Tanzu Kubernetes 클러스터에 방명록 애플리케이션을 배포하여 서비스 계정, 배포 및 서비스 생성에 대한 포드 보안 정책을 탐색합니다.

방명록 애플리케이션을 배포하는 것은 Kubernetes를 살펴볼 수 있는 일반적인 방법입니다. Tanzu Kubernetes Grid 서비스에서 프로비저닝된 Tanzu Kubernetes 클러스터에 모든 방명록 YAML 파일을 배포하면 애플리케이션 포드가 생성되지 않습니다. kubectl describe pod 명령을 실행하면 다음 오류 메시지가 나타납니다.

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

방명록 애플리케이션에서는 deploymentreplicaset 리소스를 모두 사용하여 기본 네임스페이스에 권한 있는 컨테이너를 배포합니다. Tanzu Kubernetes 클러스터에 대해 PodSecurityPolicy 컨트롤러가 사용되도록 설정되어 있으므로 클러스터 사용자가 방명록 애플리케이션 포드를 생성하려고 하면 이러한 컨트롤러의 서비스 계정이 PodSecurityPolicy에 기반하여 확인됩니다. 적절한 PSP가 이러한 서비스 계정에 바인딩되지 않으면 해당 애플리케이션이 배포되지 않습니다.

기본적으로 Tanzu Kubernetes 관리자는 사용자 계정을 사용하여 네임스페이스에 권한 있는 포드를 직접 생성할 수 있습니다. 그러나 방명록 애플리케이션에서는 서비스 계정을 사용하여 권한 있는 컨테이너를 배포합니다. 클러스터 관리자는 kube-system 네임스페이스에 Deployment, StatefulSet 및 DaemonSet를 생성할 수 있습니다. 그러나 방명록 애플리케이션에서는 이러한 리소스를 기본 네임스페이스에 배포합니다. 또한 관리자가 아닌 사용자는 적절한 PSP 및 바인딩 없이는 권한 있는 또는 권한 없는 포드를 전혀 생성할 수 없습니다.

한 가지 해결 방법은 기본 권한 있는 PSP에 대한 바인딩을 생성하여 방명록 애플리케이션 배포를 허용하는 것입니다. 권한 있는 PodSecurityPolicy는 바인딩된 계정에 대해 루트로 실행 포드 및 권한 있는 컨테이너를 허용합니다. 클러스터 전체에 vmware-system-privileged를 적용하는 ClusterRoleBinding을 생성할 수 있지만 이렇게 하면 필요한 것보다 많은 권한을 부여하여 최소 권한의 원칙을 위반할 수 있습니다. 더 나은 접근 방법은 시스템 서비스 계정이 기본 네임스페이스에서 권한 있는 PodSecurityPolicy를 사용할 수 있도록 하는 RoleBinding을 생성하는 것입니다. 자세한 내용은 포드 보안 정책에 대한 역할 바인딩 예의 내용을 참조하십시오.

사전 요구 사항

프로시저

  1. Tanzu Kubernetes 클러스터에 로그인합니다. vCenter Single Sign-On 사용자로 Tanzu Kubernetes 클러스터에 연결의 내용을 참조하십시오.
  2. 방명록 네임스페이스를 생성합니다.
    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
    참고: 보안을 강화해야 하는 경우에는 방명록 네임스페이스에 RoleBinding을 적용합니다. 포드 보안 정책에 대한 역할 바인딩 예 항목을 참조하십시오.
  4. 스토리지 클래스를 확인하거나 새로 생성합니다.
    기존 스토리지 클래스를 확인하려면:
    kubectl get storageclass
    스토리지 클래스를 생성하려면 Tanzu Kubernetes 스토리지 클래스 예 항목을 참조하십시오.
  5. 스토리지 클래스를 사용하는 PVC(영구 볼륨 할당)을 생성합니다.
    다음 YAML 파일을 사용합니다. PVC를 생성하려면 Tanzu Kubernetes 영구 볼륨 할당 예 항목을 참조하십시오.
  6. 방명록 YAML 파일을 생성합니다.
  7. 네임스페이스에 방명록 애플리케이션을 배포합니다.
    kubectl apply -f . --namespace guestbook
  8. 방명록 리소스의 생성을 확인합니다.
    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 주소(이 예에서는 10.19.15.99)를 사용하여 방명록 웹 페이지에 액세스합니다.
    방명록 웹 인터페이스가 표시되고 방명록 데이터베이스에 값을 입력할 수 있습니다. 애플리케이션을 다시 시작하면 데이터가 유지됩니다.