从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后,我可以进入登录页面了。

以上

bannerAds