使用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)に設定する

image.png
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周围的工具仍然存在许多错误和缺陷,所以我们需要努力跟进才行。

广告
将在 10 秒后关闭
bannerAds