背 景 介 紹
從上圖可以發(fā)現(xiàn),vSphere 7中的用戶角色比其他舊版本更多。我們?nèi)匀挥?ldquo;數(shù)據(jù)中心管理員”(VI Admin),他們管理著整個(gè)數(shù)據(jù)中心的計(jì)算,網(wǎng)絡(luò)和存儲(chǔ)資源。在vShpere 7中,數(shù)據(jù)中心管理員可以啟用和管理一種被稱為“ Supervisor Kubernetes”的全新群集,該群集在vSphere的hypervisor層面武裝了一個(gè)Kubernetes的控制中心。在“ Supervisor Kubernetes”群集中,數(shù)據(jù)中心管理員可以創(chuàng)建一個(gè)或多個(gè)命名空間(Namespace)。命名空間(Namespace)是“vSphere with Kubernetes”中的多租戶解決方案。每個(gè)命名空間都有隔離的網(wǎng)絡(luò)資源和訪問控制范圍。數(shù)據(jù)中心管理員還可以給命名空間分配的CPU,內(nèi)存和存儲(chǔ)的資源配額。
數(shù)據(jù)中心管理員可以將命名空間的各種權(quán)限委派給其他的用戶(User)或組(Group)。那些獲得“view”權(quán)限的用戶稱為“Namespace審計(jì)員”,他們可以監(jiān)控和觀察命名空間里的資源使用狀況;那些獲得“edit”權(quán)限的用戶稱為“Namespace管理員”,他們可以管理和控制命名空間里的資源,并且可以在命名空間內(nèi)創(chuàng)建一個(gè)或多個(gè)Tanzu Kubernetes群集(之前稱為Guest Cluster)。這些Namespace管理員還可以在命名空間中直接部署和運(yùn)行應(yīng)用程序(在虛擬機(jī)和Pod VM上),在這種情況下,它們也稱為“Supervisor 集群開發(fā)者”。
默認(rèn)情況下,“Namespace管理員”將成為新創(chuàng)建的Tanzu Kubernetes群集的“Tanzu群集管理員”。通過(guò)使用kubernetes的RBAC,“Namespace管理員”可以將集群管理員角色或更加細(xì)粒度的權(quán)限分配給其他用戶和組,這些用戶稱為“Tanzu集群開發(fā)者”,他們負(fù)責(zé)在Tanzu Kubernetes集群上開發(fā)和部署應(yīng)用程序。
本文將通過(guò)實(shí)戰(zhàn)的方式,來(lái)一步步展示這些不同的角色是如何通過(guò)Kubernetes的客戶端命令“kubectl”,來(lái)訪問vSphere With Kubernetes不同層次的集群,以及每個(gè)角色有哪些不同的權(quán)限和限制。本文共包括4部分的內(nèi)容:
- “數(shù)據(jù)中心管理員”對(duì)Supervisor Kubernetes集群的訪問
- “Namespace管理員”對(duì)Supervisor Kubernetes集群的訪問
- “Tanzu集群管理員”對(duì)Tanzu Kubernetes集群的訪問
- “Tanzu集群開發(fā)者”對(duì)Tanzu Kubernetes集群的訪問
數(shù)據(jù)中心管理員一般通過(guò)vSphere單點(diǎn)登錄(SSO)服務(wù)認(rèn)證的用戶,缺省的用戶名一般是administrator@vsphere.local。這個(gè)用戶通常是通過(guò)登錄vCenter Server的瀏覽器客戶端來(lái)進(jìn)行數(shù)據(jù)中心的管理。在這一節(jié)中我們看看,這個(gè)數(shù)據(jù)中心管理員是如何通過(guò)新的Kubernetes客戶端命令“kubectl”來(lái)管理vSpherew with Kubernetes。下面的實(shí)戰(zhàn)練習(xí)需要幾個(gè)前提條件:
配置好Supervisor Kubernetes集群。請(qǐng)參考:Config a Supervisor Cluster
創(chuàng)建并配置好Supervisor Kubernetes集群的命名空間。請(qǐng)參考:Configure Supervisor Cluster Namespaces
下載并安裝好Kubernetes客戶端根據(jù)kubectl和vSphere的插件。請(qǐng)參考:Download and Install the Kubernetes CLI Tools for vSphere
1.1 登錄Supervisor Kubernetes集群
1、要想通過(guò)kubectl命令連接Supervisor集群,首先需要使用“數(shù)據(jù)中心管理員”的SSO的賬號(hào)登錄,可以使用以下的命令。其中“SUPERVISOR-CLUSTER-CONTROL-PLANE-IP-ADDRESS”是Supervisor集群控制節(jié)點(diǎn)的IP地址,通過(guò)vCenter Server管理控制臺(tái)瀏覽器客戶端可以查看。“VCENTER-SSO-USER”是管理員用戶名,一般為administrator@vsphere.local。
kubectl vsphere login –server=SUPERVISOR-CLUSTER-CONTROL-PLANE-IP-ADDRESS–vsphere-username VCENTER-SSO-USER
例如:
$ kubectl vsphere login --server=10.117.233.1 --vsphere-username administrator@vsphere.local
要注意的是:成功登錄后vSphere的kubectl插件會(huì)保存一個(gè)登錄憑證(token),這個(gè)憑證可以保證你在10小時(shí)內(nèi)不需要重新登錄系統(tǒng)就能直接訪問集群。超過(guò)10小時(shí)則需要重新執(zhí)行這條登錄命令。
2、顯示當(dāng)前可以訪問的集群配置信息
$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* 10.117.233.1 10.117.233.1 wcp:10.117.233.1:administrator@vsphere.local
microservices 10.117.233.1 wcp:10.117.233.1:administrator@vsphere.local microservices
wangyu 10.117.233.1 wcp:10.117.233.1:administrator@vsphere.local wangyu
從上面的輸出中,您可以看到我們已經(jīng)在Supervisor集群中創(chuàng)建了兩個(gè)命名空間,分別為“microservices”和“ wangyu”。數(shù)據(jù)中心管理員可以訪問Supervisor集群中所有的命名空間。第一行記錄顯示綁定的命名空間為空,其實(shí)是綁定到一個(gè)叫做“default”的命名空間上。您可以使用以下命令來(lái)更改當(dāng)前上下文(context)
$ kubectl config use-context wangyu
Switched to context "wangyu"
更改上下文對(duì)于數(shù)據(jù)中心管理員是可選的,在當(dāng)前的命名空間里您可以使用“ -n”選項(xiàng),來(lái)操作其他命名空間的資源。例如:
$ kubectl get pods -n microcervices
1.2 數(shù)據(jù)中心管理員通過(guò)kubectl能夠做的事情
1、數(shù)據(jù)中心管理員可以查看和操作一些特殊的kubernetes資源(例如namespaces和storageclass)。稍后您會(huì)發(fā)現(xiàn),這些資源的訪問權(quán)限是別的用戶(例如Namespace管理員)所沒有的。
$ kubectl get namespaces
NAME STATUS AGE
default Active 4d20h
kube-node-lease Active 4d20h
kube-public Active 4d20h
kube-system Active 4d20h
microservices Active 2d2h
vmware-system-capw Active 4d20h
vmware-system-csi Active 4d20h
vmware-system-kubeimage Active 4d20h
vmware-system-nsx Active 4d20h
vmware-system-registry Active 4d20h
vmware-system-registry-754088061 Active 4d17h
vmware-system-tkg Active 4d20h
vmware-system-ucs Active 4d20h
vmware-system-vmop Active 4d20h
wangyu Active 4d20h
$ kubectl get storageclass
NAME PROVISIONER AGE
pacific-storage-policy csi.vsphere.vmware.com 4d20h
2、您甚至可以列出部署在系統(tǒng)命名空間中的Pod資源,例如,以“kube-”開頭和“vmware-”開頭的命名空間就是屬于系統(tǒng)的命名空間。
$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-7fb7656c66-65nc6 1/1 Running 0 5d
coredns-7fb7656c66-9zp8z 1/1 Running 0 5d
coredns-7fb7656c66-fgfml 1/1 Running 0 5d
csr-signer-42164f156d72f36753e2cdfb7de0c558 1/1 Running 0 5d
csr-signer-4216c813a129bb53c21f21e63990fd6b 1/1 Running 0 5d
csr-signer-4216d818db629c2b035276f82acfdba3 1/1 Running 0 5d
docker-registry-42164f156d72f36753e2cdfb7de0c558 1/1 Running 0 5d
docker-registry-4216c813a129bb53c21f21e63990fd6b 1/1 Running 0 5d
docker-registry-4216d818db629c2b035276f82acfdba3 1/1 Running 0 5d
……
1.3數(shù)據(jù)中心管理員通過(guò)kubectl不能夠做的事情
實(shí)際上,數(shù)據(jù)中心管理員也不是萬(wàn)能的,有不少資源的操作和訪問是通過(guò)kubectl命令無(wú)法完成的。
1、在上一小節(jié)中,您可能發(fā)現(xiàn)數(shù)據(jù)中心管理員可以列出系統(tǒng)命名空間中的資源。但是他不能將應(yīng)用程序部署到這些系統(tǒng)命名空間中。例如:
$ kubectl create -f hello.yaml -n kube-system
Error from server (Forbidden): error when creating "hello.yaml": deployments.apps is forbidden:
User "sso:Administrator@vsphere.local" cannot create resource "deployments" in API group "apps"
in the namespace "kube-system"
實(shí)際上,只有那些在vCenter Server客戶端里顯示的命名空間(Menu → Workload Management),才能部署客戶自己開發(fā)的應(yīng)用。如下圖所示:
2、數(shù)據(jù)中心管理員無(wú)法使用kubectl命令來(lái)創(chuàng)建新的命名空間
$ kubectl create namespace test01
Error from server (Forbidden): namespaces is forbidden: User "sso:Administrator@vsphere.local"
cannot create resource "namespaces" in API group "" at the cluster scope
在此vSphere版本里,Supervisor集群中創(chuàng)建命名空間唯一有效的方法是通過(guò)vCenter Client Console。在今后的版本里可能會(huì)添加新的方法。
3、另外還有一些其他的Kubernetes的資源是數(shù)據(jù)中心管理員通過(guò)kubectl命令也無(wú)法訪問的,例如(role,rolebinding,psp,crd等等):
$ kubectl get roles
Error from server (Forbidden): roles.rbac.authorization.k8s.io is forbidden:
User "sso:Administrator@vsphere.local" cannot list resource "roles" in API
group "rbac.authorization.k8s.io" in the namespace "default"
$ kubectl get rolebindings
Error from server (Forbidden): rolebindings.rbac.authorization.k8s.io is forbidden:
User "sso:Administrator@vsphere.local" cannot list resource "rolebindings" in API
group "rbac.authorization.k8s.io" in the namespace "default"
$ kubectl get customresourcedefinitions
Error from server (Forbidden): customresourcedefinitions.apiextensions.k8s.io
is forbidden: User "sso:Administrator@vsphere.local" cannot list resource
"customresourcedefinitions" in API group "apiextensions.k8s.io" at the cluster scope
$ kubectl get certificatesigningrequests
Error from server (Forbidden): certificatesigningrequests.certificates.k8s.io
is forbidden: User "sso:Administrator@vsphere.local" cannot list resource
"certificatesigningrequests" in API group "certificates.k8s.io" at the cluster scope
$ kubectl get psp
Error from server (Forbidden): podsecuritypolicies.policy is forbidden:
User "sso:Administrator@vsphere.local" cannot list resource "podsecuritypolicies"
in API group "policy" at the cluster scope
1.4 小結(jié)
在本節(jié)中,您已經(jīng)知道如何以數(shù)據(jù)中心管理員(VI Admin)的身份通過(guò)“ kubectl”命令連接Supervisor集群,并進(jìn)行相應(yīng)的操作。實(shí)際上,數(shù)據(jù)中心管理員很少使用“ kubectl”命令,vCenter Server Client Console才是數(shù)據(jù)中心管理員的常用武器。通常,數(shù)據(jù)中心管理員會(huì)將命名空間的管理員權(quán)限委派給其他用戶,讓我們?cè)谙乱还?jié)中看到應(yīng)該怎么做。
2、“Namespace管理員”對(duì)Supervisor Kubernetes集群的訪問
在Supervisor集群上創(chuàng)建命名空間后,正確使用這些命名空間的方式是將命名空間的管理員角色委派給其他現(xiàn)有vSphere SSO用戶(例如本地帳戶),而不是使用數(shù)據(jù)中心管理員“ administrator@vsphere.local”的身份。vSphere SSO可以通過(guò)Identity Federation技術(shù),來(lái)接入第三方的identity provider管理用戶和用戶組(請(qǐng)參考技術(shù)博客:https://blogs.vmware.com/vsphere/2020/03/vsphere-7-identity-federation.html)。當(dāng)然,最簡(jiǎn)單的方式就是通過(guò)vCenter Server 客戶端控制臺(tái)創(chuàng)建一個(gè)新的本地用戶,并為其分配命名空間的管理員角色。下面我們看看,這個(gè)Namespace管理員是如何被分配的,他是如何通過(guò)Kubernetes客戶端命令“kubectl”來(lái)管理vSpherew with Kubernetes。下面的實(shí)戰(zhàn)練習(xí)需要幾個(gè)前提條件:
配置好Supervisor Kubernetes集群。請(qǐng)參考:Config a Supervisor Cluster
創(chuàng)建并配置好Supervisor Kubernetes集群的命名空間。請(qǐng)參考:Configure Supervisor Cluster Namespaces
下載并安裝好Kubernetes客戶端根據(jù)kubectl和vSphere的插件。請(qǐng)參考:Download and Install the Kubernetes CLI Tools for vSphere
2.1 將Namespace的管理員權(quán)限代理給其他vSphere用戶
1、在vCenter Server的客戶端以數(shù)據(jù)中心管理員的身份登錄。
在vCenter Server的客戶端創(chuàng)建一個(gè)本地用戶(Administration → Single Sign On→ Users and Groups → Add User),如下圖所示:
2、將supervisor集群命名空間的“edit”角色賦予剛才創(chuàng)建的用戶 (Menu → Workload Management → Namespaces → Your Namespace → Permissions → Add),如下圖所示:
2.2 登錄Supervisor Kubernetes集群
1、用剛才創(chuàng)建的用戶來(lái)登錄到Supervisor集群上:
$ kubectl vsphere login --server=10.117.233.1 --vsphere-username wangyu@vsphere.local
要注意的是:成功登錄后,vSphere的kubectl插件會(huì)保存一個(gè)登錄憑證(token),這個(gè)憑證可以保證你在10小時(shí)內(nèi)不需要重新登錄系統(tǒng)就能直接訪問集群。超過(guò)10小時(shí)則需要重新執(zhí)行這條登錄命令。
2、成功登錄后,vSphere的kubectl插件會(huì)根據(jù)登錄返回的信息自動(dòng)更新kubeconfig配置文件。如果當(dāng)前這個(gè)用戶被賦予多個(gè)命名空間的權(quán)限, 所有這些命名空間都會(huì)被列到上下文里(contexts):
$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* wangyu 10.117.233.1 wcp:10.117.233.1:wangyu@vsphere.local wangyu
2.3 Namespace管理員通過(guò)kubectl能夠做的事情
1、Namespace管理員可以在當(dāng)前的命名空間里查看和操作一些kubernetes資源:
$ kubectl get serviceaccount
NAME SECRETS AGE
default 1 6d1h
my-tanzu-cluster-ccm 1 5d6h
my-tanzu-cluster-pvcsi 1 5d6h
$ kubectl get secret
NAME TYPE DATA AGE
default-token-lqfwr kubernetes.io/service-account-token 3 6d1h
wangyu-default-image-pull-secret kubernetes.io/dockerconfigjson 1 5d22h
wangyu-default-image-push-secret kubernetes.io/dockerconfigjson 1 5d22h
2、Namespace管理員還可以在當(dāng)前的命名空間部署和運(yùn)行自己開發(fā)的應(yīng)用。在這種情況下, Namespace管理員搖身一變,稱為“Supervisor 集群開發(fā)者”。
$ kubectl create -f hello.yaml
deployment.apps/helloweb created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
helloweb-7cd97b9cb8-cdw22 0/1 Running 0 74s
helloweb-7cd97b9cb8-vzcc5 0/1 Running 0 4s
3、Namespace管理員還可以在當(dāng)前的命名空間部署一個(gè)Tanzu Kubernetes集群。在這種情況下, Namespace管理員缺省的稱為 “Tanzu集群管理員”。創(chuàng)建Tanzu集群的具體步驟,請(qǐng)參見官方文檔(https://docs.vmware.com/en/VMware-vSphere/7.0/vmware-vsphere-with-kubernetes/GUID-DBF5D8F2-2A28-4730-8AA3-32E9CE1C3BB8.html)
$ kubectl create -f tanzucluster.yaml
……
$ kubectl get tanzukubernetescluster
NAME CONTROLPLANE WORKER DISTRIBUTION AGE PHASE
my-tanzu-cluster 1 3 v1.16.8+vmware.1 5d6h running
2.4 Namespace管理員通過(guò)kubectl不能夠做的事情
1、數(shù)據(jù)中心管理員沒有權(quán)限做的事情,Namespace管理員都沒有權(quán)限做。請(qǐng)參考上一節(jié)的內(nèi)容。
2、Namespace管理員不能在他沒有賦權(quán)的命名空間里訪問和操作相關(guān)Kubernetes資源。
3、有些Kubernetes資源屬于全局資源,只有數(shù)據(jù)中心管理員才有權(quán)限操作,其他任何Namespace管理員都沒有權(quán)限,例如namespace,node和storageclass等等。
$ kubectl get nodes
Error from server (Forbidden): nodes is forbidden: User "sso:wangyu@vsphere.local"
cannot list resource "nodes" in API group "" at the cluster scope
$ kubectl get namespaces
Error from server (Forbidden): namespaces is forbidden: User "sso:wangyu@vsphere.local"
cannot list resource "namespaces" in API group "" at the cluster scope
$ kubectl get storageclass
Error from server (Forbidden): storageclasses.storage.k8s.io is forbidden: User
"sso:wangyu@vsphere.local" cannot list resource "storageclasses" in API group
"storage.k8s.io" at the cluster scope
2.5 小結(jié)
在本節(jié)中,您已經(jīng)知道如何以Namespace管理員的身份通過(guò)“ kubectl”命令連接Supervisor集群,并對(duì)賦權(quán)的命名空間進(jìn)行相應(yīng)的操作。實(shí)際上,更多的Kubernetes應(yīng)用通常都部署在Tanzu Kubernetes集群上。讓我們?cè)谙聨坠?jié)中看看如何以不同的身份訪問Tanzu Kubernetes集群的。
3、“Tanzu集群管理員”對(duì)Tanzu Kubernetes集群的訪問
Namespace管理員在特定的命名空間里創(chuàng)建了Tanzu Kubernetes集群以后,此Namespace管理員會(huì)缺省的成為這個(gè)Tanzu Kubernetes集群的管理員。在這一節(jié)中,我們看看如何以兩種不同的方式以管理員的權(quán)限來(lái)訪問Tanzu Kubernetes集群。下面的實(shí)戰(zhàn)練習(xí)需要幾個(gè)前提條件:
- 配置好Supervisor Kubernetes集群。請(qǐng)參考:Config a Supervisor Cluster
- 創(chuàng)建并配置好Supervisor Kubernetes集群的命名空間。請(qǐng)參考:Configure Supervisor Cluster Namespaces
- 下載并安裝好Kubernetes客戶端根據(jù)kubectl和vSphere的插件。請(qǐng)參考:Download and Install the Kubernetes CLI Tools for vSphere
- 將Namespace的管理員角色分配給其他用戶。請(qǐng)參考上一節(jié)。
- 在命名空間里創(chuàng)建一個(gè)或多個(gè)Tanzu Kubernetes 集群。請(qǐng)參考:How to Create Tanzu Kubernetes Clusters
3.1 Namespace管理員通過(guò)SSO賬號(hào)登錄Tanzu Kubernetes集群
1、在Namespace管理員在特定的命名空間里創(chuàng)建了Tanzu Kubernetes集群以后,此Namespace管理員會(huì)缺省的成為這個(gè)Tanzu Kubernetes集群的管理員?梢允褂靡韵碌拿钔ㄟ^(guò)Namespace管理員的SSO賬號(hào)來(lái)登錄Tanzu Kubernetes集群。
kubectl vsphere login \
–server=SUPERVISOR-CLUSTER-CONTROL-PLANE-IP \
–tanzu-kubernetes-cluster-name TANZU-KUBERNETES-CLUSTER-NAME \
–tanzu-kubernetes-cluster-namespace SUPERVISOR-NAMESPAC-NAME \
–vsphere-username NAMESPACE-ADMIN-SSO-USER-NAME \
–insecure-skip-tls-verify
例如:
$ kubectl vsphere login --server=10.117.233.1 --tanzu-kubernetes-cluster-name \
my-tanzu-cluster --tanzu-kubernetes-cluster-namespace wangyu --vsphere-username \
wangyu@vsphere.local --insecure-skip-tls-verify
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
my-tanzu-cluster-control-plane-kffsj Ready master 6d4h v1.16.8+vmware.1
my-tanzu-cluster-workers-c5jwz-86b575c4bb Ready <none> 6d4h v1.16.8+vmware.1
my-tanzu-cluster-workers-c5jwz-86b575c4bb Ready <none> 6d4h v1.16.8+vmware.1
my-tanzu-cluster-workers-c5jwz-86b575c4bb Ready <none> 6d4h v1.16.8+vmware.1
2、顯示當(dāng)前可以訪問的集群配置信息
$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
wangyu 10.117.233.1 wcp:10.117.233.1:wangyu@vsphere.local wangyu
* my-tanzu-cluster 10.117.233.3 wcp:10.117.233.3:wangyu@vsphere.local
要注意的是:成功登錄后vSphere的kubectl插件會(huì)保存一個(gè)登錄憑證(token),這個(gè)憑證可以保證你在10小時(shí)內(nèi)不需要重新登錄系統(tǒng)就能直接訪問集群。超過(guò)10小時(shí)則需要重新執(zhí)行這條登錄命令。
3.2 Namespace管理員通過(guò)kubeconfig文件登錄Tanzu Kubernetes集群
這是用Tanzu集群管理員的身份來(lái)登錄Tanzu Kubernetes集群的另外一種方式,這種方式不受10個(gè)小時(shí)的限制,每次訪問Tanzu Kubernetes集群的時(shí)候不需要有登錄的過(guò)程。雖然很方便,但是不太安全,一旦用戶拿到這個(gè)管理員授權(quán)身份,就會(huì)一直有效。
1、用Namespace管理員的身份登錄到Supervisor集群上:
$ kubectl vsphere login --server=10.117.233.1 --vsphere-username wangyu@vsphere.local
2、用Namespace管理員的身份通過(guò)以下命令從Supervisor集群當(dāng)中獲取Tanzu集群管理員的秘鑰信息,并將它保存到一個(gè)文件中:
kubectl get secret CLUSTER-NAME-kubeconfig -o jsonpath='{.data.value}’ | base64 -d > KUBECONFIG-NAME
例如:
$ kubectl get secret my-tanzu-cluster-kubeconfig -o jsonpath='{.data.value}' | base64 -d \
> my-tanzu-cluster-kubeconfig.yaml
3、設(shè)置系統(tǒng)環(huán)境變量KUBECONFIG,指向上一步保存的文件,來(lái)直接訪問Tanzu Kubernetes集群:
$ export KUBECONFIG =./my-tanzu-cluster-kubeconfig.yaml
$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes-admin@my-tanzu-cluster my-tanzu-cluster kubernetes-admin
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
my-tanzu-cluster-control-plane-kffsj Ready master 6d4h v1.16.8+vmware.1
my-tanzu-cluster-workers-c5jwz-86b575c4bbt Ready <none> 6d4h v1.16.8+vmware.1
my-tanzu-cluster-workers-c5jwz-86b575c4bb Ready <none> 6d4h v1.16.8+vmware.1
my-tanzu-cluster-workers-c5jwz-86b575c4bb Ready <none> 6d4h v1.16.8+vmware.1
3.3 小結(jié)
在本節(jié)中,您已經(jīng)知道如何以兩種不同的方式來(lái)訪問Tanzu Kubernetes集群。這兩種方式的用戶都屬于Tanzu集群管理員。在日常開發(fā)工作中,開發(fā)人員訪問Kubernetes集群的時(shí)候并不需要管理員的權(quán)限。在下節(jié)中,我么看看如何給Tanzu Kubernetes集群的開發(fā)人員賦予更加細(xì)粒度的訪問權(quán)限。
4、“Tanzu集群開發(fā)者”對(duì)Tanzu Kubernetes集群的訪問
創(chuàng)建Tanzu Kubernetes集群后,作為集群管理員,您將在集群上進(jìn)行大量管理工作。例如:創(chuàng)建不同的命名空間(注意這是Tanzu集群的命名空間,要和Supervisor集群的命名空間區(qū)分開來(lái)),為其分配資源配額,并為不同的開發(fā)人員分配不同的權(quán)限。有兩種方法可以使開發(fā)人員訪問Tanzu Kubernetes集群,一種方法是向vSphere SSO用戶分配權(quán)限,另一種方法是使用Kubernetes中的Service Account Token。下面的實(shí)戰(zhàn)練習(xí)需要幾個(gè)前提條件:
配置好Supervisor Kubernetes集群。請(qǐng)參考:Config a Supervisor Cluster
創(chuàng)建并配置好Supervisor Kubernetes集群的命名空間。請(qǐng)參考:Configure Supervisor Cluster Namespaces.
下載并安裝好Kubernetes客戶端根據(jù)kubectl和vSphere的插件。請(qǐng)參考:Download and Install the Kubernetes CLI Tools for vSphere
將Namespace的管理員角色分配給其他用戶。請(qǐng)參考上一節(jié)。
在命名空間里創(chuàng)建一個(gè)或多個(gè)Tanzu Kubernetes 集群。請(qǐng)參考:How to Create Tanzu Kubernetes Clusters.
4.1 “Tanzu集群開發(fā)者”通過(guò)SSO賬號(hào)訪問Tanzu Kubernetes集群
1、用Tanzu集群管理員的身份登錄到Tanzu Kubernetes集群上。具體步驟請(qǐng)參考上一節(jié)。
2、在以下示例中,我們將創(chuàng)建兩個(gè)命名空間(分別名為dev和test),一個(gè)角色(Role)(名為devrole),一些權(quán)限設(shè)置(在pods和deployments上的操作)和一個(gè)角色綁定(RoleBinding)。在RoleBinding中,我們將devrole與vSphere SSO用戶“ dev”連接,這意味著我們將命名空間中的“ dev”權(quán)限授予了SSO用戶“ dev@vsphere.local”。請(qǐng)注意,vSphere系統(tǒng)中必須已經(jīng)存在這個(gè)名為“dev”的SSO用戶。如何在vSphere中創(chuàng)建本地的SSO用戶,請(qǐng)參見第二節(jié)
$ kubectl create ns dev
$ kubectl create ns test
$ more devRolebindings.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: devrole
namespace: dev
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "create","list","update", "delete","watch"]
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "create","list","update", "delete","watch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: rolebinding-dev
namespace: dev
roleRef:
kind: Role
name: devrole
apiGroup: ""
subjects:
- kind: User
name: sso:dev@vsphere.local
apiGroup: rbac.authorization.k8s.io
$ kubectl apply -f devRolebindings.yaml
role.rbac.authorization.k8s.io/devrole created
rolebinding.rbac.authorization.k8s.io/rolebinding-dev created
3、使用名為“dev”的vSphere SSO用戶來(lái)登錄Tanzu Kubernetes集群
$ kubectl vsphere login --server=10.117.233.1 --tanzu-kubernetes-cluster-name \
my-tanzu-cluster --tanzu-kubernetes-cluster-namespace wangyu --vsphere-username \
dev@vsphere.local --insecure-skip-tls-verify
要注意的是:成功登錄后vSphere的kubectl插件會(huì)保存一個(gè)登錄憑證(token),這個(gè)憑證可以保證你在10小時(shí)內(nèi)不需要重新登錄系統(tǒng)就能直接訪問集群。超過(guò)10小時(shí)則需要重新執(zhí)行這條登錄命令。
4、驗(yàn)證一下當(dāng)前的dev用戶能夠在dev的命名空間里部署Deployments和Pods資源:
$ kubectl create deployment nginx --image=nginx -n dev
deployment.apps/nginx created
$ kubectl get deployments -n dev
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 0/1 1 0 19s
$ kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
nginx-86c57db685-bczhq 1/1 Running 0 2m35s
5、驗(yàn)證一下當(dāng)前的dev用戶不能夠在dev的命名空間里操作services資源
$ kubectl get services -n dev
Error from server (Forbidden): services is forbidden: User "sso:dev@vsphere.local"
cannot list resource "services" in API group "" in the namespace "dev"
6、驗(yàn)證一下當(dāng)前的dev用戶不能夠在其他命名空間里(例如test)操作deployments資源
$ kubectl create deployment nginx --image=nginx -n test
Error from server (Forbidden): deployments.apps is forbidden: User
"sso:dev@vsphere.local" cannot create resource "deployments" in API
group "" in the namespace "test"
4.2 “Tanzu集群開發(fā)者”通過(guò)Service Account Token訪問Tanzu Kubernetes集群
1、用Tanzu集群管理員的身份登錄到Tanzu Kubernetes集群上。具體步驟請(qǐng)參考上一節(jié)。
2、在以下示例中,我們將在名為“test”的命名空間中創(chuàng)建一個(gè)名為“ testaccount”的Service Account。然后我們創(chuàng)建一個(gè)名為“ testrole”的角色(Role),一些權(quán)限規(guī)則(rules)來(lái)對(duì)Pods和Deployments資源的進(jìn)行操作。接著我們創(chuàng)建一個(gè)角色綁定(RoleBinding),將“ testvrole”與“ testaccount”連接起來(lái),這意味著我們將命名空間“ test”的權(quán)限授予了名為“ testaccount”這個(gè)Service Account。
$ more saToTest.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: testaccount
namespace: test
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: testrole
namespace: test
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "create","list","update", "delete","watch"]
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "create","list","update", "delete","watch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: rolebinding-test
namespace: test
roleRef:
kind: Role
name: testrole
apiGroup: ""
subjects:
- kind: ServiceAccount
name: testaccount
namespace: test
$ kubectl apply -f satoTest.yaml -n test
serviceaccount/testaccount created
role.rbac.authorization.k8s.io/testrole created
rolebinding.rbac.authorization.k8s.io/rolebinding-test created
3、獲得這個(gè)Service Account Token的字符串:
$ TOKENNAME=`kubectl -n test get serviceaccount/testaccount -o jsonpath='{.secrets[0].name}’`
$ TOKENVALUE=`kubectl -n test get secret $TOKENNAME -o jsonpath='{.data.token}'| base64 --decode`
$ echo $TOKENVALUE
eyJhbGciOiJSUzI1NiIsImtpZCI6Im1tNEZLTGtSYnIxMXNxW……
4、獲得Tanzu Kubernetes集群API Server的IP地址和證書信息:
$ SERVERNAME=`kubectl config view --flatten --minify -o jsonpath='{.clusters[0].cluster.server}'`
$ CERTIFICATE=`kubectl config view --flatten --minify -o jsonpath='{.clusters[0].cluster.certificate-authority-data}'`
$ echo $SERVERNAME
https://10.117.233.3:6443
$ echo $CERTIFICATE
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JS……
5、創(chuàng)建一個(gè)文件sa-kubeconfig.yaml,包含下面的內(nèi)容,并且將文件中的占位符用上面·獲得的字符串$TOKENVALUE, $SERVERNAME和$CERTIFICATE替換:
apiVersion: v1
kind: Config
users:
- name: testaccount
user:
token: <replace this with $TOKENVALUE>
clusters:
- cluster:
certificate-authority-data: <replace this with $CERTIFICATE>
server: <replace this with $SERVERNAME>
name: my-tanzu-cluster
contexts:
- context:
cluster: my-tanzu-cluster
user: testaccount
name: test-my-tanzu
current-context: test-my-tanzu
6、將這個(gè)文件發(fā)給用戶,讓他設(shè)置系統(tǒng)環(huán)境變量,來(lái)直接訪問Tanzu Kubernetes集群:
$ export KUBECONFIG =./sa-kubeconfig.yaml
7、驗(yàn)證一下當(dāng)前的service account用戶能夠在test的命名空間里部署Deployments和Pods資源:
$ kubectl create deployment nginx --image=nginx -n test
deployment.apps/nginx created
$ kubectl get deployments -n test
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 0/1 1 0 19s
$ kubectl get pods -n test
NAME READY STATUS RESTARTS AGE
nginx-86c57db685-bczhq 1/1 Running 0 2m35s
8、驗(yàn)證一下當(dāng)前的service account用戶不能夠在test的命名空間里操作service資源
$ kubectl get services -n test
Error from server (Forbidden): services is forbidden: User
"system:serviceaccount:test:testaccount" cannot list resource
"services" in API group "" in the namespace "test"
9、驗(yàn)證一下當(dāng)前的service account用戶不能夠在其他命名空間里(例如dev)操作Deployments資源
$ kubectl create deployment nginx --image=nginx -n dev
Error from server (Forbidden): deployments.apps is forbidden: User
"system:serviceaccount:test:testaccount" cannot create resource "deployments"
in API group "" in the namespace "dev"
4.3 小結(jié)
在本節(jié)中,您已經(jīng)知道如何以兩種不同的方式來(lái)給Tanzu Kubernetes集群的開發(fā)人員分配權(quán)限。第一種方式一般用于給現(xiàn)有的用戶來(lái)分配權(quán)限,要求對(duì)應(yīng)的用戶已經(jīng)在vSphere SSO系統(tǒng)中存在。第二種方法常用于云管軟件和Kubernetes集群的結(jié)合,可以根據(jù)具體的權(quán)限要求動(dòng)態(tài)的產(chǎn)生用戶登錄所需要的配置文件。
5、總結(jié)
用戶對(duì)vSphere with Kubernetes的訪問控制的了解,是用戶開始使用這個(gè)產(chǎn)品最重要的環(huán)節(jié)之一。通過(guò)對(duì)系統(tǒng)不同層次的訪問控制進(jìn)行全面的了解,架構(gòu)師和系統(tǒng)管理員才能進(jìn)行數(shù)據(jù)中心安全的規(guī)劃和設(shè)置。