쿠버네티스 무작정 따라하기 - #1. kt cloud 에서 K8S Cluster 만들기
[kt cloud Container개발팀 김유민 님]
쿠버네티스 무작정 따라하기 - #1. kt cloud 에서 K8S Cluster 만들기
초등학생 때 처음 컴퓨터를 배우면서 읽었던 무작정 따라하기 책을 떠올리며 Container, MSA, 쿠버네티스를 시작하고 싶은데 개념적으로 너무 어렵다 느끼는 분들을 위한 콘텐츠 입니다.
“백문이 불여일견이요,
백견이 불여일각이며,
백각이 불여일행이라"
“백번 듣고, 보고, 깨우치는 것 보다 한번 행함이 낫다” 라는 고사성어처럼 일단 무작정 따라하면서 실습을 통해 쿠버네티스와 가까워지는 시리즈입니다.
이번 시리즈 동안에는 개념이나 이론적인 설명들은 최대한 배제할 예정입니다!
( 혹시 개념이나 이론적인 분이 궁금하신 분들을 위해 중간 중간 관련 링크를 첨부 드릴게요,
하지만 개념은 실습이 끝난 후에 한번 훑어 보시는 걸 추천 드립니다!)
그럼 더 이상의 설명 없이 무작정 따라하기 바로 들어가 보겠습니다
1.일단 VM 생성부터 해볼까요?
kt cloud Console에 접속하신 후 아래와 같이 VM 을 생성해주세요.
생성 화면에서 VM 을 생성하실 Zone과 Tier를 선택하고 Name을 작성 해야 합니다!
순서대로 “DX-M1”, “Private”, “my-k8s-master01” 입력 하겠습니다.
Volume Type, Volume Size는 기본 설정인 “HDD” , “50GB” 그대로 설정하고,
중요
SSH Keypair 는 현재 가지고 계신 사용 가능한 Key Pair를 선택해주세요!
없다면 신규 생성을 통해서 새로 만들어서 잘 보관 해주세요.(해당 Key가 없다면 이후에 진행할 VM 접속이 어렵습니다
)
생성 화면 아래에 OS와 스펙을 선택하는데 동일하게
[ CPU-Intel Server] → [Ubuntu] → [Ubuntu 24.04 64bit] → [2Core 4GB]
로 선택 해주시고 “생성” 버튼을 클릭해주세요.
자 이제 위 과정을 동일하게 3번만 더 반복해주시면 됩니다
모든 설정은 동일하게 해주시고 Name 만 아래와 같이 총 4대의 VM 을 생성 해주세요.
“my-k8s-master01”, “my-k8s-master02”, “my-k8s-master03', “my-k8s-worker01”
여기 까지 진행 해주셨다면 Virtual Machine 화면에서 아래와 같이 서버 목록이 보입니다.
다시 한번 VM 명과 Zone, Tier를 동일하게 생성 했는지 확인 해주세요!
현재 아래와 같이 총 4대의 VM이 생성되었네요! 그럼 계속해서 진행해볼까요?
2.VM을 만들었으면 들어가야죠
먼저 외부에서 접속하기 위한 Public IP 를 만들어 봅시다.
정상적으로 생성이 되었다면 위와 같이 ‘추가’ 타입의 ‘ASSOCIATE’ 상태를 가진 Public IP 가 조회 됩니다. 그럼 해당 Public IP 체크 후 “접속 설정”을 클릭해주세요.
화면과 같이 대상 Virtual Machine 선택 ‘my-k8s-master01’, Private Port 는 ‘22’, Public Port는 ‘60001’ 로 입력 후 “추가” 해주세요.
master01 서버와 마찬가지로 다른 서버들도 아래와 같이 접속 설정 해주겠습니다.
- my-k8s-master01 → Private Port : ‘22’ / Public Port : ‘60001’
- my-k8s-master02 → Private Port : ‘22’ / Public Port : ‘60002’
- my-k8s-master03 → Private Port : ‘22’ / Public Port : ‘60003’
- my-k8s-master01 → Private Port : ‘22’ / Public Port : ‘60004’
다른 포트로 하면 안되나요?
→ Private Port는 22번이 Ubuntu 서버의 기본 SSH Port 임으로 처음 접속을 위해선 22번으로 설정해주셔야 하며, Public Port는 외부에서 접속하기 위해 노출 시키는 Port 임으로 원하시는 Port 로 변경해도 무방합니다! 단, 하나의 Public IP에서 동일한 Public Port는 사용할 수 없으니 참고해주세요!
정상적으로 설정하셨다면 위와 같이 화면에 접속 설정한 내역이 조회 됩니다.
이제 방화벽 설정만 추가해주시면 VM 에 들어갈 수 있습니다. 그럼 방화벽 설정을 하러 가볼까요.
방화벽 설정 화면 클릭 시 아래와 같이 팝업 화면이 표시됩니다
Zone 정보를 확인해주시고 혹시 기존에 생성된 방화벽 정책 있다면 일단 무시해주세요~
화면과 같이 Src Network, Protocol, Dest Network 를 설정 해줄게요
- (1) Src Network Tier : ‘external’ 선택
- (2) Src CIDR : 접속할 PC의 IP로 CIDR 정보를 넣어주셔야 해요! 내 IP 확인
- (3) Dest Network Tier : ‘Private’ 선택
- (4) Dest CIDR : ‘PF_211.X.X.11_60001_TCP’ 선택
→ Dest CIDR 목록을 보면 익숙하시죠 우리가 위에서 생성한 접속 설정들입니다.
‘PF_211.X.X.11_60001_TCP' 부터 'PF_211.X.X.11_60004_TCP’
총 4개의 방화벽 정책을 추가해주세요!
방화벽 정책을 잘 설정 해주셨다면 화면과 같이 조회가 되겠죠?
이제 VM 접속을 위한 준비가 완료됐습니다. 저는 * Mac에서 터미널을 이용할 건데요
* Window 환경이실 경우 cmd 창에서 동일하게 접속 할 수 있습니다.
처음 VM 을 생성할 때 선택한 SSH Key Pair( ~.pem 파일)가 위치한 곳에서 다음 ssh 접속 명령어를 수행 해주시면 됩니다!
$ ssh -i [ssh key pair] ubuntu@211.x.x.11 -p 60001 |
VM 접속에 성공 했습니다
이제 위 명령어에서 Port 를 60002, 60003, 60004로 바꿔 보면서 다른 VM에도 접속이 되는지 확인해주세요.
접속에 이상이 없다면 아래 그림과 같이 구성되었다고 볼 수 있겠죠?
이제 드디어! Kubernets를 설치하기 전에…
3.몇 가지 설정과 Container Runtime 설치가 필요해요
먼저 ‘my-k8s-master01' VM에 접속해주세요 그리고 아래 순서대로 명령어를 수행할게요!
우선은 명령어를 무작정 따라 해보시죠.
* 혹시 궁금하신 분들을 위해 Step 마다 ‘Why?’ 를 남겨 드리겠습니다.
1) apt 업데이트
Why? - Pakage 다운로드를 위해 Ubuntu Repository 에서 설치 가능한 Package 목록을 업데이트 하는 명령어 입니다. 서버에 설치되어 있는 Package는 업데이트 되지 않아요!
sudo apt update |
apt 업데이트가 안된다면 kt cloud Console 로 돌아가서 아래와 같이 방화벽 정책을 추가해주세요!
2) Swap 메모리 설정 Off
Why? - k8s 1.22 버전 부터 알파로 지원해오던 부분을 1.28 버전에서 부터는 베타로 지원하고 있습니다. 다만 우리는 사용하지 않을 기능이기에 Off 하고 넘어갈게요! 자세한 내용이 궁금하시면
(https://velog.io/@yange/kubernetes-swap-off%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC)
#swap Memory 확인 $ free -m #swap memory off $ sudo swapoff -a #VM 재부팅 시 설정 초기화 방지를 위한 fstab 수정 $ sudo sed -i '/swap/d' /etc/fstab |
3) Container Runtime(Containerd) 설치
Why? - Container 들이 VM 에서 실행되기 위한 프로그램이라고 생각해주시면 좋아요. k8s 1.24 버전 이후로 dockershim 지원이 중단되었으니 주의! 그래서 우리는 containerd 를 설치하겠습니다! 자세한 내용이 궁금하시면
(https://kubernetes.io/ko/docs/setup/production-environment/container-runtimes/)
#containerd 설치 - 1.7.12 버전 특정 $ sudo apt install -y containerd=1.7.12-0ubuntu4 #containerd 상태 확인 $ systemctl stauts containerd # containerd enable $ sudo systemctl enable containerd |
4) Network 설정
Why? - containerd와 Kuberentes가 정상적으로 네트워킹과 파일 시스템 작업을 처리할 수 있도록 특정 커널 모듈을 활성화 시켜주어야 합니다.
IPv4를 포워딩하여 iptables가 브리지된 트래픽을 보게 하기 (https://kubernetes.io/ko/docs/setup/production-environment/container-runtimes/#ipv4%EB%A5%BC-%ED%8F%AC%EC%9B%8C%EB%94%A9%ED%95%98%EC%97%AC-iptables%EA%B0%80-%EB%B8%8C%EB%A6%AC%EC%A7%80%EB%90%9C-%ED%8A%B8%EB%9E%98%ED%94%BD%EC%9D%84-%EB%B3%B4%EA%B2%8C-%ED%95%98%EA%B8%B0)
$ sudo modprobe br_netfilter $ sudo modprobe overlay $ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf br_netfilter EOF $ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF $ cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf overlay br_netfilter EOF $ cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 EOF $ sudo sysctl --system |
5) Containerd Config 설정
Why? - 실행 중인 containerd 로 부터 default 설정에 대한 conf 파일을 생성하고, containerd 에서 SystemCgroup을 사용할 수 있도록 설정을 추가해주어야 합니다.
systemd cgroup 드라이버 환경 설정하기 (https://kubernetes.io/ko/docs/setup/production-environment/container-runtimes/#containerd-systemd)
# containerd 디렉토리 생성 $ sudo mkdir -p /etc/containerd # containerd defalt Config 기반으로 config.toml 생성 $ sudo containerd config default | sudo tee /etc/containerd/config.toml # 파일 권한 수정 $ sudo chmod 644 /etc/containerd/config.toml # Cgroup 설정 변경 $ sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml # containerd 재기동 및 상태 확인 $ sudo systemctl restart containerd $ systemctl status containerd |
이제 나머지 3대의 VM에서도 1) ~ 5) 번 까지 동일한 작업을 수행해주세요
“my-k8s-master02”, “my-k8s-master03', “my-k8s-worker01”
전부 다 수행하셨다면 이제 마지막 단계만 남았습니다!
4.Kubernetes 설치 및 구성
1) Master 서버 용 Load Balancer 생성
위에서 우리는 3대의 master 용 서버를 생성했습니다. 이는 따로 언급 드리진 않았지만, Kuberentes 에서 마스터 노드의 HA(High Availiability) 구성을 하기 위함입니다.
때문에 3대의 Master 노드의 단일 진입점이 필요한데요, 이를 위해 먼저 LB(Load Balancer)를 생성하고 각 Master 노드로 바인딩 하겠습니다.
kt cloud Console 화면으로 접속해서 LB를 하나 만들어 줄게요.
생성 화면으로 넘어가서 아래와 동일한 값으로 세팅 해주세요
- Zone : ‘DX-M1’
- Tier : ‘Private’
- Name : ‘my-k8s-api’ ← 중복 확인 체크 필수!
- Service IP / Port : ‘(신규 IP할당)' / ‘6443’
- Service Type : ‘HTTPS(Bridge)’
- Service Options : ‘Round Robin’
- Health Check : ‘TCP’
정상적으로 LB 가 생성되었다면 목록에서 ‘my-k8s-api’ 를 조회할 수 있습니다!
중요
생성된 LB의 IP를 기억해주세요! 저는 ‘172.X.1.181’ 입니다. 나중에 Kubernetes 구성 간 해당 IP를 넣어주셔야 합니다!
해당 LB를 체크 후 ‘VM 연결/해제’ 버튼을 클릭해주세요.
팝업창이 나오면 아래와 같이 ‘my-k8s-master01~03'에 대하여 동일하게 “추가” 해주세요
정상적으로 추가 해주셨다면 아래와 같이 조회 됩니다!
2) 외부 호출 용 Public IP 및 SNAT 설정
위에서 생성된 LB의 IP 를 보면 서버들의 IP와 동일하게 사설 대역인 172.X.X.X 대역입니다.
우리는 여기서 추가로, 외부 네트워크 대역에서도 Kubernetes API 를 사용할 수 있도록 Public IP 를 생성하고 SNAT 로 LB와 연결하는 작업을 해보겠습니다!
먼저 VM 접속 설정 하실 때와 동일하게 ‘Public IP' 생성해보겠습니다.
생성된 ‘ASSOCIATE' 상태의 Public IP를 체크 후 ‘Static NAT’ 버튼을 눌러주세요
아래와 같이 팝업 화면이 나오면 ‘Load Balancer’ 탭으로 가서 위에서 생성했던 LB를 선택 후 '확인' 버튼을 클릭 해주세요.
설정이 정상적으로 되었다면 아래와 같이 Public IP 목록에서 ‘my-k8s-api’, ‘STATICNAT’ 로 조회 됩니다
중요
LB와 마찬가지로 생성된 Public IP의 IP 주소를 기억해주세요! 저는 211.X.X.10 입니다!
3) Kubernetes Tool 설치
해당 작업은 ‘my-k8s-master01' , ‘my-k8s-master02’ , ‘my-k8s-master03’, ‘my-k8s-worker01’ 모든 서버에 동일하게 진행 해주셔야 합니다.
VM에 직접 접속해서 아래 명령어를 차례로 수행 해주세요!
# Install dependencies $ sudo apt-get install -y apt-transport-https ca-certificates curl |
# kuberentes apt keyrings 받아오기 $ sudo curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg # kubernetes 패키지 repo 정보 추가 $ echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list # apt repo upddate $ sudo apt-get update |
# install k8s tools $ sudo apt-get install -y kubelet=1.30.5-1.1 kubeadm=1.30.5-1.1 kubectl=1.30.5-1.1 # 자동 update 방지를 위한 hold $ sudo apt-mark hold kubelet kubeadm kubectl |
드디어 마지막 단계입니다
4) Kubernetes init / Master Join / Worker Join
‘my-k8s-master01’ 서버에 접속 해주세요. kubeadm 명령어를 이용하여 kubernetes cluster 를 생성하겠습니다.
- ‘--control-plane-endpoint’ 값에는 위에서 확인한 LB IP를 넣어주세요
- ‘--api-cert-extra-sans’ 값은 Public IP의 값을 넣어주시면 됩니다.
$ sudo kubeadm init --pod-network-cidr=192.168.0.0/16 \ --cri-socket /run/containerd/containerd.sock \ --control-plane-endpoint 172._.1.181 \ --apiserver-cert-extra-sans=211._._.10 |
중요
kubeadm init 명령어가 성공적으로 수행되면 빨간색 네모로 표기 드린 것처럼 ‘kubeadm join’ 명령어가 2개 출력 됩니다. 해당 명령어 2개 모두 복사해서 메모장에 넣어 둘게요.
추가로 아래 명령어 수행을 통해 마스터 노드 조인을 위해 필요한 인증서 Key도 같이 메모 해주세요!
$ sudo kubeadm init phase upload-certs --upload-certs |
현재 서버에서 ‘kubectl’ 명령어를 수행할 수 있도록 kube/config 설정을 계정 디렉토리 및에 복사해주겠습니다.
$ sudo mkdir -p /root/.kube $ sudo mkdir -p /home/ubuntu/.kube $ sudo cp -f /etc/kubernetes/admin.conf /root/.kube/config $ sudo cp -f /etc/kubernetes/admin.conf /home/ubuntu/.kube/config $ sudo chown -R ubuntu:ubuntu /home/ubuntu/ |
위에 설정이 정상적으로 되었다면 아래와 같이 kubectl 명령어를 사용할 수 있습니다!
$ kubectl version # 포드 조회 $ kubectl get pod -n kube-system |
보이시나요?!
맞습니다 현재 아래 그림처럼 ‘my-k8s-master01’ 서버 1대로 K8S 클러스터가 구성된 상태에요!
* 포드는 중요 POD만 표기하였습니다
그럼 계속해서 ‘kubectl’ 명령어를 통해 calico CNI를 배포해볼게요!
$ kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/calico.yaml |
Calico 관련 포드가 잘 배포 되었는지 조회해볼까요?
$ kubectl get pod -n kube-system |
좋습니다! 이제 나머지 서버들도 Kubernetes Cluster 구성에 포함되도록
Master Node Join과 Worker Node Join 을 수행해볼까요
‘my-k8s-master02’ 서버에 접속 해주세요. 이제 위에서 ‘kubeadm init ~' 명령어 실행 후 메모장에 넣어두었던 명령어를 사용할 차례입니다!
저장해두었던 2개의 명령어 중 ‘--control-plane’ Flag가 붙은 명령어에 ‘--certificate-key’ Flag를 추가하여 위에서 복사해둔 인증서 key값을 넣어주세요.
혹시 명령어를 저장해두지 않으셨거나 잃어 버리셨나요?
그렇다면 클릭! (https://bono915.tistory.com/entry/Kubernetes-%EC%8B%A0%EA%B7%9C-worker-node-join-%EB%B0%A9%EB%B2%95)
$ sudo kubeadm join 172.X.1.181:6443 --token 2xmfo0.af__________0h \ --discovry-token-ca-cert-hash sha256:4d32____________________________d2d7 \ --control-plane --certificate-key eb3de______________________________________61db |
‘my-k8s-master03’ 서버에 접속해서 동일하게 수행해주세요!
그럼 다시 ‘my-k8s-master01’ 서버로 돌아가서 kubectl 명령어로 ‘my-k8s-master02’와 ‘my-k8s-master03’서버가 정상적으로 조회 되는지 확인 해볼까요?
$ kubectl get node $ kubectl get pod -A |
노드 목록에 ‘my-k8s-master02’와 ‘my-k8s-master03’ 서버가 추가 되었네요!
전체 포드 목록에서도 모든 포드 들이 ‘Running’ 상태로 정상적으로 실행되고 있습니다.
마지막으로 ‘my-k8s-worker01’ 서버도 Cluster에 Join 해주겠습니다. ‘my-k8s-master01’ 서버에 접속해서 저장해두었던 2개의 명령어 중 ‘--control-plane’ Flag 가
없는
명령어를 실행 해주세요.
$ sudo kubeadm join 172.X.1.181:6443 --token 2xmfo0.af__________0h \ --discovry-token-ca-cert-hash sha256:4d32____________________________d2d7 |
다시 ‘my-k8s-master01’ 로 돌아가서 노드와 포드를 조회 해볼까요?
$ kubectl get node $ kubectl get pod -A |
여기까지 VM 생성부터 접속하여 필수 OS 설정과 Container Rutime 설치 및 Kubernetes Package 설치하였습니다.
이후 kubeadm 명령어를 사용하여 클러스터 구성 후 Master 노드 조인 및 Worker 노드 조인까지 해서 총 4대의 VM 으로 구성된 쿠버네티스 클러스터를 구성이 완료됐습니다!
여러분들은 시간이 얼마나 걸리셨나요? 저는 글을 쓰기 위해 캡처 하며 진행해서 매우 오랜 시간이 걸렸습니다
그런데 혹시 이 모든 과정을 몇 분 만에 하는 방법을 알고 계신가요?
5.이 모드 걸 클릭 몇 번으로? K2P Standard
kt cloud 에서는 이런 복잡한 과정들을 자동화하여 고객에게 제공하기 위한
K2P(kt cloud Kuberentes Pack)(https://cloud.kt.com/product/productDetail?prodId=P000000019) 이라는 상품이 있습니다!
클러스터 생성 이후에도 관리 및 유지 보수를 위한 다양한 기능들과 옵션 상품들을 제공하고 있는데요.
이후 이어지는 Kubernetes 구성 요소와 Application 배포 및 CICD 관련 내용에 대한 내용은 편의성을 위해 K2P Standard 상품을 통해 생성한 클러스터에서 진행 해보도록 하겠습니다!
(위에서 수동으로 생성한 클러스터에서 계속 진행하셔도 무방합니다)
참고/출처
https://support.apple.com/ko-kr/guide/terminal/apd5265185d-f365-44cb-8b09-71a064a42125/mac
https://priming.tistory.com/72
https://velog.io/@yange/kubernetes-swap-off%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC
https://kubernetes.io/ko/docs/setup/production-environment/container-runtimes/
https://captcha.tistory.com/78
https://velog.io/@200ok/Kubernetes-Calico-CNI-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0
https://bono915.tistory.com/entry/Kubernetes-%EC%8B%A0%EA%B7%9C-worker-node-join-%EB%B0%A9%EB%B2%95