DevOps/Azure

[Kubernetes] AKS의 워커노드에 접속하기

돌돌김 2021. 2. 22. 11:51

 

docs.microsoft.com/ko-kr/azure/aks/ssh

 

AKS(Azure Kubernetes Service) 클러스터 노드에 대한 SSH 연결 만들기 - Azure Kubernetes Service

문제 해결 및 유지 관리 작업은 AKS(Azure Kubernetes Service) 클러스터 노드를 사용하여 SSH 연결을 만드는 방법을 알아봅니다.

docs.microsoft.com

  • 실행환경 : Ubuntu 18.06 또는 Mac
  • AKS를 구성하고, Pod를 배포한 상황

Azure에서 PaaS로 제공하는 쿠버네티스 서비스를 사용하면, Master Node는 Azure에서 관리하고, 사용자는 Worker Node만 관리할 수 있다.

 

AKS를 만들면 아래와 같이 가상머신확장집합 이라는 것이 생겼을 것이다. 생성되는 갯수는 초기에 설정한 노드의 개수와 일치한다. 

가상머신확장 집합은 말 그대로 가상머신이다. 3대의 컴퓨터(VM)을 할당 받은 것이며 각각은 IP를 따로 할당받는다.

 

 

 

클러스터 내부 IP로 통신 하는것을 확인 하기 위해선, 노드 내부로 들어가서 통신을 해야한다. 아래 명령어로 Pod가 어떤 노드에 배포되었는지 확인할 수 있다.

$ kubectl get pod -o wide  
NAME            READY   STATUS    RESTARTS   AGE     IP            NODE                                NOMINATED NODE   READINESS GATES
pod-readiness   1/1     Running   0          7m58s   10.244.1.77   aks-agentpool-19228959-vmss000001   <none>           <none>

 

 

확인결과 이 pod는 vmss00001에 배포 되었고, 이 vmss의 ip를 확인해보면 10.240.0.5 인것을 알 수 있다. 이제 10.240.0.5로 들어가서 해당 노드에 배포된 Pod끼리 통신이 되는지 확인해야한다.

 

 

 

로컬 PC (VM)에서 ssh keygen 생성
$ ssh keygen

 

 

AKS Cluster 구성

 

$ CLUSTER_RESOURCE_GROUP=$(az aks show --resource-group [리소스그룹 이름] --name [AKS 클러스터 이름] --query nodeResourceGroup -o tsv)
$ SCALE_SET_NAME=$(az vmss list --resource-group $CLUSTER_RESOURCE_GROUP --query '[0].name' -o tsv)

$ az vmss extension set  \
    --resource-group $CLUSTER_RESOURCE_GROUP \
    --vmss-name $SCALE_SET_NAME \
    --name VMAccessForLinux \
    --publisher Microsoft.OSTCExtensions \
    --version 1.4 \
    --protected-settings "{\"username\":\"azureuser\", \"ssh_key\":\"$(cat ~/.ssh/id_rsa.pub)\"}"

$ az vmss update-instances --instance-ids '*' \
    --resource-group $CLUSTER_RESOURCE_GROUP \
    --name $SCALE_SET_NAME


$ az vm user update \
    --resource-group $CLUSTER_RESOURCE_GROUP \
    --name aks-agentpool-19228959-vmss \
    --username azureuser \
    --ssh-key-value ~/.ssh/id_rsa.pub

 

 

위의 과정까지 완료를 했다면 다음번에 실행할 때는 도우미 Pod를 만드는 과정만 반복해서 실행하면 된다.

 

 

도우미 Pod에서 AKS 노드로 접속

 

# 도우미 Pod(vmss에 접속을 위함) 생성 및 접속
$ kubectl run -it --rm aks-ssh --image=debian

# SSH Client install
$ apt-get update && apt-get install openssh-client -y


# (다른 터미널에서 실행) 발급 받은 ssh-key의 private-key를 도우미 Pod로 복사
$ kubectl cp ~/.ssh/id_rsa $(kubectl get pod -l run=aks-ssh -o jsonpath='{.items[0].metadata.name}'):/id_rsa

# 도우미 Pod에서 실행 -> 워커노드로 접속
$ chmod 0600 id_rsa 
$ ssh -i id_rsa azureuser@10.240.0.4 # 접속하고 싶은 워커노드의 IP

 

 

Worker Node에 정상적으로 접속이 되고, Pod의 8080포트에 request를 보내면 정상적으로 response가 오는지 확인하자. 내가 만든 Pod의 이미지는 서비스에 curl 명령을 날리면 pod의 hostname을 리턴해주도록 했다.

 

yaml file (이미지는 가렸음)
apiVersion: v1
kind: Service
metadata:
  name: svc-readiness
spec:
  selector:
    app: readiness
  ports:
    - port: 8080
      targetPort: 8080


---

apiVersion: v1
kind: Pod
metadata:
  name: pod-readiness
  labels:
    app: readiness
spec:
  containers:
    - name: con-01
      image: {}
      ports:
      - containerPort: 8080
  terminationGracePeriodSeconds: 0

 

 

Service의 IP확인

 

$ kubectl get svc                                                      
NAME            TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
kubernetes      ClusterIP   10.0.0.1      <none>        443/TCP    8d
svc-readiness   ClusterIP   10.0.33.218   <none>        8080/TCP   6m39s

 

 

WorkerNode에서 Service로 curl 호출

 

azureuser@aks-agentpool-19228959-vmss000001:~$  while true; do date && curl 10.0.33.218:8080/hostname; sleep 1; done
Mon Feb 22 02:27:49 UTC 2021
Hostname : pod-readiness
Mon Feb 22 02:27:50 UTC 2021
Hostname : pod-readiness
Mon Feb 22 02:27:51 UTC 2021
1 2