본문 바로가기

기초 공부/시스템

[Kubernetes] Kubernetes 설치 (ubuntu 22.04/Containerd/Flannel)

1.Kubernetes 소개 및 중요성

 

 Kubernetes는 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고, 확장가능한 오픈소스 플랫폼이다. 쿠버네티스는 선언적 구성과 자동화를 모두 용이하게 해준다.

 

※ 참조 : https://kubernetes.io/ko/docs/concepts/overview/ (Kubernetes 공식 문서)

 

 보다 효율적으로 서버 리소스 자원을 활용하기 위해 MSA(Micro Serivece Architecture) 방식으로 컨테이너를 활용하기 시작하였다. 다만, 컨테이너가 다운되거나 장애 발생, 재배포 시 과거처럼 수작업이 아닌 Kubernetes에서 지원되는 기능을 통해 자동화된 관리 컨테이너 관리가 가능하게 되었다.

 

2.Kubernetes 설치 사전 요구 사항

※VM 인스턴스 정보

구분 명칭 설명
H/W 정보 VM 인스턴스 Master Node 1 : 4(2x2) Processors / 4GB RAM
Worker Node 1 : 2(2x1) Processors / 2GB RAM
Worker Node 2 : 2(2x1) Processors / 2GB RAM
HOST OS Ubuntu 22.04.3 LTS (x64) Master Node 1 / Worker Node 1 / Worker Node 2 동일 (6.2.0-39-generic)
네트워크 NAT Master Node 1 : 192.168.75.10
Worker Node 1 : 192.168.75.20
Worker Node 2 : 192.168.75.25
     

 

3.Kubernetes 설치 환경 설정

 - containerd 등 설정

1) '/etc/hosts'  설정

 (1)각 노드 별 HOST 명칭 수정

#아래의 명령어를 통해 각 노드 별 HOST 명칭을 수정
sudo hostnamectl set-hostname [노드 별 HOST]
#master node
sudo hostnamectl set-hostname master1
#worker node
sudo hostnamectl set-hostname worker1
sudo hostnamectl set-hostname master2

 (2) '/etc/hosts 파일을 수정하여 각 마스터 노드, 워커 노드 의 HOST 명으로 연결이 가능하도록 수정

#sudo vim /etc/hosts
192.168.75.10 master1
192.168.75.20 worker1
192.168.75.25 worker2

(3) 설정된 HOST로 ping 명령어를 실행하여 설정 확인

#각 노드에서 수행
ping master1 -c 3
ping worker1 -c 3
ping worker2 -c 3

 

2) 방화벽 설정

 일반적으로 Kubernetes를 운영하려거나, 기존 운용 중인 서비스가 있을 시 필요한 포트 외에는 차단하도록 방화벽 등이 설정되어 있을 것이다. 이를 반영하기 위해 Ubuntu에서 제공하는 UFW 방화벽을 설정한다.

 

(1) UFW 방화벽 허용 포트 확인

 Kubernetes는 아래와 같은 포트를 방화벽에서 허용해줘야 한다. 다만, 아래의 예시처럼 특정 서비스에서 제공하는 Kubernetes에서 필요한 포트가 상이할 수 있다.

※Master Node

구분 포트 이름 (서비스 제공자) 포트 번호
1 kubernetes API Server 6443
2 kubernetes etcd Server Client API 2379
3 kubernetes etcd Server Client API 2380
4 Kubelet API 10250
5 Kube-controller-manager 10257
6 Kube-scheduler 10259
7 Kubelet API (Oracle, read-only) 10255
8 Kube-controller-manager (Oracle 10252
9 Kube-scheduler (Oracle) 10251

※Worker Node

구분 포트 이름 (서비스 제공자) 포트 번호
1 Kubelet API 10250
2 NodePort 서비스 (기본 포트) 30000-32767

 

(2) UFW 방화벽 설정

※Master Node

#공통으로 원격 접근을 위한 포트 허용
sudo ufw allow "OpenSSH"
sudo ufw enable
#UFW 방화벽 활성화 요청 시 허용(Y)
#Master Node 허용 포트
sudo ufw allow 6443/tcp
sudo ufw allow 2379:2380/tcp
sudo ufw allow 10250/tcp
sudo ufw allow 10259/tcp
sudo ufw allow 10257/tcp

 

※Worker Node

#공통으로 원격 접근을 위한 포트 허용
sudo ufw allow "OpenSSH"
sudo ufw enable
#UFW 방화벽 활성화 요청 시 허용(Y)
#Worker Node 허용 포트
sudo ufw allow 10250/tcp
sudo ufw allow 30000:32767/tcp

(3) 설정된 방화벽 확인

sudo ufw status
Master Node Worker Node

 

3)커널 모듈 및 SWAP 설정

(1) 커널 모듈 "overlay" 및 "br_netfilter" 활성화

※VM 인스턴스 이용 간 영구적으로 커널 모듈이 활성화되도록 설정

#커널 모듈 활성화
sudo modprobe overlay
sudo modprobe br_netfilter
#영구적 설정
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
#
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF
#설정된 값을 재부팅 없이 적용
sudo sysctl --system

 

(2) SWAP 비활성화

 SWAP 기능 이용 시, Kubernetes 운용 간 장애가 발생할 수 있으므로 해당 기능을 비활성화한다.

sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
#문서 편집기 이용 시
sudo vim /etc/fstab
#/swapfile 주석처리 확인
sudo swapoff -a
#SWAP 비활성화 확인
free -m

주석처리(#) 확인
SWAP 0 표시 확인

 

4) CRI (Container Runtime Interface - 컨테이너 런타임 인터페이스) 설치

(1) containerd 설치 (공식 배포 사이트 이용)

※참조 1 : https://github.com/containerd/containerd/blob/main/docs/getting-started.md (설치 가이드)

※참조 2 : https://github.com/containerd/containerd/releases (containerd 버전 확인)

#containerd 다운로드
wget https://github.com/containerd/containerd/releases/download/v1.7.13/containerd-1.7.13-linux-amd64.tar.gz
sudo tar Cxzvf /usr/local containerd-1.7.13-linux-amd64.tar.gz
#systemd 설정 파일 다운로드
sudo wget https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
sudo mv containerd.service /usr/lib/systemd/system/
#systemctl containerd 등록
sudo systemctl daemon-reload
sudo systemctl enable --now containerd

 

(2) runC 설치

※참조 : https://github.com/opencontainers/runc/tags (runC 배포사이트)

#버전 확인 후 다운로드
wget https://github.com/opencontainers/runc/releases/download/v1.1.12/runc.amd64
sudo install -m 755 runc.amd64 /usr/local/sbin/runc

 

(3)containerd 설정 파일 생성

 압축된 containerd 파일을 이용하여 설치 시, containerd의 환경설정 파일인 "config.toml"이 자동생성되지 않는다. containerd 사용을 위한 환경설정 파일을 생성한다.

sudo mkdir -p /etc/containerd/
containerd config default | sudo tee /etc/containerd/config.toml
#runc에서 systemd cgroup 드라이버를 사용하여 컨테이너의 cgroup을 관리할 수 있도록 허용
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
#또는 문서 편집기를 이용하여 직접 수정
sudo vim /etc/containerd/config.toml
#설정 재설정 후 재시작
sudo systemctl restart containerd

SystemdCgoup = false &rarr; true로 변경

 

4.Kubernetes 설치 방법

 kubeadm 기반으로, kubernetes 패키지를 설치

 ※ 참조 : https://kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

 

5.Kubernetes 설치 과정

1) kubernetes 리포지토리 추가

#
sudo apt install apt-transport-https ca-certificates curl -y
#구글 클라우드 공개 서명키 다운로드 // 공식문서 가이드 설치 에러로 아래의 서명키 다운로드로 변경
sudo curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg| sudo gpg -o /usr/share/keyrings/kubernetes-archive-keyring.gpg --dearmor
#쿠버네티스 리포지터리 추가
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt-get install -y kubelet kubeadm kubectl
#kubernetes 호환성을 위해 자동 업데이트 방지
sudo apt-mark hold kubelet kubeadm kubectl

 

2) CNI (Container Network Interface) 설치

 컨테이너 간의 네트워크를 제어할 수 있는 플러그인으로, AWS VPC, Azure CNI, Cilium, Calico, Flannel 등의 다양한 컨테이너 네트워크 플러그인을 지원하며 구축하는 서비스 환경에 적합한 플러그인을 선택하여 적용한다.

 

(1) Flannel 설치

 Flannel은 L3 네트워크 계층 기능을 중점으로 지원하며, 네트워크 정책은 Calico와 병행할 수 있다.

  ※ 참조  : https://github.com/flannel-io/flannel 

mkdir -p /opt/cni/bin
#압축파일 다운로드 설치
curl -O -L https://github.com/containernetworking/plugins/releases/download/v1.2.0/cni-plugins-linux-amd64-v1.2.0.tgz
tar -C /opt/cni/bin -xzf cni-plugins-linux-amd64-v1.2.0.tgz
#
sudo curl -fsSLo /opt/cni/bin/flanneld https://github.com/flannel-io/flannel/releases/download/v0.24.2/flanneld-amd64
sudo chmod +x /opt/cni/bin/flanneld

 

3) kubernetes Control-plane 초기화

(1) 커널 모듈 활성화 확인 (br_netfilter)

lsmod | grep br_netfilter

 

(2) kubeadm을 이용한 클러스터 생성 정보 다운로드

sudo kubeadm config images pull

 

(3) Master Node에서 kubernetes 클러스터 초기화

sudo kubeadm init --pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.75.10 \
--cri-socket=unix:///run/containerd/containerd.sock

 

(4) kubernetes 자격증명 설정

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

 

4) Master Node와 Worker Node 연결

(1) Flannel Pod 네트워크 플러그인 설정 적용

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
#기본 Pod 실행 확인
kubectl get pods --all-namespaces

(2) Worker Node를 Kubernetes 클러스터에 등록

#이전에 Master Node에서 확인된 kubeadm join 정보 입력 // worker1, worker2 공통
sudo kubeadm join 192.168.75.10:6443 --token vrk087.dphnlhd7xu0r68ot \
	--discovery-token-ca-cert-hash sha256:ab7e155692c7147bcb650180f6980a23eaef41dc8110550c54872a3eac751db2
#Worker Node 연결 확인
kubectl get nodes -o wide

정상적으로 Worker Node가 확인됨

 

6.설치 간 문제 해결

(1)sudo ufw allow "OpenSSH" 시 에러

 openssh가 미설치된 경우에 발생하므로, "sudo apt-get install openssh-server" 명령어를 통해 설치 후 재입력

 

7.참고 자료 및 링크