MicroK8sのOIDC連携にCognitoを使う。
MicroK8sのインストールはこちらを参照。
CognitoのUser Poolは作成済みの前提で、クライアントを作成する。
"Create app client"をクリック。
"Application Type"は"Traditional web application"で"Name your application"にmicrok8sを入力。"Return URL"にhttp://localhost:8000 (kubeloginのコールバックURL) を設定して、"Create app client"ボタンをクリック。
(スクリーンショットはhttp://localhost:18000になっているが、http://localhost:8000の間違い。)
必須ではないが、ローカルで8000ポートが使用済みの場合ののフォールバックポートとして18000が使われるので、Callback URLにhttp://localhost:18000を追加しておいた方が無難。
"App client information"パネルから"Client ID"と"Client secret"をコピー。
User Poolの"Overview"パネルから"Token signing key URL"の/.well-known/jwks.jsonの前までのパスをコピー。
MicroK8sのControlplaneをインストールしてあるサーバーにログインして、/var/snap/microk8s/current/args/kube-apiserverを修正する。
変数は環境に合わせて修正し、次のコマンドを実行。
OIDC_ISSUER_URL=https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_tv3NHZAKO
OIDC_CLIENT_ID=3ftgo86lgdb2mb0fr0jho761q9
OIDC_USERNAME_CLAIM=email
OIDC_GROUPS_CLAIM=cognito:groups
cat <<EOF | sudo tee -a /var/snap/microk8s/current/args/kube-apiserver
--oidc-issuer-url=${OIDC_ISSUER_URL}
--oidc-client-id=${OIDC_CLIENT_ID}
--oidc-username-claim=${OIDC_USERNAME_CLAIM}
--oidc-username-prefix=oidc:
--oidc-groups-claim=${OIDC_GROUPS_CLAIM}
--oidc-groups-prefix=oidc:
EOF
MicroK8sを再起動。
sudo snap restart microk8s
Cognito上のユーザーが属している管理ユーザー用のグループがplatform-engineerとする。このグループにcluster-adminのClusterRoleを割り当てるために、次のコマンドを実行。
kubectl create clusterrolebinding cluster-admin-platform-engineer --clusterrole=cluster-admin --group=oidc:platform-engineer
https://github.com/int128/kubelogin#getting-started より、kubeloginをインストールして、次のコマンドで現在のkubectlのコンテキストにcongnitoのユーザーを追加する。
OIDC_ISSUER_URL=https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_tv3NHZAKO
OIDC_CLIENT_ID=3ftgo86lgdb2mb0fr0jho761q9
OIDC_CLIENT_SECRET=********
kubectl config set-credentials cognito \
--exec-api-version=client.authentication.k8s.io/v1beta1 \
--exec-command=kubectl \
--exec-arg=oidc-login \
--exec-arg=get-token \
--exec-arg=--oidc-issuer-url=${OIDC_ISSUER_URL} \
--exec-arg=--oidc-client-id=${OIDC_CLIENT_ID} \
--exec-arg=--oidc-client-secret=${OIDC_CLIENT_SECRET}
kubectl config set-context --current --user=cognito
次のコマンドを実行。
kubectl auth whoami
Cognitoのログイン画面が立ち上がるので、ログインする。
ログインが成功すると、
次のようにUsernameとGroupsがマッピングされる。
$ kubectl auth whoami
ATTRIBUTE VALUE
Username oidc:makingx@gmail.com
Groups [oidc:platform-engineer system:authenticated]