可以将 Guestbook 应用程序部署到 Tanzu Kubernetes 集群,以了解服务帐户以及部署和服务创建的 pod 安全策略。

部署 Guestbook 应用程序是探索 Kubernetes 的一种常用方法。如果将所有 Guestbook YAML 文件部署到 Tanzu Kubernetes Grid 服务 置备的一个 Tanzu Kubernetes 集群,将无法成功创建应用程序 pod。运行 kubectl describe pod 命令时,将显示以下错误消息:

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

Guestbook 应用程序使用 deploymentreplicaset 资源在默认命名空间中部署特权容器。由于已为 Tanzu Kubernetes 集群启用 PodSecurityPolicy 控制器,因此当任何集群用户尝试创建 Guestbook 应用程序 pod 时,都将根据 PodSecurityPolicy 检查这些控制器的服务帐户。如果适当的 PSP 未绑定到这些服务帐户,则不会部署该应用程序。

默认情况下,Tanzu Kubernetes 管理员可以使用其用户帐户直接在任何命名空间中创建特权 pod。但是,Guestbook 应用程序使用服务帐户部署特权容器。集群管理员可以在 kube-system 命名空间中创建 Deployment、StatefulSet 和 DaemonSet。但是,Guestbook 应用程序会在默认命名空间中部署这些资源。此外,如果没有适当的 PSP 和绑定,非管理用户根本无法创建特权 pod 或非特权 pod。

一种解决方案是创建默认特权 PSP 的绑定,以允许部署 Guestbook 应用程序。对于绑定帐户,特权 PodSecurityPolicy 允许以 root 用户身份运行的 pod 和特权容器。可以创建适用于 vmware-system-privileged 集群范围的 ClusterRoleBinding,但这样做可能会违反最小特权原则,因为授予的权限多于所需权限。更好的方法是创建 RoleBinding,以允许系统服务帐户在默认命名空间中使用特权 PodSecurityPolicy。有关详细信息,请参见Pod 安全策略的角色绑定示例

前提条件

过程

  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。请参见 Pod 安全策略的角色绑定示例
  4. 验证存储类或创建一个存储类。
    要验证现有存储类,请执行以下命令:
    kubectl get storageclass
    要创建存储类,请参见 Tanzu Kubernetes 存储类示例
  5. 创建使用存储类的持久卷声明 (PVC)。
    使用以下 YAML 文件: 要创建 PVC,请参见 Tanzu Kubernetes 持久卷声明示例
  6. 创建 Guestbook YAML 文件。
  7. 在 Guestbook 命名空间中部署 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 数据库中输入值。如果重新启动应用程序,将保留数据。