Kubernetes

Kubernetesを使用してデプロイする

Kubernetesを使用して、別々のマネージャー、コントローラー、エンフォーサーコンテナをデプロイし、すべての新しいノードにエンフォーサーがデプロイされることを確認できます。SUSE® Securityは、flannel、weave、またはcalicoなどのKubernetesネットワークプラグインを必要とし、サポートします。

サンプルファイルは、1つのマネージャーと3つのコントローラーをデプロイします。すべてのノードにエンフォーサーをデーモンセットとしてデプロイします。デフォルトでは、以下のサンプルはマスターノードにもデプロイされます。

ノードラベルを使用して専用のマネージャーまたはコントローラーノードを指定するには、下部のセクションを参照してください。

セッション状態の問題の可能性があるため、ロードバランサーの背後に1つ以上のマネージャーをデプロイ(スケール)することは推奨されません。SUSE® Securityの設定ファイルのバックアップを保存するためにPersistentVolumeクレームを使用する予定がある場合は、Deploying SUSE® Securityの概要にある一般的なバックアップ/永続データセクションを参照してください。

デプロイメントが統合されたロードバランサーをサポートしている場合は、以下のyamlファイルのコンソールでタイプNodePortをLoadBalancerに変更してください。

OpenShiftの指示用の別のセクションがあり、Kubernetes上のDocker EEにはDockerセクションに記載された特別な手順があります。

SUSE® SecurityのDocker Hub上のイメージ

イメージはSUSE® SecurityのDocker Hubレジストリにあります。マネージャー、コントローラー、エンフォーサーには適切なバージョンタグを使用し、スキャナーとアップデーターにはバージョンを’latest’のままにしてください。次に例を示します。

  • neuvector/manager:5.4.3

  • neuvector/controller:5.4.3

  • neuvector/enforcer:5.4.3

  • neuvector/scanner:latest

  • neuvector/updater:latest

適切なyamlファイル内のイメージ参照を必ず更新してください。

現在のSUSE® Security Helmチャート(v1.8.9+)を使用してデプロイする場合、values.ymlに次の変更を加える必要があります:

  • レジストリをdocker.ioに更新してください。

  • Docker Hubの現在のバージョンに合わせてイメージ名/タグを更新してください。

  • imagePullSecretsは空のままにしてください。

Rancher Manager 2.6.5+ SUSE® Securityチャートからデプロイする場合、イメージはRancher Registryのミラーイメージリポジトリから自動的に取得され、cattle-neuvector-systemネームスペースにデプロイされます。

SUSE® Securityをデプロイする。

  1. SUSE® Securityネームスペースと必要なサービスアカウントを作成する:

    kubectl create namespace neuvector
    kubectl create sa controller -n neuvector
    kubectl create sa enforcer -n neuvector
    kubectl create sa basic -n neuvector
    kubectl create sa updater -n neuvector
    kubectl create sa scanner -n neuvector
    kubectl create sa registry-adapter -n neuvector
    kubectl create sa cert-upgrader -n neuvector
  2. (オプション) SUSE® Security Pod Security Admission (PSA)またはPod Security Policy (PSP)を作成する:Kubernetes 1.25+でPod Security Admission(Pod Security Standardsとも呼ばれる)を有効にしている場合、またはKubernetesクラスターで1.25以前のPod Security Policiesを使用している場合、SUSE® Securityに次の内容を追加する(例: nv_psp.yaml)。

    • PSPはKubernetes 1.21で廃止され、1.25で完全に削除されます。

    • ManagerおよびScannerポッドはuidなしで実行される。PSPにルール`Run As User: Rule: MustRunAsNonRoot`がある場合、以下のサンプルyamlに次の内容を追加する(`#`に適切な値を設定する):

    securityContext:
        runAsUser: ###

    Kubernetes 1.25+のPSAでは、PSAが有効なクラスターにデプロイするために、SUSE® Securityネームスペースに特権プロファイルのラベルを付ける。

    kubectl label namespace neuvector "pod-security.kubernetes.io/enforce=privileged"
  3. SUSE® Securityセキュリティルールのカスタムリソース(CRD)を作成する。Kubernetes 1.19+の場合:

    YAMLを使用してバージョン`5.4.6`にアップグレードする場合、`responserules-crd-k8s.yaml`ファイルをデプロイする必要がある。Helmチャートを使用している場合、このステップは自動的に処理され、アクションは必要ない。

    kubectl apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/crd-k8s-1.19.yaml
    kubectl apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/waf-crd-k8s-1.19.yaml
    kubectl apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/dlp-crd-k8s-1.19.yaml
    kubectl apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/com-crd-k8s-1.19.yaml
    kubectl apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/vul-crd-k8s-1.19.yaml
    kubectl apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/admission-crd-k8s-1.19.yaml
    kubectl apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/5.4.3_group-definition-k8s.yaml
    kubectl apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/5.4.3_group-definition-k8s
    kubectl apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/responserules-crd-k8s.yaml
  4. Kubernetes APIにアクセスするための読み取り権限を追加する。

    標準のSUSE® Security 5.2+デプロイメントは、デフォルトのサービスアカウントの代わりに最小特権のサービスアカウントを使用する。5.3以前のバージョンからアップグレードする場合は、以下を参照する。

    5.3.0以上にアップグレードする場合は、現在のバージョンに基づいて以下のコマンドを実行する。

    • バージョン5.2.0:

    • バージョン5.2.0以前:

    kubectl delete clusterrole neuvector-binding-nvsecurityrules neuvector-binding-nvadmissioncontrolsecurityrules neuvector-binding-nvdlpsecurityrules neuvector-binding-nvwafsecurityrules
    kubectl delete clusterrolebinding neuvector-binding-app neuvector-binding-rbac neuvector-binding-admission neuvector-binding-customresourcedefinition neuvector-binding-nvsecurityrules neuvector-binding-view neuvector-binding-nvwafsecurityrules neuvector-binding-nvadmissioncontrolsecurityrules neuvector-binding-nvdlpsecurityrules
    kubectl delete rolebinding neuvector-admin -n neuvector

    以下の「create clusterrole」コマンドを使用して、読み取り権限を適用する。

    kubectl create clusterrole neuvector-binding-app --verb=get,list,watch,update --resource=nodes,pods,services,namespaces
    kubectl create clusterrole neuvector-binding-rbac --verb=get,list,watch --resource=rolebindings.rbac.authorization.k8s.io,roles.rbac.authorization.k8s.io,clusterrolebindings.rbac.authorization.k8s.io,clusterroles.rbac.authorization.k8s.io
    kubectl create clusterrolebinding neuvector-binding-app --clusterrole=neuvector-binding-app --serviceaccount=neuvector:controller
    kubectl create clusterrolebinding neuvector-binding-rbac --clusterrole=neuvector-binding-rbac --serviceaccount=neuvector:controller
    kubectl create clusterrole neuvector-binding-admission --verb=get,list,watch,create,update,delete --resource=validatingwebhookconfigurations,mutatingwebhookconfigurations
    kubectl create clusterrolebinding neuvector-binding-admission --clusterrole=neuvector-binding-admission --serviceaccount=neuvector:controller
    kubectl create clusterrole neuvector-binding-customresourcedefinition --verb=watch,create,get,update --resource=customresourcedefinitions
    kubectl create clusterrolebinding neuvector-binding-customresourcedefinition --clusterrole=neuvector-binding-customresourcedefinition --serviceaccount=neuvector:controller
    kubectl create clusterrole neuvector-binding-nvsecurityrules --verb=get,list,delete --resource=nvsecurityrules,nvclustersecurityrules
    kubectl create clusterrole neuvector-binding-nvadmissioncontrolsecurityrules --verb=get,list,delete --resource=nvadmissioncontrolsecurityrules
    kubectl create clusterrole neuvector-binding-nvdlpsecurityrules --verb=get,list,delete --resource=nvdlpsecurityrules
    kubectl create clusterrole neuvector-binding-nvwafsecurityrules --verb=get,list,delete --resource=nvwafsecurityrules
    kubectl create clusterrolebinding neuvector-binding-nvsecurityrules --clusterrole=neuvector-binding-nvsecurityrules --serviceaccount=neuvector:controller
    kubectl create clusterrolebinding neuvector-binding-view --clusterrole=view --serviceaccount=neuvector:controller
    kubectl create clusterrolebinding neuvector-binding-nvwafsecurityrules --clusterrole=neuvector-binding-nvwafsecurityrules --serviceaccount=neuvector:controller
    kubectl create clusterrolebinding neuvector-binding-nvadmissioncontrolsecurityrules --clusterrole=neuvector-binding-nvadmissioncontrolsecurityrules --serviceaccount=neuvector:controller
    kubectl create clusterrolebinding neuvector-binding-nvdlpsecurityrules --clusterrole=neuvector-binding-nvdlpsecurityrules --serviceaccount=neuvector:controller
    kubectl create role neuvector-binding-scanner --verb=get,patch,update,watch --resource=deployments -n neuvector
    kubectl create rolebinding neuvector-binding-scanner --role=neuvector-binding-scanner --serviceaccount=neuvector:updater --serviceaccount=neuvector:controller -n neuvector
    kubectl create role neuvector-binding-secret --verb=get --resource=secrets -n neuvector
    kubectl create rolebinding neuvector-binding-secret --role=neuvector-binding-secret --serviceaccount=neuvector:controller -n neuvector
    kubectl create role neuvector-binding-secret --verb=get,list,watch --resource=secrets -n neuvector
    kubectl create rolebinding neuvector-binding-secret --role=neuvector-binding-secret --serviceaccount=neuvector:controller --serviceaccount=neuvector:enforcer --serviceaccount=neuvector:scanner --serviceaccount=neuvector:registry-adapter -n neuvector
    kubectl create clusterrole neuvector-binding-nvcomplianceprofiles --verb=get,list,delete --resource=nvcomplianceprofiles
    kubectl create clusterrolebinding neuvector-binding-nvcomplianceprofiles --clusterrole=neuvector-binding-nvcomplianceprofiles --serviceaccount=neuvector:controller
    kubectl create clusterrole neuvector-binding-nvvulnerabilityprofiles --verb=get,list,delete --resource=nvvulnerabilityprofiles
    kubectl create clusterrolebinding neuvector-binding-nvvulnerabilityprofiles --clusterrole=neuvector-binding-nvvulnerabilityprofiles --serviceaccount=neuvector:controller
    kubectl apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/neuvector-roles-k8s.yaml
    kubectl create role neuvector-binding-lease --verb=create,get,update --resource=leases -n neuvector
    kubectl create rolebinding neuvector-binding-cert-upgrader --role=neuvector-binding-cert-upgrader --serviceaccount=neuvector:cert-upgrader -n neuvector
    kubectl create rolebinding neuvector-binding-job-creation --role=neuvector-binding-job-creation --serviceaccount=neuvector:controller -n neuvector
    kubectl create rolebinding neuvector-binding-lease --role=neuvector-binding-lease --serviceaccount=neuvector:controller --serviceaccount=neuvector:cert-upgrader -n neuvector
    kubectl create clusterrole neuvector-binding-nvgroupdefinitions --verb=list,get,delete --resource=nvgroupdefinitions
    kubectl create clusterrolebinding neuvector-binding-nvgroupdefinitions --clusterrole=neuvector-binding-nvgroupdefinitions --serviceaccount=neuvector:controller
    kubectl create role neuvector-binding-secret-controller --verb=create,patch,update --resource=secrets -n neuvector
    kubectl create rolebinding neuvector-binding-secret-controller --role=neuvector-binding-secret-controller --serviceaccount=neuvector:controller --serviceaccount=neuvector:default -n neuvector
    kubectl create clusterrole neuvector-binding-nvresponserulesecurityrules --verb=get,list,delete --resource=nvresponserulesecurityrules
    kubectl create clusterrolebinding neuvector-binding-nvresponserulesecurityrules --clusterrole=neuvector-binding-nvresponserulesecurityrules --serviceaccount=neuvector:controller
  5. 以下のコマンドを実行して、neuvector/controllerおよびneuvector/updaterサービスアカウントが正常に追加されたか確認する。

    kubectl get ClusterRoleBinding neuvector-binding-app neuvector-binding-rbac neuvector-binding-admission neuvector-binding-customresourcedefinition neuvector-binding-nvsecurityrules neuvector-binding-view neuvector-binding-nvwafsecurityrules neuvector-binding-nvadmissioncontrolsecurityrules neuvector-binding-nvdlpsecurityrules neuvector-binding-nvgroupdefinitions neuvector-binding-nvresponserulesecurityrules -o wide

    サンプル出力:

    NAME                                                ROLE                                                            AGE   USERS   GROUPS   SERVICEACCOUNTS
    neuvector-binding-app                               ClusterRole/neuvector-binding-app                               66d                    neuvector/controller
    neuvector-binding-rbac                              ClusterRole/neuvector-binding-rbac                              66d                    neuvector/controller
    neuvector-binding-admission                         ClusterRole/neuvector-binding-admission                         66d                    neuvector/controller
    neuvector-binding-customresourcedefinition          ClusterRole/neuvector-binding-customresourcedefinition          66d                    neuvector/controller
    neuvector-binding-nvsecurityrules                   ClusterRole/neuvector-binding-nvsecurityrules                   66d                    neuvector/controller
    neuvector-binding-view                              ClusterRole/view                                                66d                    neuvector/controller
    neuvector-binding-nvwafsecurityrules                ClusterRole/neuvector-binding-nvwafsecurityrules                66d                    neuvector/controller
    neuvector-binding-nvadmissioncontrolsecurityrules   ClusterRole/neuvector-binding-nvadmissioncontrolsecurityrules   66d                    neuvector/controller
    neuvector-binding-nvdlpsecurityrules                ClusterRole/neuvector-binding-nvdlpsecurityrules                66d                    neuvector/controller
    neuvector-binding-nvgroupdefinitions                ClusterRole/neuvector-binding-nvgroupdefinitions                66d                    neuvector/controller

    そしてこのコマンド:

    kubectl get RoleBinding neuvector-binding-scanner neuvector-binding-cert-upgrader neuvector-binding-job-creation neuvector-binding-lease neuvector-binding-secret -n neuvector -o wide

    サンプル出力:

    NAME                              ROLE                                   AGE    USERS   GROUPS   SERVICEACCOUNTS
    neuvector-binding-scanner         Role/neuvector-binding-scanner         8m8s                    neuvector/controller, neuvector/updater
    neuvector-binding-cert-upgrader   Role/neuvector-binding-cert-upgrader   8m8s                    neuvector/cert-upgrader
    neuvector-binding-job-creation    Role/neuvector-binding-job-creation    8m8s                    neuvector/controller
    neuvector-binding-lease           Role/neuvector-binding-lease           8m8s                    neuvector/controller, neuvector/cert-upgrader
    neuvector-binding-secret          Role/neuvector-binding-secret          8m8s                    neuvector/controller, neuvector/enforcer, neuvector/scanner, neuvector/registry-adapter
  6. (オプション) フェデレーションマスターおよび/またはリモートマルチクラスター管理サービスを作成する。SUSE® Securityでマルチクラスター管理機能を使用する予定の場合、1つのクラスターにはフェデレーションマスターサービスがデプロイされている必要があり、各リモートクラスターにはフェデレーションワーカーサービスが必要となる。柔軟性のために、各クラスターにマスターサービスとワーカーサービスの両方をデプロイすることを選択でき、任意のクラスターがマスターまたはリモートになることができる。フェデレーテッド クラスター管理

    apiVersion: v1
    kind: Service
    metadata:
      name: neuvector-service-controller-fed-master
      namespace: neuvector
    spec:
      ports:
      - port: 11443
        name: fed
        protocol: TCP
      type: LoadBalancer
      selector:
        app: neuvector-controller-pod
    
    ---
    
    apiVersion: v1
    kind: Service
    metadata:
      name: neuvector-service-controller-fed-worker
      namespace: neuvector
    spec:
      ports:
      - port: 10443
        name: fed
        protocol: TCP
      type: LoadBalancer
      selector:
        app: neuvector-controller-pod

    次に、適切なサービスを作成します:

    kubectl create -f nv_master_worker.yaml
  7. プリセットバージョンコマンドを使用して、主要なSUSE® Securityサービスとポッドを作成するか、以下のサンプルyamlを修正してください。プリセットバージョンは、SUSE® Securityコンソールのためにロードバランサーを呼び出します。以下のサンプルyamlファイルを使用する場合は、yamlファイル内のマネージャー、コントローラー、およびエンフォーサーのイメージ参照におけるイメージ名と<version>タグを置き換えてください。また、デプロイメント環境に必要な他の変更(マネージャーアクセスのためのロードバランサー/ノードポート/イングレスなど)を行ってください。以下のYAMLは、v5.4.2以降からデプロイされた場合、内部証明書の変更のために変更する必要があります。このYAMLを参照してください。

    kubectl apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/neuvector-k8s.yaml

    または、上記のyamlや以下のサンプルを修正する場合:

    kubectl create -f neuvector.yaml

    それで終わりです!SUSE® Securityコンソールに接続し、admin:adminでログインできるはずです。例えば、`\https://<public-ip>:8443`のように。

neuvector.yamlファイルに指定されたnodeportサービスは、SUSE® Security管理用Webコンソールポートのために、すべてのKubernetesノードでランダムなポートを開きます。代わりに、LoadBalancerまたはIngressを使用して、パブリックIPとデフォルトポート8443を使用することができます。nodeportの場合、そのポートのファイアウォールを通じてアクセスを開く必要がある場合は、必ず行ってください。ホストノードでどのポートが開いているかを確認したい場合は、次のコマンドを実行してください:

kubectl get svc -n neuvector

そして、次のようなものが表示されます:

NAME                          CLUSTER-IP      EXTERNAL-IP   PORT(S)                                          AGE
neuvector-service-webui     10.100.195.99     <nodes>       8443:30257/TCP                                   15m

PKSの変更

PKSはフィールドテスト済みで、プラン/タイルに特権コンテナを有効にする必要があり、Allinone、Controller、EnforcerのためにyamlのhostPathを次のように変更します:

      hostPath:
            path: /var/vcap/sys/run/docker/docker.sock

マスターノードのテイントとトレランス

すべてのテイント情報は、ノードにエンフォーサーをスケジュールするために一致している必要があります。ノード(例:マスター)のテイント情報を確認するには:

kubectl get node taintnodename -o yaml

サンプル出力:

spec:
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
  # there may be an extra info for taint as below
  - effect: NoSchedule
    key: mykey
    value: myvalue

上記のように追加のテイントがある場合は、これらをサンプルyamlのトレランスセクションに追加してください:

spec:
  template:
    spec:
      tolerations:
        - effect: NoSchedule
          key: node-role.kubernetes.io/master
        - effect: NoSchedule
          key: node-role.kubernetes.io/control-plane
        # if there is an extra info for taints as above, please add it here. This is required to match all the taint info defined on the taint node. Otherwise, the Enforcer won't deploy on the taint node
        - effect: NoSchedule
          key: mykey
          value: myvalue

マネージャーおよびコントローラー ノードのためのノードラベルの使用

マネージャーとコントローラーがデプロイされるノードを制御するために、各ノードにラベルを付けてください。nodenameを適切なノード名(‘kubectl get nodes’)に置き換えてください。注意:デフォルトでは、Kubernetesはマスターノードにポッドをスケジュールしません。

kubectl label nodes nodename nvcontroller=true

次に、マネージャーとコントローラーのデプロイメントセクションのyamlファイルにnodeSelectorを追加してください。次に例を示します。

          - mountPath: /host/cgroup
              name: cgroup-vol
              readOnly: true
      nodeSelector:
        nvcontroller: "true"
      restartPolicy: Always

専用の管理ノード(監視するアプリケーションコンテナがない場合)である場合、コントローラーノードにエンフォーサーがデプロイされないように、エンフォーサーのyamlセクションにnodeAffinityを追加してください。次に例を示します。

  app: neuvector-enforcer-pod
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                - key: nvcontroller
                  operator: NotIn
                  values: ["true"]
      imagePullSecrets:

ローリングアップデート

Kubernetes、RedHat OpenShift、Rancherなどのオーケストレーションツールは、設定可能なポリシーを使用してローリングアップデートをサポートしています。この機能を使用して、SUSE® Security コンテナを更新することができます。最も重要なのは、ポリシー、ログ、および接続データが失われないように、少なくとも 1 つのコントローラー (またはオールインワン) が実行されていることを確認することです。新しいリーダーを選出し、コントローラー間でデータを同期させるために、コンテナを更新する間に最低 120 秒を確保してください。

提供されたサンプルデプロイメント YAML は、ローリングアップデートポリシーをすでに構成しています。SUSE® Security Helm チャートを介して更新している場合は、最新のチャートをプルして、入場制御などの新機能を適切に構成し、SUSE® Security の古いクラスター ロールとクラスター ロール バインディングを削除してください。Kubernetes を介して更新している場合は、以下のサンプルコマンドを使用して手動で新しいバージョンに更新することができます。

サンプル Kubernetes ローリングアップデート

新しいイメージバージョンに更新するだけのアップグレードの場合は、このシンプルなアプローチを使用できます。

デプロイメントまたはデーモンセットがすでに実行中の場合は、YAML ファイルを新しいバージョンに変更し、更新を適用できます。

kubectl apply -f <yaml file>

コマンドラインから SUSE® Security の新しいバージョンに更新するには。

デプロイメントとしてのコントローラー (マネージャーにも適用)

kubectl set image deployment/neuvector-controller-pod neuvector-controller-pod=neuvector/controller:<version> -n neuvector

デーモンセットとしての任意のコンテナの場合:

kubectl set image -n neuvector ds/neuvector-enforcer-pod neuvector-enforcer-pod=neuvector/enforcer:<version>

ローリングアップデートのステータスを確認するには:

kubectl rollout status -n neuvector ds/neuvector-enforcer-pod
kubectl rollout status -n neuvector deployment/neuvector-controller-pod

更新をロールバックするには:

kubectl rollout undo -n neuvector ds/neuvector-enforcer-pod
kubectl rollout undo -n neuvector deployment/neuvector-controller-pod

Kubernetes で REST API を公開する

Kubernetes クラスターの外部からアクセスするために REST API を公開するには、以下のサンプル YAML ファイルを参照してください:

apiVersion: v1
kind: Service
metadata:
  name: neuvector-service-rest
  namespace: neuvector
spec:
  ports:
    - port: 10443
      name: controller
      protocol: TCP
  type: LoadBalancer
  selector:
    app: neuvector-controller-pod

REST API に関する詳細は、オートメーションセクションをご覧ください。

非特権モードでの Kubernetes デプロイメント

以下の手順を使用して、特権モードコンテナを使用せずに SUSE® Security をデプロイできます。コントローラーはすでに非特権モードにあり、Enforcer のデプロイメントを変更する必要があります。以下に、抜粋されたスニペットを示します。

Enforcer:

spec:
  template:
    metadata:
      annotations:
        container.apparmor.security.beta.kubernetes.io/neuvector-enforcer-pod: unconfined
        # this line is required to be added if k8s version is pre-v1.19
        # container.seccomp.security.alpha.kubernetes.io/neuvector-enforcer-pod: unconfined
    spec:
      containers:
          securityContext:
            # the following two lines are required for k8s v1.19+. pls comment out both lines if version is pre-1.19. Otherwise, a validating data error message will show
            seccompProfile:
              type: Unconfined
            capabilities:
              add:
              - SYS_ADMIN
              - NET_ADMIN
              - SYS_PTRACE
              - IPC_LOCK

Kubernetes デプロイメント YAML v5.4.2 以降

以下のサンプル YAML は、バージョン 5.4.2 以降のもので、内部証明書を Controller、Enforcer、および Scanner ポッドにマウントする必要があります。ハードコーディングされた証明書はもはやサポートされていません。デプロイする前に、指定されたリンクから内部証明書のシークレットを作成してください:内部証明書の置き換え

詳しくは、ここをクリックしてください。
apiVersion: v1
kind: Service
metadata:
  name: neuvector-svc-crd-webhook
  namespace: neuvector
spec:
  ports:
  - port: 443
    targetPort: 30443
    protocol: TCP
    name: crd-webhook
  type: ClusterIP
  selector:
    app: neuvector-controller-pod

---

apiVersion: v1
kind: Service
metadata:
  name: neuvector-svc-admission-webhook
  namespace: neuvector
spec:
  ports:
  - port: 443
    targetPort: 20443
    protocol: TCP
    name: admission-webhook
  type: ClusterIP
  selector:
    app: neuvector-controller-pod

---

apiVersion: v1
kind: Service
metadata:
  name: neuvector-service-webui
  namespace: neuvector
spec:
  ports:
    - port: 8443
      name: manager
      protocol: TCP
  type: LoadBalancer
  selector:
    app: neuvector-manager-pod

---

apiVersion: v1
kind: Service
metadata:
  name: neuvector-svc-controller
  namespace: neuvector
spec:
  ports:
  - port: 18300
    protocol: "TCP"
    name: "cluster-tcp-18300"
  - port: 18301
    protocol: "TCP"
    name: "cluster-tcp-18301"
  - port: 18301
    protocol: "UDP"
    name: "cluster-udp-18301"
  clusterIP: None
  selector:
    app: neuvector-controller-pod

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: neuvector-manager-pod
  namespace: neuvector
spec:
  selector:
    matchLabels:
      app: neuvector-manager-pod
  replicas: 1
  template:
    metadata:
      labels:
        app: neuvector-manager-pod
    spec:
      serviceAccountName: basic
      serviceAccount: basic
      containers:
        - name: neuvector-manager-pod
          image: neuvector/manager:5.4.3
          env:
            - name: CTRL_SERVER_IP
              value: neuvector-svc-controller.neuvector
      restartPolicy: Always

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: neuvector-controller-pod
  namespace: neuvector
spec:
  selector:
    matchLabels:
      app: neuvector-controller-pod
  minReadySeconds: 60
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  replicas: 3
  template:
    metadata:
      labels:
        app: neuvector-controller-pod
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - neuvector-controller-pod
              topologyKey: "kubernetes.io/hostname"
      serviceAccountName: controller
      serviceAccount: controller
      containers:
        - name: neuvector-controller-pod
          image: neuvector/controller:5.4.3
          securityContext:
            runAsUser: 0
          readinessProbe:
            exec:
              command:
              - cat
              - /tmp/ready
            failureThreshold: 3
            initialDelaySeconds: 5
            periodSeconds: 5
            successThreshold: 1
            timeoutSeconds: 1
          env:
            - name: CLUSTER_JOIN_ADDR
              value: neuvector-svc-controller.neuvector
            - name: CLUSTER_ADVERTISED_ADDR
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: CLUSTER_BIND_ADDR
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
          volumeMounts:
            - mountPath: /etc/config
              name: config-volume
              readOnly: true
            - mountPath: /etc/neuvector/certs/internal/cert.key
              name: internal-cert
              readOnly: true
              subPath: tls.key
            - mountPath: /etc/neuvector/certs/internal/cert.pem
              name: internal-cert
              readOnly: true
              subPath: tls.crt
            - mountPath: /etc/neuvector/certs/internal/ca.cert
              name: internal-cert
              readOnly: true
              subPath: ca.crt
      terminationGracePeriodSeconds: 300
      restartPolicy: Always
      volumes:
        - name: config-volume
          projected:
            sources:
              - configMap:
                  name: neuvector-init
                  optional: true
              - secret:
                  name: neuvector-init
                  optional: true
              - secret:
                  name: neuvector-secret
                  optional: true
        - name: internal-cert
          secret:
            defaultMode: 420
            secretName: internal-cert

---

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: neuvector-enforcer-pod
  namespace: neuvector
spec:
  selector:
    matchLabels:
      app: neuvector-enforcer-pod
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: neuvector-enforcer-pod
    spec:
      tolerations:
        - effect: NoSchedule
          key: node-role.kubernetes.io/master
        - effect: NoSchedule
          key: node-role.kubernetes.io/control-plane
      hostPID: true
      serviceAccountName: enforcer
      serviceAccount: enforcer
      containers:
        - name: neuvector-enforcer-pod
          image: neuvector/enforcer:5.4.3
          securityContext:
            privileged: true
          env:
            - name: CLUSTER_JOIN_ADDR
              value: neuvector-svc-controller.neuvector
            - name: CLUSTER_ADVERTISED_ADDR
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: CLUSTER_BIND_ADDR
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
          volumeMounts:
            - mountPath: /lib/modules
              name: modules-vol
              readOnly: true
            - mountPath: /var/nv_debug
              name: nv-debug
              readOnly: false
            - mountPath: /etc/neuvector/certs/internal/cert.key
              name: internal-cert
              readOnly: true
              subPath: tls.key
            - mountPath: /etc/neuvector/certs/internal/cert.pem
              name: internal-cert
              readOnly: true
              subPath: tls.crt
            - mountPath: /etc/neuvector/certs/internal/ca.cert
              name: internal-cert
              readOnly: true
              subPath: ca.crt
      terminationGracePeriodSeconds: 1200
      restartPolicy: Always
      volumes:
        - name: modules-vol
          hostPath:
            path: /lib/modules
        - name: nv-debug
          hostPath:
            path: /var/nv-debug
        - name: internal-cert
          secret:
            defaultMode: 420
            secretName: internal-cert

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: neuvector-scanner-pod
  namespace: neuvector
spec:
  selector:
    matchLabels:
      app: neuvector-scanner-pod
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  replicas: 2
  template:
    metadata:
      labels:
        app: neuvector-scanner-pod
    spec:
      serviceAccountName: scanner
      serviceAccount: scanner
      containers:
        - name: neuvector-scanner-pod
          image: neuvector/scanner:latest
          imagePullPolicy: Always
          env:
            - name: CLUSTER_JOIN_ADDR
              value: neuvector-svc-controller.neuvector
          volumeMounts:
            - mountPath: /etc/neuvector/certs/internal/cert.key
              name: internal-cert
              readOnly: true
              subPath: tls.key
            - mountPath: /etc/neuvector/certs/internal/cert.pem
              name: internal-cert
              readOnly: true
              subPath: tls.crt
            - mountPath: /etc/neuvector/certs/internal/ca.cert
              name: internal-cert
              readOnly: true
              subPath: ca.crt
      restartPolicy: Always
      volumes:
        - name: internal-cert
          secret:
            defaultMode: 420
            secretName: internal-cert
---

apiVersion: batch/v1
kind: CronJob
metadata:
  name: neuvector-updater-pod
  namespace: neuvector
spec:
  schedule: "0 0 * * *"
  jobTemplate:
    spec:
      template:
        metadata:
          labels:
            app: neuvector-updater-pod
        spec:
          serviceAccountName: updater
          serviceAccount: updater
          containers:
          - name: neuvector-updater-pod
            image: neuvector/updater:latest
            imagePullPolicy: Always
            command:
            - /bin/sh
            - -c
            - TOKEN=`cat /var/run/secrets/kubernetes.io/serviceaccount/token`; /usr/bin/curl -kv -X PATCH -H "Authorization:Bearer $TOKEN" -H "Content-Type:application/strategic-merge-patch+json" -d '{"spec":{"template":{"metadata":{"annotations":{"kubectl.kubernetes.io/restartedAt":"'`date +%Y-%m-%dT%H:%M:%S%z`'"}}}}}' 'https://kubernetes.default/apis/apps/v1/namespaces/neuvector/deployments/neuvector-scanner-pod'
          restartPolicy: Never

以下のサンプルは、完全なデプロイメントリファレンスです(Kubernetes 1.19+)。

詳しくは、ここをクリックしてください。
apiVersion: v1
kind: Service
metadata:
  name: neuvector-svc-crd-webhook
  namespace: neuvector
spec:
  ports:
  - port: 443
    targetPort: 30443
    protocol: TCP
    name: crd-webhook
  type: ClusterIP
  selector:
    app: neuvector-controller-pod

---

apiVersion: v1
kind: Service
metadata:
  name: neuvector-svc-admission-webhook
  namespace: neuvector
spec:
  ports:
  - port: 443
    targetPort: 20443
    protocol: TCP
    name: admission-webhook
  type: ClusterIP
  selector:
    app: neuvector-controller-pod

---

apiVersion: v1
kind: Service
metadata:
  name: neuvector-service-webui
  namespace: neuvector
spec:
  ports:
    - port: 8443
      name: manager
      protocol: TCP
  type: LoadBalancer
  selector:
    app: neuvector-manager-pod

---

apiVersion: v1
kind: Service
metadata:
  name: neuvector-svc-controller
  namespace: neuvector
spec:
  ports:
  - port: 18300
    protocol: "TCP"
    name: "cluster-tcp-18300"
  - port: 18301
    protocol: "TCP"
    name: "cluster-tcp-18301"
  - port: 18301
    protocol: "UDP"
    name: "cluster-udp-18301"
  clusterIP: None
  selector:
    app: neuvector-controller-pod

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: neuvector-manager-pod
  namespace: neuvector
spec:
  selector:
    matchLabels:
      app: neuvector-manager-pod
  replicas: 1
  template:
    metadata:
      labels:
        app: neuvector-manager-pod
    spec:
      serviceAccountName: basic
      serviceAccount: basic
      containers:
        - name: neuvector-manager-pod
          image: neuvector/manager:5.4.3
          env:
            - name: CTRL_SERVER_IP
              value: neuvector-svc-controller.neuvector
      restartPolicy: Always

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: neuvector-controller-pod
  namespace: neuvector
spec:
  selector:
    matchLabels:
      app: neuvector-controller-pod
  minReadySeconds: 60
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  replicas: 3
  template:
    metadata:
      labels:
        app: neuvector-controller-pod
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - neuvector-controller-pod
              topologyKey: "kubernetes.io/hostname"
      serviceAccountName: controller
      serviceAccount: controller
      containers:
        - name: neuvector-controller-pod
          image: neuvector/controller:5.4.3
          securityContext:
            runAsUser: 0
          readinessProbe:
            exec:
              command:
              - cat
              - /tmp/ready
            initialDelaySeconds: 5
            periodSeconds: 5
          env:
            - name: CLUSTER_JOIN_ADDR
              value: neuvector-svc-controller.neuvector
            - name: CLUSTER_ADVERTISED_ADDR
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: CLUSTER_BIND_ADDR
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
          volumeMounts:
            - mountPath: /etc/config
              name: config-volume
              readOnly: true
      terminationGracePeriodSeconds: 300
      restartPolicy: Always
      volumes:
        - name: config-volume
          projected:
            sources:
              - configMap:
                  name: neuvector-init
                  optional: true
              - secret:
                  name: neuvector-init
                  optional: true
              - secret:
                  name: neuvector-secret
                  optional: true

---

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: neuvector-enforcer-pod
  namespace: neuvector
spec:
  selector:
    matchLabels:
      app: neuvector-enforcer-pod
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: neuvector-enforcer-pod
      annotations:
        container.apparmor.security.beta.kubernetes.io/neuvector-enforcer-pod: unconfined
      # Add the following for pre-v1.19
      # container.seccomp.security.alpha.kubernetes.io/neuvector-enforcer-pod: unconfined
    spec:
      tolerations:
        - effect: NoSchedule
          key: node-role.kubernetes.io/master
        - effect: NoSchedule
          key: node-role.kubernetes.io/control-plane
      hostPID: true
      serviceAccountName: enforcer
      serviceAccount: enforcer
      containers:
        - name: neuvector-enforcer-pod
          image: neuvector/enforcer:5.4.3
          securityContext:
            # the following two lines are required for k8s v1.19+. pls comment out both lines if version is pre-1.19. Otherwise, a validating data error message will show
            seccompProfile:
              type: Unconfined
            capabilities:
              add:
              - SYS_ADMIN
              - NET_ADMIN
              - SYS_PTRACE
              - IPC_LOCK
          env:
            - name: CLUSTER_JOIN_ADDR
              value: neuvector-svc-controller.neuvector
            - name: CLUSTER_ADVERTISED_ADDR
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: CLUSTER_BIND_ADDR
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
          volumeMounts:
            - mountPath: /lib/modules
              name: modules-vol
              readOnly: true
            - mountPath: /var/nv_debug
              name: nv-debug
              readOnly: false
      terminationGracePeriodSeconds: 1200
      restartPolicy: Always
      volumes:
        - name: modules-vol
          hostPath:
            path: /lib/modules
        - name: nv-debug
          hostPath:
            path: /var/nv-debug

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: neuvector-scanner-pod
  namespace: neuvector
spec:
  selector:
    matchLabels:
      app: neuvector-scanner-pod
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  replicas: 2
  template:
    metadata:
      labels:
        app: neuvector-scanner-pod
    spec:
      serviceAccountName: scanner
      serviceAccount: scanner
      containers:
        - name: neuvector-scanner-pod
          image: neuvector/scanner:latest
          imagePullPolicy: Always
          env:
            - name: CLUSTER_JOIN_ADDR
              value: neuvector-svc-controller.neuvector
      restartPolicy: Always

---

apiVersion: batch/v1
kind: CronJob
metadata:
  name: neuvector-updater-pod
  namespace: neuvector
spec:
  schedule: "0 0 * * *"
  jobTemplate:
    spec:
      template:
        metadata:
          labels:
            app: neuvector-updater-pod
        spec:
          serviceAccountName: updater
          serviceAccount: updater
          containers:
          - name: neuvector-updater-pod
            image: neuvector/updater:latest
            imagePullPolicy: Always
            command:
            - TOKEN=`cat /var/run/secrets/kubernetes.io/serviceaccount/token`; /usr/bin/curl -kv -X PATCH -H "Authorization:Bearer $TOKEN" -H "Content-Type:application/strategic-merge-patch+json" -d '{"spec":{"template":{"metadata":{"annotations":{"kubectl.kubernetes.io/restartedAt":"'`date +%Y-%m-%dT%H:%M:%S%z`'"}}}}}' 'https://kubernetes.default/apis/apps/v1/namespaces/neuvector/deployments/neuvector-scanner-pod'
          restartPolicy: Never

PKS の変更

PKS はフィールドテスト済みで、プラン/タイルに特権コンテナを有効にする必要があり、Allinone、Enforcer のために yaml の hostPath を次のように変更する必要があります。

      hostPath:
            path: /var/vcap/sys/run/docker/docker.sock