リリースノート
プローブのプロトコルの変更、についてリリースノートに言及があり、
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) が使用され、
アノテーションで指定されたパスにプローブのリクエストが送信されます
externalTrafficPolicy が 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
なので、以下のアップデート方法でいいすか?というのをserviceのマニフェストなどを添付して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
Loadbalancerの正常性プローブの状態
AKSのポータルの管理画面のプロパティからVMSSとかのリソースのあるリソースグループのリンクを踏んでそのあたりのLBを確認する
と正常性プローブというメニューがあってプロトコルがわかる。(STG/PRODで異なってた)
マニフェストや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チャートのNAMEで、
CHARTはhelm search repoでみたときのhelmリポジトリ上のチャートのNAME(ローカルリポジトリの場合は直下のディレクトリ名)で、
flagsは設定上書きする変数ファイルとかdry-run的なほかのオプションを指定する
helm upgrade実行ログ
$ 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確認してログイン画面でるようになった
以上