Kubernetes:使用 TLS Ingress 资源更新部署映像

Kubernetes:使用 TLS Ingress 资源更新部署映像

我正在尝试更新image我的部署。为此,我正在执行kubectl edit deployment web并将spec.template.spec.containers.image属性从:

gcr.io/my-project-id-1234/app:v1

到:

gcr.io/my-project-id-1234/app:v2

从日志中,我知道部署更新正常。我遇到的问题与 TLS 入口有关;这是我的配置:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: tls-ingress
spec:
  tls:
    - secretName: tls-secrets
  backend:
    serviceName: web
    servicePort: 80

kubectl describe ing web这是更新之前的结果:

$ kubectl describe ing                                                                                                                                                          
Name:                   tls-ingress
Namespace:              default
Address:                105.78.154.212
Default backend:        web:80 (10.0.2.3:8000)
TLS:
  tls-secrets terminates 
Rules:
  Host  Path    Backends
  ----  ----    --------
Annotations:
  backends:                     {"k8s-be-32171":"HEALTHY"}
  forwarding-rule:              k8s-fw-default-tls-ingress
  https-forwarding-rule:        k8s-fws-default-tls-ingress
  https-target-proxy:           k8s-tps-default-tls-ingress
  static-ip:                    k8s-fw-default-tls-ingress
  target-proxy:                 k8s-tp-default-tls-ingress
  url-map:                      k8s-um-default-tls-ingress

更新之前,一切正常。但不久之后,流量就无法成功路由到我的集群。描述入口现在返回:

Name:                   tls-ingress
Namespace:              default
Address:                105.78.154.212
Default backend:        web:80 (10.0.2.3:8000)
TLS:
  tls-secrets terminates 
Rules:
  Host  Path    Backends
  ----  ----    --------
Annotations:
  static-ip:                    k8s-fw-default-tls-ingress
  target-proxy:                 k8s-tp-default-tls-ingress
  url-map:                      k8s-um-default-tls-ingress
  backends:                     {"k8s-be-32171":"UNHEALTHY"}
  forwarding-rule:              k8s-fw-default-tls-ingress
  https-forwarding-rule:        k8s-fws-default-tls-ingress
  https-target-proxy:           k8s-tps-default-tls-ingress

当我更新 Deployment 时,如何正确更新 Ingress?

答案1

Ingress 指向一个 Service。Service 指向一组带有一些标签的 Pod。Deployment 在 Pod 上定义这些标签。以下是需要排除故障的列表:

  1. 确认服务上的标签选择器与部署正在创建的 Pod 上的标签相匹配。否则部署创建的 Pod 将不会被服务选中,并且您的 Ingress 将指向空值。

  2. 确认服务已公开为NodePort。否则 Google 的外部负载均衡器将无法进入您的集群。

  3. 确认 Pod 正在运行/健康。 Deployment 可能会更新,但 Pod 可能不健康或处于 CrashLoop 中。 应用程序必须使用200状态代码进行响应GET /

  4. 为健康检查创建防火墙规则:

    gcloud compute firewall-rules create allow-130-211-0-0-22 \
      --source-ranges 130.211.0.0/22 \
      --allow tcp:30000-32767
    

答案2

入口报告{“k8s-be-32171”:“UNHEALTHY”},表示后端服务的健康检查失败。

确保应用程序 pod 已启动并正在运行,请检查

kubectl get pods <pod-name>

kubectl get deployment <deplyment-name>

如果应用程序 pod 已准备就绪并正在运行,则入口应该自动连接到新的 pod rs,但这可能需要一段时间,具体取决于健康检查参数。

相关内容