Post

kubernetes v1.28 설치 메뉴얼(2024년11월 기준)

kubernetes v1.28 설치 메뉴얼(2024년11월 기준)

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 apply

설정이 안되는경우 아래의 명령어를 통해 인터페이스 명칭과 오타를 확인

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 파라미터 적용하기

1
sudo sysctl --system

쿠버네티스 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

This post is licensed under CC BY 4.0 by the author.