구성 순서
- 개요 및 준비 환경
- 컨테이너 런타임 설치
- kubeadm, kubelet, kubectl 설치
- 로드밸런서 생성
- 고가용성 클러스터 생성
- 마스터 join
- CNI 설치
- 워커 노드 join
- 기타 추가 설정
1. 개요 및 준비 환경
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/ha-topology/
스택형 etcd 토폴로지
위와 같은 토폴로지로 구성 예정 ( 메모리 리소스가 부족해서 Worker Node는 2대로만 구성할 예정 )
만약 일반적인 싱글 마스터 쿠버네티스 클러스터를 구성하고 싶다면 4, 6번 과정은 제외하고 5번에서 kubeadm init 명령으로 변경해서 실행하면 됨
VMware 및 VirtualBox를 통해 Ubuntu 20.04 LTS 이미지로 가상머신 6개 생성
- Master 3대 (쿼럼 이슈로 인해 반드시 홀수대로 구성해야 함)
- Worker Node 2대
- LoadBalancer 1대
CPU 2코어 이상
메모리 3GB 이상
각 가상 머신의 IP 설정 (원한다면 변경 가능. 단, /etc/hosts파일에 입력할 내용을 지정한 IP로 수정해서 입력)
192.168.108.130 ~ 132 : master1 ~ 3
192.168.108.133 ~ 134 : node1 ~ 2
192.168.108.135 : lb
공통
/etc/hosts 파일을 수정하여 노드간 이름으로 통신가능하게 설정
아래 명령 실행
# /etc/hosts
cat <<EOF | sudo tee -a /etc/hosts
192.168.108.130 master1 master1.example.com
192.168.108.131 master2 master2.example.com
192.168.108.132 master3 master3.example.com
192.168.108.133 node1 node1.example.com
192.168.108.134 node2 node2.example.com
192.168.108.135 lb lb.example.com
EOF
2. 컨테이너 런타임 설치 - LoadBalancer를 제외한 모든 노드에 실행
containerd 런타임 설치
https://docs.docker.com/engine/install/ubuntu/
충돌하는 모든 패키지 제거
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
Docker apt저장소를 설정
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
Docker 패키지 최신 버전 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
설치가 잘 되었는지 확인
sudo docker run hello-world
3. kubeadm, kubelet, kubectl 설치 - LoadBalancer를 제외한 모든 노드에 실행
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
현재 23.12.31(일) 기준 가장 최신 버전으로 설치
kubeadm 1.29
※ 사전 준비 사항
1. 머신당 2GB 이상의 RAM(더 적으면 앱을 위한 공간이 거의 남지 않음)
2. CPU 2개 이상.
3. 모든 노드에 대한 고유한 호스트 이름, MAC 주소 및 product_uuid
4. 특정 포트를 열기 위한 방화벽 해제
5. 스왑 해제
6. containerd 파일 내용 기본값으로 변경
# 방화벽 해제
sudo systemctl disable --now ufw
# 스왑 해제
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# containerd 파일 기본값 변경
containerd config default > /etc/containerd/config.toml
sudo systemctl restart containerd
Kubernetes apt 저장소를 사용하는 데 필요한 패키지 색인 및 설치 패키지를 업데이트.
sudo apt-get update
# apt-transport-https may be a dummy package; if so, you can skip that package
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
Kubernetes 패키지 저장소의 공개 서명 키를 다운로드.
모든 저장소에 동일한 서명 키가 사용되므로 URL의 버전을 무시할 수 있음.
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
Kubernetes apt 저장소를 추가
다른 버전으로 설치할 경우 URL의 v1.29를 원하는 버전으로 변경
# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
패키지 인덱스를 업데이트 후 kubelet, kubeadm 및 kubectl을 설치하고 해당 버전을 고정.
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
4. 로드밸런서 생성 - LoadBalancer에만 실행
sudo apt update
sudo apt install haproxy
sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg-org # 파일 백업용
설치 완료 후 vi에디터나 nano에티터를 통해 /etc/haproxy/haproxy.cfg 파일 수정
# /etc/haproxy/haproxy.cfg
frontend k8s_frontend
bind *:6443
mode tcp
default_backend k8s_masters
backend k8s_masters
mode tcp
option tcp-check
option tcplog
balance leastconn
server master1 192.168.108.130:6443 check
server master2 192.168.108.131:6443 check
server master3 192.168.108.132:6443 check
데몬 재실행
sudo systemctl restart haproxy
sudo systemctl enable haproxy
5. 고가용성 클러스터 생성 - Master1 노드에서만 실행
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/
control plane 초기화 (master1에서만 입력)
sudo kubeadm init --control-plane-endpoint "lb.example.com:6443" --upload-certs
kubectl 명령을 사용할 수 있도록 다음 명령 실행
control-plane 초기화 후 출력된 세가지 명령 중 하나다.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
6. 마스터 join - Master1 을 제외한 모든 Master 노드에서 실행
master들을 join하기 위해 입력해야 하는 명령
초기화를 진행한 master1을 제외한 나머지 마스터들에게 입력
클러스터 생성 단계에서 control-plane 초기화 후 출력된 세가지 명령 중 하나다.
kubeadm join lb.example.com:6443 --token [해시값] \
--discovery-token-ca-cert-hash sha256:[해시값] \
--control-plane --certificate-key [해시값]
kubectl 명령을 사용하기 위해 입력해야 하는 명령 (보통 마스터에 입력한다.)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
워커 노드도 kubectl 명령을 쓰고 싶다면 다음 명령 입력 (워커 노드 join 완료 후)
apt-get install openssh-server
sudo sed -i.bak -e '/^#PermitRootLogin prohibit-password/{n;s/.*/&\nPermitRootLogin yes/}' /etc/ssh/sshd_config
sudo systemctl restart sshd
mkdir -p $HOME/.kube
scp master1:/etc/kubernetes/admin.conf $HOME/.kube/config # fingerprint 지문에 yes입력 후 root 비밀번호 입력
sudo chown $(id -u):$(id -g) $HOME/.kube/config
7. CNI 설치 - Master1 노드에서만 실행
ProjectCalico에서 제공하는 Calico CNI를 사용
curl https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml -O
kubectl apply -f calico.yaml
coredns와 calico 파드들이 완전히 Running 상태가 될 때까지 대기
watch kubectl get pods -n kube-system
CNI 설치가 완료되었으면 다음과 같이 모든 마스터 노드들이 Ready 상태가 되어야 한다.
kubectl get nodes
8. 워커 노드 join - 모든 Worker Node 에서 실행
Worker Node들을 join하기 위해 입력해야 하는 명령
클러스터 생성 단계에서 control-plane 초기화 후 출력된 세가지 명령 중 하나다.
kubeadm join lb.example.com:6443 --token [해시값] \
--discovery-token-ca-cert-hash sha256:[해시값]
워커 노드도 kubectl 명령을 쓰고 싶다면 다음 명령 입력 (워커 노드 join 완료 후)
(master1 에서만 실행)
apt-get install openssh-server
sudo sed -i.bak -e '/^#PermitRootLogin prohibit-password/{n;s/.*/&\nPermitRootLogin yes/}' /etc/ssh/sshd_config
sudo systemctl restart sshd
(각 Worker Node에서 실행)
mkdir -p $HOME/.kube
scp master1:/etc/kubernetes/admin.conf $HOME/.kube/config # fingerprint 지문에 yes입력 후 root 비밀번호 입력
sudo chown $(id -u):$(id -g) $HOME/.kube/config
9. 기타 추가 설정
tab키를 통해 명령어 자동 완성 기능을 추가하고 싶으면 각 노드에 다음과 같이 입력한다.
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
kubectl 뿐 아니라 kubeadm도 자동 완성 기능을 쓰고 싶다면 다음과 같이 입력한다.
source <(kubeadm completion bash)
echo "source <(kubeadm completion bash)" >> ~/.bashrc
이제 멀티 마스터 쿠버네티스 클러스터 생성이 완료되었고 이제 CLI나 yaml 파일을 통해 쿠버네티스 운영이 가능하다.
ubuntu 22.04 버전에서 kubeadm 1.29버전을 설치하고 싶으면 아래 링크를 참조한다.
'Kubernetes' 카테고리의 다른 글
Kubernetes 기초 - 로깅과 모니터링(2) (0) | 2024.01.02 |
---|---|
Kubernetes 기초 - 로깅과 모니터링(1) (0) | 2024.01.02 |
Kubernetes 기초 - Secret (0) | 2023.12.23 |
Kubernetes 기초 - ConfigMap (0) | 2023.12.23 |
Kubernetes 기초 - Label(4) (0) | 2023.12.22 |