DIY! k8s 1.26 설치하기

교육 v1.1

쿠버네티스 1.26 버전의 설치방법을 안내합니다. 우분투 20.04 에서 테스트 되었습니다.

환경 정보

Ubuntu 20.04

  • 맥 M1, 패러럴즈 환경에서 vagrant 로 구성
  • Vagrantfile 참고

OS 정보 확인

## CPU architecture - amd64|arm64
dpkg --print-architecture

arm64

## Ubuntu code name - xenial|focal
lsb_release -cs

focal

Pre-requisite

시스템 설정

bridge 모듈/설정 확인

## br_netfilter 모듈 로드 여부 확인
lsmod | grep br_netfilter

*(없음)*

## net.bridge.bridge-nf-call-iptables = 1 확인
sysctl -a | grep net.bridge.bridge-nf-call-iptables

*(없음)*

IPV4를 포워딩하여 iptables가 bridge된 트래픽 보기 설정

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.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

sudo sysctl --system

확인

# sysctl -a | grep -E "bridge-nf-call-ip|ip_forward "
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

# lsmod | grep br_netfilter
br_netfilter           28672  0
bridge                233472  1 br_netfilter

swapoff 설정

sudo swapoff -a

sudo sed -i.bak '/swap/d' /etc/fstab
  • -i , in-place : 파일에서 직접 수정. 뒤에 확장자를 주면 원본파일명.{확장자} 백업파일을 만들어줌 (참고) -i 옵션을 주지 않으면 화면 출력

runC

릴리즈 : https://github.com/opencontainers/runc/releases

ARCH=$(dpkg --print-architecture)

wget https://github.com/opencontainers/runc/releases/download/v1.1.7/runc.$ARCH

sudo install -m 755 runc.$ARCH /usr/local/sbin/runc

## 설치 확인
sudo which runc; sudo runc -v

containerd

릴리즈: https://github.com/containerd/containerd/releases

호환 정보 : https://containerd.io/releases/#kubernetes-support

k8s-compatible-table.png

ARCH=$(dpkg --print-architecture)
CONTAINERD_VERSION="1.6.20"
CONTAINERD_TAR="containerd-${CONTAINERD_VERSION}-linux-${ARCH}.tar.gz"
wget https://github.com/containerd/containerd/releases/download/v${CONTAINERD_VERSION}/${CONTAINERD_TAR}

sudo tar Cxzvf /usr/local ${CONTAINERD_TAR}

wget https://raw.githubusercontent.com/containerd/containerd/main/containerd.service

sudo mv containerd.service /usr/lib/systemd/system/

sudo systemctl daemon-reload
sudo systemctl enable --now containerd

sudo systemctl status containerd

sudo mkdir -p /etc/containerd/
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
sudo systemctl restart containerd

CNI

릴리즈: https://github.com/containernetworking/plugins/releases

ARCH=$(dpkg --print-architecture)
CNI_VERSION="1.2.0"
CNI_TAR="cni-plugins-linux-${ARCH}-v${CNI_VERSION}.tgz"
sudo mkdir -p /opt/cni/bin/

sudo wget https://github.com/containernetworking/plugins/releases/download/v${CNI_VERSION}/${CNI_TAR}

sudo tar Cxzvf /opt/cni/bin ${CNI_TAR}

cni.png

kubernetes

https, certificate, curl 설치

## apt 패키지 색인을 업데이트하고, 쿠버네티스 apt 리포지터리를 사용하는 데 필요한 패키지를 설치한다.
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

K8s 리포지토리 apt 등록

## 사이닝키 다운로드
sudo curl https://packages.cloud.google.com/apt/doc/apt-key.gpg \
 | sudo apt-key --keyring /usr/share/keyrings/kubernetes-archive-keyring.gpg add -

## 리포 추가
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

## apt 색인 update
sudo apt-get update

K8s 버전확인

# apt-cache madison kubeadm

kubeadm |  1.27.1-00 | https://apt.kubernetes.io kubernetes-xenial/main arm64 Packages
kubeadm |  1.27.0-00 | https://apt.kubernetes.io kubernetes-xenial/main arm64 Packages
kubeadm |  1.26.4-00 | https://apt.kubernetes.io kubernetes-xenial/main arm64 Packages
..

설치

K8S_VERSION="1.26.4-00"
sudo apt-get -y install kubelet=${K8S_VERSION} \
                        kubeadm=${K8S_VERSION} \
                        kubectl=${K8S_VERSION}

sudo apt-mark hold kubelet kubeadm kubectl

kubelet 설정

#### ip of this box for kubelet
IP_ADDR=`ip addr show eth1 | grep /24 | awk '{print $2}'`
#### set node-ip to kubelet
echo "KUBELET_EXTRA_ARGS=--node-ip=\"$IP_ADDR\"" | tee /etc/default/kubelet
systemctl restart kubelet

kubeadm init

sudo kubeadm init \
--apiserver-advertise-address=192.168.100.2 \
--apiserver-cert-extra-sans=192.168.100.2 \
--pod-network-cidr=10.224.0.0/16 \
--service-cidr=10.225.0.0/16 \
--node-name=ubuntu2004

kubectl setup

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

flannel

## flannel YAML 다운로드
wget -O kube-flannel.yml https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

## POD IP 대역 수정
sed -i.bak 's/10.244.0.0/10.224.0.0/g' kube-flannel.yml
## indent 8칸
sed -i.bak '/- --kube-subnet-mgr/a \ \ \ \ \ \ \ \ - --iface=eth1' kube-flannel.yml

## 적용 
kubectl create -f kube-flannel.yml

마치며

이상, Ubuntu 20.04 환경에서 쿠버네티스 1.26 설치 핸즈온을 설명드렸습니다.
1.23+ 에서 도커를 사용하지 않게 되면서 runc, containerd, cni 등 직접 설치하는 부분과 추가적인 환경 설정이 더 많아 졌는데요.

매번 필요할 때마다 설치하기 번거로운니 vagrant 로 한방에 설치할 수 있도록 Vagrantfile을 작성해두었습니다.

  • m1 (arm), parallels 환경에서 작성되었습니다
  • x86, virtualbox 환경의 경우는 약간의 수정이 필요합니다