Skip to main content

NKS Private Cluster 생성하기

VPC 및 서브넷 생성

고가용성을 위해서 노드들이 생성될 프라이빗 서브넷 두 개를 먼저 생성합니다. 프라이빗 클러스터의 노드들은 모두 프라이빗 서브넷에 있기 때문에 외부에서 접근할 수 없어 점프 서버를 통해야 하고 이 점프 서버가 위치할 서브넷은 퍼블릭 서브넷으로 생성합니다. 하나 더 퍼블릭 서브넷으로 NatGateway용 서브넷도 하나 생성합니다. 여기까지 일반 용도 퍼블릭 서브넷 하나와 일반 용도 프라이빗 서브넷 두 개, NatGateway용 퍼블릭 서브넷을 생성해주었어요. 마지막으로 로드밸런서용 프라이빗 서브넷 하나와 퍼블릭 서브넷을 생성한다면 모두 끝입니다.

CreatePrivateCluster1

NKS 클러스터 생성

다음으로 콘솔에서 NKS 서비스로 이동하여 클러스터를 생성합니다. 저는 KVM 하이퍼바이저를 선택하였는데 KVM 하이퍼바이저는 스토리지 볼륨을 중단없이 동적으로 증가 또는 감소시킬 수 있어서 KVM으로 선택하였습니다. 여기서 네트워크 타입에 따라서 프라이빗 클러스터, 퍼블릭 클러스터로 나뉘는데요, 저는 프라이빗 클러스터를 만드는 게 목적이므로 Private를 선택합니다. 서브넷에는 일반 노드들이 위치할 서브넷을 선택하시면 되는데 저는 위에서 고가용성을 위해서 두 개의 서브넷을 선택합니다. 두 서브넷은 모두 KR-1 리전에 위치하여 KR-2 리전에 있는 서브넷을 사용하여 고가용성을 높이고 싶었지만 NKS 클러스터에서는 같은 리전에 속한 서브넷만 선택이 가능해요. 다음으로 로드밸런서 서브넷, 퍼블릭 서브넷을 차례로 생성해줍니다. 클러스터 인증 모드는 ConfigMap을 선택하였는데 뒤에서 NKS 클러스터에 접근할 수 있는 NCP 서브 어카운트 계정의 정보를 ConfigMap으로 등록해줄거에요.

CreatePrivateCluster2

노드풀 등록

다음을 누르면 노드풀 설정으로 이동되는데요, 여기서 운영하는 서비스의 워크로드에 맞게 적절한 리소스를 선택하시면 됩니다. 24.07.17일 기준 NCP 인스턴스로 사용가능한 우분투 최신 이미지는 24.04이지만 NKS 노드로는 최신 이미지가 22.04입니다. 다음으로 인증키를 설정하고 최종확인을 하여 클러스터 생성을 마무리합니다.

CreatePrivateCluster3

NACL 설정

앞 설명에서 NACL 설정을 여기서 설명하지만 서브넷을 생성할 때 NACL이 필요할거에요, 아무 인바운드와 아웃바운드 설정이 없는 nacl 하나와 인바운드와 아웃바운드로 트래픽 인입을 조절할 수 있는 nacl 하나를 만들었어요, 로드밸런서용 퍼블릭 서브넷에만 후자의 nacl을 적용하고 나머지 서브넷에는 모두 설정없는 nacl을 적용하였는데 외부 서비스로 로드밸런서를 사용하여 노출하게 되는데 이때 AWS와 같은 경우라면 로드밸런서에도 보안그룹을 부착하여 보안을 설정할 수 있지만 NCP는 로드밸런서에 보안그룹을 붙일 수가 없어서 서브넷 단위에서의 흐름 제어인 NACL을 사용해야만 합니다.

따라서 퍼블릭 로드밸런서가 위치한 서브넷의 NACL을 사용하여 원하는 소스아이피만 요청을 받도록 할 수 있지만 이렇게 될 경우 퍼블릭 서브넷에 위치한 모든 로드밸런서가 영향을 받는다는 점입니다. 만약 로드밸런서별로 별도의 설정이 필요하다면 ALB가 아니라 NLB를 사용할 수 있고 쿠버네티스 매니페스트 파일의 어노테이션에 service.beta.kubernetes.io/ncloud-load-balancer-inbound-source를 사용하실 수 있습니다.

우선순위 6번은 짤렸지만 위에서 생성했던 모든 서브넷의 모든 포트를 허용해주었고 가장 마지막 우선순위에 모두 거부처리를 하고 그 위 우선순위에 제가 허용해주고 싶은 외부 아이피를 차례대로 허용해주었습니다. 만약 퍼블릭하게 열고 싶다면 인바운드와 아웃바운드 모두 아무설정을 진행하지 않아도 됩니다.

CreatePrivateCluster4

CreatePrivateCluster5

ACG 설정

노드에 적용되는 ACG는 자동으로 생성되고 VPC 대역으로 모든 포트를 허용하게 설정합니다.

CreatePrivateCluster6

점프서버 생성 및 기타 도구 설치

마지막으로 점프서버(바스티온 서버, 프록시 서버, 배스천 서버...)로 사용할 인스턴스를 퍼블릭 서브넷에 생성합니다. ACG도 하나 더 생성해주어야 하는데 위에서 만든 서브넷 대역의 모든 포트를 허용처리와 더불어 랩탑의 공인아이피 접속을 위해서 SSH 22번 포트도 허용해줍니다. 점프서버 생성이 완료되었다면 SSH 접속을 합니다. 가장 먼저 점프 서버에 kubectl 커맨드를 다운로드 받고 ./kube/config 파일을 다운로드 받기 위해서 사용할 ncp-iam-authenticator를 다운로드 받습니다.

ncp-iam-authenticator를 다운로드 받으셨다면 콘솔로 돌아가서 NKS 서비스 이동해 방금 만든 클러스터의 상세 정보 탭을 클릭합니다. 클러스터의 UUID를 복사하여 아래 커맨드에 이어서 붙여넣습니다. 그러면 해당 경로에 kubeconfig-[클러스터UUID].yaml이 생성되는데 이 파일을 .kube/config로 넣어줍니다. 여기까지 완료한다면 점프서버에서 쿠버네티스 클러스터에 접근이 가능해집니다.

ncp-iam-authenticator create-kubeconfig --region=KR --clusterUuid=

ConfigMap으로 서브어카운트 등록

ConfigMap 인증으로 아래 configMap을 생성해서 적용해주어야 해요, 서브 어카운트 아이디 번호를 적절히 넣어준뒤에 생성합니다.

$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
name: ncp-auth
namespace: kube-system
data:
mapSubAccounts: |
- subAccountIdNo:
username: albert
groups:
- system:masters
EOF

클러스터 IP ACL 설정

한가지 설정이 더 남았어요. 저는 이 점프 서버를 통해서만 클러스터를 제어하도록 만들 거에요. config 파일을 가지고 있더라도 위 점프 서버를 통해서만 명령을 보낼 수 있게 말이죠. 이 설정을 위해서 다시 콘솔로 돌아가 이번엔 상세정보가 아닌 액세스로 이동해서 IP ACL 설정으로 이동합니다.

CreatePrivateCluster7

저는 화이트리스트로 관리하기를 원하여 기본 액션을 deny하고 허용하고 싶은 아이피 리스트만 넣기를 원하기에 아래처럼 설정을 했어요. 블러처리를 했지만 접근소스에는 점프서버의 공인 아이피가 들어가 있습니다.

CreatePrivateCluster8

다이나믹 포트 포워딩으로 로컬에서 접근하기

여기까지 NKS 프라이빗 클러스터 생성과 점프 서버를 통한 클러스터 접근을 진행했어요. 하지만 불편한 한가지가 있었어요. 점프 서버를 통한 접근은 좋지만 제 로컬 피씨에 설치된 여러 도구들을 그대로 사용했기에 로컬 피씨에서도 kubectl 명령으로 프라이빗 클러스터에 접근하고 싶었습니다. 그래서 socks5 프록시를 사용하기로 했어요. socks5 프록시를 사용하는 것에 대해선 k8s 공식 가이드에도 내용이 잘 정리되어 있어 참고하셔도 좋아요.

제 로컬의 .kube/config에는 여러 클러스터 설정 정보가 들어가있기에 제 나름대로 점프서버에 있는 .kube/config를 추가해주었어요. 다음으로 다이나믹 포트포워딩을 사용할 것이기에 ~/.ssh/config 파일에 SSH 접속 정보를 미리 만들어주고 아래 명령어를 실행해서 포트포워딩을 설정했어요.

ssh -D 1080 -C -N fleet-bastion-prod

다음으로 쉘을 하나 더 열어서 아래 명령어를 실행한 뒤 kubectx로 클러스터를 스위칭한 뒤에 컨텍스트를 다시 한번 확인하고 노드 리스트를 출력했더니 잘 실행되었어요. 이제 제 로컬에서도 k9s를 사용할 수 있게 되었네요.

export HTTPS_PROXY=socks5://localhost:1080

$ k config get-contexts
$ k get nodes
NAME STATUS ROLES AGE VERSION
fleet-node-prod-w-59dd Ready <none> 9d v1.27.9
fleet-node-prod-w-59fb Ready <none> 8d v1.27.9
fleet-node-prod-w-59on Ready <none> 8d v1.27.9
fleet-node-prod-w-59oo Ready <none> 8d v1.27.9
fleet-node-prod-w-59vr Ready <none> 7d2h v1.27.9
fleet-node-prod-w-59vu Ready <none> 7d1h v1.27.9
fleet-node-prod-w-5aym Ready <none> 21h v1.27.9
fleet-node-prod-w-5ayn Ready <none> 21h v1.27.9