从AKS1.24开始,探针的协议规范将发生变化
发布说明
关于探测器协议的更改,在发布说明中提到了:https://github.com/Azure/AKS/releases/tag/2022-09-11,我感到有些疑惑并咨询了以下信息:https://cloud-provider-azure.sigs.k8s.io/topics/loadbalancer/#custom-load-balancer-health-probe。
Kubernetes バージョン <= 1.23 の場合
Service のアノテーションが設定されていない場合、プローブのプロトコルに TCP が使用されます
アノテーションが設定されている場合は、プロトコルは spec.ports.appProtocol (http/https) が使用され、
アノテーションで指定されたパスにプローブのリクエストが送信されます
Kubernetes バージョン > 1.24 の場合
Service のアノテーションが設定されていない場合、プローブのプロトコルに spec.ports.appProtocol` (http/https) が使用され、
リクエスト パスには / が使用されます
アノテーションが設定されている場合は、プロトコルは spec.ports.appProtocol` (http/https) が使用され、
アノテーションで指定されたパスにプローブのリクエストが送信されます
如果外部流量策略为 local
没有措施
Service のマニフェストを拝見させていただきましたところ、 externalTrafficPolicy が local 設定でございましたので、
/healthz に対して、HTTP プローブがされておりますことを確認いたしました。
今回の変更の影響は externalTrafficPolicy が cluster のものが影響をうけます。
所以和平安详。
如果无特殊设置,将ingress-nginx的helm图表直接安装。
“情况”
将STG升级到1.24之后,网站变为无法访问的状态,在ingress-nginx的Pod日志中出现以下消息。
W0213 06:26:54.326428 7 controller.go:1083] Service "default/sample-backendserver" does not have any active Endpoint.
根据公式文档,似乎在确认安装方法时,设置了以下选项:
https://learn.microsoft.com/ja-jp/azure/aks/ingress-basic?tabs=azure-cli
将以下内容以中文亲自转述,只需要提供一个选项:
–set controller.service.annotations. “service.beta.kubernetes.io/azure-load-balancer-health-probe-request-path” = /healthz
— 设置 controller 服务的注释。”service.beta.kubernetes.io/azure-load-balancer-health-probe-request-path”的值为/healthz。
所以,我附上了服务清单等文件,并通过SR问题咨询来确认以下的更新方法可以吗?然后收到了一个类似于OK的回复。
helm list
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz
helm list
当查看service的状态时,情况如下:
80端口:31858/TCP,443端口:32418/TCP
顺便说一句,helm安装的ingress-nginx配置选项似乎没有包含在内。
$ helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
base-chart default 5 2022-11-04 13:31:19.153007 +0900 +0900 deployed base-chart-1.0.0
sample-nginx default 1 2022-02-21 17:36:59.589264879 +0900 +0900 deployed ingress-nginx-4.0.17 1.1.1
$ helm get values sample-nginx
USER-SUPPLIED VALUES:
null
负载均衡器正常性探测的状态
从AKS的门户管理界面的属性中,点击资源组中存在VMSS等资源的链接,可以查看相关负载均衡器。并存在一个名为“正常性探测”的菜单,可以确定协议。(在STG和PROD中有所不同)
尽管 Manifest、Service、Ingress 和 Pod 的状态没有出现任何错误,但没有访问到 Ingress 的 Pod。
答案摘要
<実行例>
helm upgrade ingress-nginx ingress-nginx/ingress-nginx \
--namespace $NAMESPACE \
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz
<<公開情報>>
Title : AKS 1.24 アップグレード時にAzure Load Balancer の正常性プローブプロトコルが変更される
URL : https://jpaztech.github.io/blog/containers/aks-lb-probe-failed-after-upgraded-to-k8s-1.24/
实际的AKS探针配置
我从SR那里学会的命令。
NAMESPACE=default
helm upgrade ingress-nginx ingress-nginx/ingress-nginx \
--namespace $NAMESPACE \
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz
我們可以輸入 URL 來進行確認。
$ kubectl config get-contexts
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
sample-backendserver-fcc5d54d5-nh7b2 1/1 Running 0 10d
sample-backendserver-queue-worker-7c97c7d77d-h6t4j 1/1 Running 0 10d
sample-frontendserver-c46b4b58-p8z9q 1/1 Running 0 10d
sample-nginx-ingress-nginx-controller-86c854f84-9zph2 1/1 Running 0 10d
$ kubectl get service
$ kubectl get ingress
$ helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
base-chart default 5 2022-11-04 13:31:19.153007 +0900 +0900 deployed base-chart-1.0.0
sample-nginx default 1 2022-02-21 17:36:59.589264879 +0900 +0900 deployed ingress-nginx-4.0.17 1.1.1
$ helm repo list
Error: no repositories to show
$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
"ingress-nginx" has been added to your repositories
$ helm repo list
NAME URL
ingress-nginx https://kubernetes.github.io/ingress-nginx
$ helm search repo ingress-nginx
NAME CHART VERSION APP VERSION DESCRIPTION
ingress-nginx/ingress-nginx 4.5.2 1.6.4 Ingress controller for Kubernetes using NGINX a...
$ helm get values sample-nginx
USER-SUPPLIED VALUES:
null
NAMESPACE=default
helm upgrade ingress-nginx ingress-nginx/ingress-nginx \
--namespace $NAMESPACE \
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz
如果不做出改变,就会被称为不同的版本,所以要改名字。
$ helm upgrade --help
~略~
Usage:
helm upgrade [RELEASE] [CHART] [flags]
~略~
※RELEASE是在使用helm list命令时实际安装的helm chart的任意命名。CHART是在使用helm search repo命令时的helm仓库上的chart的名称(如果是本地仓库,则为直接下级目录的名称)。flags指定要覆盖设置的变量文件或其他dry-run选项。
升级Helm执行日志
$ NAMESPACE=default
helm upgrade sample-nginx ingress-nginx/ingress-nginx \
--namespace $NAMESPACE \
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz
Release "sample-nginx" has been upgraded. Happy Helming!
NAME: sample-nginx
LAST DEPLOYED: Fri Feb 24 04:45:11 2023
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
The ingress-nginx controller has been installed.
It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status by running 'kubectl --namespace default get services -o wide -w sample-nginx-ingress-nginx-controller'
An example Ingress that makes use of the controller:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example
namespace: foo
spec:
ingressClassName: nginx
rules:
- host: www.example.com
http:
paths:
- pathType: Prefix
backend:
service:
name: exampleService
port:
number: 80
path: /
# This section is only required if TLS is to be enabled for the Ingress
tls:
- hosts:
- www.example.com
secretName: example-tls
If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:
apiVersion: v1
kind: Secret
metadata:
name: example-tls
namespace: foo
data:
tls.crt: <base64 encoded cert>
tls.key: <base64 encoded key>
type: kubernetes.io/tls
$ helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
base-chart default 5 2022-11-04 13:31:19.153007 +0900 +0900 deployed base-chart-1.0.0
sample-nginx default 2 2023-02-24 04:45:11.59890333 +0000 UTC deployed ingress-nginx-4.5.2 1.6.4
$ helm get values sample-nginx
USER-SUPPLIED VALUES:
controller:
service:
annotations:
service.beta.kubernetes.io/azure-load-balancer-health-probe-request-path: /healthz
$ kubectl get po
NAME READY STATUS RESTARTS AGE
sample-backendserver-fcc5d54d5-nh7b2 1/1 Running 0 10d
sample-backendserver-queue-worker-7c97c7d77d-h6t4j 1/1 Running 0 10d
sample-frontendserver-c46b4b58-p8z9q 1/1 Running 0 10d
sample-nginx-ingress-nginx-controller-67d45d5c56-7pxhz 1/1 Running 0 4m20s
$ kubectl logs -f --tail=20 sample-nginx-ingress-nginx-controller-67d45d5c56-7pxhz
验证URL后,我可以进入登录页面了。
以上