ubuntu에 특정 k8s, crio 버전 설치하기
회사에서는 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 부분을 전부 원하는 버전으로 고쳐주면 된다.