티스토리 뷰
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
'쿠버네티스' 카테고리의 다른 글
CKA 기출개념 정리 rollout (0) | 2024.12.31 |
---|---|
CKA 기출개념 정리 쿠버네티스 업그레이드 (0) | 2024.12.31 |
CKA 기출개념 정리 워커노드 Not ready (0) | 2024.12.31 |
[쿠버네티스] Kubectl JSON 필터링 (0) | 2024.12.20 |
[쿠버네티스] 11. Trouble Shooting (0) | 2024.12.18 |