How to Change Kubernetes Container Runtime To CRI-O from Docker

Intro

[Kubernetes Cluster 구축 Post]에서 구성한 Docker Container Runtime의 Kubernetes Cluster 환경에서, Worker Node 하나의 Container Runtime을 CRI-O로 변경하는 작업을 정리한다. 기존 노드 중 ‘worker2’를 선택한다.

Cluster Info

  • Cluster Node 구성: 3 Lightsail Instances
    • Master Node
    • Worker Node1
    • Worker Node2
  • Instance OS: Ubuntu 20.04 LTS
  • Kubernetes Version: v1.20.1
  • CNI: Flannel
  • Container Runtime: Docker v19.3.11

kubernetes cluster node info

Change Kubernetes Container Runtime To CRI-O from Docker

Install CRI-O On Worker Node

CRI-O를 설정할 노드(worker2)에 CRI-O를 설치해 준다. CRI-O의 버전은 Kubernetes와 동일한 버전들이 호환 된다. 아래의 명령어들을 실행하여 CRI-O를 설치해 준다.

  • VERSION 변수를 설치할 Kubernetes 환경의 버전과 동일하게 설정한다.
  • OS 변수를 [설치 문서 가이드]를 확인하여 설정한다.
    • 예)Ubuntu 20.04: xUbuntu_20.04, Ubuntu 18.04: xUbuntu_18.04
  • 아래의 명령들을 쉘에서 root로 실행 하여 설치
      VERSION=1.20
      OS=xUbuntu_20.04
    
      echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
      echo "deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.list
    
      curl -L https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$VERSION/$OS/Release.key | apt-key add -
      curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/Release.key | apt-key add -
    
      apt-get update
      apt-get install cri-o cri-o-runc
    
      systemctl daemon-reload
      systemctl enable crio
      systemctl start crio
    
  • 아래의 명령을 통해 running 중인 crio 데몬을 확인 할 수 있다.
      sudo systemctl status crio
    

    crio daemon check

Drain Worker Node

CRI-O를 설치할 노드(worker2)를 drain하여 Pod들을 evict해 준다.

  • Run drain
      kubectl drain {Node Name} --force --ignore-daemonsets
    

Reset kubeadm reset On Worker Node

CRI-O를 설치할 노드(worker2)를 kubeadm reset하여 Cluster에서 제거 해 준다.

기존에 kubeadm join시 사용했던 docker의 socket(/var/run/dockershim.sock)을 명시한다.

  • Reset the node
      sudo kubeadm reset --cri-socket=/var/run/dockershim.sock
    

Get join command (Create token)

CRI-O Node (worker2)를 다시 join하기 위해 token을 재 발급 받는다. ‘–print-join-command’ 옵션을 사용하여 편리하게 full join command를 얻을 수 있다.

  • Create token and Print join command
      sudo kubeadm token create --print-join-command
    
      // example
      sudo kubeadm join 172.26.15.44:6443 --token jc766n.sqhvprbnwozmbzzz \
        --discovery-token-ca-cert-hash sha256:zzzzfcf98zzzb7zzzf75a728386zzz85a159b3ab54e89db38ac7fce9zzzzzzzz \
        --cri-socket=/var/run/crio/crio.sock
    

Join Worker Node

Join할 CRI-O Node에서 kubeadm join command를 실행해 준다. 앞에서 생성한 token이 포함된 join command에 CRI-O의 cri-socket을 명시해 준다.

기존의 docker가 존재 하여 docker의 cri-socket이 남아 있거나, 여러 cri-socket들이 Node에 존재 할 경우, 반드시 join시 사용할 cri-socket을 명시해야 합니다.

  • kubeadm join
      // example
      sudo kubeadm join 172.26.15.44:6443 --token jc766n.sqhvprbnwozmbzzz \
        --discovery-token-ca-cert-hash sha256:zzzzfcf98zzzb7zzzf75a728386zzz85a159b3ab54e89db38ac7fce9zzzzzzzz \
        --cri-socket=/var/run/crio/crio.sock
    

Uncordon Worker Node

drain 했었던 Worker Node를 uncordon하여 스케쥴링을 재개 합니다.

  • Run uncordon
      kubectl uncordon {node name}
    

Check Worker Node Status and Container Runtime

Container Runtime 교체를 진행한 Node를 Describe하거나, 아래와 같은 방법으로 Node의 상태와 Container Runtime을 확인한다.

kubectl get nodes -o wide

container runtime changed node info

Pod Creation Test

해당 Node에 Pod을 생성하여, 정상 생성 및 사용이 가능한지 확인한다.

해당 Node에 Pod을 스케쥴링 하기 위해, spec.nodeName 필드를 이용하거나, Node Affinity를 사용한다.

  • Test Pod Yaml
      apiVersion: v1
      kind: Pod
      metadata:
        name: ubuntu-crio-test
      spec:
        containers:
        - image: ubuntu:18.04
          name: testpod
          command: ["/bin/bash", "-ec", "while :; do echo '.'; sleep 5 ; done"]
        nodeName: {Target Node Name}
    
  • 생성된 Pod 확인 created pod info

  • Pod Container Ping 확인 Container Ping Test

Source

Leave a comment