Kubernetes部署连接被拒绝

时间:2018-07-02 12:54:57

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

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

我创建了一个集群,然后运行kubectl create -f deployment.yaml 它已经在我的集群上创建了一个部署容器。之后,我创建了以下服务: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

怎么了?

请帮帮我!

谢谢, 阿卜杜勒

3 个答案:

答案 0 :(得分:1)

您的部署文件没有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

答案 1 :(得分:1)

首先请确保您的入口控制器正在运行,以检查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,您就需要在部署中具有选择器,以便该部署可以管理副本,除了您无需公开副本您将要通过负载均衡器访问应用程序的节点端口。

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

答案 2 :(得分:0)

您可以先检查curl podip:port处的吊舱是否在您的情况下工作,curl podip:8080;如果效果不佳,则必须检查进程是否在使用的映像中绑定8080端口。

如果可以,请尝试使用curl svcip:svcport进行服务,在您的情况下,应为curl svcip:80;如果无法正常运行,将是kubernetes网络[配置]问题。

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

从理论上讲,如果所有条件都与k8s规则匹配,那么它应该可以工作。