최근 온프레미스에서 퍼블릭 클라우드로 환경이 전환되면서 AWS, 애저, GCP, NCP 등 클라우드 컴퓨팅 플랫폼 서비스에 대한 수요가 점차 늘어나고 있는 것으로 보인다. 그리고 도커와 쿠버네티스를 활용하는 것이 이제는 필수 기술이라고 생각하고 개인적으로 더 알고 싶고 관심이 생겨 이렇게 스터디 일기를 쓰게 되었습니다.
그러면 환경을 구성하기 전에 온프레미스 환경에서 클러스터를 구성했다고 말하고 싶습니다.
0. 구성 상태
0-1 환경 구성
마스터 노드 | 작업자 노드 | CRF | 컨테이너 런타임 |
1EA | 3EA | 옥양목 (vxlan) | 컨테이너 |
0-2 클러스터 구성
마디 | 호스트 이름 | 운영 체제 | 쿠버네티스 버전 | CPU | 밈 | 디스크 |
마스터 노드 | m-k8s | 우분투 20.04.5 LTS | v1.26.2 | 2 | 4 | 100 그램 |
작업 node01 | w1-k8s | 우분투 20.04.5 LTS | v1.26.2 | 2 | 4 | 100 그램 |
작업 node02 | w2-k8s | 우분투 20.04.5 LTS | v1.26.2 | 2 | 4 | 100 그램 |
작업 Node03 | w3-k8s | 우분투 20.04.5 LTS | v1.26.2 | 2 | 4 | 100 그램 |
현재 저는 하나의 마스터 노드와 세 개의 작업자 노드를 가지고 있으며 Kubernetes가 최근 DockerSim을 통한 Docker 지원을 중단했기 때문에
컨테이너 런타임이 containerd로 이동되었습니다. CNI의 경우 Calico, Flannel, Weave Net, Cilium 등이 있는데 저는 Calico로 구성했습니다.
1. 설치과정(일반)
마스터 노드와 작업자 노드가 모두 진행 중입니다.
1-1 환경 설정
ifconfig, netstat, route와 같은 명령을 나중에 실행하려면 net-tools를 설치하십시오.
apt-get install -y net-tools
Kubernetes는 공식적으로 스왑 사용을 비활성화할 것을 권장합니다. 교환을 비활성화할 수도 있습니다.
sudo swapoff /swap.img
sudo sed -i -e '/swap.img/d' /etc/fstab
그리고 containerd 설치를 계속하겠습니다. 이 부분에 대한 공식 문서를 참조할 수 있습니다.
참조 : https://kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd
1-2 컨테이너 설치
$ cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
$ sudo modprobe overlay
$ sudo modprobe br_netfilter
이 명령어는 쿠버네티스 클러스터 구성에 필요한 커널 모듈을 로딩하기 위한 설정 파일인 /etc/modules-load.d/k8s.conf를 생성하고 여기에 오버레이와 br_netfilter 모듈을 추가 적용한다.
- 오버레이: Kubernetes에서 오버레이 네트워크를 사용하기 위한 모듈입니다. 오버레이 네트워크는 물리적 네트워크를 사용하여 Pod 간의 통신을 가능하게 하는 가상 네트워크를 구성하는 방법입니다.
- br_netfilter: Kubernetes 클러스터 내에서 iptables를 사용하기 위한 모듈입니다. 이 모듈이 로드되지 않으면 iptables를 사용하는 네트워크 정책이나 서비스가 작동하지 않습니다.
재부팅 후에도 지속되도록 sysctl의 설정을 정의합니다.
$ cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.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
그런 다음 패키지 목록을 업데이트하고 향후 사용에 필요한 다양한 기타 패키지를 설치합니다.
$ sudo apt-get update
$ sudo apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
자세한 설명은 아래를 참조하세요.
- apt-transport-https: HTTPS 프로토콜을 사용하여 APT 리포지토리를 다운로드하고 업데이트하는 데 필요합니다.
- ca-certificates: SSL/TLS 인증서를 인증하는 데 필요한 인증서를 제공합니다.
- curl: URL을 통해 데이터를 보내고 받는 명령입니다.
- gnupg: Gnu Privacy Guard(GPG)로 암호화, 서명 및 인증을 수행하는 데 사용됩니다.
- lsb-release: Linux 배포판의 버전 및 릴리스 정보를 확인하는 데 사용됩니다. 이 명령은 HTTPS를 사용하여 패키지를 다운로드하므로 보안상의 이유로 APT를 사용하는 데 필요한 패키지를 설치하기 전에 HTTPS를 지원하는 인증서를 설치하는 것이 중요합니다.
그런 다음 시스템에 gpg 키를 추가합니다.
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo "deb (arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg) https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
저장소가 변경되었으므로 업데이트 및 containerd 설치를 진행합니다.
$ sudo apt-get update
$ sudo apt-get install containerd.io
1-3 containerd 설정 및 kubeadm, kubelet 및 kubectl 설치
containerd를 실행하기 전에 기본 구성 파일을 정의해야 합니다.
먼저 containerd 데몬이 실행될 때 기본 구성 파일을 찾을 디렉터리를 만듭니다.
containerd의 기본 구성 파일 정보가 포함된 containerd config default의 내용을 /etc/containerd/config.toml 파일에 복사하여 저장하고 이 파일을 참조하여 containerd 실행 시 구성을 저장합니다.
$ sudo mkdir -p /etc/containerd
$ containerd config default | sudo tee /etc/containerd/config.toml
또한 Kubernetes 버전 1.22부터는 systemd와 cgroups를 동기화해야 합니다. 저는 1.26.2 버전을 사용하고 있었기 때문에 설정을 진행하겠습니다.
vi 명령 이후 : 이제 125로 설정또는 /SystemdCgroup입장시 잘못된 값 진실로 이동하여 저장하십시오.
:지금 설정 사람마다 다를 수 있으니 확인 부탁드립니다.
$ sudo vi /etc/containerd/config.toml
114 (plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options)
115 BinaryName = ""
116 CriuImagePath = ""
117 CriuPath = ""
118 CriuWorkPath = ""
119 IoGid = 0
120 IoUid = 0
121 NoNewKeyring = false
122 NoPivotRoot = false
123 Root = ""
124 ShimCgroup = ""
125 SystemdCgroup = true
이제 모든 설정을 완료하여 containerd를 계속 진행하고 containerd를 다시 시작합니다.
패키지 목록을 업데이트한 후 Kubernetes 리포지토리에서 필요한 패키지를 설치합니다.
$ sudo systemctl restart containerd
$ sudo apt-get update
$ sudo apt-get install -y apt-transport-https ca-certificates curl
쿠버네티스 설치 시 사용한 GPG 키를 다운로드한 후 쿠버네티스 APT 리포지토리를 등록합니다.
이 키는 Kubernetes 패키지 리포지토리에 배포된 패키지를 인증하고 패키지의 신뢰성을 보장하는 데 사용됩니다.
$ sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
$ echo "deb (signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg) https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
리포지토리 패키지를 업데이트하고 kubeadm, kubelet 및 kubectl 설치를 진행합니다.
$ sudo apt-get update
$ sudo apt-get install -y kubelet kubeadm kubectl
마지막으로 선택 사항이지만 다음 명령을 실행하여 kubeadm, kubelet 및 kubectl을 업데이트하지 않고 문제를 해결했습니다. 즉, 패키지의 보안 패치나 버그 수정 같은 주요 업그레이드에 대한 부분은 사용하지 않지만 테스트 및 연구용으로 사용되므로 문제가 되지 않는 것 같습니다.
$ sudo apt-mark hold kubelet kubeadm kubectl
다음으로 마스터 및 작업자 노드의 설치 및 구성을 다룹니다.