以下の内容はhttps://zaki-hmkc.hatenablog.com/entry/2026/03/15/114045より取得しました。


[AWX] K8sのRBACで認証するkube-rbac-proxyを経由したAWX Operatorのメトリクス情報の参照

先日AWXデプロイ時にkube-rbac-proxyのpullエラーが発生して代替としてquay.io/brancz/kube-rbac-proxyを使用するよう修正したが、これがそもそも何をやっているのか、という話。

github.com

最新の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)

zaki-hmkc.hatenablog.com

AWX OperatorのメトリクスはやはりOperatorとしての情報や、あとはバックアップリストアの状態も取れ…そう?

標準構成だとClusterIP設定のServiceリソースしか作成されないことろ見ると、同一クラスターにデプロイされたPrometheusから参照するのを想定してる気がする。
RBACの設定はここには含まれてないけど、設定サンプルもAWX Operatorのリポジトリにある。

github.com

うちのクラスターはNode Exporterは入れているけどPrometheus本体は外部で動いているからね…

zaki-hmkc.hatenablog.com


備忘録として、RBAC関連のエントリ

zaki-hmkc.hatenablog.com

zaki-hmkc.hatenablog.com




以上の内容はhttps://zaki-hmkc.hatenablog.com/entry/2026/03/15/114045より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14