kubernetes v1.28 설치 메뉴얼
네트워크 세팅
VirtualBox에 우분투 설치(v24.04.1)
가상 환경에 우분투 설치는 웹상에 다른 많은 안내들이 있으니 그것을 참고
여기에서는 VirtualBox에 24.04.1 버전을 기반으로 설치하고 진행 하였다.
우분투 설치 후 ip 확인을 위해 net-tools 설치
1
| sudo apt-get install net-tools
|
고정 아이피 세팅
1
2
| sudo nano /etc/netplan/XX-cloud-init.yaml
# XX 는 숫자. 환경마다 다를 수 있다.
|
[XX-cloud-init.yaml 파일내용]
1
2
3
4
5
6
7
8
9
10
| network:
ethernets:
enp0s3:
addresses: [10.0.2.20/24] ## 원하는 IP로 설정
routes:
- to: default
via: 10.0.2.1 ## 게이트웨이 IP 설정
nameservers:
addresses: [8.8.8.8] ## 네임서버 IP 설정(여기에서는 구글네임서버)
version: 2
|
아래 명령을 사용하여 설정을 적용한다
설정이 안되는경우 아래의 명령어를 통해 인터페이스 명칭과 오타를 확인
1
| sudo netplan --debug apply
|
ssh 서버 상태 확인 및 활성화 방법
ssh 서버 상태확인
1
| systemctl status ssh --no-pager
|
Active(상태)가 inactive라면 아래 명령어로 활성화 시켜준다
1
| sudo systemctl start ssh
|
시스템이 재시작해도 자동 실행되도록 설정
1
| sudo systemctl enable ssh
|
VirtualBox에서 NAT설정
만약 putty등의 터미널로 ssh 접속시 가상환경과의 통신을 위해 VirtualBox에서 네트워크 설정을 해줘야 한다
[NAT 네트워크 설정]
가상머신 메뉴 > 설정 > 네트워크 > 어댑터 1 > 다음에 연결됨 > ‘NAT 네트워크’ 로 변경
[포트포워딩 설정]
도구 > 네트워크 > 오른쪽 탭에서 NAT 네트워크 > 아래 포트 포워딩 > IPv4(4) > ‘포트 포워딩’ 설정 추가
도커 설치 - installing docker
설치를 위해 필요한 패키지들 설치
1
2
| sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
|
도커 공식 GPG키 추가 및 리포지토리 설정
gpg 키 생성
1
2
3
4
| #'ch /etc/apt/keyrings' 해당 디렉토리가 없을 경우 생성 필요(대부분 있음)
#sudo mkdir -p -m 755 /etc/apt/keyrings
sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
도커 저장소 추가 및 업데이트
1
2
| echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt-get update
|
도커 패키지들 설치
1
| sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
도커 서비스 상태 확인
1
| systemctl status docker --no-pager
|
도커 컨테이너 런타임 서비스 containerd 상태 확인
1
| systemctl status containerd --no-pager
|
쿠버네티스 설치
쿠버네티스를 위한 도커 데몬 설정
도커 cgroup 설정을 systemd로 변경한다.
1
2
3
4
5
6
7
8
9
10
11
| sudo mkdir /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
>{
> "exec-opts": ["native.cgroupdriver=systemd"],
> "log-driver": "json-file",
> "log-opts": {
> "max-size": "100m"
> },
> "storage-driver": "overlay2"
>}
>EOF
|
컨테이너 런타임(containerd) 환경 설정
1
2
3
4
5
6
7
8
9
10
| #containerd에서 사용할 기본 설정값 생성
sudo sh -c "containerd config default > /etc/containerd/config.toml"
#disabled_plugins = [] 확인, 값이 없어야 함
#systemd cgroup 드라이버를 runc 에서 사용하려면, 다음과 같이 설정
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
|
도커 재시작 및 변동된 설정값 확인(cgroupdriver)
1
2
| sudo systemctl restart docker && sudo systemctl restart containerd
sudo docker info | grep Cgroup
|
쿠버네티스를 위한 커널 및 네트워크 환경 설정
Kernel Forwarding
1
2
3
4
| cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
|
커널모듈 활성화
1
2
| sudo modprobe overlay
sudo modprobe br_netfilter
|
도커관련 브릿지 방화벽 설정
1
2
3
4
5
| 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 파라미터를 설정하면, 재부팅 후에도 값이 유지된다.
재부팅하지 않고 sysctl 파라미터 적용하기
쿠버네티스 v1.28 설치를 위해 gpg키 및 저장소 설정
최근에 쿠버네티스 리포지토리 저장소가 변경되어서 최신 저장소로 맞춰 주어야 한다.
제대로 저장소 세팅이 되어있지 않으면 쿠버네티스가 다운로드 가능한 패키지 목록에 뜨지 않는다.
1
2
3
4
| 키 정보 다운로드
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
저장소 레포지토리 설정
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
|
패키지 업데이트 및 다운로드 가능한 쿠버네티스 버전 확인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| # 패키지 저장소 업데이트 확인. 저장소 설정이 제대로 되어있지 않다면 여기에서 오류가 발생한다. 오류가 없도록 저장소 위치를 맞춰줄것.
sudo apt-get update
# 설치 가능한 쿠버네티스 버전 확인. 여기에서는 v1.28
sudo apt-cache madison kubeadm
# kubeadm, kubelet, kubectl 설치. 버전을 명시해 주지 않으면 최신버전을 설치
sudo apt-get install -y kubelet=1.28.15-1.1 kubeadm=1.28.15-1.1 kubectl=1.28.15-1.1
OR
sudo apt-get install -y kubelet kubeadm kubectl
# kubeadm, kubelet, kubectl 버전 고정
sudo apt-mark hold kubelet kubeadm kubectl
# kubeadm, kubelet, kubectl 버전 확인
kubeadm version
kubelet --version
kubectl version --output=yaml
|
쿠버네티스 클러스터 설정
클러스터 인증서들 확인
1
2
3
4
| kubeadm certs check-expiration
!MISSING! admin.conf
......
인증서가 없음을 확인. kubeadm init 하면 만들어진다.
|
kubeadm이 사용가능한 이미지 리스트들 출력
1
| kubeadm config images list
|
루트 권한으로 들어가 쿠버네티스 설치에 필요한 이미지들을 다운로드
1
2
| $sudo -i
root@xxx:~# kubeadm config images pull
|
가상환경 복제 전 호스트 이름 설정 & DNS 설정
호스트 이름 설정
1
2
3
| sudo hostnamectl set-hostname myserver01
cat /etc/hostname
myserver01
|
DNS 설정 - Master Node, Worker Node1, Worker Node2 상호 통신이 가능하도록 미리 ip와 hostname을 설정한다
1
2
3
4
5
6
7
| sudo nano /etc/hosts
127.0.0.1 localhost
127.0.0.1 myserver01
10.0.2.20 myserver01
10.0.2.21 myserver02
10.0.2.22 myserver03
|
UFW방화벽 설정 확인 - inactive 상태를 확인한다. active 상태라면 이를 변경해 줘야한다.
1
2
| sudo ufw status
Status: inactive
|
swap메모리 비활성화
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| free -h
......
Swap: 0Gi 0B 0Gi
#위와 같이 나온다면 swap메모리 비활성화 상태, 만일 값이 있다면 아래 명령으로 비활성화 해준다
sudo -i
swapoff --all
#비활성화 확인
free -h
Swap: 0Gi 0B 0Gi
#재부팅 시 설정을 유지하기 위해 아래 파일의 관련 설정 주석 처리
sudo nano /etc/fstab
#/swap.img none swap sw 0 0
#재부팅
sudo reboot now
|
여기까지 진행 하였다면 쿠버네티스 클러스터 구성 준비가 완료
이제 이 환경을 복제하여 마스터 노드와 워커 노드들을 만들어 쿠버네티스 클러스터를 구성
쿠버네티스 가상환경을 복제하여 Master Node, Worker Node1, Worker Node2 로 만들어준다.
복제된 3대의 가상환경이 만들어졌다면 다음으로 넘어간다.
[Master node] 설정
CNI를 calico를 사용할 것이므로 pod-network-cidr을 192.168.0.0/16 으로 설정하고 초기화한다. 루트로 들어가서 init명령어를 통해 마스터 노드 초기화
1
2
3
4
5
6
7
8
9
10
11
| kubeadm certs check-expiration
sudo -i
kubeadm init --apiserver-advertise-address=10.0.2.20 --pod-network-cidr=192.168.0.0/16
#성공적으로 마스터 노드가 올라오면 아래와 같이 출력되는 Worker Node에서 Master Node로 조인할 수 있는 구문을 복사하여 저장한다.
kubeadm join 10.0.2.20:6443 --token yvcpua.wj94q3pao2sh1a2e \
--discovery-token-ca-cert-hash sha256:6e63cac42c4d95c6dcf46321ad6910117586e57ffbf3d04881d40155b73128ed
#마스터 노드 인증서들 확인
kubeadm certs check-expiration
exit
|
사용자 권한으로도 쿠버네티스를 사용할 수 있도록 설정
1
2
3
4
5
6
7
8
| # kubeconfig 설정
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
#설정된 권한을 적용하기 위해 재접속 한다
exit
|
마스터 노드 서비스 kubelet 동작 확인
1
2
3
| systemctl status kubelet --no-pager
#Active: active(running) 상태를 확인한다
|
마스터 노드 구성 서비스들 동작 확인
1
2
3
4
5
6
7
8
9
10
11
12
| test@myserver01:~$ kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-5dd5756b68-j79nn 0/1 Pending 0 15m
kube-system coredns-5dd5756b68-tg4hx 0/1 Pending 0 15m
kube-system etcd-myserver01 1/1 Running 0 16m
kube-system kube-apiserver-myserver01 1/1 Running 0 16m
kube-system kube-controller-manager-myserver01 1/1 Running 0 16m
kube-system kube-proxy-s5fmj 1/1 Running 0 15m
kube-system kube-scheduler-myserver01 1/1 Running 0 16m
#위와 같이 보여지면 정상이다
#coredns- 들의 STATUS가 Pending 상태인 것은 차후 CNI calico가 설치되면 Running상태로 변경된다.
|
만일 설정이 잘못되거나 설치가 정상적이지 않다면 다음 명령어로 마스터 노드 init 상태를 리셋한다
1
2
3
| #마스터 노드 리셋(문제가 있을 경우 사용)
kubeadm reset
#다시 마스터 노드를 올리려면 kubeadm init ... 명령어를 다시 사용하여 실행
|
Master Node에 CNI설치
CNI는 권장하는 calico를 설치하도록 한다.
1
2
3
4
| #calico설정 다운로드
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml
#설정값 적용하여 calico관련 모듈 올림
kubectl apply -f calico.yaml
|
마스터 노드 준비 확인
1
2
3
4
5
6
7
8
9
10
11
| test@myserver01:~$ kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-658d97c59c-vq2lg 1/1 Running 0 75s
kube-system calico-node-nb6pv 1/1 Running 0 75s
kube-system coredns-5dd5756b68-j79nn 1/1 Running 0 24m
kube-system coredns-5dd5756b68-tg4hx 1/1 Running 0 24m
kube-system etcd-myserver01 1/1 Running 0 25m
kube-system kube-apiserver-myserver01 1/1 Running 0 25m
kube-system kube-controller-manager-myserver01 1/1 Running 0 25m
kube-system kube-proxy-s5fmj 1/1 Running 0 24m
kube-system kube-scheduler-myserver01 1/1 Running 0 25m
|
쿠버네티스 클러스터 노드 확인(아직은 Master Node만 확인가능)
1
2
3
| test@myserver01:~$ kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
myserver01 Ready control-plane 33m v1.28.15 10.0.2.20 <none> Ubuntu 24.04.1 LTS 6.8.0-49-generic containerd://1.7.23
|
이제 Master Node가 Worker Node들을 받아들일 준비 완료가 됨
다음으로 Worker Node1(myserver02), Worker Node2(myserver03)을 설정
[Worker node1, Worker node2] 설정
네트워크 설정
1
2
3
4
5
6
7
| #가장 먼저 호스트 이름 변경(DNS 설정 hostname과 같아야 한다)
sudo hostnamectl set-hostname myserver02
cat /etc/hostname
myserver02
#아래 명령어를 통해 myserver02, myserver03새로운 아이피 세팅(DNS 설정 ip값과 같아야 한다)
sudo nano /etc/netplan/XX-cloud-init.yaml
|
마스터로부터 kubeconfig 설정을 복사해 가져옴
1
2
3
| mkdir -p $HOME/.kube
scp -p test@10.0.2.20:~/.kube/config ~/.kube/config
#원격지 마스터 password입력하고 파일을 복사해옴
|
루트로 들어가 마스터 가동시 출력된 join 구문을 가져와 Master Node에 join한다
1
2
3
| sudo -i
kubeadm join 10.0.2.20:6443 --token yvcpua.wj94q3pao2sh1a2e \
--discovery-token-ca-cert-hash sha256:6e63cac42c4d95c6dcf46321ad6910117586e57ffbf3d04881d40155b73128ed
|
Worker Node의 Master Node 연결 확인
마스터 노드로 가서 다음 명령을 통해 확인한다
1
2
3
4
| test@myserver01:~$ kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
myserver01 Ready control-plane 44m v1.28.15 10.0.2.20 <none> Ubuntu 24.04.1 LTS 6.8.0-49-generic containerd://1.7.23
myserver02 NotReady <none> 17s v1.28.15 10.0.2.21 <none> Ubuntu 24.04.1 LTS 6.8.0-49-generic containerd://1.7.23
|
약간의 시간이 지난 후 myserver02의 상태가 Ready로 바뀌게 된다
이후 다른 Worker Node도 같은 구문으로 join 하면 쿠버네티스 클러스터 구성이 완료된다.
References
https://white-polarbear.tistory.com/161
https://inblog.ai/jongcloud/%EC%9A%B0%EB%B6%84%ED%88%AC-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-%EC%B4%9D%EC%A0%95%EB%A6%AC-24%EB%85%84-8%EC%9B%94-26946
https://jongsky.tistory.com/112