공부/Kubernetes

ubuntu에 특정 k8s, crio 버전 설치하기

토고미 2022. 1. 3. 17:34

회사에서는 centOS를 사용하는데, 개인 서버에서는 우분투를 깔아놔서 설치법이 조금 달라서 애먹었다.

게다가 docker가 아닌 crio라서 조금 더 힘들었음

 

설치 버전

ubuntu 18.04

kubernetes 1.19.4

crio 1.19.2

 

아래 명령어를 통해 자신의 OS 버전 확인 가능

cat /etc/os-release

 

 

설치 순서(공통)

swap 파티션 비활성화

sudo swapoff -a
vi /etc/fstab

/etc/fstab 파일의 swap 관련 부분을 주석처리 한다.

/swapfile ~ 부분

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda2 during installation
UUID=96cfaf04-a044-4aaa-a4e0-6c4caa94a8ef /               ext4    errors=remount-ro 0       1
# /boot/efi was on /dev/sda1 during installation
UUID=2F9E-B3A4  /boot/efi       vfat    umask=0077      0       1
# /swapfile                                 none            swap    sw              0       0

 

cri-o 사전 작업 & 설치

br_netfilter & iptables 설정

sudo modprobe br_netfilter
sudo modprobe overlay
sudo cat << "EOF" | sudo tee -a /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
sudo sysctl --system

repo 등록

OS, CRIO_VERSION을 원하는 설치버전으로 바꾸면 된다

OS=xUbuntu_18.04
CRIO_VERSION=1.19:1.19.2
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /"|sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
echo "deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$CRIO_VERSION/$OS/ /"|sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$CRIO_VERSION.list

import GPG key

curl -L https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$CRIO_VERSION/$OS/Release.key | sudo apt-key add -
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/Release.key | sudo apt-key add -

등록한 repo 반영

sudo apt-get update

 

그런데 여기서 아마 에러가 날 것이다.

repo 주소를 직접 들어가보면 알겠지만 1.19:1.19.2가 아니라 1.19:/1.19.2이기 때문이다.

직접 수정해주자.

(참고로 애초에 변수를 1.19:/1.19.2로 하면 그것대로 안됨..)

 

vi /etc/apt/sources.list.d/devel\:kubic\:libcontainers\:stable\:cri-o\:1.19\:1.19.2.list

직접 vi로 들어가서

deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.19:/1.19.2/xUbuntu_18.04/ /

1.19:/1.19.2로 변경해주고

 

다시 하면 된다.

sudo apt-get update

그리고 드디어 cri-o 설치

sudo apt install cri-o cri-o-runc

 

kubeadm, kubectl, kubelet 설치

설치 가능한 kubernetes 버전 조회

curl -s https://packages.cloud.google.com/apt/dists/kubernetes-xenial/main/binary-amd64/Packages | grep Version | awk '{print $2}'

 

나는 1.19.4를 설치할 것이기 때문에, 관련 버전을 찾아보면 1.19.4-00이 있다는 것을 확인할 수 있다.

해당 버전으로 아래와 같이 설치를 하면 된다.

VERSION=1.19.4-00
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - && \
echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list && \
sudo apt-get update -q && \
sudo apt-get install -qy kubelet=$VERSION kubectl=$VERSION kubeadm=$VERSION

 

설치 순서(master)

kubernetes 설치

kubeadm-config.yaml 생성

apiVersion: kubeadm.k8s.io/v1beta2
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: {마스터 노드 IP}
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/crio/crio.sock
---
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: {k8s 버전} # 예시:v1.19.4
controlPlaneEndpoint: {마스터 노드 IP}:6443
imageRepository: k8s.gcr.io
networking:
  serviceSubnet: 10.96.0.0/16
  podSubnet: 10.244.0.0/16
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

만약 아래와 같은 에러가 뜬다면 kubeadm-config.yaml을 수정한다.

W0131 02:20:03.293687    3579 common.go:84] your configuration file uses a deprecated API spec: "kubeadm.k8s.io/v1beta2". Please use 'kubeadm config migrate --old-config old.yaml --new-config new.yaml', which will write the new, similar spec using a newer API version.

에러에서 알려준 명령어대로 하거나

kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml

아래와 같이 직접 kubeadm-config.yaml을 수정한다 

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: ol2p06.upfph75u2rnx8xq8
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: {마스터 노드 IP}
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/crio/crio.sock
  imagePullPolicy: IfNotPresent
  name: {hostname}
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/control-plane
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: {마스터 노드 IP}:6443
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
#imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: {k8s 버전} #예시:v1.25.0
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.96.0.0/16
scheduler: {}

중요한 점은 imageRepository를 주석처리 해야한다는 것!

 

kubeadm init 실행

kubeadm init --config kubeadm-config.yaml

 

worker 노드 join을 위해 kubeadm init 결과로 나오는 아래 아웃풋을 저장해둬야 한다

kubeadm join {마스터 노드 IP}:6443 --token 어쩌구.저쩌구 \
    --discovery-token-ca-cert-hash sha256:쏼라쏼라

 

kubectl 사용을 위한 config 이동

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

 

 

설치 순서(worker)

kubeadm join (옵션 주의)

kubeadm join {마스터 노드 IP}:6443 --token 어쩌구.저쩌구 \
    --discovery-token-ca-cert-hash sha256:쏼라쏼라 --cri-socket=/var/run/crio/crio.sock

--cri-socket 옵션이 추가된 것에 주의하자

 

혹시 kubelet cgroup driver 문제가 생기면, kubelet의 설정에 --cgroup-driver=systemd 를 추가하자

문제없으면 하지않는 것을 추천..

vi /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=/var/run/crio/crio.sock --cgroup-driver=systemd"

 

kubelet 재시작

systemctl restart kubelet

 

번외 : calico 설치

calico v3.16버전 설치

kubectl apply -f https://docs.projectcalico.org/v3.16/manifests/calico.yaml

3.16의 특정 버전을 설치하고 싶다면,

해당 yaml을 받아서 image 부분을 전부 원하는 버전으로 고쳐주면 된다.