
이 사이트에 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/