Guestbook アプリケーションを Tanzu Kubernetes クラスタにデプロイして、サービス アカウントのポッド セキュリティ ポリシー、およびデプロイとサービスの作成について確認します。

Guestbook アプリケーションのデプロイは、Kubernetes を確認する際の一般的な手段です。Tanzu Kubernetes Grid サービス によってプロビジョニングされた Tanzu Kubernetes クラスタにすべてのゲストブック YAML ファイルをデプロイすると、アプリケーション ポッドは正常に作成されません。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 名前空間に Deployments、StatefulSets、および DaemonSet を作成できます。ただし、Guestbook アプリケーションはこれらのリソースをデフォルトの名前空間にデプロイします。また、管理者以外のユーザーは、適切な PSP やバインドがなければ特権ポッドも権限のないポッドも一切作成できません。

1 つの解決策は、デフォルトの特権 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 アドレス(この例では 10.19.15.99)を使用して Guestbook Web ページにアクセスします。
    Guestbook Web インターフェイスが表示され、Guestbook データベースに値を入力できます。アプリケーションを再起動すると、データは保持されます。