我正在尝试更新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 上定义这些标签。以下是需要排除故障的列表:
确认服务上的标签选择器与部署正在创建的 Pod 上的标签相匹配。否则部署创建的 Pod 将不会被服务选中,并且您的 Ingress 将指向空值。
确认服务已公开为
NodePort
。否则 Google 的外部负载均衡器将无法进入您的集群。确认 Pod 正在运行/健康。 Deployment 可能会更新,但 Pod 可能不健康或处于 CrashLoop 中。 应用程序必须使用
200
状态代码进行响应GET /
。为健康检查创建防火墙规则:
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,但这可能需要一段时间,具体取决于健康检查参数。