0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Kubernetes/MinikubeでService Account Tokenを試してみる

Posted at

はじめに

Kubernetesを学習している。過去に用意された資料でAuthn/Authz/RBACなどについて学んでいたがServiceAccountを用意してもv1.24以降デフォルトでSecretを生成しなくなった様でつまづいたのでその対応メモ。

ハンズオンや勉強資料としてKubeKubernetes道場 Advent Calendar 2018での手順を元にした。今はもう2025年だが…。

なお私が確認した環境は

  • minikube v1.35.0
  • k8s v1.32.0

手順

ServiceAccountの作成

まずアカウント名をtest-saとしてServiceAccountを作成する

$ kubectl create sa test-sa
serviceaccount/test-sa created

どんな感じにできたか確認してみる。

$ kubectl get sa/test-sa -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: "2025-01-28T00:09:09Z"
  name: test-sa
  namespace: default
  resourceVersion: "414"
  uid: 7a0f0bb6-1714-4193-99c0-553d7375a9ff

以前はここに次のようなsecretのエントリーがあり、

secrets:
- name: test-sa-token-XXXX

自動でTokenが作られていた様だが、現在はこれがなくTokenを作成してくれなくなったとの事。

そこで、次の方法でSecretを作成する。

Secret Tokenの作成

次の様なManifestを用意し、

apiVersion: v1
kind: Secret
metadata:
  name: test-sa-secret
  annotations:
    kubernetes.io/service-account.name: test-sa
type: kubernetes.io/service-account-token

適用する。

$ kubectl apply -f sa-secret.yaml 
secret/test-sa-secret created

ServiceAccountにTokenができた様子。

$ kubectl describe sa/test-sa
Name:                test-sa
Namespace:           default
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   <none>
Tokens:              test-sa-secret
Events:              <none>

実際のSecretの内容を見てみるとTokenができている。

$ kubectl get secret/test-sa-secret -o yaml
apiVersion: v1
data:
  ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCakNDQWU2Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwdGFXNXAKYTNWaVpVTkJNQjRYRFRJMU1ERXhPVEF3TVRreE1Wb1hEVE0xTURFeE9EQXdNVGt4TVZvd0ZURVRNQkVHQTFVRQpBeE1LYldsdWFXdDFZbVZEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTndhCnNaaXR4Z3ZkRmNSVExNZERrRUpEMmNTVDkvem9XWnNGMGV3T1dEVVFZMVlwbmF3bUlBTG9HSlpyaUZTQktFeTcKNnhwQVJoMlhJQ29JbnFYN1R4UGljZXRxMjJ5b2k2RFNhVXY1S3p0TlFRd2tnWjY5Z3MxUWt5T2JNN2pTTmtQTApnUmF5NHJOYXNtWnE0NFdhQlZUc0VlcDdKOTNTam1aNnY3bzhycUZYUWlrbVlJUXhQcnpUQmFPZVF4Y2JuYk91CnViMW5teW5ENmMyNFVJdDc2ay92U1R0Z3I4aEdycXZHZ0NRSGJGL1VMaHhvcG5nT2MrekdsREs5WEx1NFN2VHcKMmZpVGVnYm01Y3g1TGR0amt1ak5kMXMxaXlCbnFJRWFVMGQ5S2ttaDNTbUhSYldGZUV0MGo3U2h0RmQzY3dUZwpNQzhZUkpZNVZKdEJGSFJlTlhVQ0F3RUFBYU5oTUY4d0RnWURWUjBQQVFIL0JBUURBZ0trTUIwR0ExVWRKUVFXCk1CUUdDQ3NHQVFVRkJ3TUNCZ2dyQmdFRkJRY0RBVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVcKQkJTYTFMNkRIaktVL200T1lZdUdqK2wwNjFiZy96QU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUF4NkM1QkI2VgpsS2tFRm5KZkxuSmU5cWd5WmRTcWFqUEJycE9qN0dQbzRXYTA2ZjVJRHp5V1g1NHB4ZVVDdC9heENEcXVRbUR4CnlCczZ4VGg0cU9tM20vN0p3TGRPK2tKbXJaREplbFRyK3pKK1Q1blJ0Ti9ZK0tiV25MRXkvd3BiNm5VWWw2UUEKczlQbHAzaVZESWJSOE96QkQrWXNFVElQRlVtSU1QWm5aekE2L3JreGprTEhCc041L3VDMnNJU3laQ0txOEk0RgpPclZCdHlOUG4yVGJLSmVablBmZnNaOGppT0JWRS95Zm1OMWw5QTNnVzVjbUlPOE1LZ3dNNkVJbjVKM2FwcmRhCmZ3WTJ6ZlFmU2xFdFhlY3hqSHFiSEdDdFFZcFJRVWV0d2NEeGxXOTFBT0Jjb0FZWDdqdk5VQmtlOGY4K2g0cGEKRXB6cHNoRDlwUEE3NEE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
  namespace: ZGVmYXVsdA==
  token: ZXlKaGJHY2lPaUpTVXpJMU5pSXNJbXRwWkNJNklrZDFZWFpqVmxwMFlWOXFVRVJMT1hBdFJYUjFUVVZqV1ZWdFdFSlVieTEyYlVnNWJVNVVTa0ZwUlRRaWZRLmV5SnBjM01pT2lKcmRXSmxjbTVsZEdWekwzTmxjblpwWTJWaFkyTnZkVzUwSWl3aWEzVmlaWEp1WlhSbGN5NXBieTl6WlhKMmFXTmxZV05qYjNWdWRDOXVZVzFsYzNCaFkyVWlPaUprWldaaGRXeDBJaXdpYTNWaVpYSnVaWFJsY3k1cGJ5OXpaWEoyYVdObFlXTmpiM1Z1ZEM5elpXTnlaWFF1Ym1GdFpTSTZJblJsYzNRdGMyRXRjMlZqY21WMElpd2lhM1ZpWlhKdVpYUmxjeTVwYnk5elpYSjJhV05sWVdOamIzVnVkQzl6WlhKMmFXTmxMV0ZqWTI5MWJuUXVibUZ0WlNJNkluUmxjM1F0YzJFaUxDSnJkV0psY201bGRHVnpMbWx2TDNObGNuWnBZMlZoWTJOdmRXNTBMM05sY25acFkyVXRZV05qYjNWdWRDNTFhV1FpT2lKa05qWXhZV1ppTmkwell6SmtMVFJrTW1FdFlXWXpaaTAwT0RVNU1XWXlPVGRrTW1VaUxDSnpkV0lpT2lKemVYTjBaVzA2YzJWeWRtbGpaV0ZqWTI5MWJuUTZaR1ZtWVhWc2REcDBaWE4wTFhOaEluMC5kVjBYRV90Z3RrRGhHOW9rUmsxc25wMUFFbkROZU0wMWJxOUdBaUxGd3FFSzBGZ0oycVk2TjRUR1M4S0RXSFRUUGZLbFprX0hpZE5jdzZKckdma3FWY09MRTVnbzhpRHJQSk1QUXgtcHF5OHdqNXZxU0RkQU9UUHVYOEg2bkkyLXRWRXJ1WWhwUGUtXzVqWEpCTklFQTZCNnJTbzRyYkR3QUozTzZnSEYtSTVXbHY3bFllcUlYUUJUNkxXcXlIU2VLRTZaMWowS1FZVVk5ZXp3cldjNE44Zy1vY1E3QXVYZE13S2hzcTYzZUhlOEM5b3NrUFFkQnpTQnZrQ1JpMVJibEJxWHR1aTE0bzRzajVia1ktUW84LTZFa01DdGNHZWlheGdIY29SNGE1Rk1sMGFLRFI1VjJKak5XQUJTOHREc2IzX3BlUHJEbkNtZmRlUk5MWVFLOGc=
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Secret","metadata":{"annotations":{"kubernetes.io/service-account.name":"test-sa"},"name":"test-sa-secret","namespace":"default"},"type":"kubernetes.io/service-account-token"}
    kubernetes.io/service-account.name: test-sa
    kubernetes.io/service-account.uid: d661afb6-3c2d-4d2a-af3f-48591f297d2e
  creationTimestamp: "2025-01-28T01:07:15Z"
  labels:
    kubernetes.io/legacy-token-last-used: "2025-01-28"
  name: test-sa-secret
  namespace: default
  resourceVersion: "1152"
  uid: 48461965-40a1-4356-99d8-0360467bd408
type: kubernetes.io/service-account-token

data.tokenはBase64エンコードされているのでデコードすると実際のTokenが得られる。

とりあえずコピペで行うと…

$ echo -n 'ZXlKaGJHY2lPaUp.....<snip>' | base64 -d
eyJhbGciOiJ.....<snip>

後でCredential設定で使用するので環境変数に格納しておく。ワンライナーで書くと次の感じ。

$ TEST_SA_TOKEN=$(kubectl get secret/test-sa-secret -o jsonpath='{.data.token}' | base64 -d)
$ echo $TEST_SA_TOKEN
eyJhbGciOiJ.....<snip>

Contextの設定

上記までの操作でContext自体は出来ている模様。

$ kubectl config get-contexts 
CURRENT   NAME              CLUSTER          AUTHINFO         NAMESPACE
          docker-desktop    docker-desktop   docker-desktop   
*         minikube          minikube         minikube         default
          test-sa-context   minikube         test-sa  

しかしこのContextに切り替えても

$ kubectl config use-context test-sa-context
Switched to context "test-sa-context".

ログインしてない/CredentialにTokenが設定されていないので拒否される。

$ kubectl get po
error: You must be logged in to the server (Unauthorized)

一旦、デフォルトのminikubeに戻す

$ kubectl config use-context minikube
Switched to context "minikube".

先ほど環境変数に入れていたTokenをCredentialに設定

$ kubectl config set-credentials test-sa --token $TEST_SA_TOKEN  
User "test-sa" set.

Contextを切り替え確認

$ kubectl config use-context test-sa-context
Switched to context "test-sa-context".

Podを取得してみる

$ kubectl get po
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:default:test-sa" cannot list resource "pods" in API group "" in the namespace "default"

作成したServiceAccountで認証はされたがPodを取得する権限がないのでエラーとなる。

この先はRBACなどの話なのでここでは触れない(RBAC設定する前にkubectl config use-context minikubeしよう)。

次の記事を参考にすると良さそう(というかこの記事を読んでServiceAccountとTokenの仕様が変わったので調べながらこの記事を書いている)。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?