https://cormachogan.com/2020/09/29/deploying-tanzu-kubernetes-guest-cluster-in-vsphere-with-tanzu/
Cormac Hogan
내가 올린 “vSphere with Tanzu” 포스트의 마지막 편에서, 첫 번째 탄즈 쿠베르네츠(TKG) 게스트 클러스터를 어떻게 만들 것인지에 대해 살펴볼 것이다. 이전 게시물에서는 vSphere with Tanzu를 VCF with Tanzu와 비교했으며, 사전 요구 사항을 다뤘다. 그런 다음 vSphere with Tanzu와 함께 로드 밸런서 서비스를 제공하기 위해 HA-Proxy를 배포하는 데 관련된 단계를 살펴보았다. 가장 최근 게시물에서는 워크로드 관리 활성화에 관련된 단계를 살펴보았다. 이제 이 모든 것이 갖춰졌으므로 TKG 클러스터를 구축하여 VMware 엔지니어링, VMware 지원, 컨포머셜, 쿠버네티스 클러스터를 제공할 수 있게 되었다.
참고: 이 절차는 제품의 릴리스되지 않은 버전을 사용하는 경우. 따라서 일부 스크린샷은 GA 이전에 변경될 수 있다. 그러나 배치 단계는 그대로 유지되어야 한다.
1단계 : 네임스페이스 생성
1단계 – 네임스페이스 만들기
Tanzu와 함께 vSphere는 네임스페이스 개념을 계속 지원하고 있다. 이를 통해 vSphere 관리자는 개발자 또는 개발자 팀이 Tanzu 구축 환경에서 작업할 때 사용할 수 있는 리소스를 제어할 수 있다. 이를 통해 개발자가 “야성”을 하고 기본 인프라 자원에 대한 공정한 분담보다 더 많은 비용을 소비하며 동일한 인프라에서 작업하는 다른 개발자 또는 개발자 팀에 영향을 미치거나 실제로 생산에 영향을 미치는 것을 방지할 수 있다. 시작하려면 작업량 관리에서 네임스페이스를 선택한 다음 아래 나온 것처럼 “네임스페이스 만들기”를 클릭하십시오.

네임스페이스를 생성할 때 네임스페이스를 생성할 클러스터를 선택한다. 나는 클러스터가 하나뿐이니까, 그것은 꽤 직관적이다. 네임스페이스의 이름을 제공해야 한다. 내 경우, cormac-ns라고 불렀다. 마지막으로, 이것은 새로운 것이다. 워크로드 네트워크를 선택해야 할 것이다. 워크로드 관리 활성화에 대한 이전 게시물을 기억한다면, 우리는 여러 개의 워크로드 네트워크를 만들 수 있었다. 나는 그 때 한 개만 만들었고, 그래서 이 단계는 쉽다. 선택적 설명이 추가되었으면 “Create” 버튼을 클릭한다.
네임스페이스는 아래와 같이 만들어질 것이다.
Tanzu Kubernetes 창에 네임스페이스에 이미 연결된 Content Library가 있음을 표시한다는 점에 유의하십시오. 이 작업은 이전에 Tanzu / Workload Management를 사용하여 vSphere를 구축하는 동안 Content Library를 포함했을 때 수행된 작업이었습니다. 사용 권한으로 아무것도 하지 않음 – 나중에 SSO 관리자 로그인을 사용할 것이며, 이 로그인은 이미 네임스페이스에 대한 전체 사용 권한을 암시적으로 가지고 있다. 용량 및 사용량 설정에 대해서는 아무 것도 하지 않을 것이다. 따라서 프로덕션 환경에서 이러한 설정을 검토하고 조정하기를 원할 것이다. 스토리지 섹션에 스토리지 정책을 추가하기만 하면 된다. “vSAN Default Storage Policy”을 추가하려는 경우 네임스페이스에 추가된 스토리지 정책은 영구 볼륨을 프로비저닝할 때 사용할 수 있는 Kubernetes 스토리지 클래스로 표시된다는 점에 유의한다. 나중에 vSphere with Tanzu에 로그인하고 TKG “guest” 클러스터를 구축하면 이 스토리지 클래스를 볼 수 있을 것이다.
스토리지 클래스를 선택하면 vSphere UI에 있는 네임스페이스 랜딩 페이지의 스토리지 섹션에 스토리지 클래스가 표시된다.
2단계 : vSphere with Tanzu에 로그인하고 TKG 배포
처음에 vSphere with Tanzu를 구축했을 때 Kubernetes CLI Tools 랜딩 페이지를 보여드렸다. 이는 슈퍼바이저 제어부 쿠버네티스 API 서버의 로드 밸런서 IP 주소에 연결하여 액세스할 수 있다. 실제로 네임스페이스의 상태 창에도 이 URL에 대한 링크가 있다. 이 페이지에서 우리는 네임스페이스에 접속하여 TKG를 배치하기 위해 kubectl, kubectl-login과 같은 다양한 도구를 다운로드할 수 있다.
이 도구를 사용하여 이전에 만들어진 cormac-ns 네임스페이스에 로그인하고 TKG – Tanzu Kubernetes 클러스터를 배포할 것이다.
2.1 네임스페이스 컨텍스트에 로그인
로그인하려면 kubectl-login 명령을 사용하여 서버를 슈퍼바이저 제어부 API 서버 IP 주소로 설정하십시오.
C:\bin>kubectl-vsphere.exe login --insecure-skip-tls-verify --vsphere-username \
administrator@vsphere.local --server=https://192.50.0.176
Password:********
Logged in successfully.
You have access to the following contexts:
192.50.0.176
cormac-ns
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>`
C:\bin>kubectl config use-context cormac-ns
Switched to context "cormac-ns".
2.2 제어부 및 스토리지 클래스 확인
이 시점에서 3개의 제어부 노드가 준비 상태에 있는지, 앞서 네임스페이스에 할당한 스토리지 정책이 실제로 스토리지 클래스로 나타났는지 항상 확인하고 싶다. TKG 가상 머신 이미지가 보이고 이미지 저장에 사용되는 컨텐츠 라이브러리가 실제로 성공적으로 동기화되었는지 확인하는 데 유용한 다른 항목도 있다. 모든 것이 존재하고 올바른 것처럼 보인다.
C:\bin>kubectl get nodes
NAME STATUS ROLES AGE VERSION
422425ad85759a5db789ec2120747d13 Ready master 18m v1.18.2-6+38ac483e736488
42242c84f294f9c38ecfe419ca601c6e Ready master 19m v1.18.2-6+38ac483e736488
42249f93e32ea81ca8f03efa2465d67f Ready master 28m v1.18.2-6+38ac483e736488
C:>kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
vsan-default-storage-policy csi.vsphere.vmware.com Delete Immediate true 57s
C:\bin>kubectl get virtualmachineimages
NAME VERSION OSTYPE
ob-15957779-photon-3-k8s-v1.16.8---vmware.1-tkg.3.60d2ffd v1.16.8+vmware.1-tkg.3.60d2ffd vmwarePhoton64Guest
ob-16466772-photon-3-k8s-v1.17.7---vmware.1-tkg.1.154236c v1.17.7+vmware.1-tkg.1.154236c vmwarePhoton64Guest
ob-16545581-photon-3-k8s-v1.16.12---vmware.1-tkg.1.da7afe7 v1.16.12+vmware.1-tkg.1.da7afe7 vmwarePhoton64Guest
ob-16551547-photon-3-k8s-v1.17.8---vmware.1-tkg.1.5417466 v1.17.8+vmware.1-tkg.1.5417466 vmwarePhoton64Guest
2.3 TKG 배포를 위한 매니페스트 파일 생성
TKG “게스트” 클러스터를 vSphere with Tanzu에 생성하는 것은 매우 간단하다. 클러스터 이름, 제어부 노드 수, 작업자 노드 수, 리소스 관점(클래스)에서 노드 크기, 사용할 스토리지 클래스(스토리지클래스) 및 노드(버전)에 사용할 이미지(버전)에 대한 정보를 자세히 설명하는 YAML의 간단한 매니페스트 파일만 있으면 된다. 단일 제어부 노드, 2 x worker 노드, 이미지 버전 1.17.7을 지정하여 사용한 예제를 소개한다. 이러한 버전 번호 사용은 이전에 컨텐츠 라이브러리 목록에서 사용할 Photon OS 이미지를 지정하는 속기 방법이다. v1.17.x 이미지에만 Antrea CNI가 포함되어 있다는 점에 유의한다.
C:\bin>type cluster.yaml
apiVersion: run.tanzu.vmware.com/v1alpha1
kind: TanzuKubernetesCluster
metadata:
name: tkg-cluster-01
spec:
topology:
controlPlane:
count: 1
class: guaranteed-small
storageClass: vsan-default-storage-policy
workers:
count: 2
class: guaranteed-small
storageClass: vsan-default-storage-policy
distribution:
version: v1.17.7
다양한 클래스에 할당된 리소스에 대해 자세히 알아보려면 다음 명령을 사용하여 쿼리하십시오. 설명 출력 하단의 ‘Spec’ 세부 정보를 참조한다.
C:\bin>kubectl get virtualmachineclass
NAME AGE
best-effort-2xlarge 2d16h
best-effort-4xlarge 2d16h
best-effort-8xlarge 2d16h
best-effort-large 2d16h
best-effort-medium 2d16h
best-effort-small 2d16h
best-effort-xlarge 2d16h
best-effort-xsmall 2d16h
guaranteed-2xlarge 2d16h
guaranteed-4xlarge 2d16h
guaranteed-8xlarge 2d16h
guaranteed-large 2d16h
guaranteed-medium 2d16h
guaranteed-small 2d16h
guaranteed-xlarge 2d16h
guaranteed-xsmall 2d16h
C:\bin>kubectl describe virtualmachineclass guaranteed-small
Name: guaranteed-small
Namespace:
Labels: <none>
Annotations: API Version: vmoperator.vmware.com/v1alpha1
Kind: VirtualMachineClass
Metadata:
Creation Timestamp: 2020-09-25T15:25:56Z
Generation: 1
Managed Fields:
API Version: vmoperator.vmware.com/v1alpha1
Fields Type: FieldsV1
fieldsV1:
f:metadata:
f:annotations:
.:
f:kubectl.kubernetes.io/last-applied-configuration:
f:spec:
.:
f:hardware:
.:
f:cpus:
f:memory:
f:policies:
.:
f:resources:
.:
f:requests:
.:
f:cpu:
f:memory:
Manager: kubectl
Operation: Update
Time: 2020-09-25T15:25:56Z
Resource Version: 2939
Self Link: /apis/vmoperator.vmware.com/v1alpha1/virtualmachineclasses/guaranteed-small
UID: 4a547922-0ecf-4899-a8b8-12cc6dbd78e8
Spec:
Hardware:
Cpus: 2
Memory: 4Gi
Policies:
Resources:
Requests:
Cpu: 2000m
Memory: 4Gi
Events: <none>
CPU 및 메모리에 대한 “Request” 값이 “Spec”과 일치한다.”Spec.Hardware” 항목은 best effort이 아니라 이러한 자원이 guaranteed된다는 것을 의미한다. 물론 앞서 살펴본 바와 같이 best effort도 가상 머신 클래스로 이용할 수 있다.
2.4 TKG 매니페스트 적용 및 배치 모니터링
이 시점에서는 앞에서 제시한 매니페스트를 적용하여 TKG 클러스터를 구축하면 된다. 그런 다음 다양한 명령을 사용하여 배포를 모니터링할 수 있다. 설명 명령은 매우 길 수 있으므로 클러스터가 배포된 시점의 출력만 표시하지만 설명 명령을 반복적으로 사용하여 TKG 클러스터 배포 상태를 모니터링할 수 있다.
C:\bin>kubectl apply -f cluster.yaml
tanzukubernetescluster.run.tanzu.vmware.com/tkg-cluster-01created
C:\bin>kubectl get cluster
NAME PHASE
tkg-cluster-01 Provisioned
C:\bin>kubectl get tanzukubernetescluster
NAME CONTROL PLANE WORKER DISTRIBUTION AGE PHASE
tkg-cluster-01 1 2 v1.17.7+vmware.1-tkg.1.154236c 3m7s creating
다음은 설명 명령어로부터의 전체 출력이다. Antrea를 CNI로 사용, 노드 및 VM 상태, 클러스터 API 끝점(부하 분산 장치에서, IP 주소의 프런트엔드 네트워크 범위)과 같은 많은 유용한 정보가 있다.
C:\bin>kubectl describe tanzukubernetescluster
Name: tkg-cluster-01
Namespace: cormac-ns
Labels: <none>
Annotations: API Version: run.tanzu.vmware.com/v1alpha1
Kind: TanzuKubernetesCluster
Metadata:
Creation Timestamp: 2020-09-23T15:41:25Z
Finalizers:
tanzukubernetescluster.run.tanzu.vmware.com
Generation: 1
Managed Fields:
API Version: run.tanzu.vmware.com/v1alpha1
Fields Type: FieldsV1
fieldsV1:
f:metadata:
f:annotations:
.:
f:kubectl.kubernetes.io/last-applied-configuration:
f:spec:
.:
f:distribution:
.:
f:version:
f:topology:
.:
f:controlPlane:
.:
f:class:
f:count:
f:storageClass:
f:workers:
.:
f:class:
f:count:
f:storageClass:
Manager: kubectl
Operation: Update
Time: 2020-09-23T15:41:25Z
API Version: run.tanzu.vmware.com/v1alpha1
Fields Type: FieldsV1
fieldsV1:
f:metadata:
f:finalizers:
.:
v:"tanzukubernetescluster.run.tanzu.vmware.com":
f:status:
.:
f:addons:
.:
f:authsvc:
.:
f:name:
f:status:
f:version:
f:cloudprovider:
.:
f:name:
f:status:
f:version:
f:cni:
.:
f:name:
f:status:
f:version:
f:csi:
.:
f:name:
f:status:
f:version:
f:dns:
.:
f:name:
f:status:
f:version:
f:proxy:
.:
f:name:
f:status:
f:version:
f:psp:
.:
f:name:
f:status:
f:version:
f:clusterApiStatus:
.:
f:apiEndpoints:
f:phase:
f:nodeStatus:
.:
f:tkg-cluster-01-control-plane-sn85m:
f:tkg-cluster-01-workers-csjd7-554668c497-vtf68:
f:tkg-cluster-01-workers-csjd7-554668c497-z8vjt:
f:phase:
f:vmStatus:
.:
f:tkg-cluster-01-control-plane-sn85m:
f:tkg-cluster-01-workers-csjd7-554668c497-vtf68:
f:tkg-cluster-01-workers-csjd7-554668c497-z8vjt:
Manager: manager
Operation: Update
Time: 2020-09-23T15:52:45Z
Resource Version: 22469
Self Link: /apis/run.tanzu.vmware.com/v1alpha1/namespaces/cormac-ns/tanzukubernetesclusters/tkg-cluster-01
UID: 9ede742d-c7e3-4715-ac7e-89d2ed312a16
Spec:
Distribution:
Full Version: v1.17.7+vmware.1-tkg.1.154236c
Version: v1.17.7
Settings:
Network:
Cni:
Name: antrea
Pods:
Cidr Blocks:
192.168.0.0/16
Service Domain: cluster.local
Services:
Cidr Blocks:
10.96.0.0/12
Topology:
Control Plane:
Class: guaranteed-small
Count: 1
Storage Class: vsan-default-storage-policy
Workers:
Class: guaranteed-small
Count: 2
Storage Class: vsan-default-storage-policy
Status:
Addons:
Authsvc:
Name: authsvc
Status: applied
Version: 0.1-65-ge3d8be8
Cloudprovider:
Name: vmware-guest-cluster
Status: applied
Version: 0.1-77-g5875817
Cni:
Name: antrea
Status: applied
Version: v0.7.2_vmware.1
Csi:
Name: pvcsi
Status: applied
Version: v0.0.1.alpha+vmware.73-4a26ce0
Dns:
Name: CoreDNS
Status: applied
Version: v1.6.5_vmware.5
Proxy:
Name: kube-proxy
Status: applied
Version: 1.17.7+vmware.1
Psp:
Name: defaultpsp
Status: applied
Version: v1.17.7+vmware.1-tkg.1.154236c
Cluster API Status:
API Endpoints:
Host: 192.50.0.177
Port: 6443
Phase: Provisioned
Node Status:
tkg-cluster-01-control-plane-sn85m: ready
tkg-cluster-01-workers-csjd7-554668c497-vtf68: ready
tkg-cluster-01-workers-csjd7-554668c497-z8vjt: ready
Phase: running
Vm Status:
tkg-cluster-01-control-plane-sn85m: ready
tkg-cluster-01-workers-csjd7-554668c497-vtf68: ready
tkg-cluster-01-workers-csjd7-554668c497-z8vjt: ready
Events: <none>
C:\bin>kubectl get tanzukubernetescluster
NAME CONTROL PLANE WORKER DISTRIBUTION AGE PHASE
tkg-cluster-01 1 2 v1.17.7+vmware.1-tkg.1.154236c 11m running
C:\bin>kubectl get cluster
NAME PHASE
tkg-cluster-01 Provisioned
관심 있는 것은 API Endpoints인데, 이는 로드 밸런서 IP 주소 범위에서 다른 IP 주소 입니다. 네트워킹 측면에서 볼 때 NAT의 구현은 다음과 유사한 것으로 보인다.
마지막으로 주목할 점은 vSphere Client UI로 다시 전환하여 네임스페이스를 조사하면 Tanzu Kubernetes 창에 클러스터 하나가 구축되었음을 보여주는 업데이트가 있음을 알 수 있다는 점이다. 인벤토리에서 왼쪽을 보면 TKG 클러스터를 vSphere에서 인벤토리 항목으로 볼 수도 있다.
2.5 로그아웃 후 TKG 클러스터 컨텍스트에 로그인
위의 모든 작업은 Tanzu Supervisor 클러스터가 설치된 vSphere의 네임스페이스 컨텍스트에서 수행되었다. 다음 단계는 슈퍼바이저 컨텍스트에서 로그아웃하고 TKG 게스트 클러스터 컨텍스트에 로그인하는 것이다. 이를 통해 우리는 슈퍼바이저 클러스터에 있는 쿠베르네츠 API 서버가 아닌 TKG 클러스터 API 서버에서 kubectl 명령을 지시할 수 있다. KUBECONFIG 환경변수 설정을 통해 이를 달성할 수 있는 다른 방법도 있지만, 간단히 로그아웃하고 다시 로그인하는 것이 더 쉽다는 것을 알게 되었다.
C:\bin>kubectl-vsphere.exe logout
Your KUBECONFIG context has changed.
The current KUBECONFIG context is unset.
To change context, use `kubectl config use-context <workload name>`
Logged out of all vSphere namespaces.
C:\bin>kubectl-vsphere.exe login \
--insecure-skip-tls-verify \
--vsphere-username administrator@vsphere.local \
--server=https://192.50.0.176 \
--tanzu-kubernetes-cluster-namespace cormac-ns \
--tanzu-kubernetes-cluster-name tkg-cluster-01
Password: ********
Logged in successfully.
You have access to the following contexts:
192.50.0.176
cormac-ns
tkg-cluster-01
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>`
2.6 TKG 클러스터 컨텍스트 검증
우리는 우리가 현재 올바른 맥락에서 일하고 있는지 확인하기 위해 몇 가지 kubectl 명령을 실행할 수 있다. 노드를 표시하면 클러스터를 배포할 때 매니페스트에 지정된 1 x control 노드와 2 x worker 노드가 표시되는 것을 볼 수 있다. 또한 클러스터에 배포된 모든 포드를 표시할 수 있어야 하며 네트워킹용 Antrea 에이전트와 스토리지용 CSI 노드 에이전트도 모두 관찰할 수 있어야 한다. 또한 TKG 클러스터에서 모든 것이 준비/실행 상태에 들어갔는지 확인할 수 있는 좋은 기회다.
C:\bin>kubectl get nodes
NAME STATUS ROLES AGE VERSION
tkg-cluster-01-control-plane-sn85m Ready master 8m40s v1.17.7+vmware.1
tkg-cluster-01-workers-csjd7-554668c497-vtf68 Ready <none> 2m16s v1.17.7+vmware.1
tkg-cluster-01-workers-csjd7-554668c497-z8vjt Ready <none> 2m16s v1.17.7+vmware.1
C:\bin>kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system antrea-agent-7zphw 2/2 Running 0 2m23s
kube-system antrea-agent-mvczg 2/2 Running 0 2m23s
kube-system antrea-agent-t6qgc 2/2 Running 0 8m11s
kube-system antrea-controller-76c76c7b7c-4cwtm 1/1 Running 0 8m11s
kube-system coredns-6c78df586f-6d77q 1/1 Running 0 7m55s
kube-system coredns-6c78df586f-c8rtj 1/1 Running 0 8m14s
kube-system etcd-tkg-cluster-01-control-plane-sn85m 1/1 Running 0 7m24s
kube-system kube-apiserver-tkg-cluster-01-control-plane-sn85m 1/1 Running 0 7m12s
kube-system kube-controller-manager-tkg-cluster-01-control-plane-sn85m 1/1 Running 0 7m30s
kube-system kube-proxy-frpgn 1/1 Running 0 2m23s
kube-system kube-proxy-lchkq 1/1 Running 0 2m23s
kube-system kube-proxy-m2xjn 1/1 Running 0 8m14s
kube-system kube-scheduler-tkg-cluster-01-control-plane-sn85m 1/1 Running 0 7m27s
vmware-system-auth guest-cluster-auth-svc-lf2nf 1/1 Running 0 8m2s
vmware-system-cloud-provider guest-cluster-cloud-provider-7788f74548-cfng4 1/1 Running 0 8m13s
vmware-system-csi vsphere-csi-controller-574cfd4569-kfdz8 6/6 Running 0 8m12s
vmware-system-csi vsphere-csi-node-hvzpg 3/3 Running 0 8m12s
vmware-system-csi vsphere-csi-node-t4w8p 3/3 Running 0 2m23s
vmware-system-csi vsphere-csi-node-t6rdw 3/3 Running 0 2m23s
좋은 것 같군요. 우리는 TKG 게스트 클러스터를 Tanzu와 함께 vSphere에 성공적으로 구축했다.
요약
마지막 블로그 게시물들에서 다음 사항을 살펴보았다.
- 네트워크 요구 사항을 포함하여 vSphere with Tanzu와 VCF의 차이점 또한 vSphere with Tanzu를 성공적으로 구축하기 위해 필요한 다양한 사전 요구 사항도 살펴보았다.
- HA-Proxy를 구축하는 방법과 vSphere with Tanzu에 로드 밸런서 서비스를 제공하는 방법에 대해 살펴보았다.
- 워크로드 관리를 지원하고 vSphere with Tanzu와 협력하는 방법을 살펴보았다.
- 마지막으로 이 게시물에서 TKG ‘게스트’ 클러스터를 vSphere with Tanzu에 구축하는 방법을 살펴보았다.
이를 통해 귀하의 vSphere 환경에서 vSphere with Tanzu를 검토할 수 있는 충분한 정보를 얻었기를 바란다. 나는 항상 무엇이 효과가 있는지, 무엇이 효과가 없는지 등 당신의 피드백을 듣는 데 관심이 있다. 소셜 미디어에 자유롭게 댓글을 남기거나 나에게 연락 바란다.