Cloud/Kubernetes

[Kubernetes] "docker->crio" 컨테이너 런타임 변경

Piracoon 2021. 2. 5. 17:43

Kubernetes에서 v1.20 이후 컨테이너 런타임으로서 도커를 사용 중단한다고 한다.

사실상 도커가 이미지를 load, push, save, tag 와 같은 명령어를 사용하기에 편리하였지만, 내부에 임베디드 되어 있지 않아 뺀다고 한다.

 

이미지를 끌어오는 역할을 하게 docker를 두고, 일반적인 컨테이너를 띄우는 역할로 cri-o를 통해 띄어지도록 교체를 할 것이다. 

 


1. crio 설치

# yum install -y crio
# systemctl enable crio

서버가 재부팅이 되었을 경우, 자동으로 올라오기 위해 enable을 잊지 말고 시켜 주자..

 

2. network plugin 삭제

# rm -rf /etc/cni/net.d/100-crio-bridge.conf /etc/cni/net.d/200-loopback.conf

삭제를 해주지 않으면, cri-o가 제공하는 인터페이스가 올라온다.. 기존 환경에서는 calico를 쓰고 있었기 때문에 삭제를 해주어야 문제없이 교체할 수 있다.

 

3. /etc/crio.conf 파일 수정

# vi /etc/crio/crio.conf
---

registries = ["{registry}:{port}" , "docker.io"]
insecure_registries = ["{registry}:{port}"]
plugin_dirs : "/opt/cni/bin" 추가
폐쇄망인 경우 pause_image : "k8s.gcr.io/pause:3.1"  "{registry}:{port}/k8s.gcr.io/pause:3.1" "{registry}:{port}/k8s.gcr.io/pause:3.1"로 변경
pids_limit = 32768

registries나 insecure_registries의 경우 docker daemon.json에 이미지를 가져오기 위한 것과 동일하다.

pids_limit 값의 수정의 경우, Watson Content Analytics 애플리케이션이 실행이 될 때 동작을 안할 수 있기 때문에 설정해 줍니다. 추가적으로 oracle db나, tibero와 같은 DB에서 필요로 하는 수정 사항이다.

 

4. /etc/containers/registries.conf 파일 수정

# vi /etc/containers/registries.conf
---
unqualified-search-registries = ['registry.fedoraproject.org', 'registry.access.redhat.com', 'registry.centos.org', 'docker.io', '{registry}:{port}']

 

5. crio 재기동

# systemctl restart crio

 

6. Pod 이미지 태그 명 변경 (폐쇄망 환경인 경우)

# kubectl edit daemonset -n kube-system kube-proxy
변경 전 : image: k8s.gcr.io/kube-proxy:v1.15.3
변경 후 : {registry}:{port}/k8s.gcr.io/kube-proxy:v1.15.3

# kubectl edit deploy -n kube-system coredns

변경 전 : image: k8s.gcr.io/coredns:1.3.1
변경 후 :
{registry}:{port}/k8s.gcr.io/coredns:1.3.1


master
의 경우 kube-apiserver, kube-scheduler, kube-controller-manager, etcd 이미지 태그 변경

 

7. kubelet 데몬 stop

# systemctl stop kubelet

 

8. /var/lib/kubelet/kubeadm-flags.env 옵션 변경

# vi /var/lib/kubelet/kubeadm-flags.env
---
기존 (docker) : KUBELET_KUBEADM_ARGS="--cgroup-driver=cgroupfs --network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.1     

변경 (cri-o) : KUBELET_KUBEADM_ARGS="--container-runtime=remote --pod-infra-container-image={registry}:{port}/k8s.gcr.io/pause:3.1 --cgroup-driver=systemd --container-runtime-endpoint=/var/run/crio/crio.sock"

--pod-infra-container-image={registry}:{port}/k8s.gcr.io/pause:3.1 해당 옵션 추가의 경우 cri-o 런타임으로 변경이 될때 폐쇄망 환경의 경우 컨테이너를 멈춤 상태로 띄어주는 역할을 하는 pause 이미지를 외부에서 못 가져와 프로세스 기동이 되지 않는 문제가 있기에 추가해 준다. 폐쇄망이 아니라면 안 해줘도 된다. (생략 가능)

9. kubelet 재기동

# systemctl restart kubelet

 

10. docker 재기동 및 pod 모니터링

# systemctl restart docker

도커가 재기동되면서, cri-o상으로 컨테이너 프로세스가 이동한다. 

이때, "watch crictl ps" 명령어를 통해 모니터링하는 것도 좋다. 뜨지 않는다면 pause 이미지를 못 가져와서 그런 확률이 높다.

 

11. 서버 재기동 (criopod가 정상적으로 넘어오는지 확인)

# reboot -h now

간혹, 재부팅 이후에 잘 올라왔던 cri-o 프로세스들이 안 살아 나는 경우가 있었다. 이와 같이 pause 이미지 문제였었다.