既存のTanzu Kubernetes Grid環境に Pinniped を有効する方法のメモ。
Pinnipedを導入することで、tanzu CLIさえ用意すればどこからでもTKGのクラスタにアクセスできるようになります。
TKG 1.3以降で新規作成する場合は、最初から設定しておくと良いですが、1.2以前からアップデートした場合はこの手順が必要です。
ドキュメントは こちら 。
TKG 1.3.1-patch1で検証しています。
目次
Management ClusterにPinnipedをインストール
Pinnipedは Kapp Controller のAppリソース経由でインストールされます。
事前のAppリソースを確認します。pinnipedがいません。
$ kubectl get app -n tkg-system
NAME DESCRIPTION SINCE-DEPLOY AGE
antrea Reconcile succeeded 2m2s 110d
metrics-server Reconcile succeeded 2m37s 110d
tanzu-addons-manager Reconcile succeeded 2m31s 111d
vsphere-cpi Reconcile succeeded 2m41s 87d
vsphere-csi Reconcile succeeded 2m36s 110d
pinnepdをインストールするためのYAMLをtanzu CLIで生成します。
ここでは認証にLDAPを使用します。
export IDENTITY_MANAGEMENT_TYPE=ldap
export LDAP_BIND_DN=cn=admin,dc=example,dc=com
export LDAP_BIND_PASSWORD=password
export LDAP_HOST=ldap.example.com:636
export LDAP_USER_SEARCH_BASE_DN=ou=people,dc=exmple,dc=com
export LDAP_USER_SEARCH_FILTER=
export LDAP_USER_SEARCH_USERNAME=cn
export LDAP_USER_SEARCH_ID_ATTRIBUTE=cn
export LDAP_USER_SEARCH_EMAIL_ATTRIBUTE=mail
export LDAP_USER_SEARCH_NAME_ATTRIBUTE=cn
export LDAP_GROUP_SEARCH_BASE_DN=ou=groups,dc=example,dc=com
export LDAP_GROUP_SEARCH_FILTER=
export LDAP_GROUP_SEARCH_USER_ATTRIBUTE=DN
export LDAP_GROUP_SEARCH_GROUP_ATTRIBUTE=uniqueMember
export LDAP_GROUP_SEARCH_NAME_ATTRIBUTE=cn
export LDAP_ROOT_CA_DATA_B64=
export CLUSTER_NAME=carrot
export NAMESPACE=tkg-system
export CLUSTER_PLAN=dev
export VSPHERE_CONTROL_PLANE_ENDPOINT=dummy
export _TKG_CLUSTER_FORCE_ROLE=management
export FILTER_BY_ADDON_TYPE=authentication/pinniped
tanzu cluster create ${CLUSTER_NAME} --dry-run
次のようなSecretが生成されます。
apiVersion: v1
kind: Secret
metadata:
annotations:
tkg.tanzu.vmware.com/addon-type: authentication/pinniped
labels:
clusterctl.cluster.x-k8s.io/move: ""
tkg.tanzu.vmware.com/addon-name: pinniped
tkg.tanzu.vmware.com/cluster-name: carrot
name: carrot-pinniped-addon
namespace: tkg-system
stringData:
values.yaml: |
#@data/values
#@overlay/match-child-defaults missing_ok=True
---
infrastructure_provider: vsphere
tkg_cluster_role: management
custom_cluster_issuer: ""
custom_tls_secret: ""
http_proxy: ""
https_proxy: ""
no_proxy: ""
identity_management_type: ldap
pinniped:
cert_duration: 2160h
cert_renew_before: 360h
supervisor_svc_endpoint: https://0.0.0.0:31234
supervisor_ca_bundle_data: ca_bundle_data_of_supervisor_svc
supervisor_svc_external_ip: 0.0.0.0
supervisor_svc_external_dns: null
upstream_oidc_client_id: ""
upstream_oidc_client_secret: ""
upstream_oidc_issuer_url: https://0.0.0.0:30167
upstream_oidc_tls_ca_data: ca_bundle_data_of_dex_svc
upstream_oidc_additional_scopes:
- email
- profile
- groups
upstream_oidc_claims:
username: name
groups: groups
dex:
app: dex
create_namespace: true
namespace: tanzu-system-auth
organization: vmware
commonname: tkg-dex
config:
connector: ldap
frontend:
theme: tkg
web:
https: 0.0.0.0:5556
tlsCert: /etc/dex/tls/tls.crt
tlsKey: /etc/dex/tls/tls.key
expiry:
signingKeys: 90m
idTokens: 5m
authRequests: 90m
deviceRequests: 5m
logger:
level: info
format: json
staticClients:
- id: pinniped
redirectURIs:
- https://0.0.0.0/callback
name: pinniped
secret: dummyvalue
ldap:
host: ldap.example.com:636
insecureNoSSL: false
startTLS: null
rootCA: null
rootCAData: ""
bindDN: cn=admin,dc=example,dc=com
BIND_PW_ENV_VAR: password
usernamePrompt: LDAP Username
insecureSkipVerify: false
userSearch:
baseDN: ou=people,dc=exmple,dc=com
filter: ""
username: cn
idAttr: cn
emailAttr: mail
nameAttr: cn
scope: sub
groupSearch:
baseDN: ou=groups,dc=example,dc=com
filter: ""
nameAttr: cn
scope: sub
userMatchers:
- userAttr: DN
groupAttr: uniqueMember
oauth2:
skipApprovalScreen: true
responseTypes:
- code
storage:
type: kubernetes
config:
inCluster: true
enablePasswordDB: false
service:
name: dexsvc
type: null
deployment:
replicas: 1
certificate:
duration: 2160h
renewBefore: 360h
dns:
vsphere:
dnsNames:
- tkg-dex.com
ipAddresses:
- 0.0.0.0
aws:
dnsNames:
- tkg-dex.com
DEX_SVC_LB_HOSTNAME: example.com
azure:
dnsNames:
- tkg-dex.com
DEX_SVC_LB_HOSTNAME: dex.example.com
type: tkg.tanzu.vmware.com/addon
問題がなければkubectl applyでManagement Clusterに対して適用します。
kubectl config use-context carrot-admin@carrot
tanzu cluster create ${CLUSTER_NAME} --dry-run | kubectl apply -f -
Appリソース一覧を再度確認するとpinnipedが表示され、Reconcile succeededと出力されれば正常にインストールされています。
$ kubectl get app -n tkg-system
NAME DESCRIPTION SINCE-DEPLOY AGE
antrea Reconcile succeeded 37s 110d
metrics-server Reconcile succeeded 111s 110d
pinniped Reconcile succeeded 103s 9m55s
tanzu-addons-manager Reconcile succeeded 111s 111d
vsphere-cpi Reconcile succeeded 116s 87d
vsphere-csi Reconcile succeeded 105s 110d
次のコマンドでKapp Controllerによって実際にデプロイされたリソースを確認できます。
$ kubectl get app -n tkg-system pinniped -o template='{{.status.inspect.stdout}}'
Target cluster 'https://100.64.0.1:443' (nodes: carrot-control-plane-kbfpl, 1+)
01:49:39AM: debug: Resources: Ignoring group version: schema.GroupVersionResource{Group:"stats.antrea.tanzu.vmware.com", Version:"v1alpha1", Resource:"antreaclusternetworkpolicystats"}
01:49:39AM: debug: Resources: Ignoring group version: schema.GroupVersionResource{Group:"stats.antrea.tanzu.vmware.com", Version:"v1alpha1", Resource:"antreanetworkpolicystats"}
01:49:39AM: debug: Resources: Ignoring group version: schema.GroupVersionResource{Group:"stats.antrea.tanzu.vmware.com", Version:"v1alpha1", Resource:"networkpolicystats"}
Resources in app 'pinniped-ctrl'
Namespace Name Kind Owner Conds. Rs Ri Age
(cluster) cluster-info-reader ClusterRole kapp - ok - 8m
^ cluster-info-reader ClusterRoleBinding kapp - ok - 8m
^ credentialissuers.config.concierge.pinniped.dev CustomResourceDefinition kapp 2/2 t ok - 8m
^ dex ClusterRole kapp - ok - 238d
^ dex ClusterRoleBinding kapp - ok - 238d
^ federationdomains.config.supervisor.pinniped.dev CustomResourceDefinition kapp 2/2 t ok - 8m
^ jwtauthenticators.authentication.concierge.pinniped.dev CustomResourceDefinition kapp 2/2 t ok - 8m
^ oidcidentityproviders.idp.supervisor.pinniped.dev CustomResourceDefinition kapp 2/2 t ok - 8m
^ pinniped-concierge ClusterRoleBinding kapp - ok - 8m
^ pinniped-concierge Namespace kapp - ok - 8m
^ pinniped-concierge-aggregated-api-server ClusterRole kapp - ok - 8m
^ pinniped-concierge-aggregated-api-server ClusterRoleBinding kapp - ok - 8m
^ pinniped-concierge-create-token-credential-requests ClusterRole kapp - ok - 8m
^ pinniped-concierge-create-token-credential-requests ClusterRoleBinding kapp - ok - 8m
^ pinniped-supervisor Namespace kapp - ok - 8m
^ tanzu-system-auth Namespace kapp - ok - 8m
^ tkg-pinniped-post-deploy-cluster-role ClusterRole kapp - ok - 8m
^ tkg-pinniped-post-deploy-cluster-role-binding ClusterRoleBinding kapp - ok - 8m
^ v1alpha1.login.concierge.pinniped.dev APIService kapp 1/1 t ok - 8m
^ webhookauthenticators.authentication.concierge.pinniped.dev CustomResourceDefinition kapp 2/2 t ok - 8m
kube-public pinniped-concierge-cluster-info-lister-watcher Role kapp - ok - 8m
^ pinniped-concierge-cluster-info-lister-watcher RoleBinding kapp - ok - 8m
^ pinniped:view-pinnipedinfo Role kapp - ok - 8m
^ pinniped:view-pinnipedinfo RoleBinding kapp - ok - 8m
kube-system pinniped-concierge-extension-apiserver-authentication-reader RoleBinding kapp - ok - 8m
^ pinniped-concierge-kube-system-pod-read Role kapp - ok - 8m
^ pinniped-concierge-kube-system-pod-read RoleBinding kapp - ok - 8m
pinniped-concierge pinniped-concierge Deployment kapp 2/2 t ok - 8m
^ pinniped-concierge ServiceAccount kapp - ok - 8m
^ pinniped-concierge-76576668d5 ReplicaSet cluster - ok - 8m
^ pinniped-concierge-76576668d5-fbf2d Pod cluster 4/4 t ok - 8m
^ pinniped-concierge-76576668d5-x7fsl Pod cluster 4/4 t ok - 8m
^ pinniped-concierge-aggregated-api-server Role kapp - ok - 8m
^ pinniped-concierge-aggregated-api-server RoleBinding kapp - ok - 8m
^ pinniped-concierge-api Endpoints cluster - ok - 8m
^ pinniped-concierge-api Service kapp - ok - 8m
^ pinniped-concierge-api-qzbjq EndpointSlice cluster - ok - 8m
^ pinniped-concierge-config ConfigMap kapp - ok - 8m
^ tkg-jwt-authenticator JWTAuthenticator kapp - ok - 8m
pinniped-supervisor pinniped-ca Certificate kapp 1/1 t ok - 8m
^ pinniped-ca-2scpf CertificateRequest cluster 1/1 t ok - 8m
^ pinniped-ca-issuer Issuer kapp 1/1 t ok - 8m
^ pinniped-cert Certificate kapp 1/1 t ok - 8m
^ pinniped-cert-7c8sk CertificateRequest cluster 1/1 t ok - 6m
^ pinniped-cert-tsbq5 CertificateRequest cluster 1/1 t ok - 7m
^ pinniped-federation-domain FederationDomain kapp - ok - 8m
^ pinniped-post-deploy-job Job kapp 1/1 t ok Completed 8m
^ pinniped-post-deploy-job-sa ServiceAccount kapp - ok - 8m
^ pinniped-post-deploy-job-zhmzl Pod cluster 2/4 t ok - 7m
^ pinniped-selfsigned-ca-issuer Issuer kapp 1/1 t ok - 8m
^ pinniped-supervisor Deployment kapp 2/2 t ok - 8m
^ pinniped-supervisor Endpoints cluster - ok - 8m
^ pinniped-supervisor Role kapp - ok - 8m
^ pinniped-supervisor RoleBinding kapp - ok - 8m
^ pinniped-supervisor Service kapp - ok - 8m
^ pinniped-supervisor ServiceAccount kapp - ok - 8m
^ pinniped-supervisor-654b669974 ReplicaSet cluster - ok - 8m
^ pinniped-supervisor-654b669974-cnqj9 Pod cluster 4/4 t ok - 5m
^ pinniped-supervisor-654b669974-qzh28 Pod cluster 4/4 t ok - 5m
^ pinniped-supervisor-kxv79 EndpointSlice cluster - ok - 8m
^ pinniped-supervisor-static-config ConfigMap kapp - ok - 8m
^ upstream-idp-client-credentials Secret kapp - ok - 8m
^ upstream-oidc-identity-provider OIDCIdentityProvider kapp 2/2 t ok - 5m
tanzu-system-auth dex ConfigMap kapp - ok - 8m
^ dex Deployment kapp 2/2 t ok - 8m
^ dex ServiceAccount kapp - ok - 8m
^ dex-77cfc7fd87 ReplicaSet cluster - ok - 8m
^ dex-77cfc7fd87-7n7rt Pod cluster 4/4 t ok - 5m
^ dex-ca Certificate kapp 1/1 t ok - 8m
^ dex-ca-issuer Issuer kapp 1/1 t ok - 8m
^ dex-ca-q7czk CertificateRequest cluster 1/1 t ok - 8m
^ dex-cert Certificate kapp 1/1 t ok - 8m
^ dex-cert-fzpsk CertificateRequest cluster 1/1 t ok - 8m
^ dex-cert-vf2pd CertificateRequest cluster 1/1 t ok - 5m
^ dex-selfsigned-ca-issuer Issuer kapp 1/1 t ok - 8m
^ dexsvc Endpoints cluster - ok - 8m
^ dexsvc Service kapp - ok - 8m
^ dexsvc-s6dgm EndpointSlice cluster - ok - 8m
^ ldap-bindpw Secret kapp - ok - 8m
tkg-system pinniped-kapp-config ConfigMap kapp - ok - 8m
Rs: Reconcile state
Ri: Reconcile information
80 resources
Succeeded
Pinnepedにアクセスします。JWTAuthenticatorリソースをみてURLを確認します。
$ kubectl get jwtauthenticator -n pinniped-concierge
NAME ISSUER
tkg-jwt-authenticator https://192.168.11.110:31234
ISSUERのURLにアクセスします。この例では https://192.168.11.110:31234 です。

LDAP認証を使う場合は、OIDCのProxyとしてDexがインストールされます。Dexにもアクセスします。
OIDCIdentityProviderリソースをみてURLを確認します。
$ kubectl get oidcidentityprovider -n pinniped-supervisor
NAME ISSUER STATUS AGE
upstream-oidc-identity-provider https://192.168.11.110:30167 Ready 10m
ISSUERのURLにアクセスします。この例では https://192.168.11.110:30167/auth です。


Workload ClusterにPinnipedをインストール
次にWorkload ClusterにPinnipedをインストールします。Workload ClusterのAppリソース一覧を取得し、pinnipedが存在しないことを確認します。
$ kubectl config use-context orange-admin@orange
$ kubectl get app -n tkg-system
NAME DESCRIPTION SINCE-DEPLOY AGE
antrea Reconcile succeeded 4m34s 110d
metrics-server Reconcile succeeded 3m36s 110d
vsphere-cpi Reconcile succeeded 2m32s 102d
vsphere-csi Reconcile succeeded 3m34s 110d
pinnepdをインストールするためのYAMLをtanzu CLIで生成します。contextは再度management clusterに戻します。
kubectl config use-context carrot-admin@carrot
export SUPERVISOR_ISSUER_URL=$(kubectl get configmap pinniped-info -n kube-public -otemplate='{{.data.issuer}}')
export SUPERVISOR_ISSUER_CA_BUNDLE_DATA_B64=$(kubectl get configmap pinniped-info -n kube-public -otemplate='{{.data.issuer_ca_bundle_data}}')
export CLUSTER_NAME=orange
export NAMESPACE=default
export CLUSTER_PLAN=dev
export VSPHERE_CONTROL_PLANE_ENDPOINT=dummy
export _TKG_CLUSTER_FORCE_ROLE=workload
export FILTER_BY_ADDON_TYPE=authentication/pinniped
tanzu cluster create ${CLUSTER_NAME} --dry-run
次のようなSecretが生成されます。
apiVersion: v1
kind: Secret
metadata:
annotations:
tkg.tanzu.vmware.com/addon-type: authentication/pinniped
labels:
clusterctl.cluster.x-k8s.io/move: ""
tkg.tanzu.vmware.com/addon-name: pinniped
tkg.tanzu.vmware.com/cluster-name: orange
name: orange-pinniped-addon
namespace: default
stringData:
values.yaml: |
#@data/values
#@overlay/match-child-defaults missing_ok=True
---
infrastructure_provider: vsphere
tkg_cluster_role: workload
identity_management_type: oidc
pinniped:
cert_duration: 2160h
cert_renew_before: 360h
supervisor_svc_endpoint: https://192.168.11.110:31234
supervisor_ca_bundle_data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURORENDQWh5Z0F3SUJBZ0lSQU9iYnNxUUUwWjlGOUtwSzlUTG9IS1l3RFFZSktvWklodmNOQVFFTEJRQXcKS0RFUE1BMEdBMVVFQ2hNR2RtMTNZWEpsTVJVd0V3WURWUVFERXd4MGEyY3RjR2x1Ym1sd1pXUXdIaGNOTWpFdwpOekUyTURFME1UUXdXaGNOTXpFd056RTBNREUwTVRRd1dqQW9NUTh3RFFZRFZRUUtFd1oyYlhkaGNtVXhGVEFUCkJnTlZCQU1UREhSclp5MXdhVzV1YVhCbFpEQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0MKZ2dFQkFLMjVSQW9qSVB6VVFSb2k2eGJqNVZ4azFLTmhwakJHSnBlY0ZITFNCdy9NTG03c3d6b2pRSWhVWXhBNQpRRExpcGx5L29YVk5DanNBK2ROeEZLc0xTNHpIUjFMQjlSSFBqNkpwbFVOdDRVRlUxSnFSbXR2b3pWUU5lbUpWClJraVNISktTQjJBUUY3NG1FQjU5QmhkYitIMVNSS25RK01jMGNuenoxcWp3RFJLdmkzazJSZ3czSTUrRDFuRnEKalJ2bXA2c2ZOSHEyMHpWSlFNc2dHcmtUMGg5WjdLeDBYbno5cjBJMTBLVm5KNXhjUkp4WjBiWkhjWmdWQTRWRApheEdmOFk2YlJ5OWl6TEwvZm1ua1g4R0NtKzAvZEY0UXRKaWxyOFk5MVFtdXQ0aWx5SnFnZDRDYml6Tmk2RTlCClQrajd5OFJyV0tmMWFLRVkrRFNvdkdrSGI2c0NBd0VBQWFOWk1GY3dEZ1lEVlIwUEFRSC9CQVFEQWdJRU1CMEcKQTFVZEpRUVdNQlFHQ0NzR0FRVUZCd01CQmdnckJnRUZCUWNEQWpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUJVRwpBMVVkRVFRT01BeUNDbkJwYm01cGNHVmtZMkV3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUM4STY4UG9XSW4rCmt2Sk5wWkZTYjFwbmExYzA2K1NLZndMQlpQZFRjOG9KREZHOXN0WVBvRjJpelo4Y2R6dXhmUjhqMEJJUFpKM2MKb3VBNkRHRHhvMTRXZEdVQkhMTXhXN2VlRlFIVnNDMW93QlE3cWFhclpiS1N5dFA1T0UrOUt5UnB3Z3ZqbXVuVQp1bnY2a1Y1eUY0YXA4K2xmaElVRnR5Qlh1RkRDNkJMR1ZUUGNtWXRhajFJekU3YTc0VE5tSmJiRTRLNmorK24zClh1RUw1Z2ZkcE4vU3BtaG5oU04vWlo3WDRuWW1qZzBtTjVmTm84cDVpdFp4c1gwSmg1LytFNE5oeEZWSFlPRVAKa0V4TVJqSDh2c2RrM0twd1NEakIvRjRGREgxZG9JRkE1aVU5TGhva1N6bW1RL2JrbUZnM3FmSlVtQ24rR1BhaAoyazVyWHdQQ2N6TT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
image:
name: pinniped
tag: v0.4.1_vmware.1
repository: projects.registry.vmware.com/tkg
pull_policy: IfNotPresent
post_deploy_job_image:
name: tanzu_core/addons/tkg-pinniped-post-deploy
tag: v1.3.1
repository: projects.registry.vmware.com/tkg
pull_policy: IfNotPresent
type: tkg.tanzu.vmware.com/addon
問題がなければkubectl applyでManagement Clusterに対して適用します。
kubectl config use-context carrot-admin@carrot
tanzu cluster create ${CLUSTER_NAME} --dry-run | kubectl apply -f -
Workload ClusterのAppリソース一覧を再度確認するとpinnipedが表示され、Reconcile succeededと出力されれば正常にインストールされています。
$ kubectl config use-context orange-admin@orange
$ kubectl get app -n tkg-system
NAME DESCRIPTION SINCE-DEPLOY AGE
antrea Reconcile succeeded 3m51s 110d
metrics-server Reconcile succeeded 2m52s 110d
pinniped Reconcile succeeded 2m46s 2m50s
vsphere-cpi Reconcile succeeded 111s 102d
vsphere-csi Reconcile succeeded 2m59s 110d
次のコマンドでKapp Controllerによって実際にデプロイされたリソースを確認できます。
$ kubectl get app -n tkg-system pinniped -o template='{{.status.inspect.stdout}}'
Target cluster 'https://100.64.0.1:443' (nodes: orange-control-plane-l9kmz, 2+)
03:13:47AM: debug: Resources: Ignoring group version: schema.GroupVersionResource{Group:"stats.antrea.tanzu.vmware.com", Version:"v1alpha1", Resource:"networkpolicystats"}
03:13:47AM: debug: Resources: Ignoring group version: schema.GroupVersionResource{Group:"stats.antrea.tanzu.vmware.com", Version:"v1alpha1", Resource:"antreanetworkpolicystats"}
03:13:47AM: debug: Resources: Ignoring group version: schema.GroupVersionResource{Group:"stats.antrea.tanzu.vmware.com", Version:"v1alpha1", Resource:"antreaclusternetworkpolicystats"}
Resources in app 'pinniped-ctrl'
Namespace Name Kind Owner Conds. Rs Ri Age
(cluster) cluster-info-reader ClusterRole kapp - ok - 38s
^ cluster-info-reader ClusterRoleBinding kapp - ok - 38s
^ credentialissuers.config.concierge.pinniped.dev CustomResourceDefinition kapp 2/2 t ok - 38s
^ jwtauthenticators.authentication.concierge.pinniped.dev CustomResourceDefinition kapp 2/2 t ok - 38s
^ pinniped-concierge ClusterRoleBinding kapp - ok - 38s
^ pinniped-concierge Namespace kapp - ok - 38s
^ pinniped-concierge-aggregated-api-server ClusterRole kapp - ok - 38s
^ pinniped-concierge-aggregated-api-server ClusterRoleBinding kapp - ok - 38s
^ pinniped-concierge-create-token-credential-requests ClusterRole kapp - ok - 38s
^ pinniped-concierge-create-token-credential-requests ClusterRoleBinding kapp - ok - 38s
^ pinniped-supervisor Namespace kapp - ok - 38s
^ tkg-pinniped-post-deploy-cluster-role ClusterRole kapp - ok - 38s
^ tkg-pinniped-post-deploy-cluster-role-binding ClusterRoleBinding kapp - ok - 38s
^ v1alpha1.login.concierge.pinniped.dev APIService kapp 1/1 t ok - 38s
^ webhookauthenticators.authentication.concierge.pinniped.dev CustomResourceDefinition kapp 2/2 t ok - 38s
kube-public pinniped-concierge-cluster-info-lister-watcher Role kapp - ok - 38s
^ pinniped-concierge-cluster-info-lister-watcher RoleBinding kapp - ok - 38s
^ pinniped:view-pinnipedinfo Role kapp - ok - 38s
^ pinniped:view-pinnipedinfo RoleBinding kapp - ok - 38s
kube-system pinniped-concierge-extension-apiserver-authentication-reader RoleBinding kapp - ok - 38s
^ pinniped-concierge-kube-system-pod-read Role kapp - ok - 38s
^ pinniped-concierge-kube-system-pod-read RoleBinding kapp - ok - 38s
pinniped-concierge pinniped-concierge Deployment kapp 2/2 t ok - 37s
^ pinniped-concierge ServiceAccount kapp - ok - 38s
^ pinniped-concierge-6f4564c7b4 ReplicaSet cluster - ok - 37s
^ pinniped-concierge-6f4564c7b4-7z9tb Pod cluster 4/4 t ok - 37s
^ pinniped-concierge-6f4564c7b4-nfgfg Pod cluster 4/4 t ok - 37s
^ pinniped-concierge-aggregated-api-server Role kapp - ok - 38s
^ pinniped-concierge-aggregated-api-server RoleBinding kapp - ok - 38s
^ pinniped-concierge-api Endpoints cluster - ok - 37s
^ pinniped-concierge-api Service kapp - ok - 37s
^ pinniped-concierge-api-lgdbt EndpointSlice cluster - ok - 37s
^ pinniped-concierge-config ConfigMap kapp - ok - 38s
^ tkg-jwt-authenticator JWTAuthenticator kapp - ok - 37s
pinniped-supervisor pinniped-post-deploy-job Job kapp 1/1 t ok Completed 37s
^ pinniped-post-deploy-job-knwld Pod cluster 2/4 t ok - 37s
^ pinniped-post-deploy-job-sa ServiceAccount kapp - ok - 38s
tkg-system pinniped-kapp-config ConfigMap kapp - ok - 38s
Rs: Reconcile state
Ri: Reconcile information
38 resources
Succeeded
Pinnipedを経由してkubeconfigを取得
Pinnipedを導入するメリットとして、adminではなくユーザーの権限でk8sクラスタにアクセスするためのkubeconfigを生成できます。
この操作は tanzu CLIがインストールされている任意の端末上で行えます。 ここがポイントです。
ドキュメントは こちら 。
次のコマンドでManagement Clusterへログインします。ここでは~/.tanzuディレクトリがない、別の端末上で作業します。
tanzu login --endpoint https://192.168.11.110:6443 --name carrot
ブラウザが立ち上がり、ログインフォームが表示されます。LDAP認証の場合は、Dexのログインフォームです。

LDAPのユーザー情報を入力してログインします。

ブラウザが使えない端末上で
tanzu loginする場合は、次の設定を加えます。export TANZU_CLI_PINNIPED_AUTH_LOGIN_SKIP_BROWSER=true tanzu login --endpoint https://192.168.11.110:6443 --name carrotブラウザが立ち上がる代わりに次のメッセージが出力されます。
Please log in: https://192.168.11.110:31234/oauth2/authorize?access_type=offline&client_id=pinniped-cli&code_challenge=T3nvakm4MPVR1UrX8AOZhNI3f7I6ifJhl_nS4VGPWGI&code_challenge_method=S256&nonce=2aa1d63168e0ce01a66473bb1d9bc869&redirect_uri=http%3A%2F%2F127.0.0.1%3A39585%2Fcallback&response_type=code&scope=offline_access+openid+pinniped%3Arequest-audience&state=70c5f446968e10b211617d1bd0dc407aこのURLをコピーして、Pinniped/Dexにアクセスできるネットワーク上のブラウザが使える端末上のブラウザでアクセスします。
ログインすると、127.0.0.1に対するコールバックURLへリダイレクトされます。この端末上からはアクセスできないので、ブラウザのアドレスバーからURLをコピーします。
tanzu loginを実行した端末上の別のコンソールを開いて、コピーしたURLをcurlでアクセスします。"でURLを囲む必要があります。$ curl "http://127.0.0.1:39585/callback?code=C_ucwRvqFVNO3ugESbYgVZRYMZFM0nLStyXgfYFjVC4.2JokdjJa096qIe4cj0OixHw1XaXiD16OiHHQq1_YhAs&scope=openid+offline_access+pinniped%3Arequest-audience&state=70c5f446968e10b211617d1bd0dc407a" you have been logged in and may now close this tab
tanzu loginを実行したコンソールに次のメッセージが出力されればログイン成功です。✔ successfully logged in to management cluster using the kubeconfig carrot
次のコマンドでWorkload Clusterに対するkubeconfigを生成し、ファイルに保存します。
tanzu cluster kubeconfig get orange --export-file ~/.kube/config-orange
Management Clusterへのkubeconfigは
~/.kube-tkg/configに記述されていますが、tanzu management-cluster kubeconfig getコマンドでも取得可能です。
このkubeconfigを使ってk8sクラスタにアクセスしてみます。
kubectl cluster-info --kubeconfig ~/.kube/config-orange
初回は再度ログインが求められるので、tanzu loginの場合と同じ手順でログインします。
k8sクラスタにRBACの設定をしていなければ、ログインに成功後に、次のようなログが出力されます。
Error from server (Forbidden): services is forbidden: User "making" cannot list resource "services" in API group "" in the namespace "kube-system"
LDAPのmakingユーザーにroleをbindしていないのでk8sのリソースにアクセスする権限がありません。
ここではこのユーザーを管理者とみなし、cluster-adminのClusterRoleをbindします。
Workload Clusterに対して、admin権限で次のコマンドでLDAPユーザー個別にbindするか、
kubectl create clusterrolebinding ldap-making --clusterrole cluster-admin --user making
次のコマンドでLDAPグループに対してbindします。ユーザーに対してbindすると、LDAPにユーザーが増えるためにRoleBindingを作成する必要があって面倒なので、グループに対してbindした方が良いです。
kubectl create clusterrolebinding ldap-administrators --clusterrole cluster-admin --group administrators
これでtanzu loginを実行した端末上でもWorkload Clusterへアクセスできるようになります。
$ kubectl cluster-info --kubeconfig ~/.kube/config-orange
Kubernetes control plane is running at https://192.168.11.114:6443
KubeDNS is running at https://192.168.11.114:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
Pinnipedを導入することで、tanzu CLIさえ用意すればどこからでもTKGのクラスタにアクセスできるようになりました。
運用する上でとても便利な機能です。
