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()