Cloud Penguins

Flying penguins in the cloud.

Auth0でTKGのクラスタを認証できるようにする

TKGでは、認証に外部Identity Provider(IdP)を利用することができる。TKG1.3以降はPinnipedというコンポーネントが含まれており、これが外部IdPを担った認証を行うようになっている。

Pinnipedについては星野さんのCNDO2021の発表が参考になるので興味のある方は是非。

event.cloudnativedays.jp

OpenID Connectを使った認証はTKGのドキュメントに記載があるのだけど、これはOktaを使った説明になっている。 自分は普段Auth0をIdPとして使っており(CNDT/CNDOもAuth0)、そちらを使ったログインをやりたいなと思い、今回の記事を書くことにした。

なおOkta/Auth0に限らずOpenID ConnectなIdPであれば似たような設定で利用可能だと思うので、適宜読み替えて活用してもらえれば。

Management Clusterの構築手順

これ以降の解説はTKG1.3.1 を前提とする。

Management Clusterを作る

Management Clusterの作り方は、1点を除き通常とほぼ変わりなし。今回はUIを使って構築してみる。

$ tanzu management-cluster create --ui

f:id:jaco-m:20210530141517p:plain いつもの画面。今回はvSphereを使うが、認証周りについてはEC2でもAzureでも同じだと思われる。

f:id:jaco-m:20210530141623p:plain Iaas Providerの設定は通常と変わらず。各自利用している環境に合わせて変更。

f:id:jaco-m:20210530141705p:plain Management Cluster Settings。ここも通常と変わらないが、 CONTROL PLANE ENDPOINT の値だけちゃんとメモしておくこと。後で使います。

この後 6. Kubernetes Networkまでは通常と一緒なので割愛。

次に7. Identity Management。ここが一番のポイント。一旦TKG側の設定はここで止めておいて、Auth0の設定に入る。

Auth0の設定をする

auth0.com Auth0にログインをする。アカウントを持っていない方は新規登録しておきましょう。今回の用途くらいであれば無料の範囲内で利用可能。

f:id:jaco-m:20210530142544p:plain ログインしたら、Applications-> Create Applicationをクリック。

f:id:jaco-m:20210530142651p:plain Nameは任意の名前を。application typeはRegular Web Applicationsを選ぶ。

f:id:jaco-m:20210530143203p:plain 次にアプリケーションの設定にはいるが、すこし下にスクロールしたところにあるApplication URIsのAllowed Callback URIsに https://<Control PlaneのIP>:31234/callback を入れる。IPには先ほど控えたControl Planeの値を。これが出来たら一旦Save。

TKGのOIDCの設定をする

Auth0の画面を開いたままTKGの画面に戻る。 f:id:jaco-m:20210530143847p:plain Identity Managementの項目に、Auth0の値を転記していく。

  • ISSUER URL - http://<Auth0 appのDomain>/
    • https:// および 末尾のスラッシュを忘れないこと。これを忘れるとログインが失敗する
  • CLIENT ID - Auth0のClient ID
  • CLIENT SECRET - Auth0のClient Secret
  • SCOPES - openid,groups,email
  • USERNAME CLAIM - どの値をUsernameとして扱うか。今回は email を指定
  • GROUPS CLAIM - どの値をGroupとして扱うか。今回は groups を指定

入れ終わったらNEXTをクリック。残りの設定は通常のクラスタ作成と変わらない。

f:id:jaco-m:20210530144528p:plain 全ての設定が終わったらインストールを開始。しばらく待ち。

Management Clusterの設定

Management Clusterの設定が終わったら、次は tanzu コマンドを使ってadminのkubeconfigを取得。この段階ではOIDC認証は使っていない。

$ tanzu management-cluster kubeconfig get --admin
Credentials of cluster 'demo' have been saved
You can now access the cluster by running 'kubectl config use-context demo-admin@demo'
$ kubectl config use-context demo-admin@demo
Switched to context "demo-admin@demo".

Pinniped周りのPodが正しく上がっているかを確認。この段階で何らしかのErrorが発生していたら、コンフィグを間違っている可能性があるので kubectl logs などを使って確認する。

$ kubectl get all -n pinniped-supervisor
NAME                                      READY   STATUS      RESTARTS   AGE
pod/pinniped-post-deploy-job-bfzhn        0/1     Completed   0          3m4s
pod/pinniped-supervisor-f5dd7d547-pbxbd   1/1     Running     0          2m20s
pod/pinniped-supervisor-f5dd7d547-xjw8l   1/1     Running     0          2m20s

NAME                          TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
service/pinniped-supervisor   NodePort   100.65.72.169   <none>        443:31234/TCP   3m4s

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/pinniped-supervisor   2/2     2            2           3m4s

NAME                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/pinniped-supervisor-f5dd7d547   2         2         2       3m4s

NAME                                 COMPLETIONS   DURATION   AGE
job.batch/pinniped-post-deploy-job   1/1           44s        3m4s

次に、OIDC経由のユーザーにClusterRoleを付与する。今回はManagement Clusterの全権を付与したいので、cluster-admin をユーザーにつける。ユーザーに与える権限を絞りたい場合は、ここで別のClusterRoleやRoleをbindingすれば良い

$ kubectl create clusterrolebinding cluster-admin-jacopen --clusterrole cluster-admin --user jacopen@gmail.com
clusterrolebinding.rbac.authorization.k8s.io/cluster-admin-jacopen created

終わったら、OIDCで認証するためのkubeconfigを出力する。今回は /tmp/mgmt_oidc_kubeconfig に出力している

$ tanzu management-cluster kubeconfig get --export-file /tmp/mgmt_oidc_kubeconfig
You can now access the cluster by running 'kubectl config use-context tanzu-cli-demo@demo' under path '/tmp/mgmt_oidc_kubeconfig'

出力したkubeconfigを使ってリソースを取得してみる。

kubectl --kubeconfig /tmp/mgmt_oidc_kubeconfig get all

すると、自動的にブラウザが立ち上がってAuth0の認証画面に飛ばされるので、Auth0に設定してある認証手段(user/pass, Google, GitHubなど)を利用してログイン。すると、ブラウザには以下のように表示され、kubectl側では無事にレスポンスが帰ってきているはず。

f:id:jaco-m:20210530155644p:plain

これで無事Management ClusterをOIDCのユーザー経由で利用できるようになった。

OIDC経由のユーザーでtanzuコマンドを利用できるようにする

OIDC経由のユーザーをcluster-adminにしたので、そのユーザーを使ってtanzuコマンドからclusterの作成等が可能になる。

環境を分けるために別ユーザーを作成の後、 tanzu login --endpoint "https://<Management Cluster IP>:6443" --name <Management Cluster名> を実行。

すると自動的にブラウザが立ち上がり、Auth0での認証が行われる。認証が通れば以下ののようになる。

$ tanzu login --endpoint "https://10.9.11.103:6443" --name demo
✔  successfully logged in to management cluster using the kubeconfig demo
$ tanzu management-cluster get
  NAME  NAMESPACE   STATUS   CONTROLPLANE  WORKERS  KUBERNETES        ROLES
  demo  tkg-system  running  1/1           1/1      v1.20.5+vmware.1  management


Details:

NAME                                                     READY  SEVERITY  REASON  SINCE  MESSAGE
/demo                                                    True                     113m
├─ClusterInfrastructure - VSphereCluster/demo            True                     113m
├─ControlPlane - KubeadmControlPlane/demo-control-plane  True                     113m
│ └─Machine/demo-control-plane-kp9pv                     True                     113m
└─Workers
  └─MachineDeployment/demo-md-0
    └─Machine/demo-md-0-86cb4697d7-sm8p8                 True                     113m


Providers:

  NAMESPACE                          NAME                    TYPE                    PROVIDERNAME  VERSION  WATCHNAMESPACE
  capi-kubeadm-bootstrap-system      bootstrap-kubeadm       BootstrapProvider       kubeadm       v0.3.14
  capi-kubeadm-control-plane-system  control-plane-kubeadm   ControlPlaneProvider    kubeadm       v0.3.14
  capi-system                        cluster-api             CoreProvider            cluster-api   v0.3.14
  capv-system                        infrastructure-vsphere  InfrastructureProvider  vsphere       v0.7.7

tanzuコマンドを使ってManagement clusterの情報を得ることができた。