流量:Internet → Ingress 控制器规则(根据你的 Ingress YAML)→ Service → Pods
调试流程:Pods → Service → Ingress → Ingress controller → Internet
检查 Deployment & Pods
- 确保 Pod 已开始并运行(Pod 的“Status”为“Running”)。 如果没有,请检查Deployment/Pod 资源事件和log解决问题的日志。
- 假如你用的是 HTTP GET livenessProbe,请确保您的 Service 和 Ingress 已提前部署。
$ kubectl get deployment -n # logs of deployment $ kubectl logs deployment/ -n # follow logs of deployment, ctrl c to quit $ kubectl logs -f deployment/ -n # check "Events" at bottom of the output $ kubectl describe deployment -n $ kubectl get pods -n $ kubectl logs pod/ -n $ kubectl describe pod -o wide -n
检查端口映射
Ingress
Ingress 可配置为提供外部可访问服务 URL、负载平衡流量,终止 SSL / TLS 并提供基于名称的虚拟主机。 Ingress 控制器负责实现 Ingress,负载均衡器通常用于帮助处理流量的边缘路由器或其他前端。
Ingress 任何端口或协议都不会暴露。 向 Internet 公开 HTTP 和 HTTPS 通常使用外部服务 Service.Type=NodePort 或 Service.Type=LoadBalancer 服务类型。
检查 Service
- 检查 Service 中的“Endpoints该字段应与字段相匹配 Pod 的“IP”匹配。
- 如果您使用 GKE、AKS…等以等公共云 Service Types 修改为 LoadBalancer 从而不经过ingress对外暴漏Service 。 如果你能成功访问公网,这意味着你 Pod 而且服务正常,那么问题就是别人造成的。
$ kubectl get service -n $ kubectl describe service -n
检查 the Ingress & Ingress Controller 日志和资源时间
Ingress Controllers
为了使 Ingress 集群必须运行入口控制器才能正常工作。
与作为 kube-controller-manager 其他类型的控制器不同于二进制文件的一部分,Ingress 控制器不会通过 GKE、AKS 自动启动公共云中的集群。您需要选择最适合您的集群的入口控制器。
AKS 中的 Ingress Controller 是 AKS Application Gateway Ingress Controller,下面是 ingress-appgw-deployment。 作为入口控制器 AKS 群集中的 pod 运行。 它使用 Kubernetes Ingress 并将其转化为资源 Azure 该配置允许网关配置应用程序网关 Kubernetes pod 负载平衡流量。
- 检查您的 Ingress 是否有事件或错误的日志
$ kubectl get ingress -n <namespace> $ kubectl describe ingress <name-of-ingress> -n <namespace>
- 检查您的Ingress Controller 配置,看看它的规则是否与你刚刚应用的入口相匹配。
λ kubectl get deployment -n kube-system NAME READY UP-TO-DATE AVAILABLE AGE ingress-appgw-deployment 1/1 1 1 48d ... $ kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE azure-cni-networkmonitor-2fmfk 1/1 Running 0 7d5h
...
azure-ip-masq-agent-6k4rm 1/1 Running 0 3d5h
...
coredns-84d976c568-pjt8q 1/1 Running 1 86d
...
ingress-appgw-deployment-7b8b687b46-scvs7 1/1 Running 315 3d5h
kube-proxy-4c6qw 1/1 Running 0 7d5h
...
metrics-server-569f6547dd-j2wjz 1/1 Running 5 86d
...
$ kubectl describe pod ingress-appgw-deployment-7b8b687b46-scvs7 -n kube-system
最后找出问题是由 Ingress 控制器在更新 Ingress YAML 或 Pod 服务端点(包括 livenessProbe)时无法将 Ingress YAML 转换为 Azure 应用程序网关配置引起的。
$ kubectl logs -n kube-system ingress-appgw-deployment-7b8b687b46-scvs7 | grep --color=always -i error
E0110 03:19:02.123462 1 requestroutingrules.go:386] A path-rule with path '/merchant/*' already exists in config for BackendPool '/subscriptions/49fc9d19-f517-4ca5-a93e-76ed0fbd0ab1/resourceGroups/xxx/providers/Microsoft.Network/applicationGateways/aks-gw/backendAddressPools/defaultaddresspool'. Duplicate path-rule with BackendPool '/subscriptions/49fc9d19-f517-4ca5-a93e-76ed0fbd0ab1/resourceGroups/xxx/providers/Microsoft.Network/applicationGateways/aks-gw/backendAddressPools/pool-payment-payment-svc-80-bp-80' will not be applied
重启 Ingress Controller
$ kubectl rollout restart deployment <your-ingress-controller-deployment>
Application Gateway 失败原因
可能导致 Application Gateway 无法监控和应用 Ingress 配置的原因。
- 使用没有包含 TLS 私钥和证书的 Secret 的 HTTPS。 如果您使用 let’s encrypt 自动生成 tls.crt 和 tls.key 类型为 kubernates.io/tls 的机密文件,请确保它没有被您的 AKS 防火墙阻止,这将导致错误类型的 Secret(Opaque )。
apiVersion: v1
kind: Secret
metadata:
name: testsecret-tls
namespace: default
data:
tls.crt: base64 encoded cert
tls.key: base64 encoded key
type: kubernetes.io/tls
- 重定向问题
Ingress gives 502 error 注意到应用程序必须在“/”处返回 200 状态码。 如果您的应用程序返回 302(重定向到登录),这将导致运行状况失败。 当健康检查失败时,入口资源返回502。
- 后端路径规则冲突。
如果您在 Ingress 中指定 backend-path-prefix,请确保它不会与您的后端资源 Deployment livenessProbe 路径前缀冲突。
Deployment
...
livenessProbe:
httpGet:
path: /payment_resource/healthcheck.jsp
port: 8080
initialDelaySeconds: 180
periodSeconds: 10
timeoutSeconds: 3
failureThreshold: 3
successThreshold: 1
Ingress
kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
name: ingress-payment
namespace: payment
annotations:
appgw.ingress.kubernetes.io/backend-path-prefix: /payment_resource/
appgw.ingress.kubernetes.io/connection-draining: 'true'
appgw.ingress.kubernetes.io/connection-draining-timeout: '30'
appgw.ingress.kubernetes.io/cookie-based-affinity: 'true'
appgw.ingress.kubernetes.io/ssl-redirect: 'true'
cert-manager.io/cluster-issuer: letsencrypt-production
kubernetes.io/ingress.allow-http: 'false'
kubernetes.io/ingress.class: azure/application-gateway
spec:
tls:
- hosts:
- xxx.xxx.xxx.azure.com
secretName: aks-ingress-cert
rules:
- host: xxx.xxx.xxx.azure.com
http:
paths:
- path: /payment/* pathType: ImplementationSpecific backend: service: name: payment-svc port: number: 80
访问 https://xxx.xxx.xxx.azure.com/payment/healthcheck.jsp ,它将重定向到后端资源端点https://xxx.xxx.xxx.azure.com/payment_resource/healthcheck.jsp 。