使用EKS和ALB进行无502错误的部署
太长不看。
将ALB的目标从instance更改为ip。
将ALB的取消注册延迟设置为Pod删除的延迟(preStop)。
ALB+滚动更新问题
使用k8s可以方便地进行滚动更新,并以零停机时间进行部署。
然而,如果使用ALB(ingress),在滚动更新期间部分访问会出现502错误。
目前有一些问题提出了,但还没有解决的状态。请参考以下链接:
https://github.com/kubernetes-sigs/aws-alb-ingress-controller/issues/1065
https://github.com/kubernetes-sigs/aws-alb-ingress-controller/issues/1131
经过尝试了各种方法,找到了一种可以避免502错误并实现部署的方法。我来与大家分享一下。
在没有停机时间的情况下进行部署的方法
-
- ターゲットの種類(target-type)をipにする
Pod毎にIPが設定される(セカンダリプライベートIP)
ALBのターゲットがNodeのIPとポート(NodePort)からPod毎のIPとポートになる
ALBの 登録解除の遅延 < Podの削除遅延(preStop)に設定する
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: "example-ingress"
annotations:
kubernetes.io/ingress.class: alb
# annotations: https://kubernetes-sigs.github.io/aws-alb-ingress-controller/guide/ingress/annotation/
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/healthcheck-path: /
alb.ingress.kubernetes.io/healthcheck-interval-seconds: "5"
alb.ingress.kubernetes.io/healthcheck-timeout-seconds: "3"
alb.ingress.kubernetes.io/healthy-threshold-count: "2"
alb.ingress.kubernetes.io/unhealthy-threshold-count: "2"
alb.ingress.kubernetes.io/load-balancer-attributes: idle_timeout.timeout_seconds=10
alb.ingress.kubernetes.io/target-group-attributes: deregistration_delay.timeout_seconds=10
labels:
app: "example-ingress"
spec:
rules:
- http:
paths:
- path: /*
backend:
serviceName: "example-service"
servicePort: 80
---
apiVersion: v1
kind: Service
metadata:
name: example-service
spec:
type: NodePort
selector:
app: example
ports:
- port: 80
targetPort: 80
protocol: TCP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: example-deployment
spec:
selector:
matchLabels:
app: example
template:
metadata:
labels:
app: example
spec:
containers:
- name: example
image: nginx:alpine
resources:
limits:
memory: "128Mi"
cpu: "128m"
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 1
periodSeconds: 10
timeoutSeconds: 3
successThreshold: 2
failureThreshold: 2
lifecycle:
preStop:
exec:
command: ["sh", "-c", "sleep 20"]
最后
由于k8s周围的工具仍然存在许多错误和缺陷,所以我们需要努力跟进才行。