機密 <会社名> 専用 バージョン 1.0Kubernetes APIにPod内からアクセスしてみた
View Slide
自己紹介ry (@URyo_0213)インフラエンジニア主な仕事内容:- Storageの導入・設定 (+ 自動化)- 社内app作成- 社内app基盤の運用・管理 (kubernetes with PKS)
機密 <会社名> 専用 バージョン 1.01. 今日学ぶこと2. まず初めに3. Practice4. まとめAgenda
今日学ぶこと
今日学ぶこと1 RBACについて2 Pod内からKubernetes APIを叩く方法
まず初めに
Kubernetes APIKubernetesを操作する際の指示を受け取る口。CLIツールである「kubectl」や、yaml形式で書かれた「manifest」を用いた先では、このAPIを叩いています。
Kubernetes API へのアクセスクライアントからのアクセスが入ると、・Authentication(認証)アクセスが許可されているかを判断・Authorization(認可)処理の権限を持っているのかを判断・Admission Control(リクエスト制御)そのリクエストを受け入れるのかを判断AuthorizationAuthenticationClientAdmission ControlExcecute
PodからAPIを叩くために必要なもの1 Service Account2 Role / Cluster Role3 Role Binding / Cluster Role Binding
Service Account01kubernetes内で管理され、認証情報をPodに割り当てるリソース特徴:・Nampespaceに紐づく。・1つ1つに「Token」と「証明書」が割り当てられる。・Pod起動時にService Accountを必ず1つ割り当てる必要がある。 (指定しない場合、default service accountが割り当てられる)
Service Account Token
Service Account Token による認証1 HTTPリクエスト時、Service Account tokenをHeaderにいれる2 Kubernetesは、どのService Accountを使用しているかを認識3 認証をpassする
Service Account による認可 (RBAC)Role Role Binding Service AccountCluster Role Cluster Role Binding Service Accountどういった操作を許可するのかを定めた Roleを作成し、Service Accountに対してRoleBindingを用いてRoleを紐づけることで権限を管理します。
Role / Cluster Role02付与する権限を指定するリソースRole vs Cluster Roleここの違いは、Namespaceを跨げるかどうかです。Cluster Roleは、Namespaceを跨いでCluster単位でリクエスト権限を与えることができます。
Role / Cluster Role設定フィールドrulesにリスト形式で指定。基本は以下の3つを指定していく。・apiGroupsリソースが含まれている APIのグループを指定・resourcesこのルールを適用するリソースを指定・verbs指定したリソースに対して行う操作を指定apiGroupsresourcescreate 作成get / list 取得 / 一覧取得delete 削除update 更新patch 一部変更watch 変更の追跡verbs
Role / Cluster Rolemanifest例https://kubernetes.io/docs/reference/access-authn-authz/rbac/#command-line-utilities
Role Binding /Cluster Role Binding03RoleとService Account等を紐付けるリソース。Role BindingとCluster Role Bindingの違いは、Roleと同様、Namespaceを跨げるかどうかです。
Role Binding /Cluster Role Bindingmanifest例
Practice
PodからAPIを叩くまでの準備1 Service Account作成2 Role / Cluster Role作成3 Role Binding / Cluster Role Binding作成4 Pod作成5 Pod Setup
ちょっとその前に!!今回のAPI 検証用のNamespaceを作成します。# kubectl create ns apitest
Service Account作成$ kubectl create sa admin-sa -n apitest$ kubectl get sa -n apitestNAME SECRETS AGEadmin-sa 1 9sdefault 1 6m11s
Cluster Role作成$ kubectl apply -f cluster-role.yaml -n apitest$ kubectl get clusterrole -n apitest \|grep admin-roleadmin-role 98s
Cluster Role Binding作成$ kubectl apply -f cluster-role.yaml -n apitest$ kubectl get clusterrolebinding -n apitest \|grep admin-rolebindingadmin-rolebinding 63s
Pod作成$ kubectl apply -f pod.yaml -n apitest$ kubectl get pod -n apitestNAME READY STATUS RESTARTS AGEnginx 1/1 Running 0 2s
Podの中を見てみるPodに接続していきます。$ kubectl exec -it nginx -- /bin/bashroot@nginx:/#
環境変数・API アクセス先KUBERNETES_PORT_443_TCP_ADDRKUBERNETES_PORT_443_TCP_PORT
TokenService AccountのTokenは/var/run/secrets/kubernetes.io/serviceaccount/tokenに格納されています。
ca.crtAPIにアクセスする際に用いる証明書は/var/run/secrets/kubernetes.io/serviceaccount/ca.crtに格納されています。
Set upAPIにアクセスする際に必要なパラメータを環境変数に仕込んでおきます。
Set up必要なmoduleをダウンロードしておきます。# apt update# apt install -y curl# apt install -y vimAPIへアクセスできるか確認してみましょう。# curl -H "Authorization: Bearer $TOKEN" --cacert $CACERT https://$k8s/healthzok
Deploymentの作成APIに送るjsonファイルを作成しましょう。# vi deployment.json
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/deploymentsapiGroup Namespace resoure
Deploymentの作成適切なRBAC設定を行っていない場合、
Deploymentの確認別terminalから確認します。$ kubectl get pods -n apitestNAME READY STATUS RESTARTS AGEapitest-nginx-78478c4bdc-27v7p 1/1 Running 0 50sapitest-nginx-78478c4bdc-v4fsl 1/1 Running 0 50sapitest-nginx-78478c4bdc-wjzn9 1/1 Running 0 50snginx 1/1 Running 0 55m
Deploymentの確認APIからも確認できます。# curl -X GET -H "Authorization:Bearer $TOKEN" \--cacert $CACERT \https://$k8s/apis/apps/v1/namespaces/apitest/deployments/apitest-nginx
Deploymentの確認APIでの確認結果(長いので、途中まで)
Deploymentの削除# curl -X DELETE -H "Authorization:Bearer $TOKEN" \--cacert $CACERT \https://$k8s/apis/apps/v1/namespaces/apitest/deployments/apitest-nginx成功時のstdout
まとめ
まとめ1 RBACについては以下の3リソースを用いる。Service Account, (Cluster)Role, (Cluster)Role Binding2 Pod内からは、指定したService Account の情報を使ってKubernetes APIを叩くことができる。
Thank you