AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1134023
Accepted
halfer
halfer
Asked: 2023-06-16 03:27:59 +0800 CST2023-06-16 03:27:59 +0800 CST 2023-06-16 03:27:59 +0800 CST

如何调试 NodePort 拒绝 K8S 连接的原因?

  • 772
赏金将在 7 天后到期。此问题的答案有资格获得+150声望赏金。 halfer想提请更多人注意这个问题:
经过大量记录在案的努力后,我仍然停留在这个微不足道的问题上。我想知道 MicroK8S 是否不如标准 K8S 受欢迎,因此可能更难获得帮助?或者我应该在 DevOps 网站上发帖?

介绍

我最近得到了一个简单的网络应用程序,它可以在带有 MicroK8S 的三节点 Ubuntu 服务器上运行。我决定尝试重建我的集群并使用 YAML 清单重新安装所有内容,以确保该过程可复制。但是,现在无法从集群外部访问该应用程序。我正在寻找调试技术来深入了解为什么 NodePort 显然没有在所有节点上创建 TCP 侦听器。

这是我的节点:

姓名 知识产权 颜色 角色
排列 192.168.50.251 黄色的 领导者
尼卡 192.168.50.74 蓝色的 工人
山崎 192.168.50.135 绿色的 工人

集群再次选择在第三个节点 Yamazaki 上运行工作负载。我希望任何访问 Arran 或 Nikka 的网络流量都会在内部重新路由到 Yamazaki 以得到服务,就像以前发生的那样。

我做了什么

从以前工作的集群/应用程序,这是我重置所有内容的方法:

  1. microk8s leave在所有follower节点上做

  2. 对每个跟随者节点的领导者执行microk8s kubectl delete node <nodename>(他们离开时不会自动删除)

  3. microk8s reset在所有节点上执行

  4. 启用插件(dns、ingress)。我不知道是否有必要

  5. microk8s add-node为每个跟随者在领导者上创建加入命令

  6. microk8s join <ip>/<token>对每个关注者运行一个新的加入命令

  7. 在任何节点上运行microk8s status以确保集群处于 HA 模式

  8. 使用microk8s images import workload.tar

  9. 通过启动应用程序microk8s kubectl apply -f k8s-manifests/production/pod.yaml -f k8s-manifests/production/nodeport.yaml

    这是吊舱:

     apiVersion: v1
     kind: Pod
     metadata:
       name: k8s-workload
       annotations:
         kubectl.kubernetes.io/last-applied-configuration: |
           {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"k8s-workload","namespace":"default"},"spec":{"containers":[{"image":"k8s-workload","imagePullPolicy":"Never","name":"k8s-workload","ports":[{"containerPort":9090,"protocol":"TCP"}]}]}}
     spec:
       containers:
       - image: k8s-workload
         imagePullPolicy: Never
         name: k8s-workload
         ports:
         - containerPort: 9090
           protocol: TCP
    

    这是节点端口:

     apiVersion: v1
     kind: Service
     metadata:
       name: np-service
     spec:
       type: NodePort
       ports:
         - port: 9090
           targetPort: 9090
           nodePort: 30090
       selector:
         run: k8s-workload
       # This should not be needed, but it didn't help
       # this time anyway
       externalIPs: [192.168.50.251]
    
  10. 检查应用程序是否正在通过内部容器调用运行,microk8s kubectl exec -ti k8s-workload -- curl http://localhost:9090这很好

  11. 检查应用程序是否通过任何节点上的端口转发器运行,microk8s kubectl port-forward pod/k8s-workload 9090 --address='0.0.0.0'这很好

  12. 节点不在外部侦听(curl http://localhost:30090连接被拒绝,与来自 LAN 上非集群计算机的任何节点 IP 地址相同)

系统状态

这是运行的内容microk8s kubectl get all -o wide:

NAME               READY   STATUS    RESTARTS   AGE   IP             NODE       NOMINATED NODE   READINESS GATES
pod/k8s-workload   1/1     Running   0          20h   10.1.134.193   yamazaki   <none>           <none>

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP      PORT(S)          AGE     SELECTOR
service/kubernetes   ClusterIP   10.152.183.1     <none>           443/TCP          35d     <none>
service/np-service   NodePort    10.152.183.175   192.168.50.251   9090:30090/TCP   3d21h   run=k8s-workload

我不知道service/kubernetes是什么,我认为它只是标准 K8S 基础设施的一部分。

观察

我认为这篇文章是在说我的网络应用程序需要成为一项服务,但我只有一个 pod。我认为当它以前工作时,我只有一个 pod,但集群变得有点混乱,所以应用程序的服务版本可能与 pod 版本同时运行。

这篇文章还建议我应该使用入口系统。但是,考虑到 NodePort 是我目前的学习重点,我还不想放弃它。入口可以稍后出现。

我想我可以确定没有防火墙问题,因为即使在集群节点上的控制台会话中,任何与端口 30090 的连接都会被拒绝。

我想运行类似 的命令microk8s kubectl logs service np-service来查看 NodePort 在做什么,但 logs 子命令仅适用于 pod。

接下来我可以尝试什么?

kubernetes
  • 2 2 个回答
  • 63 Views

2 个回答

  • Voted
  1. Best Answer
    Eleasar
    2023-06-18T18:37:26+08:002023-06-18T18:37:26+08:00

    当用于kubectl run启动 Pod 时,Kubernetes 会自动使用部署时使用的名称标记它们。

    例如,看一下生成的 yaml kubectl run nginx --image=nginx -o yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        run: nginx <- Automatically assigned
      name: nginx
      namespace: default
    spec:
      containers:
      - image: nginx
        ...
    

    k8s-workload现在,假设您提供的Pod 的 yaml是完整的,目前缺少此标签。这很重要,因为selector您在NodePort's specs.

    apiVersion: v1
    kind: Service
    metadata:
      name: np-service
    spec:
      ...
      selector:
        run: k8s-workload <- This tells Kubernetes who the Service is for
    

    我猜此刻,Kubernetes 根本无法找到 NodePort 所在的 Pod。您可以通过运行来测试这个理论kubectl get pods -l run=k8s-workload。您应该会收到类似于 的错误消息No resources found in default namespace。

    解决这个问题就像(重新)分配标签一样简单。kubectl label这可以通过使用类似命令来完成kubectl label pod k8s-workload run=k8s-workload。

    有关此主题的更多信息可以在官方文档中找到。

    • 1
  2. halfer
    2023-06-18T22:00:08+08:002023-06-18T22:00:08+08:00

    正如我所怀疑的那样,解决方案很简单。Eleasar 友好地提供了一个label命令来解决这个问题,但我更喜欢在 YAML 中修复它,因为我认为这样更容易重复。这是我的新pod.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: k8s-workload
      labels:
        run: k8s-workload
      annotations:
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"k8s-workload","namespace":"default"},"spec":{"containers":[{"image":"k8s-workload","imagePullPolicy":"Never","name":"k8s-workload","ports":[{"containerPort":9090,"protocol":"TCP"}]}]}}
    spec:
      containers:
      - image: k8s-workload
        imagePullPolicy: Never
        name: k8s-workload
        ports:
        - containerPort: 9090
          protocol: TCP
    

    只有两行新行,为这个对象添加一个唯一的标签。

    • 0

相关问题

  • Nvidia Config 后 Containerd 无法启动

  • 在使用 kubeadm 引导集群之前,如何修改 CoreDNS 配置映射?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve