Slide 1

Slide 1 text

機密 <会社名> 専用 バージョン 1.0 Kubernetes APIに Pod内からアクセスしてみた

Slide 2

Slide 2 text

自己紹介 ry (@URyo_0213) インフラエンジニア 主な仕事内容: - Storageの導入・設定 (+ 自動化) - 社内app作成 - 社内app基盤の運用・管理 (kubernetes with PKS)

Slide 3

Slide 3 text

機密 <会社名> 専用 バージョン 1.0 1. 今日学ぶこと 2. まず初めに 3. Practice 4. まとめ Agenda

Slide 4

Slide 4 text

今日学ぶこと

Slide 5

Slide 5 text

今日学ぶこと 1 RBACについて 2 Pod内からKubernetes APIを叩く方法

Slide 6

Slide 6 text

まず初めに

Slide 7

Slide 7 text

Kubernetes API Kubernetesを操作する際の指示を受け取る口。 CLIツールである「kubectl」や、yaml形式で書かれた「manifest」 を用いた先では、このAPIを叩いています。

Slide 8

Slide 8 text

Kubernetes API へのアクセス クライアントからのアクセスが入ると、 ・Authentication(認証) アクセスが許可されているかを判断 ・Authorization(認可) 処理の権限を持っているのかを判断 ・Admission Control(リクエスト制御) そのリクエストを受け入れるのかを判断 Authorization Authentication Client Admission Control Excecute

Slide 9

Slide 9 text

PodからAPIを叩くために必要なもの 1 Service Account 2 Role / Cluster Role 3 Role Binding / Cluster Role Binding

Slide 10

Slide 10 text

Service Account 01 kubernetes内で管理され、認証情報をPodに割り当てるリソース 特徴: ・Nampespaceに紐づく。 ・1つ1つに「Token」と「証明書」が割り当てられる。 ・Pod起動時にService Accountを必ず1つ割り当てる必要がある。  (指定しない場合、default service accountが割り当てられる)

Slide 11

Slide 11 text

Service Account Token

Slide 12

Slide 12 text

Service Account Token による認証 1 HTTPリクエスト時、Service Account tokenをHeaderにいれる 2 Kubernetesは、どのService Accountを使用しているかを認識 3 認証をpassする

Slide 13

Slide 13 text

Service Account による認可 (RBAC) Role Role Binding Service Account Cluster Role Cluster Role Binding Service Account どういった操作を許可するのかを定めた Roleを作成し、Service Accountに対して RoleBindingを用いてRoleを紐づけることで権限を管理します。

Slide 14

Slide 14 text

Role / Cluster Role 02 付与する権限を指定するリソース Role vs Cluster Role ここの違いは、Namespaceを跨げるかどうかです。 Cluster Roleは、Namespaceを跨いでCluster単位でリクエスト権限を与えることができま す。

Slide 15

Slide 15 text

Role / Cluster Role 設定フィールド rulesにリスト形式で指定。 基本は以下の3つを指定していく。 ・apiGroups リソースが含まれている APIのグループを指定 ・resources このルールを適用するリソースを指定 ・verbs 指定したリソースに対して行う操作を指定 apiGroups resources create 作成 get / list 取得 / 一覧取得 delete 削除 update 更新 patch 一部変更 watch 変更の追跡 verbs

Slide 16

Slide 16 text

Role / Cluster Role manifest例 https://kubernetes.io/docs/reference/access-authn-authz/rbac/#command-line-utilities

Slide 17

Slide 17 text

Role Binding / Cluster Role Binding 03 RoleとService Account等を紐付けるリソース。 Role BindingとCluster Role Bindingの違いは、 Roleと同様、Namespaceを跨げるかどうかです。

Slide 18

Slide 18 text

Role Binding / Cluster Role Binding manifest例

Slide 19

Slide 19 text

Practice

Slide 20

Slide 20 text

PodからAPIを叩くまでの準備 1 Service Account作成 2 Role / Cluster Role作成 3 Role Binding / Cluster Role Binding作成 4 Pod作成 5 Pod Setup

Slide 21

Slide 21 text

ちょっとその前に!! 今回のAPI 検証用のNamespaceを作成します。 # kubectl create ns apitest

Slide 22

Slide 22 text

Service Account作成 $ kubectl create sa admin-sa -n apitest $ kubectl get sa -n apitest NAME SECRETS AGE admin-sa 1 9s default 1 6m11s

Slide 23

Slide 23 text

Cluster Role作成 $ kubectl apply -f cluster-role.yaml -n apitest $ kubectl get clusterrole -n apitest \ |grep admin-role admin-role 98s

Slide 24

Slide 24 text

Cluster Role Binding作成 $ kubectl apply -f cluster-role.yaml -n apitest $ kubectl get clusterrolebinding -n apitest \ |grep admin-rolebinding admin-rolebinding 63s

Slide 25

Slide 25 text

Pod作成 $ kubectl apply -f pod.yaml -n apitest $ kubectl get pod -n apitest NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 2s

Slide 26

Slide 26 text

Podの中を見てみる Podに接続していきます。 $ kubectl exec -it nginx -- /bin/bash root@nginx:/#

Slide 27

Slide 27 text

環境変数 ・API アクセス先 KUBERNETES_PORT_443_TCP_ADDR KUBERNETES_PORT_443_TCP_PORT

Slide 28

Slide 28 text

Token Service AccountのTokenは /var/run/secrets/kubernetes.io/serviceaccount/token に格納されています。

Slide 29

Slide 29 text

ca.crt APIにアクセスする際に用いる証明書は /var/run/secrets/kubernetes.io/serviceaccount/ca.crt に格納されています。

Slide 30

Slide 30 text

Set up APIにアクセスする際に必要なパラメータを環境変数に仕込んでおきます。

Slide 31

Slide 31 text

Set up 必要なmoduleをダウンロードしておきます。 # apt update # apt install -y curl # apt install -y vim APIへアクセスできるか確認してみましょう。 # curl -H "Authorization: Bearer $TOKEN" --cacert $CACERT https://$k8s/healthz ok

Slide 32

Slide 32 text

Deploymentの作成 APIに送るjsonファイルを作成しましょう。 # vi deployment.json

Slide 33

Slide 33 text

Deploymentの作成 APIにjsonファイルを送ります。 # curl -X POST -H "Authorization:Bearer $TOKEN" \ --cacert $CACERT -H 'Content-Type:application/json' \ -d @deployment.json https://$k8s/apis/apps/v1/namespaces/apitest/deployments apiGroup Namespace resoure

Slide 34

Slide 34 text

Deploymentの作成 適切なRBAC設定を行っていない場合、

Slide 35

Slide 35 text

Deploymentの確認 別terminalから確認します。 $ kubectl get pods -n apitest NAME READY STATUS RESTARTS AGE apitest-nginx-78478c4bdc-27v7p 1/1 Running 0 50s apitest-nginx-78478c4bdc-v4fsl 1/1 Running 0 50s apitest-nginx-78478c4bdc-wjzn9 1/1 Running 0 50s nginx 1/1 Running 0 55m

Slide 36

Slide 36 text

Deploymentの確認 APIからも確認できます。 # curl -X GET -H "Authorization:Bearer $TOKEN" \ --cacert $CACERT \ https://$k8s/apis/apps/v1/namespaces/apitest/deployments/apitest-nginx

Slide 37

Slide 37 text

Deploymentの確認 APIでの確認結果 (長いので、途中まで)

Slide 38

Slide 38 text

Deploymentの削除 # curl -X DELETE -H "Authorization:Bearer $TOKEN" \ --cacert $CACERT \ https://$k8s/apis/apps/v1/namespaces/apitest/deployments/apitest-nginx 成功時のstdout

Slide 39

Slide 39 text

まとめ

Slide 40

Slide 40 text

まとめ 1 RBACについては以下の3リソースを用いる。 Service Account, (Cluster)Role, (Cluster)Role Binding 2 Pod内からは、指定したService Account の情報を使って Kubernetes APIを叩くことができる。

Slide 41

Slide 41 text

Thank you