问题描述
在尝试将其 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
。
请注意,使用自定义脚本需要您对容器的启动和健康检查逻辑有更深入的了解,以确保容器之间的依赖关系得到正确满足。
请根据您的实际情况选择适合的解决方案,并根据需要进行适当的配置和调整。
正文完