Kubernetes v1.30 in Ubuntu 22.04 LTS

반영환·2024년 9월 22일
0

k8s

목록 보기
14/14
post-thumbnail

Kubernetes v1.30 in Ubuntu 22.04 LTS

이전에 실습을 진행하던 환경은 kubernetes v1.23.x 버전이였다.
당시에도 depreciated였던 버전을 사용한 이유는, v1.24 이후부터 Docker를 기본 CRI에서 제거했기 때문이다.

Docker를 쓸 수 없다는 것이 아닌, Docker를 kubernetes의 Container Runtime Interface로 사용하기 위해서는, 수동 작업이 필요하다는 의미이다.

Why Ubuntu?

Kubernetes는 기본적으로 RHEL과 Debian Linux를 공식 배포 환경으로 채택하고 있다.

A compatible Linux host. The Kubernetes project provides generic instructions for Linux distributions based on Debian and Red Hat, and those distributions without a package manager.

기존에 사용한 환경인 CentOS 7는 RHEL에서 나온 OS인데, CentOS 7는 더이상 LTS를 지원해주지 않고, AWS에서 AMI market place에서도 라이센스 구독에 문제가 발생했었다.

RHEL를 사용하려 하였지만, Enterprice Linux이기 때문에 라이센스 등록 후 wget 등 외부 라이브러리 설치가 가능했기 때문에 결론적으로 Debian과 Ubuntu를 고민하게 됐다.

Ubuntu는 Debian에서 파생된 OS이면서, 꾸준한 업데이트를 지원해주고 있어 활발하게 사용되는 OS이다.

두 OS 모두 패키지 관리자로 apt를 사용하며, 여러 편의 기능을 공유하지만 Debian은 안정성을 가장 중요시 하는 OS이기에 우리가 주로 사용하는 패키지가 설치되지 않는 경우가 많다고 한다.

사용자가 많은 Ubuntu OS 기준 빌드된 .deb 파일들이 많이 있고 최신 패키지가 많이 제공된다는 점 ( 에러를 만날 확률도 그만큼 높아지지만 ) 에서 Ubuntu OS를 사용해 Kubernetes Cluster를 구성해보기로 하였다.
Ubuntu VS Debian

Install Kubernetes

Node Port 설정

Weave CNI 설정에 필요한 필수 포트

  • 6783 포트 : TCP / UDP
  • 6784 포트 : UDP

Calico CNI 설정에 필요한 필수 포트

  • 기본 설정인 IP-in-IP 모드에선 따로 개방할 포트가 존재하지 않음. VXLAN 혹은 BGP 를 사용할 경우 추가 설정이 필요함.
  • VXLAN : UDP 4789
  • BGP : TCP 179

마스터 노드에서 필요한 필수 포트

  • 6443 포트 : Kubernetes API Server / Used By All
  • 2379~2380 포트 : etcd server client API / Used By kube-apiserver, etcd
  • 10250 포트 : Kubelet API / Used By Self, Control plane
  • 10251 포트 : kube-scheduler / Used By Self
  • 10252 포트 : kube-controller-manager / Used By Self

워커 노드에서 필요한 필수 포트

  • 10250 포트 : Kubelet API / Used By Self, Control plane
  • 30000~32767 포트 : NodePort Services / Used By All

환경 설정

1. overlay 파일시스템 모듈과 br_netfilter 모듈 로드

  • overlay : 여러 개의 파일 시스템을 겹쳐서 하나처럼 보이게 하는 유닉스 파일 시스템의 유형중 하나이다. 효율적인 이미지 저장/관리빠른 컨테이너 시작을 위해 설정한다.
  • br_netfilter : 리눅스 브릿지와 네트워크 필터링 기능을 연결한다. 즉, 네트워크 트래픽 관리와 네트워크 보안을 강화하는데 사용된다는 것인데 결론적으로 많은 CNI 플러그인들이 br_netfilter 기능을 활용해 정책을 구성하기 때문에 CNI 플러그인과의 호환성 을 위해 설정한다.
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

2. IPv4 / IPv6를 포워딩하여 iptables가 브리디된 트래픽을 처리할 수 있도록 활성화

  • net.bridge.bridge-nf-call-iptables = 1 : 리눅스 브릿지가 iptables를 통한 IPv4 트래픽 처리를 할 수 있도록 활성화함으로써 쿠버네티스가 네트워크 정책을 통해 트래픽 제어파드간의 격리를 구현할 수 있게 해준다.
  • net.bridge.bridge-nf-call-ip6tables = 1 : 위와 동일하지만 IPv4가 아니라 IPv6 트래픽 처리를 가능하게 해주는 설정을 활성화한다. 쿠버네티스가 IPv6 또한 지원하기 때문에 꼭 설정해주어야 한다.
  • net.ipv4.ip_forward = 1 : 호스트에서 IPv4 패킷 포워딩을 활성화한다. 이 설정을 통해 쿠버네티스 노드 ( DP or CP ) 가 네트워크 라우터처럼 동작해 다른 노드나 파드로 트래픽을 전달할 수 있게 해준다.
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

# 재부팅하지 않고 sysctl 파라미터 적용하기  sudo sysctl --system

3. CRI Install ( containerd )

서론에서 말했듯이 Docker를 CRI로 사용하기 위해서는 설정이 필요하다. 그렇기에 아래 사이트에서 버전을 확인해 wget을 통해 deb파일을 설치받은 후 dpkg를 통해 설치하자.

Containerd.io version

Ubuntu22.04 LTS의 경우 Jammy 버전을 사용하면 된다.

# 파일을 원하는 경로 위에서 다운로드.
wget https://download.docker.com/linux/ubuntu/dists/jammy/pool/stable/amd64/containerd.io_1.6.11-1_amd64.deb

# containerd.io 설치
sudo dpkg -i ./containerd.io_1.6.11-1_amd64.deb

4. CRI 활성화를 위한 systemd cgroup driver env setting

systemd cgroup 드라이버를 runc에서 사용하려면, /etc/containerd/config.toml를 다음과 같이 설정해야 한다.

sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/ SystemdCgroup = false/ SystemdCgroup = true/' /etc/containerd/config.toml

cat /etc/containerd/config.toml | grep SystemdCgroup
# >>> SystemdCgroup = true

sudo systemctl restart containerd

5. CNI Plugin 설치 [ 환경 ]

CNI_PLUGINS_VERSION="v1.1.1"
ARCH="amd64"
DEST="/opt/cni/bin"
sudo mkdir -p "$DEST"
curl -L "https://github.com/containernetworking/plugins/releases/download/${CNI_PLUGINS_VERSION}/cni-plugins-linux-${ARCH}-${CNI_PLUGINS_VERSION}.tgz" | sudo tar -C "$DEST" -xz

Kubernetes 설치

1. kube*

  • kubeadm : 쿠버네티스 클러스터를 쉽게 bootstrap 하는데 사용되는 도구이며, 클러스터 초기화, 노드 추가, 클러스터 업데이트 등의 기능을 수행
  • kubelet : 각 노드에서 실행되는 에이전트로 컨테이너를 관리하는 핵심 구성 요소이다. 파드 관리, 자원 모니터링 및 관리, 상태 보고, 자동 복구의 기능을 해당 에이전트가 시행한다.
  • kubectl : 쿠버네티스 클러스터와 상호 작용하기 위한 command 도구이다. 리소스 관리, 클러스터 모니터링, 디버깅 및 로그 관리, 자동화 스크립트 등에 사용된다.

google에서 제공하는 https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 는 depreciate 돼 삭제됐다. 종종 다른 블로그에서 쓰여있는데 주의하자.

# 1. 필수 패키지 설치
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl

# 2. Kubernetes GPG 키를 추가
sudo curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /usr/share/keyrings/kubernetes-archive-keyring.gpg

# 3. Kubernetes 저장소 추가
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

# 4. 패키지 목록 업데이트
sudo apt-get update

# 5. Kubernetes 패키지 설치
sudo apt-get install -y kubelet kubeadm kubectl

# 6. swap 옵션 비활성화 ( kubelet이 작동하기 위함 )
swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab

2. ControlPlane

Cluster를 총괄 관리할 Control Plane의 역할을 수행할 Node 위에서 아래 명령어를 시행한다.

# Kubernetes 환경 초기화
kubeadm init

# kubectl 명령어를 사용할 수 있도록 설정
# 아래 명령을 시행하지 않을 시 connection refuse 발생
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# node 상태 확인
kubectl get nodes

이 상황에서는 control-plane 의 status가 notReady이다. 이는 Kubernetes의 CNI 설정을 따로 해주지 않아서 그런 것이므로 CNI 설정을 해주자.

본 실습에서는 Weave 를 사용했다.

  • Calio
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
  • Weave
kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml

왜 Control Plane 에서만 CNI 설정을 하나요?
이후 결과값을 보면 daemonset 이라는 부분이 있는데 daemonset은 클러스터의 모든 노드에 같은 사항을 관리하는 데몬이므로 C/P에서만 설정해주어도 모든 노드에 설치되게 된다.

3. DataPlane

Pod가 배포 될 DataPlane에서 Kubeadm을 사용해 ControlPlane과 통신을 연결해야 한다.

kubeadm init 에서 리턴된 토큰을 사용해서 join하면된다.

kubeadm join 192.168.1.127:6443 --token [token] --discovery-token-ca-cert-hash sha256:[hash]

만일 토큰을 잃어버렸을 경우 아래 사이트를 참조하자.

Rejoin K8S Cluster

클러스터 확인

k short cut

# nano 설치
sudo apt update && apt install nano


# alias 추가
nano ~/.bashrc
alias k="kubectl"
# 변경사항 저장 - (Ctrl + X, Y, Enter)

# 변경사항 적용
source ~/.bashrc

In Control Plane

root@ip-192-168-1-127:~# kubectl get nodes
NAME               STATUS   ROLES           AGE    VERSION
ip-192-168-1-124   Ready    <none>          2m3s   v1.28.2
ip-192-168-1-127   Ready    control-plane   74m    v1.30.5

Test Deployment

kubectl create deploy sample-dp --image=nginx --replicas=1

root@ip-192-168-1-127:~# kubectl get po -o wide
NAME                        READY   STATUS    RESTARTS   AGE     IP          NODE               NOMINATED NODE   READINESS GATES
sample-dp-5f4f8bbff-xcnnf   1/1     Running   0          2m23s   10.44.0.1   ip-192-168-1-124   <none>           <none>

Data plane 위에 잘 배포된 것을 확인할 수 있다.

profile
최고의 오늘을 꿈꾸는 개발자

0개의 댓글