我使用 GKE 在运行最新版本 Kubernetes 1.18.15-gke.1501
(ClusterIP
每当我使用新映像更新部署时,我都会遇到大约 5-15 分钟的停机时间,负载均衡器会返回 502 错误。似乎控制平面创建了新的、更新的 pod,允许通过服务级别的健康检查(不是负载均衡器,它还没有创建 NEG),然后同时杀死旧的 pod是时候设置新的 NEG 了。然后它直到一段时间后才会删除旧的 NEG。
pod 上的日志显示运行状况检查正在进行,但 GKE 仪表板显示 Ingress 状态的结果不一致。入口将显示正常,但服务将显示 502。
我尝试过的事情
- 将 pod 的数量从 1 个增加到 3 个。这对某些部署有所帮助,但在其他所有部署中,它都会增加负载均衡器正确解析所需的时间。
- 尝试设置
maxSurge
为 1 和maxUnavailable
0。这根本没有改善停机时间。 - 添加
lifecycle.preStop.exec.command: ["sleep", "60"]
到部署上的容器。这是 GKE 文档中建议的。 - 多次重新创建入口、服务、部署和集群。
- 向服务中添加一个
BackendConfig
会增加其消耗速度的服务。 - 在文档中添加一个准备门应该可以解决这个问题,但由于某种原因没有?
上述任何一项都没有帮助或对事情下降的时间产生任何明显的影响。
我真的,真的很困惑为什么这不起作用。感觉就像我遗漏了一些非常明显的东西,但这也是一个如此简单的配置,你会认为它......只是工作?有人知道发生了什么吗?
配置文件
部署配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: foundation-deployment
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 1
selector:
matchLabels:
app: foundation-web
template:
metadata:
labels:
app: foundation-web
spec:
readinessGates:
- conditionType: "cloud.google.com/load-balancer-neg-ready"
serviceAccountName: foundation-database-account
containers:
# Run Cloud SQL proxy so we can safely connect to Postgres on localhost.
- name: cloud-sql-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.17
resources:
requests:
cpu: "250m"
memory: 100Mi
limits:
cpu: "500m"
memory: 100Mi
command:
- "/cloud_sql_proxy"
- "-instances=nine-foundation:us-central1:foundation-staging=tcp:5432"
securityContext:
runAsNonRoot: true
# Main container config
- name: foundation-web
image: gcr.io/project-name/foundation_web:latest
imagePullPolicy: Always
lifecycle:
preStop:
exec:
command: ["sleep", "60"]
env:
# Env variables
resources:
requests:
memory: "500Mi"
cpu: "500m"
limits:
memory: "1000Mi"
cpu: "1"
livenessProbe:
httpGet:
path: /healthz
port: 4000
initialDelaySeconds: 10
periodSeconds: 10
readinessProbe:
httpGet:
path: /healthz
port: 4000
initialDelaySeconds: 10
periodSeconds: 10
ports:
- containerPort: 4000
服务配置:
apiVersion: v1
kind: Service
metadata:
name: foundation-web-service
annotations:
cloud.google.com/neg: '{"ingress": true}'
cloud.google.com/backend-config: '{"ports": {"4000": "foundation-service-config"}}'
spec:
type: ClusterIP
selector:
app: foundation-web
ports:
- port: 4000
targetPort: 4000
后端配置:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: foundation-service-config
spec:
# sessionAffinity:
# affinityType: "GENERATED_COOKIE"
# affinityCookieTtlSec: 120
connectionDraining:
drainingTimeoutSec: 60
入口配置:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: foundation-web-ingress
labels:
name: foundation-web-ingress
spec:
backend:
serviceName: foundation-web-service
servicePort: 4000