후니의 IT인프라 사전

[T101 스터디] 네이버 클라우드 NKS 클러스터 구성하기 본문

프로젝트&&스터디/Terraform 스터디 [T101]

[T101 스터디] 네이버 클라우드 NKS 클러스터 구성하기

james_janghun 2022. 12. 11. 22:40

이번 시간에는 Terraform을 통해서 NKS 클러스터를 구성해보도록 하겠습니다.

 

대략적인 구성은 아래와 같은 모습이고 NKS 서비스 자체가 managed master node이기 때문에 대부분의 클라우드 벤더사와 같이 kubernetes service 구성과 worker node pool을 별도로 구성하여 생성합니다.

 

1. bastion.tf

대부분 클러스터는 프라이빗 서브넷에 존재시키고 bastion에 kube-config정보를 등록하고 실행시키도록 구성하였습니다.

bastion은 퍼블릭 서브넷에 존재하고, 접속을 위한 public IP를 받을 수 있도록 생성합니다. 그리고 login_key는 추후에 생성할 login pem키를 작성합니다.

resource "ncloud_server" "bastion-server" {
  subnet_no                 = ncloud_subnet.k8s-bastion-kr1.id
  name                      = "k8s-bastion"
  server_image_product_code = "SW.VSVR.OS.LNX64.CNTOS.0703.B050"
  login_key_name            = ncloud_login_key.loginkey.key_name
}

resource "ncloud_public_ip" "public_ip" {
  server_instance_no = "ncloud_server.bastion-server.id"
}

 

2. login.tf

네이버 클라우드에서는 등록된 pem키를 통해서 비밀번호를 받아 접속하는 방식을 가지고 있습니다. 그래서 pem키를 새로 생성하고 해당 pem키를 실행시키는 테라폼 디렉토리에서 받아 사용할 수 있도록 준비했습니다.

resource "ncloud_login_key" "loginkey" {
  key_name = "sample-login-key"
}

resource "local_file" "private_key" {
  filename = "./${ncloud_login_key.loginkey.key_name}.pem"
  content = "ncloud_login_key.loginkey.private_key"
  file_permission = "0400"
}

 

 

3. nat.tf

nat를 구성한 이유는 각각의 쿠버네티스 클러스터를 private subnet에 위치시키도록 하여, 해당 클러스터는 인터넷으로 다운로드가 불가능한 환경이 됩니다. 이에 nat를 구성하고, 추후에 라우트 테이블에 nat정보를 등록시켜 줍니다.

resource "ncloud_nat_gateway" "nat_gateway" {
  vpc_no      = ncloud_vpc.vpc.id
  zone        = "KR-1"
  // below fields is optional
  name        = "k8s-nat-gw"
  description = "This is NAT GW for kubernetes cluster."
}

 

 

4. network.tf

네트워크 전반적인 구성을 모두 모아두었다. vpc를 생성하고 kr-1리전에 각각 public, private, private(lb) 로 총 3개의 subnet을 구성합니다.

resource "ncloud_vpc" "vpc" {
  name = "kubernetes-vpc"
  ipv4_cidr_block = "10.0.0.0/16"
}

resource "ncloud_subnet" "k8s-bastion-kr1" {
  vpc_no         = ncloud_vpc.vpc.id
  subnet         = "10.0.11.0/24"
  zone           = "KR-1"
  network_acl_no = ncloud_vpc.vpc.default_network_acl_no
  subnet_type    = "PUBLIC"
  name           = "k8s-bastion-kr1"
}

resource "ncloud_subnet" "k8s-cluster-kr1" {
  vpc_no         = ncloud_vpc.vpc.id
  subnet         = "10.0.12.0/24"
  zone           = "KR-1"
  network_acl_no = ncloud_vpc.vpc.default_network_acl_no
  subnet_type    = "PRIVATE"
  name           = "k8s-cluster-kr1"
}

resource "ncloud_subnet" "k8s-lb-kr1" {
  vpc_no         = ncloud_vpc.vpc.id
  subnet         = "10.0.13.0/24"
  zone           = "KR-1"
  network_acl_no = ncloud_vpc.vpc.default_network_acl_no
  subnet_type    = "PRIVATE"
  usage_type     = "LOADB"
  name           = "k8s-lb-kr1"
}

 

5. nks.tf

data를 통해서 cluster의 kubernetes 버전을 선택하고, 클러스터 리소스에서 기본적인 설정을 진행합니다.

기본적으로 cluster라고하면 마스터 노드에 대한 기본적인 구성이고, node pool에서 워커노드 구성을 진행합니다.

data "ncloud_nks_versions" "version" {
  filter {
    name = "value"
    values = ["1.23"]
    regex = true
  }
}


resource "ncloud_nks_cluster" "cluster" {
  cluster_type                = "SVR.VNKS.STAND.C002.M008.NET.SSD.B050.G002"
  k8s_version                 = data.ncloud_nks_versions.version.versions.0.value
  login_key_name              = ncloud_login_key.loginkey.key_name
  name                        = "sample-cluster"
  vpc_no                      = ncloud_vpc.vpc.id
  subnet_no_list              = [ ncloud_subnet.k8s-cluster-kr1.id ]
  lb_private_subnet_no        = ncloud_subnet.k8s-lb-kr1.id
  kube_network_plugin         = "cilium"
  zone                        = "KR-1"
  log {
    audit = true
  }
}


resource "ncloud_nks_node_pool" "node_pool" {
  cluster_uuid   = ncloud_nks_cluster.cluster.uuid
  node_pool_name = "sample-node-pool"
  node_count     = 2
  product_code   = "SVR.VSVR.STAND.C002.M008.NET.SSD.B050.G002"
  subnet_no      = ncloud_subnet.k8s-cluster-kr1.id
  autoscale {
    enabled = true
    min = 1
    max = 2
  }

 

이상으로 구성이 완료되면 kube-config를 다운받아주면 됩니다.

해당 정보는 네이버클라우드 공식 홈페이지 사용자가이드에서 확인 가능합니다.

 

일단 먼저 ncp-iam-authenticator를 설치해야합니다.

curl -o ncp-iam-authenticator -L https://github.com/NaverCloudPlatform/ncp-iam-authenticator/releases/download/v1.0.6/ncp-iam-authenticator_1.0.6_linux_amd64

chmod +x ./ncp-iam-authenticator

mkdir -p $HOME/bin && cp ./ncp-iam-authenticator $HOME/bin/ncp-iam-authenticator && export PATH=$PATH:$HOME/bin

echo 'export PATH=$PATH:$HOME/bin' >> ~/.bash_profile

 

설치가 완료된 상태로 ncp-iam-authenticator를 통해서 kubeconfig.yaml 파일을 추출합니다.

이때 cluster-uuid 정보는 콘솔에서 확인 가능합니다.

ncp-iam-authenticator create-kubeconfig --region <region-code> --clusterUuid <cluster-uuid> --output kubeconfig.yaml

 

이렇게 생성된 kubeconfig.yaml은 아래와 같이 활용가능합니다.

$ kubectl get namespaces --kubeconfig kubeconfig.yaml
NAME                    STATUS   AGE
default                 Active   1h
kube-node-lease         Active   1h
kube-public             Active   1h
kube-system             Active   1h
kubernetes-dashboard    Active   1h

 

참고로 만약 지속적으로 kubeconfig 정보를 입력하기 힘들고, 하나의 클러스터만 사용한다면, 아래 명령어로 kubeconfig 정보를 복사해서 .kube 디렉토리 아래 편성하여 바로 인증을 거치도록 합니다.

cat kubeconfig.yaml > ~/.kube/config

 

이상으로 NKS 구성을 마치겠습니다.

 

- 참고자료 : https://manvscloud.com/?p=989

https://kubernetes.io/docs/concepts/services-networking/ingress/