k8sでPod内からAPIを叩く
k8sでAPIを叩く記事をだいぶ前に書きましたが最終的にPodとして配置することになりました.
この場合はtokenをベタに書かなくてももっと手軽に認証できるので試します.
環境はk8s v1.9.3で検証しています.
Goだと下記みたいなやつをPythonでやりたいというお話です.
https://github.com/kubernetes/client-go/tree/master/examples/in-cluster-client-configuration
ちなみにexampleの中にありました.
https://github.com/kubernetes-client/python/blob/master/examples/in_cluster_config.py
ほぼ前回のGKEでAPIを利用してみると同じです.
PodからAPIを利用するためにServiceAccountが必要となるのでまずServiceAccountを作成します.
今回以下の条件で作成します
- Namespace
ns_sample - ServiceAccount
sa_sample - ClusterRole
cr_sample - ClusterRoleBinding
crb_sample
この条件でapi.ymlを作ってリソースを作成します.
1apiVersion: v1
2kind: Namespace
3metadata:
4 name: ns_sample
5
6---
7
8apiVersion: v1
9kind: ServiceAccount
10metadata:
11 name: sa_sample
12 namespace: ns_sample
13
14---
15
16kind: ClusterRole
17apiVersion: rbac.authorization.k8s.io/v1
18metadata:
19 name: cr_sample
20 namespace: magi
21
22rules:
23 - apiGroups: ["*"]
24 resources: ["*"]
25 verbs: ["*"]
26
27---
28
29kind: ClusterRoleBinding
30apiVersion: rbac.authorization.k8s.io/v1
31metadata:
32 name: crb_sample
33 namespace: ns_sample
34
35subjects:
36 - kind: ServiceAccount
37 name: sa_sample
38 namespace: ns_sample
39roleRef:
40 kind: ClusterRole
41 name: cr_sample
42 apiGroup: rbac.authorization.k8s.io
リソースを作成します
1$ kubectl create -f api.yml
各リソースの状態に関しては前回の記事を参考に確認します.
最後にこれをPodから利用します.
Pod内部からの認証は下記コードでできます.
1from kubernetes import client, config
2
3config.load_incluster_config()
このコードを実行するPodにServiceAccountを紐付ければ自動でSecretを読み込み認証が行われます.
1apiVersion: v1
2kind: Pod
3metadata:
4 name: sample
5spec:
6 serviceAccountName: sa_sample
7 containers:
8 - name: sample
9 image: sample/image
既存の認証との切り替えは環境変数にKUBERNETES_SERVICE_HOSTがあるかを基準にすると良さそうです
1if os.environ.get("KUBERNETES_SERVICE_HOST"):
2 configuration = config.load_incluster_config()