先日AWXデプロイ時にkube-rbac-proxyのpullエラーが発生して代替としてquay.io/brancz/kube-rbac-proxyを使用するよう修正したが、これがそもそも何をやっているのか、という話。
最新のdevel版で使われていないので、将来はこの機能がなくなるのか・あるいは別のアクセス制御が行われると思うが(未確認)、現在(2.19.1およびそれ以前)のAWX Operatorのメトリクスをどう参照するのか確認してみた。
標準の構成
デフォルトの構成ではAWX Operatorに対してClusterIP設定のServiceリソース(awx-operator-controller-manager-metrics-service)が作成される。
zaki@cloud-dev2:~$ kubectl get svc -n awx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE awx-operator-controller-manager-metrics-service ClusterIP 10.43.226.67 <none> 8443/TCP 475d awx-postgres-15 ClusterIP None <none> 5432/TCP 475d awx-service ClusterIP 10.43.100.106 <none> 80/TCP 475d
このServiceがkube-rbac-proxyでListenしているポートへのトラフィックを受け付けている。
以下はkube-rbac-proxyの定義の抜粋。
spec: containers: - args: - --secure-listen-address=0.0.0.0:8443 - --upstream=http://127.0.0.1:8080/ - --logtostderr=true - --v=0 image: quay.io/brancz/kube-rbac-proxy:v0.15.0 imagePullPolicy: IfNotPresent name: kube-rbac-proxy ports: - containerPort: 8443 name: https protocol: TCP
このトラフィックを更にOperator本体へ流している。
つまり構成的にはkube-rbac-proxyはサイドカーコンテナとしてリバースプロキシの役割をしている。
以下はOperator本体のawx-managerの定義抜粋。
- args: - --health-probe-bind-address=:6789 - --metrics-bind-address=127.0.0.1:8080 - --leader-elect - --leader-election-id=awx-operator image: quay.io/ansible/awx-operator:2.19.1 imagePullPolicy: IfNotPresent name: awx-manager
メトリクスの参照
awx-manager内でダイレクトに参照
標準の構成ではServiceリソースはないのでPod内で直接参照してみる。
この場合kube-rbac-proxyと関係ないアクセスになり認証制限はかからないため、curlすれば何も制限なく参照できる。
zaki@cloud-dev2:~$ kubectl exec -it -n awx awx-operator-controller-manager-58b89d6d8b-6fm2m -c awx-manager -- bash
bash-4.4$ curl -s localhost:8080/metrics | head -3
# HELP ansible_operator_build_info Build information for the ansible-operator binary
# TYPE ansible_operator_build_info gauge
ansible_operator_build_info{commit="d26c43bf94960d292152862a6685696be33190fb",version="v1.34.0"} 1
bash-4.4$ curl -s localhost:8080/metrics | wc -l
366
bash-4.4$
(量が多いので先頭の3行のみ確認)
kube-rbac-proxy経由の参照
ClusterIP設定のServiceリソースがあるのでこれ経由のアクセスを試してみる。そのためにサンプルのPodを1個作成。
zaki@cloud-dev2:~$ kubectl run work-pod --image=fedora --command -- tail -f /dev/null pod/work-pod created zaki@cloud-dev2:~$ kubectl exec -it work-pod -- bash [root@work-pod /]#
このPod内からServiceリソースへcurlしてみるとこの通り認証エラー
[root@work-pod /]# curl -k https://awx-operator-controller-manager-metrics-service.awx.svc.cluster.local:8443/metrics Unauthorized
ここで必要になる認証情報は、AWX Operatorをデプロイした時に自動的に作成されるClusterRoleのうちawx-operator-metrics-readerの権限を持つトークン。
zaki@cloud-dev2:~$ kubectl get clusterrole | grep awx awx-operator-metrics-reader 2024-11-24T08:53:09Z awx-operator-proxy-role 2024-11-24T08:53:09Z
定義は以下の通りで、/metricsへのGETのアクセスが許可される内容になっている。
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: awx-operator-metrics-reader rules: - nonResourceURLs: - /metrics verbs: - get
確認用のServiceAccountを作成し、このClusterRoleを割り当てる。 CLIでやってもいいけど以下マニフェストサンプル
--- apiVersion: v1 kind: ServiceAccount metadata: namespace: default name: metrics-reader --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: namespace: default name: awx-metrics-reader-rolebinding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: awx-operator-metrics-reader subjects: - kind: ServiceAccount name: metrics-reader namespace: default --- apiVersion: v1 kind: Secret metadata: name: metrics-reader-token namespace: default annotations: kubernetes.io/service-account.name: "metrics-reader" type: kubernetes.io/service-account-token
作成されたこの(Secretリソースに保持された)トークンを認証情報としてセットしてアクセスしてみる。
zaki@cloud-dev2:~$ kubectl get secret,serviceaccount
NAME TYPE DATA AGE
secret/metrics-reader-token kubernetes.io/service-account-token 3 4s
NAME SECRETS AGE
serviceaccount/default 0 479d
serviceaccount/metrics-reader 0 4s
zaki@cloud-dev2:~$ TOKEN=$(kubectl get secret metrics-reader-token -o jsonpath='{.data.token}' | base64 -d)
zaki@cloud-dev2:~$ echo $TOKEN
eyJhbGciOiJSUzI1NiIsImtpZCI6IjZtcWVjZ0FTZHRUcE......
ここでcurl実行。
zaki@cloud-dev2:~$ kubectl exec work-pod -- curl -sk -H "Authorization: Bearer $TOKEN" https://awx-operator-controller-manager-metrics-service.awx.svc.cluster.local:8443/metrics
# HELP ansible_operator_build_info Build information for the ansible-operator binary
# TYPE ansible_operator_build_info gauge
ansible_operator_build_info{commit="d26c43bf94960d292152862a6685696be33190fb",version="v1.34.0"} 1
# HELP ansible_operator_reconcile_result Gauge of reconciles and their results.
# TYPE ansible_operator_reconcile_result gauge
ansible_operator_reconcile_result{GVK="awx.ansible.com/v1beta1, Kind=AWX",result="succeeded"} 1
:
:
zaki@cloud-dev2:~$ kubectl exec work-pod -- curl -sk -H "Authorization: Bearer $TOKEN" https://awx-operator-controller-manager-metrics-service.awx.svc.cluster.local:8443/metrics | wc -l
366
この通り、kube-rbac-proxyはKubernetes上で設定されたRBACによってアクセス制限していることが確認できた。
環境
- Kubernetes: K3s v1.33.5+k3s1
- AWX Operator: 2.19.1 (kustomizeでデプロイ)
- kube-rbac-proxy: quay.io/brancz/kube-rbac-proxy:v0.15.0
- AWX: 24.6.1
使いどころ
AWX自体のメトリクスはAWXのエンドポイント/api/v2/metricsで取得できる。(AAPだと/api/controller/v2/metrics)
AWX OperatorのメトリクスはやはりOperatorとしての情報や、あとはバックアップリストアの状態も取れ…そう?
標準構成だとClusterIP設定のServiceリソースしか作成されないことろ見ると、同一クラスターにデプロイされたPrometheusから参照するのを想定してる気がする。
RBACの設定はここには含まれてないけど、設定サンプルもAWX Operatorのリポジトリにある。
うちのクラスターはNode Exporterは入れているけどPrometheus本体は外部で動いているからね…
備忘録として、RBAC関連のエントリ