vSphere with Kubernetes의 Master/Worker Node SSH 접속하기

Posted by Just Do It ! 행동하지 않으면 성공도 실패도 없다 on Monday, May 4, 2020

vSphere with Kubernetes

vSphere 7.0

vSphere 7.0의 가장 큰 차이라고 한다면 당연하게 Kubernetes의 지원이다. 기존에 가상 머신, 스토리지, 네트워크의 SDDC부분에 중점을 두었다면, 쿠버네티스를 사용한 메니지먼트로 다양한 환경에서 동일한 메니페스트를 통해 관리를 할 수 있도록 한 것이다.

Supervisor Cluster

vSphere 7.0 의 Supervisor 클러스터를 통해서 vSphere 전반적인 가상머신, vSphere Pod, Tanzu Kubernetes Cluster를 생성/삭제 등의 라이프사이클을 관리한다. 사용자/그룹 관리, SSO연계, 퍼미션 설정, 네임스페이스 관리 등을 한다.

Supervisor 노드 접속

Supervisor노드에 접속하기 위해서

  • Supervisor 클러스터(or Workload Cluster Provider) 로그인 kubectl-vsphere 플러그인 설치하고 로그인을 한다.
kubectl vsphere login --insecure-skip-tls-verify --server <wcp.server.uri> -u administrator@vsphere.local
  • Supervisor Nodes
kubectl get node -o wide

Supervisor Cluster를 보면 Master와 Agent라는 두가지 롤의 노드가 있다. 그리고 Agent Node는 이름에서 볼 수 있듯이, ESXi Node 자체가 Agent 인것을 알 수 있다. ESXi Node에는 Virtual Kubelet을 수정해서 만든 Spherelet과 ContainerD와 같은 역할을 하는 HostD 라는 Agent가 동작하며, Agent의 Api Server와 Etcd, Scheduler, Controller Manager등이 동작하고 있는 Master 노드가 있다.

  • Supervisor Worker 노드(Agent 노드) 접속

  • Supervisor Master 노드 접속 Master Node에 접속하기 위해서는 root 계정의 패스워드를 알아야 하는데, vCenter VM에 root 접속하여 패스워드를 알수 있다.

$ ssh root@<vsphere_client_vm>
command > shell
# /usr/lib/vmware-wcp/decryptK8Pwd.py

Tanzu Kubernetes Cluster

Tanzu kuberenetes Cluster (aka Guest Cluster)에 ssh 접속하기 위한 패스워드는 Supervisor Cluster의 Secrets 에 정보가 있다.

kubectl -n ns1 get secrets
NAME                              TYPE                                  DATA   AGE
default-token-22q9s               kubernetes.io/service-account-token   3      6d10h
ns1-default-image-pull-secret     kubernetes.io/dockerconfigjson        1      6d10h
ns1-default-image-push-secret     kubernetes.io/dockerconfigjson        1      6d10h
tkg-cluster-1-ca                  Opaque                                2      6d4h
tkg-cluster-1-ccm-token-vwwlq     kubernetes.io/service-account-token   3      6d4h
tkg-cluster-1-encryption          Opaque                                1      6d4h
tkg-cluster-1-etcd                Opaque                                2      6d4h
tkg-cluster-1-kubeconfig          Opaque                                1      6d4h
tkg-cluster-1-proxy               Opaque                                2      6d4h
tkg-cluster-1-pvcsi-token-knkqb   kubernetes.io/service-account-token   3      6d4h
tkg-cluster-1-sa                  Opaque                                2      6d4h
tkg-cluster-1-ssh                 kubernetes.io/ssh-auth                1      6d4h
tkg-cluster-1-ssh-password        Opaque                                1      6d4h

  • tkg-cluster-1-ssh 는 Private.key 이고 tkg-cluster-1-ssh-password는 암호가 들어 있다.
kubectl -n ns1 get secrets tkg-cluster-1-ssh -o jsonpath='{.data.ssh-privatekey}' > tkg-cluster-1-ssh-private.key
k -n ns1 get secrets tkg-cluster-1-ssh-password -o jsonpath='{.data.ssh-passwordkey}'  | base64 -D

리눅스에서는 base64 -d, Mac에서는 base64 -D 로 사용한다

  • Tanzu kubernetes cluster의 노드에 ssh 접속하기
ssh -i tkg-cluster-1-ssh-private.key root@<tkg-clsuter-node-ip>

하지만, Supervisor Master Node 와 다르게, Tanzu Kubernetes Cluster의 Master Node는 사설 IP만을 가지고 있어서, Local 에서 바로 접속할 수가 없다. 따라서 중간에서 Bridge(Proxy)를 해줄 것이 필요하다. Supervisor Cluster에 Jumpbox Pod를 실행한다.

apiVersion: v1
kind: Pod
metadata:  
  name: jumpbox
  namespace: ns1
spec:  
  containers:  
  - image: "photon:3.0"
    name: jumpbox
    command: [ "/bin/bash", "-c", "--" ]
    args: [ "yum install -y openssh-server; mkdir /root/.ssh; cp /root/ssh/ssh-privatekey /root/.ssh/id_rsa; chmod 600 /root/.ssh/id_rsa; while true; do sleep 30; done;" ]
    volumeMounts:
    - mountPath: "/root/ssh"
      name: ssh-key
      readOnly: true
  volumes:
  - name: ssh-key
    secret:
      secretName: tkg-cluster-ssh

jumpbox pod이 실행이 되었으면, jumpbox를 통해 Tanzu Kubernetes Cluster에 접속한다.

  • 먼저 node의 IP를 확인한다
kubectl config use-context tkg-cluster-1
kubectl get no -o wide

또는

Supervisor Cluster에서 virtualmachine의 vmIP를 확인

kubectl -n ns1 get virtualmachine tkg-cluster-1-workers-4qnlq-54c68bbb84-8w6jh -o jsonpath={.status.vmIp}

  • jumpbox의 ssh 를 실행해서 접속한다
kubectl -n ns1 exec -it jumpbox -- ssh vmware-system-user@<node_vmIp>