在GKE中解决Argo Workflows健康检查失败的问题

55次阅读
没有评论

问题描述

在尝试将其 Argo Workflows 部署暴露给一个域名时,访问域名 argo.example.com 时持续收到 Server Error。用户设置了 GKE Ingress 并尝试通过将 http 重定向到 https 来修复健康检查问题,因此添加了自定义的 FrontendConfig 和 BackendConfig。然而,用户看到 “/” 的健康检查是通过的。以下是配置信息。

argo-server 命令参数:

args:
  - server
  - --namespaced
  - --auth-mode
  - server
  - --secure
  - "true"

Ingress 配置:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argo-ingress
annotations:
  networking.gke.io/managed-certificates: "argo-cert"
  networking.gke.io/v1beta1.FrontendConfig: argo-frontend-config
spec:
  rules:
    - host: argo.example.com
      http:
        paths:
          - backend:
              service:
                name: argo-server-expose
                port:
                  number: 2746
            path: /*
            pathType: ImplementationSpecific

FrontendConfig 配置:

apiVersion: networking.gke.io/v1beta1
kind: FrontendConfig
metadata:
  name: argo-frontend-config
  namespace: argo
spec:
  redirectToHttps:
    enabled: true

BackendConfig 配置:

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: argo-backend-config
  namespace: argo
spec:
  healthCheck:
    checkIntervalSec: 30
    timeoutSec: 5
    healthyThreshold: 1
    unhealthyThreshold: 2
    type: HTTPS
    requestPath: /
    port: 2746

Service 配置:

apiVersion: v1
kind: Service
metadata:
  name: argo-server-expose
  namespace: argo
  annotations:
    cloud.google.com/neg: '{"ingress": true}'
    cloud.google.com/backend-config: '{"ports": {"http":"argo-backend-config"}}'
spec:
  type: NodePort
  ports:
    - name: http
      port: 2746
      protocol: TCP
      targetPort: 2746
  selector:
    app: argo-server

解决方案

方案1 – 使用 nginx-controller 代替 GKE Ingress

针对您遇到的问题,有用户建议不要使用 GKE Ingress,而是使用 nginx-controller helm 包来代替。以下是具体的配置示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argo-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/backend-protocol: http
    cert-manager.io/cluster-issuer: "letsencrypt"
spec:
  rules:
    - host: argo.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: argo-system-argo-workflows-server
                port:
                  number: 2746
  tls:
    - hosts:
      - argo.example.com
      secretName: argo-tls-cert

方案2 – 使用自定义脚本进行健康检查

您还可以使用自定义脚本来管理容器的启动顺序和健康检查。这将需要更多的配置和维护,但可以提供更多的灵活性。以下是一个简单的 bash 脚本示例,用于在容器 A 启动后启动容器 B:

#!/bin/bash
# 启动容器 A
docker run -d --name container_a your_image_a
# 等待容器 A 完全启动
while ! docker exec container_a echo "Container A is ready"; do
  sleep 1
done
# 启动容器 B
docker run -d --name container_b your_image_b

在这个示例中,我们首先使用 docker run 命令启动容器 A,并将其命名为 container_a。然后,使用一个循环来等待容器 A 完全启动(这里是通过在容器内运行 echo 命令来测试)。一旦容器 A 就绪,我们再使用 docker run 命令启动容器 B,并将其命名为 container_b

请注意,使用自定义脚本需要您对容器的启动和健康检查逻辑有更深入的了解,以确保容器之间的依赖关系得到正确满足。

请根据您的实际情况选择适合的解决方案,并根据需要进行适当的配置和调整。

正文完