【问题标题】:Kubernetes deployment connection refusedKubernetes 部署连接被拒绝
【发布时间】:2018-07-02 12:54:57
【问题描述】:

我正在尝试将一个简单的 Python 应用部署到 Google Container Engine:

我创建了一个集群然后运行kubectl create -f deployment.yaml 它已在我的集群上创建了一个部署 pod。之后我创建了一个服务:kubectl create -f deployment.yaml

这是我的 Yaml 配置:

pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-app
spec:
  containers:
  - name: test-ctr
    image: arycloud/flask-svc
    ports:
    - containerPort: 5000

这是我的 Dockerfile:

FROM python:alpine3.7
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
EXPOSE 5000
CMD python ./app.py

deployment.yaml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: test-app
  name: test-app
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: test-app
      name: test-app
    spec:
      containers:
      - name: test-app
        image: arycloud/flask-svc
        resources:
          requests:
            cpu: "100m"
        imagePullPolicy: Always
        ports:
        - containerPort: 8080

service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: test-app
  labels:
    app: test-app
spec:
  type: LoadBalancer
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 8080
    nodePort: 32000
  selector:
    app: test-app

入口

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: frontend
          servicePort: 80

它创建一个 LoadBalancer 并提供一个外部 IP,当我打开 IP 时它返回Connection Refused error

怎么了?

请帮帮我!

谢谢你, 阿卜杜勒

【问题讨论】:

  • 您好,请检查您的目标端口和容器端口。它们应该是相同的
  • 嗨@SureshVishnoi,现在两个端口相同但仍然返回相同的错误。
  • 检查集群的安全组?
  • 我创建了一个入口控制器,它也显示错误为Some backend services are in UNHEALTHY state,这是什么意思?
  • 表示应用程序 pod 没有启动并运行

标签: python docker kubernetes google-cloud-platform google-kubernetes-engine


【解决方案1】:

你可以先通过curl podip:port检查pod是否在工作,在你的场景中,应该是curl podip:8080;如果不能正常工作,你必须检查进程是否在你使用的镜像中绑定了 8080 端口。

如果可行,请尝试curl svcip:svcport 的服务,在您的场景中,应该是curl svcip:80;如果不能正常工作,将是 kubernetes 网络 [配置] 问题。

如果仍然有效,那么问题应该发生在入口层。

理论上,如果都符合k8s规则,它应该可以工作。

【讨论】:

  • 嗨@WeiweiJiang,现在我已经创建了一个新集群并简单地部署了一个pod(在问题中添加了pod.yaml)然后尝试将它的IP 卷曲为:curl http://10.36.2.7:5000/,我还添加了我的dockerfile 进入问题。但现在它返回curl: (7) Failed to connect to 10.36.2.7 port 5000: Operation timed out
  • 有时后端不健康,健康检查由于防火墙规则而失败。 IP地址是pod IP?您是否手动打开了防火墙规则?
【解决方案2】:

您的部署文件没有selector,这意味着service 找不到任何Pod 来重定向请求。

此外,您必须将部署文件中的conteinerPOrt 与服务文件中的targetPort 匹配。

我已经在我的实验室环境中进行了测试,它对我有用:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: test-app
  name: test-app
spec:
  selector:
    matchLabels:
      app: test-app
  replicas: 1
  template:
    metadata:
      labels:
        app: test-app
    spec:
      containers:
      - name: test-app
        image: arycloud/flask-svc
        imagePullPolicy: Always
        ports:
        - containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
  name: test-app
  labels:
    app: test-app
spec:
  type: LoadBalancer
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 5000
  selector:
    app: test-app

【讨论】:

    【解决方案3】:

    首先确保你的入口控制器正在运行,检查kubectl get pods -n ingress-nginx,如果你没有发现任何正在运行的pod,你需要部署kubernetes入口,你可以通过kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud/deploy.yaml来完成。

    如果你已经正确安装了入口控制器,那么只需应用下面的 yaml,你需要在你的部署中有 selector 以便部署可以管理副本,除了你不需要公开一个节点端口,因为您将通过负载均衡器访问您的应用程序。

    apiVersion: v1
    kind: Service
    metadata:
      name: test-app
      labels:
        app: test-app
    spec:
      type: LoadBalancer
      ports:
      - name: http
        port: 80
        protocol: TCP
        targetPort: 8080
      selector:
        app: test-app
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: test-app
      name: test-app
    spec:
      selector:
        matchLabels:
          app: test-app
      replicas: 1
      template:
        metadata:
          labels:
            app: test-app
        spec:
          containers:
          - name: test-app
            image: arycloud/flask-svc
            imagePullPolicy: Always
            ports:
            - containerPort: 8080
    ---
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: test-ingress
      annotations:
        kubernetes.io/ingress.class: "nginx"
    spec:
      rules:
      - http:
          paths:
          - path: /
            backend:
              serviceName: frontend
              servicePort: 80
    

    【讨论】:

      猜你喜欢
      • 2021-06-27
      • 2020-11-06
      • 2020-04-29
      • 1970-01-01
      • 2021-10-22
      • 2019-06-01
      • 2021-10-19
      • 2020-05-03
      • 2021-09-13
      相关资源
      最近更新 更多