이 사이트에 TKG v1.4 Carvel 패키지를 TKG의 멀티 클라우드 버전(TKGm)에 배포하는 방법을 자세히 설명하는 여러 문서를 게시했습니다. 하지만 이러한 패키지는 vSphere with Tanzu에서 TKG Service(TKGS)를 통해 프로비저닝된 클러스터에도 구현할 수 있다는 사실을 알고 계십니까? 이 게시물에서는 이를 달성할 수 있는 방법에 대해 단계별로 설명하겠습니다. 공식 문서는 여기에서 확인할 수 있으며, 특히 일부 매니페스트에 대해서는 이 게시물 중에 수시로 참조할 것입니다. 또한 Grafana, Prometheus 및 Fluent Bit와 같은 일부 패키지는 vSphere 7.0U2 이후의 릴리스에서 아직 검증되지 않았으므로 처음에는 vSphere 7.0U3에 Cert Manager 패키지를 구축하는 데 필요한 사항을 중점적으로 살펴보겠습니다. 또한 Tanzu CLI를 vSphere with Tanzu와 함께 활용해야 합니다. 이전 포스트에서 Tanzu Kubernetes 워크로드 클러스터를 Tanzu와 함께 프로비저닝하는 데 사용되었음을 확인할 수 있습니다. 먼저 현재 환경의 전체 설정 목록을 살펴보겠습니다. 요구사항보다 더 높은 경우가 있지만, 참고용으로 게시합니다.
환경
- vSphere 7.0U3c 빌드 19234570
- 기존 vSphere with Tanzu Supervisor Cluster – v1.21.0+vmware.wcp.2-vsc0.0.12-18735554
- 기존 Tanzu Kubernetes 워크로드 클러스터 – v1.20.7+VMware.1-tkg.1.7fb9067
- 기존 NSX ALB/Avi Vantage 로드 밸런서 – v20.1.5
- Tangu CLI – v1.4.1 buildDate: 2022-01-04
- 추가 Tanzu CLI 툴 – ytt / kapp / kbld / imgpkg
tangu CLI 컨텍스트를 TKC로 설정
이제 배포/설정 단계를 진행하겠습니다. 먼저 Supervisor 클러스터 컨텍스트를 사용하여 Tanzu로 vSphere에 로그인합니다. 그런 다음 Supervisor 클러스터에 탄주 컨텍스트를 설정합니다. 마지막으로 vSphere Tanzu Kubernetes에 한 번 더 로그인하여 워크로드 클러스터에 컨텍스트를 설정합니다.
% kubectl-vsphere login --server xx.xx.62.16 --vsphere-username administrator@vsphere.local \ --insecure-skip-tls-verify Logged in successfully. You have access to the following contexts: xx.xx.62.16 workload If the context you wish to use is not in this list, you may need to try logging in again later, or contact your cluster administrator. To change context, use `kubectl config use-context <workload name>` % kubectl config use-context xx.xx.62.16 Switched to context "xx.xx.62.16". % tanzu login --context xx.xx.62.16 ? Select a server xx.xx.62.16 () ✔ successfully logged in to management cluster using the kubeconfig xx.xx.62.16 % kubectl-vsphere login --server xx.xx.62.16 --vsphere-username administrator@vsphere.local \ --insecure-skip-tls-verify \ --tanzu-kubernetes-cluster-namespace workload \ --tanzu-kubernetes-cluster-name workload1 Logged in successfully. You have access to the following contexts: xx.xx.62.16 workload workload1 If the context you wish to use is not in this list, you may need to try logging in again later, or contact your cluster administrator. To change context, use `kubectl config use-context <workload name>` % kubectl config use-context workload1 Switched to context "workload1". % kubectl get nodes NAME STATUS ROLES AGE VERSION workload1-control-plane-pdvqt Ready control-plane,master 5d v1.20.7+vmware.1 workload1-workers-gwdmd-6794cd57d8-pj8lk Ready <none> 5d v1.20.7+vmware.1 workload1-workers-gwdmd-6794cd57d8-ts859 Ready <none> 96m v1.20.7+vmware.1 workload1-workers-gwdmd-6794cd57d8-wjfxq Ready <none> 96m v1.20.7+vmware.1 % kubectl config use-context workload1 Switched to context "workload1".
기본 StorageClass를 정의
공식 문서의 단계 중 하나는 기본 저장소 클래스가 있는지 확인하는 것입니다. 이렇게 하려면 TKC가 배포된 네임스페이스에 할당한 스토리지 클래스 중 하나를 패치해야 합니다. vSAN 기본 스토리지 정책이라는 스토리지 클래스 하나만 추가했으므로 이 단계를 기본값으로 설정하는 단계입니다.
% kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE vsan-default-storage-policy csi.vsphere.vmware.com Delete Immediate true 5d % kubectl patch storageclass vsan-default-storage-policy -p \ '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' storageclass.storage.k8s.io/vsan-default-storage-policy patched % kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE vsan-default-storage-policy (default) csi.vsphere.vmware.com Delete Immediate true 5d
서비스 계정에 대한 ClusterRole/ClusterRoleBinding을 생성
설치 중인 대부분의 패키지는 자체 서비스 계정을 가지고 있으므로 이러한 서비스 계정이 워크로드 클러스터에서 Pod를 생성하는 기능과 같은 작업을 수행할 수 있는 적절한 권한을 가지고 있는지 확인해야 합니다. 기본적으로 워크로드 클러스터와 관련된 두 가지 미리 정의된 포드 보안 정책이 있습니다.
% kubectl get psp NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP READONLYROOTFS VOLUMES vmware-system-privileged true * RunAsAny RunAsAny RunAsAny RunAsAny false * vmware-system-restricted false RunAsAny MustRunAsNonRoot MustRunAs MustRunAs false configMap,emptyDir,projected,secret,downwardAPI,persistentVolumeClaim
고유한 PodSecurityPolicy를 생성할 수 있지만 미리 정의된 PodSecurityPolicy 중 하나인 vmware-system-privileged을 사용하겠습니다. 이를 새 ClusterRole에 리소스로 포함시킨 다음 다음과 같이 새 ClusterRoleBinding을 통해 이 새 ClusterRole을 서비스 계정에 바인딩합니다.
% cat securityPolicy.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: psp:privileged rules: - apiGroups: ['policy'] resources: ['podsecuritypolicies'] verbs: ['use'] resourceNames: - vmware-system-privileged --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: all:psp:privileged roleRef: kind: ClusterRole name: psp:privileged apiGroup: rbac.authorization.k8s.io subjects: - kind: Group name: system:serviceaccounts apiGroup: rbac.authorization.k8s.io If you wanted your service accounts to use a Pod Security Policy that was not quite so privileged, here is one that I managed to create which allowed the cert manager package to deploy successfully. You would obviously have to change the resourceName is the ClusterRole above to match this PSP name. Note that this policy may require additional entries for other packages, notably around networking and ports. apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: tester-psp spec: allowPrivilegeEscalation: false requiredDropCapabilities: - ALL volumes: - configMap - emptyDir - projected - secret - downwardAPI - persistentVolumeClaim fsGroup: rule: RunAsAny runAsUser: rule: RunAsAny seLinux: rule: RunAsAny supplementalGroups: rule: RunAsAny
서비스 계정에서 권한이 많지 않은 Pod Security Policy을 사용하도록 설정했다면, 이 정책을 통해 Cert Manager 패키지를 성공적으로 배포할 수 있습니다. 이 PSP 이름과 일치하려면 ClusterRole의 resourceName을 변경해야 합니다. 이 정책에는 다른 패키지, 특히 네트워킹 및 포트 관련 항목이 추가로 필요할 수 있습니다.
apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: tester-psp spec: allowPrivilegeEscalation: false requiredDropCapabilities: - ALL volumes: - configMap - emptyDir - projected - secret - downwardAPI - persistentVolumeClaim fsGroup: rule: RunAsAny runAsUser: rule: RunAsAny seLinux: rule: RunAsAny supplementalGroups: rule: RunAsAny
kapp-controller 매니페스트 배포
kapp-controller는 Carvel 패키지 관리의 필수적인 부분입니다. 여기에서 그것에 대해 더 배울 수 있습니다. 이렇게 하면 TKG v1.4 패키지를 Tanzu 워크로드 클러스터와 함께 vSphere에 설치하고 관리할 수 있습니다. 공식 문서에는 kapp 컨트롤러를 배포하는 데 필요한 kapp-controller YAML 매니페스트에 대한 링크가 있으므로, 여기서는 해당 매니페스트가 상당히 크기 때문에 복제하지 않을 것입니다. 매니페스트를 로컬에서 파일로 복사한 후에는 배포를 계속 진행하여 워크로드 클러스터에 적용할 수 있습니다. 아래에서 볼 수 있듯이 클러스터에 상당수의 CRD(Custom Resource Definitions) 패키지가 추가되었으며, 그 중 상당수는 kubectl을 사용하여 쿼리할 수 있으며, 곧 알게 될 것입니다.
% vi kapp-controller.yaml ### paste the manifest contents here and save it % kubectl apply -f kapp-controller.yaml namespace/tkg-system created namespace/tanzu-package-repo-global created apiservice.apiregistration.k8s.io/v1alpha1.data.packaging.carvel.dev created service/packaging-api created customresourcedefinition.apiextensions.k8s.io/internalpackagemetadatas.internal.packaging.carvel.dev created customresourcedefinition.apiextensions.k8s.io/internalpackages.internal.packaging.carvel.dev created customresourcedefinition.apiextensions.k8s.io/apps.kappctrl.k14s.io created customresourcedefinition.apiextensions.k8s.io/packageinstalls.packaging.carvel.dev created customresourcedefinition.apiextensions.k8s.io/packagerepositories.packaging.carvel.dev created configmap/kapp-controller-config created deployment.apps/kapp-controller created serviceaccount/kapp-controller-sa created clusterrole.rbac.authorization.k8s.io/kapp-controller-cluster-role created clusterrolebinding.rbac.authorization.k8s.io/kapp-controller-cluster-role-binding created clusterrolebinding.rbac.authorization.k8s.io/pkg-apiserver:system:auth-delegator created rolebinding.rbac.authorization.k8s.io/pkgserver-auth-reader created % kubectl get pods -n tkg-system -w | grep kapp-controller kapp-controller-5d8f7d9477-9z7n2 0/1 ContainerCreating 0 19s kapp-controller-5d8f7d9477-9z7n2 1/1 Running 0 93s % kubectl get all -n tkg-system NAME READY STATUS RESTARTS AGE pod/kapp-controller-5d8f7d9477-9z7n2 1/1 Running 0 7m48s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/packaging-api ClusterIP 100.70.177.69 <none> 443/TCP 7m50s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/kapp-controller 1/1 1 1 7m49s NAME DESIRED CURRENT READY AGE replicaset.apps/kapp-controller-5d8f7d9477 1 1 1 7m49s % kubectl get crd NAME CREATED AT antreaagentinfos.clusterinformation.antrea.tanzu.vmware.com 2022-02-09T10:39:40Z antreacontrollerinfos.clusterinformation.antrea.tanzu.vmware.com 2022-02-09T10:39:40Z apps.kappctrl.k14s.io 2022-02-14T11:16:36Z clusternetworkpolicies.security.antrea.tanzu.vmware.com 2022-02-09T10:39:40Z externalentities.core.antrea.tanzu.vmware.com 2022-02-09T10:39:40Z internalpackagemetadatas.internal.packaging.carvel.dev 2022-02-14T11:16:36Z internalpackages.internal.packaging.carvel.dev 2022-02-14T11:16:36Z networkpolicies.security.antrea.tanzu.vmware.com 2022-02-09T10:39:40Z packageinstalls.packaging.carvel.dev 2022-02-14T11:16:37Z packagerepositories.packaging.carvel.dev 2022-02-14T11:16:37Z tiers.security.antrea.tanzu.vmware.com 2022-02-09T10:39:40Z traceflows.ops.antrea.tanzu.vmware.com 2022-02-09T10:39:41Z
TKGv1.4 패키지 저장소를 추가
다음 단계에서는 tangu CLI를 사용하여 TKGv1.4 패키지 저장소를 추가합니다. 리포지토리가 추가되면 우리는 리포지토리에서 직접 쿼리하고 패키지를 설치할 수 있습니다. 나는 repo에게 tkgv14repo라는 이름을 주었습니다. 리포지토리가 조정되면 아래와 같이 tanzu CLI를 사용하거나 kubectl 명령을 사용하여 리포지토리를 쿼리할 수 있습니다. repo에 대한 조정이 성공하면, 우리는 repo에서 패키지를 배포할 수 있습니다.
% tanzu package repository add tkg14repo --url projects.registry.vmware.com/tkg/packages/standard/repo:v1.4.0 / Adding package repository 'tkg14repo'... Added package repository 'tkg14repo' % tanzu package repository list / Retrieving repositories... NAME REPOSITORY STATUS DETAILS tkg14repo projects.registry.vmware.com/tkg/packages/standard/repo:v1.4.0 Reconciling % tanzu package repository list / Retrieving repositories... NAME REPOSITORY STATUS DETAILS tkg14repo projects.registry.vmware.com/tkg/packages/standard/repo:v1.4.0 Reconcile succeeded % tanzu package available list - Retrieving available packages... NAME DISPLAY-NAME SHORT-DESCRIPTION cert-manager.tanzu.vmware.com cert-manager Certificate management contour.tanzu.vmware.com Contour An ingress controller external-dns.tanzu.vmware.com external-dns This package provides DNS synchronization functionality. fluent-bit.tanzu.vmware.com fluent-bit Fluent Bit is a fast Log Processor and Forwarder grafana.tanzu.vmware.com grafana Visualization and analytics software harbor.tanzu.vmware.com Harbor OCI Registry multus-cni.tanzu.vmware.com multus-cni This package provides the ability for enabling attaching multiple network interfaces to pods in Kubernetes prometheus.tanzu.vmware.com prometheus A time series database for your metrics % kubectl get packages NAME PACKAGEMETADATA NAME VERSION AGE cert-manager.tanzu.vmware.com.1.1.0+vmware.1-tkg.2 cert-manager.tanzu.vmware.com 1.1.0+vmware.1-tkg.2 8m30s contour.tanzu.vmware.com.1.17.1+vmware.1-tkg.1 contour.tanzu.vmware.com 1.17.1+vmware.1-tkg.1 8m30s external-dns.tanzu.vmware.com.0.8.0+vmware.1-tkg.1 external-dns.tanzu.vmware.com 0.8.0+vmware.1-tkg.1 8m30s fluent-bit.tanzu.vmware.com.1.7.5+vmware.1-tkg.1 fluent-bit.tanzu.vmware.com 1.7.5+vmware.1-tkg.1 8m30s grafana.tanzu.vmware.com.7.5.7+vmware.1-tkg.1 grafana.tanzu.vmware.com 7.5.7+vmware.1-tkg.1 8m30s harbor.tanzu.vmware.com.2.2.3+vmware.1-tkg.1 harbor.tanzu.vmware.com 2.2.3+vmware.1-tkg.1 8m30s multus-cni.tanzu.vmware.com.3.7.1+vmware.1-tkg.1 multus-cni.tanzu.vmware.com 3.7.1+vmware.1-tkg.1 8m30s prometheus.tanzu.vmware.com.2.27.0+vmware.1-tkg.1 prometheus.tanzu.vmware.com 2.27.0+vmware.1-tkg.1 8m29s
위의 목록에서 볼 수 있듯이 현재 설치할 수 있는 패키지는 8개입니다. 앞서 공식 문서에서 강조했듯이 이러한 패키지 중 일부는 vSphere 7.0U3에서 아직 검증되지 않았습니다.
패키지는 구성 가능한 변수 세트와 함께 제공되며, 사전 요구 사항에 설명된 tansu CLI 도구를 사용하여 검색할 수 있습니다. 다음에는 이러한 항목을 검색하는 방법과 패키지 배포에 포함하는 방법에 대해 살펴보겠습니다.
패키지에서 구성 가능한 매개 변수를 가져오기
Certificate Manager 패키지를 설치할 예정이므로 해당 패키지의 구성을 살펴볼 수도 있습니다. 그러기 위해서는 패키지 이미지를 회수해야 합니다. 나중에 사용할 수 있도록 변수에 저장하는 것이 더 쉽지만 다음 명령을 사용하여 그렇게 할 수 있습니다. 또한 구성 가능한 매개 변수는 패키지가 개체를 설치하는 네임스페이스(예: deployment, ReplicaSet, pod)뿐이라는 점에서 구성 관점에서 가장 간단한 패키지 중 하나이기 때문에 이 연습에 대해 cert-manager 패키지를 의도적으로 선택했습니다. 해당 파일의 이름은 values.yaml이며 config 폴더 아래에 있습니다.
% kubectl get packages cert-manager.tanzu.vmware.com.1.1.0+vmware.1-tkg.2 \ -o jsonpath='{.spec.template.spec.fetch[0].imgpkgBundle.image}' projects.registry.vmware.com/tkg/packages/standard/cert-manager@sha256:117a35c2b496cbac0e6562d9b48cb821da829454e12c1ac7a6dedb6968c76de8% % image_url=$(kubectl get packages cert-manager.tanzu.vmware.com.1.1.0+vmware.1-tkg.2 \ -o jsonpath='{.spec.template.spec.fetch[0].imgpkgBundle.image}') % echo $image_url projects.registry.vmware.com/tkg/packages/standard/cert-manager@sha256:117a35c2b496cbac0e6562d9b48cb821da829454e12c1ac7a6dedb6968c76de8 % mkdir cert-mgr % imgpkg pull -b $image_url -o ./cert-mgr Pulling bundle 'projects.registry.vmware.com/tkg/packages/standard/cert-manager@sha256:117a35c2b496cbac0e6562d9b48cb821da829454e12c1ac7a6dedb6968c76de8' Extracting layer 'sha256:036fc2c9f0894cdd14bee9ee9099c22613e243b1d06b165734ea3b0014bfb0fe' (1/1) Locating image lock file images... The bundle repo (projects.registry.vmware.com/tkg/packages/standard/cert-manager) is hosting every image specified in the bundle's Images Lock file (.imgpkg/images.yml) Succeeded % ls -R ./cert-mgr config ./cert-mgr/config: _ytt_lib cert-manager.yaml overlays values.yaml ./cert-mgr/config/_ytt_lib: bundle ./cert-mgr/config/_ytt_lib/bundle: config ./cert-mgr/config/_ytt_lib/bundle/config: overlays upstream values.yaml ./cert-mgr/config/_ytt_lib/bundle/config/overlays: overlay-namespace.yaml ./cert-mgr/config/_ytt_lib/bundle/config/upstream: cert-manager.yaml ./cert-mgr/config/overlays: update-cert-deployment.yaml % cat cert-mgr/config/values.yaml #@data/values --- #! The namespace in which to deploy cert-manager. namespace: cert-manager
패키지를 배포
드디어 TKG v1.4 저장소의 패키지를 vSphere with Tanzu의 Tanzu Kubernetes 워크로드 클러스터로 구현할 수 있게 되었습니다. 이 패키지의 기본 구성 값(네임스페이스가 cert-manager로 설정됨)을 따르므로 명령에 -value 옵션을 추가하고 자체 맞춤형 구성 매개 변수 파일을 지정할 필요가 없습니다. 패키지가 설치되면 tanzu CLI 및 kubectl을 통해 상태를 쿼리할 수 있습니다.
% tanzu package install cert-manager --package-name cert-manager.tanzu.vmware.com --version 1.1.0+vmware.1-tkg.2 / Installing package 'cert-manager.tanzu.vmware.com' | Getting namespace 'default' / Getting package metadata for 'cert-manager.tanzu.vmware.com' | Creating service account 'cert-manager-default-sa' | Creating cluster admin role 'cert-manager-default-cluster-role' | Creating cluster role binding 'cert-manager-default-cluster-rolebinding' \ Creating package resource \ Package install status: Reconciling Added installed package 'cert-manager' in namespace 'default' % kubectl get all -n cert-manager NAME READY STATUS RESTARTS AGE pod/cert-manager-5849447d4c-8hhfv 1/1 Running 0 91s pod/cert-manager-cainjector-5557f7bb89-zw2rg 1/1 Running 0 91s pod/cert-manager-webhook-77947cd8fb-v8vc7 1/1 Running 0 91s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/cert-manager ClusterIP 100.70.175.194 <none> 9402/TCP 91s service/cert-manager-webhook ClusterIP 100.69.24.70 <none> 443/TCP 91s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/cert-manager 1/1 1 1 91s deployment.apps/cert-manager-cainjector 1/1 1 1 91s deployment.apps/cert-manager-webhook 1/1 1 1 91s NAME DESIRED CURRENT READY AGE replicaset.apps/cert-manager-5849447d4c 1 1 1 91s replicaset.apps/cert-manager-cainjector-5557f7bb89 1 1 1 91s replicaset.apps/cert-manager-webhook-77947cd8fb 1 1 1 91s % tanzu package installed list / Retrieving installed packages... NAME PACKAGE-NAME PACKAGE-VERSION STATUS cert-manager cert-manager.tanzu.vmware.com 1.1.0+vmware.1-tkg.2 Reconciling % tanzu package installed list / Retrieving installed packages... NAME PACKAGE-NAME PACKAGE-VERSION STATUS cert-manager cert-manager.tanzu.vmware.com 1.1.0+vmware.1-tkg.2 Reconcile succeeded % kubectl get apps NAME DESCRIPTION SINCE-DEPLOY AGE cert-manager Reconcile succeeded 30s 10m
이제 cert-manager 패키지가 tanzu 명령줄을 사용하여 워크로드 클러스터에 성공적으로 설치되었으며, 이 클러스터에 배포하려는 다른 모든 애플리케이션에서 사용할 수 있습니다. 다음 포스트에서는 동일한 방법을 사용하여 vSphere with Tanzu 워크로드 클러스터에 Prometheus + Grafana 모니터링 스택을 구축하겠습니다. 하지만, 위의 예시를 사용한다면, 당신은 지금 큰 어려움 없이 이것을 성취할 수 있을 것입니다. 한 가지 주의할 점은 Carvel 패키지와 패키지가 설치하는 객체 모두의 네임스페이스 사용을 이해하는 것은 다소 혼란스러울 수 있다는 것입니다. 여기 Tanzu Community Edition을 위해 제가 쓴 글이 있는데, 여기에도 해당됩니다.
마지막으로, 이제 VMware Cloud에서 Tanzu Services를 이용할 수 있습니다. VMware 클라우드를 사용하면 vSphere 관리자는 기본 SDDC 인프라를 관리할 필요 없이 DevOps 팀을 위해 Tanzu Kubernetes 워크로드 클러스터를 구축할 수 있습니다. 여기에서 Tanzu Services에 대해 자세히 읽어보십시오.
출처 : https://cormachogan.com/2022/02/15/deploying-carvel-packages-on-tkgs-workload-clusters-in-vsphere-with-tanzu/