티스토리 뷰

1. 문제시나리오

- kubeadm을 활용하여 kubernetes 클러스터를 설치 

1) 환경 요구 사항 

- 컨트롤플래인 노드1개와 워크 노드 2개를 사용

- OS Image: Ubuntu 20.04

- 컨트롤 플레인 노드의 IP: 192.168.010

- 워커 노드의 IP: 192.168.0.11, 192.168.0.12 

- Pod 네트워크는 192.168.0.0/16 CIDR 범위 사용 

- 컨테이너 런타임으로 containerd를 사용 

- 쿠버네티스 버전은 1.30.0

- 모든 노드에서 kubeadm, kubelet, kubectl을 설치

- CNI: Calico 네트워크 플러그인을 사용

2. 문제 해결과정

1) 컨테이너 런타임 설치

- 모든 노드에서 containerd를 설치하고 구성

(1) 패키지 업데이트 후 containerd 설치 및 활성화 

sudo apt update
sudo apt install -y containerd
sudo systemctl enable containerd
sudo systemctl start containerd

(2) 기존 설정 파일 생성 

- containerd는 /etc/containerd/config.toml 파일을 통해 설정을 관리. 

- 해당 설정 파일은 기본적으로 존재하지 않으므로, 새로 생성해야 함

sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml

(3) cgroup 드라이버를 systemd로 변경 

- 쿠버네티스는 노드의 리소스 관리 방식으로 systemd로 사용해야 함 

- cgroup: 리눅스 커널의 기능으로 시스템 리소스 사용량을 제한, 격리 추적하는 설계된 기술. kubelet과 컨테이너  런타임이 Cgroup 드라이버(cgroupfs,systemd)를 통해 시스템 자원을 관리.

- cgroupfs: cgroup을 제어하기 위해 커널에서 제공하는 가상 파일 시스템(/sys/fs/cgroup)을 직접 사용하는 방식

- systemd: 리눅스의 init 시스템인 systemd가 cgroup을 관리하는 방식

- 대부분 리눅스는 init 시스템으로 systemd를 사용. 따라서 cgroupfs와 혼용하는 경우 리소스 충돌이 발생할 수도 있어서 init 프로세스를 확인 뒤, cgroup을 systemd로 변경해야 한다. 

sudo vi /etc/containerd/config.toml

# 생성된 /etc/containerd/config.toml파일에서 SystemdCgroup= false 값을 찾아 true로 변경
 
 [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
  SystemdCgroup = false

#수정 후 

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
  SystemdCgroup = true
  
# 재시작
sudo systemctl restart containerd

(4) 쿠버네티스와 통합 확인

- containerd를 올바르게 인식하도록 하기 위해, 아래 명령어로 kubelet이 사용하는 컨테이너 런타임 소켓 경로(/run/containerd/containerd.sock)가 존재하는지 확인  

ls -l /run/containerd/containerd.sock

srw-rw---- 1 root root 0 Dec 31 12:10 /run/containerd/containerd.sock

2) 쿠버네티스 도구 설치

https://v1-30.docs.kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

(1) 쿠버네티스 패키지 저장소 추가 

- 쿠버네티스 관련 패키지는 기본적으로 ubuntu의 표준저장서에 포함되어 있지 않으므로 공식 저장소를 추가 

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

# 2. GPG 키 다운로드 및 저장
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# 3. Kubernetes 저장소 추가
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

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

(2) kubernetes 도구 설치 

# kubeadm, kubelet, kubectl 설치 (특정 버전)
sudo apt install -y kubelet=1.30.0-1.1 kubectl=1.30.0-1.1 kubeadm=1.30.0-1.1

# 패키지 버전 고정 (업데이트 방지)
sudo apt-mark hold kubelet kubeadm kubectl

(3) kubelet 서비스  활성화

sudo systemctl enable kubelet
sudo systemctl start kubelet

(4) 설치 결과 확인 

# kubeadm 버전 확인
kubeadm version

# kubectl 버전 확인 (클라이언트)
kubectl version --client

# kubelet 버전 확인
kubelet --version

kubeadm version: &version.Info{Major:"1", Minor:"30", GitVersion:"v1.30.0", ...}
Client Version: version.Info{Major:"1", Minor:"30", GitVersion:"v1.30.0", ...}
Kubernetes v1.30.0

3) 컨트롤 플레인 초기화

# 클러스터 초기화 (Pod 네트워크 CIDR 설정)
sudo kubeadm init --pod-network-cidr=192.168.0.0/16 --kubernetes-version=1.30.0

Your Kubernetes control-plane has initialized successfully!
...

## 해당 명령어그대로 사용 
To start using your cluster, you need to run the following as a regular user:
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config


##해당 부분 따로 복사 
You can now join any number of worker nodes by running the following on each as root:
  kubeadm join 192.168.0.10:6443 --token <token> --discovery-token-ca-cert-hash <hash>

4) 후속 작업

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

- 설치된 설정을 기본 kubeconfig로 사용하도록 복사하고 소유자 설정을 한다.

5) 네트워크 플러그인 설치 

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

- 결과 확인 

kubectl get pods -n kube-system

NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-847c8c99d7-xj2z7   1/1     Running   0          2m20s
calico-node-p8q9l                          1/1     Running   0          2m20s
...

6) 워커노드 추가 

- 각 워커노드에서 컨트롤 플레인 초기화 시 출력된 kubeadm join 명령어를 사용해 클러스터에 추가

##ssh로 각 노드에 먼저 들어가야한다. 

sudo kubeadm join 192.168.0.10:6443 --token <token> --discovery-token-ca-cert-hash <hash>

This node has joined the cluster:
* Certificate signing request was sent to the control-plane.
* The Kubelet was informed of the new secure connection details.
...

7) 결과 확인 

kubectl get nodes

NAME           STATUS   ROLES           AGE     VERSION
master-node    Ready    control-plane   10m     v1.30.0
worker-node1   Ready    <none>          5m      v1.30.0
worker-node2   Ready    <none>          5m      v1.30.0
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함