【问题标题】:Kubernetes Ingress get Unhealthy backend services on Google Kubernetes EngineKubernetes Ingress 在 Google Kubernetes Engine 上获得不健康的后端服务
【发布时间】:2018-10-03 12:59:10
【问题描述】:

我正在尝试在 Google 容器引擎上部署两个服务,我创建了一个包含 3 个节点的集群。 我的 docker 映像位于私有 docker hub 存储库中,这就是为什么我创建了一个秘密并在部署中使用,入口正在 Google 云控制台中创建一个负载均衡器,但它显示后端服务不是 healthy 并且在 kubernetes 部分下上面写着Does not have minimum availability的工作负载。

我是 Kubernetes 新手,有什么问题?

这是我的 yaml:

Deployment.yaml:

kind: Deployment
apiVersion: apps/v1
metadata:
  name: pythonaryapp
  labels:
    app: pythonaryapp
spec:
  replicas: 1 #We always want more than 1 replica for HA
  selector:
    matchLabels:
      app: pythonaryapp
  template:
    metadata:
      labels:
        app: pythonaryapp
    spec:
      containers:
      - name: pythonaryapp #1st container
        image: docker.io/arycloud/docker_web_app:pythonaryapp #Dockerhub image
        ports:
        - containerPort: 8080 #Exposes the port 8080 of the container
        env:
        - name: PORT #Env variable key passed to container that is read by app
          value: "8080" # Value of the env port.
        readinessProbe:
          httpGet:
            path: /healthz
            port: 8080
          periodSeconds: 2
          timeoutSeconds: 2
          successThreshold: 2
          failureThreshold: 10
      imagePullSecrets:
         - name: docksecret
---

kind: Deployment
apiVersion: apps/v1
metadata:
  name: pythonaryapp1
  labels:
    app: pythonaryapp1
spec:
  replicas: 1 #We always want more than 1 replica for HA
  selector:
    matchLabels:
      app: pythonaryapp1
  template:
    metadata:
      labels:
        app: pythonaryapp1
    spec:
      containers:
      - name: pythonaryapp1 #1st container
        image: docker.io/arycloud/docker_web_app:pythonaryapp1 #Dockerhub image
        ports:
        - containerPort: 8080 #Exposes the port 8080 of the container
        env:
        - name: PORT #Env variable key passed to container that is read by app
          value: "8080" # Value of the env port.
        readinessProbe:
          httpGet:
            path: /healthz
            port: 8080
          periodSeconds: 2
          timeoutSeconds: 2
          successThreshold: 2
          failureThreshold: 10
      imagePullSecrets:
         - name: docksecret
---

这里是 services.yaml:

kind: Service
apiVersion: v1
metadata:
  name: pythonaryapp
spec:
  type: NodePort
  selector:
    app: pythonaryapp
  ports:
  - protocol: TCP
    port: 8080
---

---
kind: Service
apiVersion: v1
metadata:
  name: pythonaryapp1
spec:
  type: NodePort
  selector:
    app: pythonaryapp1
  ports:
  - protocol: TCP
    port: 8080
---

这是我的 ingress.yaml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: mysvcs
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: pythonaryapp
          servicePort: 8080
      - path: /<name>
        backend:
          serviceName: pythonaryapp1
          servicePort: 8080

更新

这是烧瓶服务代码:

from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'Hello World, from Python Service.', 200




if __name__ == '__main__':
    app.run()

并且,在运行它的 docker 映像的容器时,它会在根路径 / 处返回 200 个 sttaus 代码。

提前致谢!

【问题讨论】:

  • 您能否确保服务返回 200 响应代码? L7LB 健康检查将针对该服务进行解析。使用 curl [node_external_ip]:[nodeport] 并确保得到 200 响应
  • 您可以通过“gcloud计算实例列表”获取节点外部IP,选择任何节点。您可以使用“kubectl get svc”获取节点端口 IP 并查找端口(它将在 30000 范围内)
  • 确保防火墙规则允许 curl,如果您使用默认网络,最好的测试方法是从项目中的 VM 执行此操作并使用节点的内部 IP 地址
  • 我之所以问上述问题是因为“没有最低可用性”,这意味着 pod 部署存在问题。能否也提供“kubectl get po”的输出
  • 嗨@PatrickW,实际上一个服务正在工作,但另一个没有,你能看看这个问题:stackoverflow.com/q/52685701/7644562,拜托!

标签: docker kubernetes google-kubernetes-engine kubernetes-ingress


【解决方案1】:

看看这个post。它可能包含对您的问题有用的提示。 例如,我确实在您的配置文件中看到了就绪探测,但没有看到活跃度探测。

post 表明 k8s 中的“没有最低可用性”可能是由于活动探测失败导致的 CrashloopBackoff 的结果。

【讨论】:

  • 嗨 @Notauser,我已经在我的 pod 定义中添加了 readinessProbe,但它无法解决我的问题。
  • 嗨@Notauser,就我而言,它说:Pods have warnings 而不是CrashloopBackoff
【解决方案2】:

在 GKE 中,入口由 GCP LoadBalancer 实现。 GCP LB 通过在根路径为“/”的服务地址中调用服务来检查服务的运行状况。确保您的容器可以在根上响应 200,或者更改 LB 后端服务健康检查路由(您可以在 GCP 控制台中进行)

【讨论】:

  • 嗨@Yehuda,我的容器正在返回根/ 上的200,因为我在问题中添加了上面的烧瓶服务代码。但是,我的后端仍然无法用于入口。
  • 我不确定它是否相关,但您的服务和您的部署具有相同的名称。入口基于 serviceName 进行路由,但由于它不是唯一的,因此可能会失败。我会将服务名称更改为 pythonaryapp-service 并更新入口并检查
  • 另一件事:GKE 入口不支持(还)基于路径的路由(至少 2 个月前它不支持),因此您应该改为基于主机路由,如下例所示: - 主机:{{ .Values.restApiHost }} http:路径:-后端:serviceName:rest-api-internal-service servicePort:80 -主机:{{ .Values.dashboardHost }} http:路径:-后端:serviceName :仪表板内部服务服务端口:80
猜你喜欢
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 2022-08-04
  • 2020-03-01
  • 2017-01-10
  • 2018-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多