설치 환경 및 버전
- Rocky Linux 9.4, 9.2, 8.8
- kubernetes v1.30
- containerd 1.7.23
- runc 1.2.0
- CNI-Plugins v1.6.0
들어가기에 앞서
Containerd가 아닌 cri-o 런타임을 설치과정은 아래 포스팅을 참고하기 바랍니다.
k8s v1.31이 현재 기준 최신 버전이지만 v1.29에서 v1.30으로 업데이트하다가 cluster를 날려먹어서 v1.30부터 재설치를 진행하였습니다. (벌써 v1.32 aplha 버전이 보이기 시작)
아래 모든 과정은 root 계정으로 진행했습니다.
설치 과정
1. SELINUX 해제
- selinux 해제
setenforce 0
- /etc/sysconfig/selinux에서 SELINUX=disabled 설정 (/etc/selinux/config에서 변경해도 된다.)
- getenforce를 통해 Permissive 문구가 나오는지 확인한다.
getenforce
2. 방화벽 해제 (선택)
# 방화벽 해제
systemctl stop firewalld
# 방화벽 비활성화
systemctl disable firewalld
방화벽은 비활성화하는 게 정신건강에 이롭다.
하지만 보안에 신경을 써야 하는 환경이라면 kubernetes에서 기본으로 사용하는
6443, 10250 같은 Port들을 수동으로 열어줘야 한다.
3. SWAP 해제
- swap 해제
swapoff -a
- /etc/fstab에서 swap 부분 라인을 삭제 또는 주석처리한다.
- swap 해제를 하지 않으면 kubelet이 정확한 리소스 사용량 산출을 못하기 때문에 반드시 해제해야 한다.
필자는 개인적으로 설치 파일들이 널브러져 있는 것을 좋아하지 않는다.
따라서 각각의 프로그램 설치 시 폴더를 만들어서 정리를 하였는데 이런 부분들은 알아서 필터링해서 봐야 한다.
4. containerd 설치
# containerd 설치 폴더 생성
cd ~
mkdir containerd
cd containerd
# containerd 다운로드
wget https://github.com/containerd/containerd/releases/download/v1.7.23/containerd-1.7.23-linux-amd64.tar.gz
# tar 해제
tar Cxzvf /usr/local containerd-1.7.23-linux-amd64.tar.gz
# containerd service 파일 다운로드
wget https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
# service 등록
cp containerd.service /etc/systemd/system/containerd.service
https://github.com/containerd/containerd/releases
위의 containerd github을 보면 현재(2024-11-01) 기준으로 v2.0.0-rc.6이 가장 최신 Pre-release로 올라와 있는 것을 확인하였다.
containerd의 메이저버전이 올라간 v2.0.0을 보고 군침을 삼키면서 호기롭게 설치를 도전하였는데 기존 containerd의 설정이 많이 변경되어서 애를 먹었다.
하지만 여러 삽질 끝에 v2.0.0을 기반으로 하는 k8s를 설치하였으나, 알 수 없는 이유로 k8s의 kube-apiserver가 오락가락하는 이슈가 발생하여 아쉽게 서버를 밀고 v1.7.23으로 다시 설치하였다.
하지만 v2.0.0이 벌써 6번째 pre-release가 나온 걸 보면 빠른 시일 내에 v2.0.0 containerd를 볼 수 있을 것으로 기대된다.
containerd v2.0.0이 정식 출시된다면 다시 재도전해서 포스팅을 써 볼 예정이다.
5. runc 설치
# runc 설치 폴더 생성
cd ~
mkdir runc
cd runc
# runc 다운로드
wget https://github.com/opencontainers/runc/releases/download/v1.2.0/runc.amd64
# runc 설치
install -m 755 runc.amd64 /usr/local/sbin/runc
https://github.com/opencontainers/runc/releases
현재 기준 runc v1.2.0이 최신버전이다.
운이 좋게도 runc v1.2.0은 현재 시점기준 고작 일주일 전에 release가 된 최신 버전이다.
containerd처럼 최신 버전에 군침을 흘리면서 도전하였고, 정말 다행스럽게도 아직까지 runc는 아무런 문제 없이 정상동작하고 있는 중이다.
6. CNI Plugins 설치
# CNI 설치 폴더 생성
cd ~
mkdir cni
cd cni
# CNI 다운로드
wget https://github.com/containernetworking/plugins/releases/download/v1.6.0/cni-plugins-linux-amd64-v1.6.0.tgz
# CNI 설치
mkdir -p /opt/cni/bin
tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.6.0.tgz
https://github.com/containernetworking/plugins/releases
현재 기준 CNI plugins v1.6.0이 최신버전이다.
CNI 또한 현재 시점 기준으로 이 주일 전에 release가 된 최신 버전이다.
CNI도 runc처럼 현재까지 아무런 이상 없이 정상적으로 동작하고 있는 중이다.
7. containerd 설정 및 실행
- containerd 기본 설정 파일 생성
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
- systemd cgroup 드라이버 환경 설정 (/etc/containerd/config.toml 설정)
- [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] 의 SystemdCgroup = true 설정
- private registry가 있는 경우 containerd에 해당 registry를 등록 (/etc/containerd/config.toml 설정)
- [plugins."io.containerd.grpc.v1.cri".registry.mirrors] 아래에 private registry 등록
(아래 예시는 private registry의 주소가 10.10.0.20:5000 일 경우에 대한 예시)
- [plugins."io.containerd.grpc.v1.cri".registry.mirrors] 아래에 private registry 등록
- containerd 서비스 실행
# containerd 서비스 실행
systemctl daemon-reload
systemctl enable --now containerd
8. IPv4를 포워딩하여 iptables가 브리지 된 트래픽을 보게 하기
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 재부팅 후 유지하도록 설정
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
# sysctl을 사용하여 변경된 파라미터 적용
sudo sysctl --system
9. Kubernetes 설치
- kubernetes repo 등록 (최신버전은 아래 github 참고)
https://github.com/kubernetes/kubernetes/releases
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
9-1. Kubernetes Control-Plane (Master) Node 설치
이 부분은 Kubernetes Control-Plane (Master) Node에서만 진행합니다.
Worker Node의 설치 시 이 과정을 건너뛰시면 됩니다.
- kubernetes 다운로드
dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
- kubelet 실행
systemctl enable --now kubelet
- control-plane (Master) Node 설치
kubeadm init
kubeadm init이 성공적으로 완료됐다면 kubeadm join ~~~~ 명령어가 나오는데 이를 잘 복사해 두면 편안하다.
join 명령어는 기본으로 유효시간이 24시간이고, 그 이후에는 만료되어 사용할 수 없게 된다.
명령어를 잊어버렸거나, 시간이 지나서 join을 추가로 하는 경우 아래의 명령어를 control-plane(master) node에서 입력하면 새로운 join 명령어를 생성하고 출력해 준다.
kubeadm token create --print-join-command
- kubectl을 위한 kube config 파일 복사
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- Kubernetes Network CNI 배포 (calico)
kubectl apply -f https://docs.tigera.io/calico/latest/manifests/calico.yaml
9-2. Kubernetes Worker Node 설치
이 부분은 Kubernetes Worker Node에서만 진행합니다.
위 9-1의 Control-Plane(Master) Node 설치 이후 kubeadm join 명령어를 반드시 복사해야 합니다.
만약 잃어버리거나 만료된 경우 Control-Plane(Master) Node에서
kubeadm token create --print-join-command
명령어를 입력하여 새로운 token을 발행해야 합니다.
- kubernetes 다운로드
# kubectl은 선택 사항이다.
dnf install -y kubelet kubeadm --disableexcludes=kubernetes
- kubernetes control-plane(Master) Node에 Join
kubeadm join [Your IP]:6443 --token [Your Token Value] \
--discovery-token-ca-cert-hash sha256:[Your HASH CODE]
10. Kubernetes 설치 확인
- Node가 정상적으로 동작하고 있는지 확인한다.
kubectl get nodes
추가
만약 K8S Cluster를 조금 더 편리하게 GUI로 제어하고 싶다면 OpenLes 사용을 추천한다. (무료)
OpenLens의 설치 방법은 아래 포스팅을 참고하면 된다.
참고 사이트
- https://kubernetes.io/ko/docs/setup/production-environment/container-runtimes
- https://github.com/containerd/containerd/blob/main/docs/getting-started.md
- https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
- https://github.com/containerd/containerd/blob/main/docs/man/containerd-config.toml.5.md
- https://github.com/opencontainers/runc/releases
- https://github.com/containernetworking/plugins/releases
반응형
'Kubernetes > 실습' 카테고리의 다른 글
[Kubernetes] Worker (slave) node upgrade (0) | 2024.03.22 |
---|---|
[Kubernetes] Control plane (master) node upgrade (0) | 2024.03.14 |
[kubernetes] control-plane(master) node 설치 과정(cri-o) (0) | 2024.03.13 |
[Kubernetes] kubespray 를 사용한 k8s 설치 (2) | 2023.05.15 |