【问题标题】:Kubernetes service : randomly getting Connection refusedKubernetes 服务:随机连接被拒绝
【发布时间】:2021-05-25 20:10:18
【问题描述】:

当在端口 80 上的 pod 内进行 curl 时,响应很好。 在机器 IP 和 30803 端口上通过 Kubernetes 服务在容器外调用 curl,偶尔会出现“连接被拒绝”。

nginx 应用配置:

server {
        listen  80;
        server_name 127.0.0.1;
        access_log  /var/log/nginx/access.log;
        error_log   /var/log/nginx/error.log;
        root        /usr/share/nginx/html;
        index index.html;

       error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

使用的 Kubernetes 部署和服务清单:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  namespace: dev
  labels:
    environment: dev
spec:
  selector:
      matchLabels:
         environment: dev
  replicas: 1
  template:
    metadata:
      labels:
        environment: dev
    spec:
      containers:
      - name: web-app
        imagePullPolicy: Never
        image: web-app:$BUILD_ID
        ports:
          - containerPort: 80
        readinessProbe:
          httpGet:
            path: /
            port: 80
          periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: web-app-dev-svc
  namespace: dev
  labels:
    environment: dev
spec:
  selector:
    environment: dev
  type: NodePort
  ports:
  - name: http
    nodePort: 30803
    port: 80
    protocol: TCP
    targetPort: 80

【问题讨论】:

  • 您应该使用 curl(-v 标志)进行一些验证。另外,执行kubectl get pods 以确保 pod 没有重新启动并且处于就绪状态。您还可以执行kubectl get services 以确保只有一个服务正在使用该节点端口。这是调试的第一步。您还可以稍后查看 k8s 节点中的日志。您可能会在那里找到有关网络问题的信息。
  • 完成所有调试步骤,描述/记录 pod 。 Pod 运行良好,因为它只是在做反向代理。我在想nginx镜像版本不兼容一些k8s功能,或者尝试切换到另一个webserver,看看可能是什么原因导致这种行为...
  • 即使你没有真正的 Ingress 控制器,NGinx 也能很好地工作。仅当您没有域的 SSL 证书时才使用节点端口。否则一切都很容易设置
  • 您正在使用标签environment: dev。是否在 dev 命名空间中部署了其他任何具有相同标签的服务可以选择? kubectl get po --show-labels
  • 您是否愿意提供答案以获得更好的可见性,解释问题是什么以及您是如何解决的?我很乐意支持您的回答。

标签: docker nginx kubernetes devops nginx-reverse-proxy


【解决方案1】:

问题是选择器中的 2 个服务使用了相同的标签值 - 'environment: dev' ,我认为这种随机连接是被激发的,因为它在一个 pod 和另一个 pod 之间进行平衡。固定标签值,现在可以完美运行。

【讨论】:

    【解决方案2】:

    当我使用 NodePort 运行 K8s 时,我没有任何问题。您可以先尝试使用代理(端口转发)到您的服务,然后再使用您的 pod,以确保所有这些都以相同的行为工作。如果直接将端口转发到您的 pod 没有任何问题,那么您的服务和 pod 之间可能存在问题(例如:网络策略,例如短时间内调用过多)。

    关于我的 nginx 配置,很简单:

    # /usr/share/nginx/html # cat /etc/nginx/conf.d/default.conf
    server {
        listen       80;
    
        # Optional
        listen  [::]:80;
        server_name  localhost;
    
        # Default configuration
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
    
            # Forward everything to the react router
            try_files $uri $uri/ /index.html?$args;
        }
    
        # If we wish some custom error page later, we could also add them.
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
    

    否则,如果您想逐字尝试 nginx,只需使用 nginx 映像(参见 kubernetes.io Cheat Sheet

    kubectl create deployment nginx --image=nginx
    kubectl create services nodeport nginx-svc --tcp 30666:80 
    
    # Nodeport should then be 30666 on the cluster
    

    【讨论】:

    • 感谢您的回复。问题出在 Kubernetes 标签中。多个应用使用了相同的标签值
    猜你喜欢
    • 2019-06-01
    • 2021-09-13
    • 2016-05-02
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 2018-10-19
    相关资源
    最近更新 更多