본문 바로가기

VMware TANZU/TKG: Tanzu Kubernetes Grid

Tanzu Platform Self-Managed 설치

VMware By Broadcom으로 전환 이후, 1년이란 시간이 지나가고 있는 현 시점에 브이엠웨어에서는 현대화 여정의 신속한 전환을 도울 수 있도록 Tanzu Platform 서비스의 오프라인 설치 버전을 12월에 공개 했습니다.

 

현재 공식 사이트를 통해서 설치 문서를 제공하고 있으나, 처음 해당 가이드를 접할 경우 앞 뒤 순서나 맥락의 이해 부족에 따른 설치하는데 장벽을 맞을 수 있습니다.

 

이 게시물에서는 Tanzu Platform SM 설치에 있어서 중요한 핵심 요소에 대한 설명을 함께 기재하여, 게시물을 보고서 바로 설치 진행을 한 이후, 다음 작업인 애플리케이션의 Build, Binding, Service, Deplivery를 간소화 하여, 개발자는 개발 코드에 집중할 수 있도록 테스트 진행을 해볼 수 있습니다.

 

Tanzu Platform이 주는 핵심 가치는 기존 고객의 파이프라인 관리 도구 사용을 하면서, 보다 쉽게 애플리케이션을 이미지를 생성하고, 이를 위한 서비스를 Attach 하고, 개발 / 스테이징 / 프로덕션으로 이어지는 목표 플랫폼에 즉시 애플리케이션을 배포하고 관리할 수 있다는 장점과 이를 UI를 통해서 우리가 어떤 애플리케이션을 얼마나 배포하고, 현재 보안 취약점은 어떻게 되는지 확인할 수 있습니다.

 

물론 Kubernetes 플랫폼 영역을 위한 구성 및 상세 운영 정보 및 Utilization 메트릭 정보를 그래프로 볼 수 있는 가시성과 이벤트 정보까지도 한눈에 살펴볼 수 있습니다. 이러한 영역은 인프라 운영 담당자는 개발자와 다른 접근으로서 플랫폼에 대한 운영 상태를 지속적으로 관찰하고, 여러 쿠버네티스 클러스터 혹은 리전간 구성된 클러스터라 할지라도, 하나의 SPACE 영역에 둠으로서 스페이스 레벨에서의 플래폼에 대한 일관성을 기본 제공 패키지 설치를 프로파일 형태 혹은 선택 설치를 통해서 유지되도록 관리할 수 있습니다.

 

이제 인프라 운영 담당자와 개발 부서는 동일한 Tanzu Platform에 대한 각자의 역할을 부여함으로서 개발 부서는 더 이상 플랫폼의 상태나 요구 사항에 대한 걱정 없이 오로지 코드 개발과 코드 업데이트에 집중할 수 있으며, 인프라 운영 담당자는 개발 부서에 리소스를 제공 이후, 관리되지 않음으로 생기는 리소스 생산 관리 문제 및 보안 규정 준수에 대한 사고를 예방하고, 뛰어난 가시성과 통찰력을 제공받을 수 있습니다.

 

1. Tanzu Plaform 설치를 위한 사전 준비 사항

- Kubernetes Cluster: VKS(vSphere Kubernetes Service) 및 OSS K8S, EKS, AKS, GKS등 다양한 클러스터 연결 지원

- Tanzu Platform SM 압축 파일 다운로드 - 공식 고객 지원 포탈로부터.

- 네트워크 접속이 가능한 Jumphost 혹은 로컬머신

- 에어갭 환경을 위한 Image Registry(i.e. Harbor)

- 외부 이미지 레지시트리로부터 이미지를 받을 수 있는 중계 호스트

- Jumphost에 Docker 설치

- Cert Manager를 설치

 

Ubuntu 22.04 기준으로 작성 되었습니다.

 

1. Harbor 인증서 다운로드 후, Jumphost의 인증서 폴더에 복사

Jumphost에서는 로컬 이미지 레지스트리로 접속이 가능하도록, 비보안 인증서일 경우 로컬 레지스트리의 인증서 정보를 복사하여, 파일 생성 후, ubuntu의 ssl certs 저장소에 복사합니다.

이로써 추후 사용될 vmware에서 제공하는 cavel 패키지의 도구중 하나인 imgpkg 명령어 도구를 통해서 이미지 업로드를 진행할 수 있습니다.

# platform root ca cert를 /etc/ssl/certs/ 폴더로 복사
sudo cp tkgs-harbor.crt /etc/ssl/certs/

 

 

2. 브로드컴 사이트에서 Tanzu Plaform SM 설치 파일을 다운로드 및 압축 해제

- 다운로드 파일을 Jumphost로 이동 후, 해당 파일을 압축 해제 합니다.

tar -zxvf tanzu-self-managed-10.0.0.tar.gz -c ./tanzu-installer

혹은 gzip -d, tar xvf 등 차례대로 이용하고 파일 이동 정리

 

압축 해제된 파일 리스트

tanzu-sm-installer << 설치 바이너리 파일

tanzusm-collector.tar << 존재하지 않음

agent-images.tar << 에이전트 이미지 파일

tanzusm-<version>.tar << 설치 이미지 파일

tanzu-bundle folder << tp-plugin 이미지 파일

 

압축 파일을 해제해서 확인하고, 아래와 같이 필요한 파일들을 복사 합니다.

 

tanzu-sm-installer 파일을 실행 경로에 복사합니다.

# tanzu-sm-installer 파일을 bin 폴더로 복사
sudo cp tanzu-installer/cli_bundle/linux/amd64/tanzu-sm-installer /usr/local/bin

 

 

tanzu-binaries.tar 파일을 압축 해제한 후, 사용될 바이너리 파일에 대해서 마찬가지로 실행 폴더 경로로 복사

tar -xvf tanzu-installer/tanzu-bundle/tanzu-binaries.tar

# 포함된 도구 crashd  imgpkg  kapp  kbld  kctrl  kubectl  tanzu  velero
$ sudo cp tanzu-installer/additional-resources/binaries/linux/amd64/* /usr/local/bin/

# tanzu cli 사용법 참고 링크
# https://techdocs.broadcom.com/us/en/vmware-tanzu/cli/tanzu-cli/1-5/cli/index.html

 

사용될 바이너리 파일들을 모두 실행 경로 폴더로 복사

crashd imgpkg kapp kbld kctrl kubectl tanzu velero

$ sudo cp tanzu-installer/additional-resources/binaries/linux/amd64/* /usr/local/bin/

 

 

3. 설치 변수 지정

- 설치 진행에 필요한 변수를 정의 합니다. Image Registry 정보 및 target repository path

export REGISTRY_USERNAME=admin
export REGISTRY_PASSWORD=Harbor12345
export REGISTRY_ENDPOINT=tkgs-harbor.tanzu.lab
export REPO_PATH=library/tpsm

 

4. adie & velero plugin 업로드

- 공식 문서의 URL이 깨져 있음으로 패키지 다운로드 사이트에서 버전 및 path를 확인해서 아래와 같이 변경해서 사용합니다.

- 실제 에어갭 환경에서는 외부 연결 호스트에서 imgpkg를 사용하여, 파일로 저장한 다음 다시 해당 파일을 Jumphost로 복제 후, 업로드 작업을 진행해야 합니다. 혹은 Webproxy를 사용해서 Jumphost에서 직접 다운로드가 가능하도록 구축 환경 동안 다운로드 사이트 도메인들에 한해서 접근 허용을 해야 합니다.

 

# Download 파일 없이 바로 업로드
# imgpkg copy -b tanzu-platform.packages.broadcom.com/adie/vcf-remote-collector-repo.tanzu.vmware.com:1.2.0 --to-repo tkgs-harbor.tanzu.lab/tanzu/adie

# 파일 download 후, 해당 파일로 업로드
imgpkg copy -b tanzu-platform.packages.broadcom.com/adie/vcf-remote-collector-repo.tanzu.vmware.com:1.2.0 --to-tar adie.tar
imgpkg copy --tar adie.tar --to-repo ${REGISTRY_ENDPOINT}/${REPO_PATH}


# Download 파일 없이 바로 업로드
# imgpkg copy -i tanzu-platform.packages.broadcom.com/velero/velero:v1.14.1 --to-repo=${REGISTRY_ENDPOINT}/${REPO_PATH}

# 파일 download 후, 해당 파일로 업로드
imgpkg copy -i tanzu-platform.packages.broadcom.com/velero/velero:v1.14.1 --to-tar velero.tar
imgpkg copy --tar velero.tar --to-repo ${REGISTRY_ENDPOINT}/${REPO_PATH}

 

 

5. Tanzu package 업로드

- TPSM(Tanzu Platform Self-Managed) 설치에 사용될 tanzu package 파일을 다운로드한 후, 로컬 이미지 레지스트리에 업로드합니다.

# Download 파일 없이 바로 업로드
# imgpkg copy -b extensions.aws-usw2.tmc-dev.cloud.vmware.com/packages/standard/repo:v2024.8.2 --to-repo ${REGISTRY_ENDPOINT}/${REPO_PATH}/tpsm/498533941640.dkr.ecr.us-west-2.amazonaws.com/packages/standard/repo

# 파일 download 후, 해당 파일로 업로드
imgpkg copy -b "extensions.aws-usw2.tmc-dev.cloud.vmware.com/packages/standard/repo:v2024.8.2" --to-tar=tanzu-packages.tar
imgpkg copy --tar tanzu-packages.tar --to-repo=${REGISTRY_ENDPOINT}/${REPO_PATH}/tpsm/498533941640.dkr.ecr.us-west-2.amazonaws.com/packages/standard/repo

 

6. trivy db 업로드

- 보안 취약성 검사에 사용될 trivy db를 다운로드 후, 이미지 레지스트리에 업로드합니다.

# imgpkg copy -i ghcr.io/aquasecurity/trivy-db:2 --to-repo=${REGISTRY_ENDPOINT}/${REPO_PATH}/trivy-db

# 파일 download 후, 해당 파일로 업로드
imgpkg copy -i ghcr.io/aquasecurity/trivy-db:2 --to-tar trivy-db.tar
imgpkg copy --tar trivy-db.tar --to-repo=${REGISTRY_ENDPOINT}/${REPO_PATH}

 

7. Storage Class 생성

- Storage Class yaml 파일을 생성하고, 적용합니다.

---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  labels:
    isSyncedFromSupervisor: "false"
  name: postgresql-storage-class
parameters:
  svStorageClass: tanzu-storage-policy
provisioner: csi.vsphere.vmware.com
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: Immediate
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  labels:
    isSyncedFromSupervisor: "false"
  name: opensearch-storage-class
parameters:
  svStorageClass: tanzu-storage-policy
provisioner: csi.vsphere.vmware.com
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: Immediate
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  labels:
    isSyncedFromSupervisor: "false"
  name: kafka-storage-class
parameters:
  svStorageClass: tanzu-storage-policy
provisioner: csi.vsphere.vmware.com
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: Immediate
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  labels:
    isSyncedFromSupervisor: "false"
  name: zookeeper-storage-class
parameters:
  svStorageClass: tanzu-storage-policy
provisioner: csi.vsphere.vmware.com
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: Immediate
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  labels:
    isSyncedFromSupervisor: "false"
  name: prometheus-storage-class
parameters:
  svStorageClass: tanzu-storage-policy
provisioner: csi.vsphere.vmware.com
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: Immediate
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  labels:
    isSyncedFromSupervisor: "false"
  name: tmc-prometheus-storage-class
parameters:
  svStorageClass: tanzu-storage-policy
provisioner: csi.vsphere.vmware.com
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: Immediate
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  labels:
    isSyncedFromSupervisor: "false"
  name: seaweedfs-storage-class
parameters:
  svStorageClass: tanzu-storage-policy
provisioner: csi.vsphere.vmware.com
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: Immediate
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  labels:
    isSyncedFromSupervisor: "false"
  name: clickhouse-storage-class
parameters:
  svStorageClass: tanzu-storage-policy
provisioner: csi.vsphere.vmware.com
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: Immediate
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  labels:
    isSyncedFromSupervisor: "false"
  name: redis-storage-class
parameters:
  svStorageClass: tanzu-storage-policy
provisioner: csi.vsphere.vmware.com
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: Immediate

 

 

8 도커 로그인

- 본격적인 설치 진행에 앞서 Docker Login 명령어를 통해서 로컬 이미지 레지스트리에 접근이 가능해야 합니다.

docker login {REGISTRY_ENDPOINT}

docker login tkgs-harbor.tanzu.lab -u admin

 

9. 설치 파일 업로드

- 압축 해제된 파일중 TPSM 설치.tar 파일을 이미지 레지스트리에 업로드 합니다.

## imgpkg copy --tar tanzusm-<VERSION>.tar --to-repo=<path-to-local-repo>
imgpkg copy --tar ./tanzu-installer/tanzusm-10.0.0-oct-2024-rc.533-vc0bb325.tar --to-repo=${REGISTRY_ENDPOINT}/${REPO_PATH}

 

10. Agent 업로드

- Agent 이미지 파일을 동일하게 업로드 합니다.

tanzu-sm-installer push tmc-extensions -a "admin:Harbor12345" -r "${REGISTRY_ENDPOINT}/${REPO_PATH}" -f tanzu-installer/agent-images.tar

 

11. TPSM Plugin Bundle 파일 업로드

- tpsm plugin bundle 파일을 업로드하고, tanzu plugin source 위치를 업데이트 지정합니다.

- 이 작업은 TPSM을 설치할 TKG Cluster 혹은 K8s Cluster에 로그인 후, 진행합니다.

tanzu-sm-installer push tanzu-plugins -u "admin:Harbor12345" -r "${REGISTRY_ENDPOINT}/${REPO_PATH}" -i tanzu-installer/tanzu-bundle/tpsm-plugin-bundle.tar.gz

# tanzu plugin source 위치 update
tanzu plugin source update default -u "${REGISTRY_ENDPOINT}/${REPO_PATH}/plugin-inventory-sm:latest"

 

12. 플랫폼 엔지니어 Plugin 설치

tanzu plugin install --group  vmware-tanzu/platform-engineer:v1.0.0

 

13. 설치에 필요한 변수 정의

- 다시 한번 설치에 필요한 변수를 확인합니다.

export TANZU_SM_VERSION=10.0.0-oct-2024-rc.533-vc0bb325
export LOCAL_REGISTRY=tkgs-harbor.tanzu.lab/library/tpsm
export REGISTRY_USERNAME=admin
## docker login 시, 생성된 ~/.docker/config.json 파일에서 확인
export REGISTRY_API_TOKEN=YWRtaW46SGFyYm9yMTIzNDU=

# KUBECONFIG지정 안하면, 현재 current-context에 구성됨.
KUBECONFIG=

 

14. Config.yaml 파일 수정

- 원본 config 파일명 변경 후, 신규 config.yaml 파일 생성 및 환경 정보 입력

 

flavor: full → full 선택해야 kubernetes cluster 연결이 가능

tls: {} → 입력 안할 경우, self-signed certification 생성.

별도로 발행한 공인 인증서 사용 시,

ingress.tls.certificate:

ingress.tls.privateKey:

항목을 통해서 직접 입력해야 합니다.

flavor: full ## full 모드 설치를 해야, Kubernetes 환경을 지원합니다.
profile: evaluation
version: '10.0.0-oct-2024-rc.533-vc0bb325'  ## 올바른 버전으로 변경
ingress:
  loadBalancerIP: "10.10.152.101"  ## 도메인 주소와 IP 고정 매핑을 위해서 로드밸런서 IP를 수동 입력 합니다.
  host: "tkgs-tp.tanzu.lab"
  tls: {}  ## 셀프 인증서를 사용하지 않을 경우에는 여기에 tpsm 호스트 도메인으로 생성된 인증서 pem과 key 값을 기재해야 합니다.
deployment:
  airGapped: true
trivy:
  dbRepository: "tkgs-harbor.tanzu.lab/library/tpsm/trivy-db"  ## 로컬 이미지 레지스트리로 변경
  allowInsecureConnections: false
postgresql:
  storageClass: "postgresql-storage-class"
clickhouse:
  storageClass: "clickhouse-storage-class"
redis:
  storageClass: "redis-storage-class"
opensearch:
  storageClass: "opensearch-storage-class"
seaweedfsS3:
  storageClass: "seaweedfs-storage-class"
prometheus:
  storageClass: "prometheus-storage-class"
  tmcStorageClass: "tmc-prometheus-storage-class"
kafka:
  storageClass: "kafka-storage-class"
zookeeper:
  storageClass: "zookeeper-storage-class"
imageRegistry:  ## 이미지 레지스트리 관련 정보를 입력합니다.
  server: tkgs-harbor.tanzu.lab
  username: admin
  password: YWRtaW46SGFyYm9yMTIzNDU=  ## base64 형식으로 입력 -> echo VMware1! | base64 -w0
  repo: library/tpsm
## 이미지 레지스트리 인증서 정보를 입력합니다.
  CustomRegistryCertificate: |-
  -----BEGIN CERTIFICATE-----
  MIIGHzCCBAegAwIBAgIUagWAj8bkFFUrFNcgZXKE2R1WBfYwDQYJKoZIhvcNAQEN
         ~~~~
  8gPxYxvbrP7PQQQpLph12RH/fNMLrL/yACY6259M3lOsxDp7TT2HQ5EUwS4XxVkS
  YF6R7oB847p+c7Hn2kblvc6uRsydwEJ1lYyCflh3iPTNBB4=
  -----END CERTIFICATE-----
versionControlSystemCertificate: ""
login:
  timeout: 60
  defaultUsers:
    admin:
      password: "VMware123"  ## 추후 변경이 불가함.
  ldap:
    url: "ldaps://tanzu-dns01.tanzu.lab:636/"  ## LDAP 경로를 입력
## LDAP 인증서를 입력
    certificate: |-
      -----BEGIN CERTIFICATE-----
      MIIF+TCCBOGgAwIBAgITWwAAABXNurJeGyA3DwAAAAAAFTANBgkqhkiG9w0BAQsF
      ~~~~~
      YS15IWIL398vZe54ySvSMrci9arOPdIt5kDjXNqj7FJc4caAXn3ETh1X9Q97
      -----END CERTIFICATE-----
    credentials:
      userDN: "CN=viadmin,CN=Users,DC=tanzu,DC=lab"
      password: "VMware123"  ## 바인딩 계정에 특수문자가 없어야 함
    users:
      baseDN: "DC=tanzu,DC=lab"
      searchFilter: "cn={0}"
      mailAttribute: "mail"
    groups:
      baseDN: "DC=tanzu,DC=lab"
      searchFilter: "member={0}"
      searchDepth: 10
      groupNameAttribute: cn
organization:
  name: "tanzulabs"

 

 

15. 설치 config 환경 정보 검증

tanzu-sm-installer verify -f config.yaml -u "${REGISTRY_USERNAME}:${REGISTRY_API_TOKEN}" -r ${LOCAL_REGISTRY} --install-version ${TANZU_SM_VERSION}

 

16. 설치 진행: 약 45분 가까이 소요됩니다.

tanzu-sm-installer install -f config.yaml -u "${REGISTRY_USERNAME}:${REGISTRY_API_TOKEN}" -r ${LOCAL_REGISTRY} --install-version ${TANZU_SM_VERSION}

 

설치 진행 하면은 아래와 같으며, Pausing 상태에 돌입하면, 오랜 시간 머무르게 됩니다.

 

17. 설치 진행 상태 확인

- 패키지 설치 상태를 동일한 접속 호스트로 터미널을 추가하여 확인합니다.

  • 다른 터미널로 kubectl get pod -n tanzusm | grep -v Running 구문으로 현재 제대로 실행되지 않은 pod들 여부를 관찰 가능. Crashbackoff가 계속 발생하는 항목들은 문제가 있는 것으로 판단해야 하며, 특히 UAA(인증) 관련 항목에서 넘어가지 못하는 경우가 다수임. → 주로 LDAP 인증 혹은 인증서 문제
  • tpsm host의 인증서 cert, key 값 삽입했을 경우, 잘못된 경우에는 로그인 시, Oauth2 에러 발생함.
  • LDAP 연결 구성이 잘못된 경우에는 계정 추가한 이후, LDAP 계정 로그인 시 접속 안되는 문제 발생함.
  • 설치까지 인내심을 가지고 기다려야합니다. 설치 규모에 따라서 약 30~45분 이상 소요됨.
kubectl -n tanzusm get packageInstalls
kubectl -n tanzusm describe packageInstalls sm
kapp ls -n tanzusm --column Name
kapp inspect -a  <app name listed in above command>  -n tanzusm

 

kubectl get pod -n tanzusm -w

 

18. 설치 종료

- 최종 설치 종료 시, 아래와 같이 PASS를 나타내는 종료 메시지가 표시됩니다.

 

WEB브라우저로 접속 및 Tanzu 도구를 사용하여, 아래와 같이 로그인 할 수 있습니다.

tanzu login은 추후, 개발자를 위한 application build, deploy를 위한 도구로 사용되며, 로그인 시 표시되는 URL을 웹 브라우저에 입력하고 로그인하면, redirect로 변경된 URL Bar에 표시된 path체 중간 token 항목만을 복사하여, 터미널에 다시 붙여놓기를 합니다.

export tanzu_url=tkgs-tp.tanzu.lab
tanzu login --endpoint https://${tanzu_url} --insecure-skip-tls-verify

 

 

최초 접속 계정은 tanzu_platform_admin 입니다. 지정한 암호를 사용하여 접속하세요.

 

로그인 하면 아래와 같은 화면이 표시됩니다.

 

 

다음 게시물에서 VCF Collector 및 K8s cluster Attach 방법을 살펴봅니다.