將 Guestbook 應用程式部署至 Tanzu Kubernetes 叢集,以深入瞭解服務帳戶的網繭安全性原則以及部署和服務建立。

部署 Guestbook 應用程式是探索 Kubernetes 的一般方式。如果您將所有 Guestbook YAML 檔案部署到由 Tanzu Kubernetes Grid 服務 佈建的 Tanzu Kubernetes 叢集,則不會成功建立應用程式網繭。執行 kubectl describe pod 命令時,會顯示下列錯誤訊息:

“Error: container has runAsNonRoot and image will run as root”

Guestbook 應用程式正在使用 deploymentreplicaset 資源在預設命名空間中部署有權限的容器。由於已針對 Tanzu Kubernetes 叢集啟用 PodSecurityPolicy 控制器,當任何叢集使用者嘗試建立 Guestbook 應用程式網繭時,會對照 PodSecurityPolicy 檢查這些控制器的服務帳戶。如果未將適當的 PSP 繫結到這些服務帳戶,則不會部署該應用程式。

依預設,Tanzu Kubernetes 管理員可以使用其使用者帳戶直接在任何命名空間中建立有權限的網繭。但是,Guestbook 應用程式會使用服務帳戶來部署有權限的容器。叢集管理員可以在 kube-system 命名空間中建立 Deployment、StatefulSet 和 DaemonSet。但是,Guestbook 應用程式會在預設命名空間中部署這些資源。此外,在沒有適當 PSP 和繫結的情況下,非管理使用者根本無法建立有權限或無權限的網繭。

一個解決方案是建立與有權限的預設 PSP 的繫結,以允許部署 Guestbook 應用程式。對於繫結帳戶,有權限的 PodSecurityPolicy 允許以 root 身分執行的網繭和有權限的容器。您可以建立在叢集範圍內套用 vmware-system-privileged 的 ClusterRoleBinding,但這樣做可能會授與比實際所需更多的權限,從而違反最低權限原則。更好的方法是建立允許系統服務帳戶在預設命名空間中使用有權限的 PodSecurityPolicy 的 RoleBinding。如需詳細資訊,請參閱 網繭安全性原則的角色繫結範例

必要條件

程序

  1. 登入 Tanzu Kubernetes 叢集。請參閱以 vCenter Single Sign-On 使用者身分連線至 Tanzu Kubernetes 叢集
  2. 建立 Guestbook 命名空間。
    kubectl create namespace guestbook
    驗證:
    kubectl get ns
  3. 使用有權限的預設 PSP 建立角色型存取控制。
    kubectl create clusterrolebinding default-tkg-admin-privileged-binding --clusterrole=psp:vmware-system-privileged --group=system:authenticated
    備註: 如果需要更嚴格的安全性,請在 Guestbook 命名空間上套用 RoleBinding。請參閱 網繭安全性原則的角色繫結範例
  4. 驗證儲存區類別,或建立一個類別。
    驗證現有的儲存區類別:
    kubectl get storageclass
    若要建立儲存區類別,請參閱 Tanzu Kubernetes 儲存區類別範例
  5. 建立使用儲存區類別的持續性磁碟區宣告 (PVC)。
    使用下列 YAML 檔案: 若要建立 PVC,請參閱 Tanzu Kubernetes 持續性磁碟區宣告範例
  6. 建立 Guestbook YAML 檔案。
  7. 在 Guestbook 應用程式的命名空間中部署該應用程式。
    kubectl apply -f . --namespace guestbook
  8. 驗證 Guestbook 資源的建立。
    kubectl get all -n guestbook
    NAME                                                 READY   STATUS              RESTARTS   AGE
    pod/guestbook-frontend-deployment-56fc5b6b47-cd58r   1/1     Running             0          65s
    pod/guestbook-frontend-deployment-56fc5b6b47-fh6dp   1/1     Running             0          65s
    pod/guestbook-frontend-deployment-56fc5b6b47-hgd2b   1/1     Running             0          65s
    pod/redis-follower-deployment-6fc9cf5759-99fgw       1/1     Running             0          65s
    pod/redis-follower-deployment-6fc9cf5759-rhxf7       1/1     Running             0          65s
    pod/redis-leader-deployment-7d89bbdbcf-flt4q         1/1     Running             0          65s
    
    NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
    service/guestbook-frontend           LoadBalancer   10.10.89.59      10.19.15.99     80:31513/TCP   65s
    service/redis-follower               ClusterIP      10.111.163.189   <none>          6379/TCP       65s
    service/redis-leader                 ClusterIP      10.111.70.189    <none>          6379/TCP       65s
    
    NAME                                            READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/guestbook-frontend-deployment   3/3     3            3           65s
    deployment.apps/redis-follower-deployment       1/2     2            1           65s
    deployment.apps/redis-leader-deployment         1/1     1            1           65s
    
    NAME                                                       DESIRED   CURRENT   READY   AGE
    replicaset.apps/guestbook-frontend-deployment-56fc5b6b47   3         3         3       65s
    replicaset.apps/redis-follower-deployment-6fc9cf5759       2         2         1       65s
    replicaset.apps/redis-leader-deployment-7d89bbdbcf         1         1         1       65s
  9. 使用 service/guestbook-frontend 負載平衡器的 External-IP 位址存取 Guestbook 網頁,在此範例中為 10.19.15.99
    您會看到 Guestbook Web 介面,並且可以在 Guestbook 資料庫中輸入值。如果重新啟動應用程式,資料會保存下來。