Microshift 란?

Kubecon 2022 에서 Redhat 이 발표한 Lightweight Kubernetes Solution 입니다.
(https://www.redhat.com/en/about/press-releases/red-hat-introduces-lightweight-kubernetes-solution-power-next-evolution-open-edge-computing)

k3s 와 같은 느낌의 Solution 으로 예상이 되어 한번 설치하여 테스트하고 설치 과정중 이슈가 있던 부분에 대해 기록해보도록 하겠습니다.

설치

먼저 이번 테스트 환경은 CentOS 8 Stream 에서 진행하였습니다.

$ cat /etc/redhat-release
CentOS Stream release 8   

CRI-O 설치

공식 문서에선 cri-o 1.21 version 을 설치하는 가이드가 있어서 그대로 진행했으나 진행이 안되었습니다.
마치 cri-o repository 가 등록이 되어 있는 것처럼 되어 있으나 등록이 안되어 있었습니다.
(위 부분은 점점 개선이 될 것으로 기대하고 있습니다.)

아래와 같이 repository 를 등록을 진행하고 cri-o 를 설치합니다.

$ sudo curl https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/CentOS_8_Stream/devel:kubic:libcontainers:stable.repo -o /etc/yum.repos.d/pstable.repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   380  100   380    0     0    462      0 --:--:-- --:--:-- --:--:--   462

$ sudo curl https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.21:/1.21.7/CentOS_8_Stream/devel:kubic:libcontainers:stable:cri-o:1.21:1.21.7.repo -o /etc/yum.repos.d/cri-o-1.21.7.repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   432  100   432    0     0    523      0 --:--:-- --:--:-- --:--:--   523

$ sudo dnf repolist
repo id                             repo name 
...
devel_kubic_libcontainers_stable    Stable Releases of Upstream github.com/containers packages (CentOS_8_Stream)
devel_kubic_libcontainers_stable_cri-o_1.21_1.21.7      devel:kubic:libcontainers:stable:cri-o:1.21:1.21.7 (CentOS_8_Stream)
...

$ sudo dnf -y install cri-o cri-tools

cri-o 서비스를 시작합니다.

$ sudo systemctl enable --now cri-o

microshift 설치

아래 명령어를 참고하여 설치 및 서비스를 시작합니다.

Repository 설정 진행.

$ sudo dnf copr enable -y @redhat-et/microshift
Enabling a Copr repository. Please note that this repository is not part
of the main distribution, and quality may vary.

The Fedora Project does not exercise any power over the contents of
this repository beyond the rules outlined in the Copr FAQ at
<https://docs.pagure.org/copr.copr/user_documentation.html#what-i-can-build-in-copr>,
and packages are not held to any quality or security level.

Please do not file bug reports about these packages in Fedora
Bugzilla. In case of problems, contact the owner of this repository.
Repository successfully enabled.

microshift 설치 진행.

$ sudo dnf install -y microshift

서비스 기동.

$ sudo systemctl enable microshift --now
Created symlink /etc/systemd/system/multi-user.target.wants/microshift.service → /usr/lib/systemd/system/microshift.service.
$ sudo systemctl status microshift
● microshift.service - MicroShift
   Loaded: loaded (/usr/lib/systemd/system/microshift.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2022-10-31 08:31:49 UTC; 7s ago
 Main PID: 15599 (microshift)
    Tasks: 9 (limit: 23492)
   Memory: 271.9M
   CGroup: /system.slice/microshift.service
           └─15599 /usr/bin/microshift run

Install Client (oc)

microshift 를 control 하기 위해 client 를 아래와 같이 설치합니다.

$ sudo curl -O https://mirror.openshift.com/pub/openshift-v4/$(uname -m)/clients/ocp/stable/openshift-client-linux.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 50.1M  100 50.1M    0     0  9005k      0  0:00:05  0:00:05 --:--:-- 10.8M
$ sudo tar -xf openshift-client-linux.tar.gz -C /usr/local/bin oc kubectl

Kubeconfig 설정

아래와 같이 kubeconfig 를 설정합니다.

$ mkdir ~/.kube
$ sudo cat /var/lib/microshift/resources/kubeadmin/kubeconfig > ~/.kube/config

설치간 이슈 사항

위와 같이 설치한 이후, microshift 에서 flannel-cni 가 running 상태가 안되는 현상이 발생됩니다.
상세 내역을 확인하면,

$ oc describe pod -n kube-system kube-flannel-ds-8qlpj
... 생략
Events:
  Type     Reason                  Age                  From               Message
  ----     ------                  ----                 ----               -------
  Normal   Scheduled               4m41s                default-scheduler  Successfully assigned kube-system/kube-flannel-ds-8qlpj to ip-172-31-40-0.ap-northeast-2.compute.internal
  Warning  FailedCreatePodSandBox  1s (x23 over 4m41s)  kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = error creating pod sandbox with name "k8s_kube-flannel-ds-8qlpj_kube-system_53a706db-6c04-4e24-a2da-3e937d860c21_0": invalid policy in "/etc/containers/policy.json": Unknown key "keyPaths"

위와 같이 Unknown key "keyPaths" 라는 error 와 함께 pod 가 정상적으로 동작 하지 못합니다.
https://github.com/cri-o/cri-o/issues/6197 issue 를 참고하여 아래와 같이 수정합니다.

$ diff /etc/containers/policy.json /etc/containers/policy.old
13c13
<             "keyPath": "/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release"
---
>             "keyPaths": ["/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release", "/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-beta"]
20c20
<             "keyPath": "/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release"
---
>             "keyPaths": ["/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release", "/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-beta"]

기존에 keyPathskeyPath 로 변경하였습니다.
이후 microshift 재시작 이후 정상적으로 Pod 가 생성되는 것을 확인 할 수 있습니다.

$ oc get nodes
NAME                                             STATUS   ROLES    AGE   VERSION
ip-172-31-40-0.ap-northeast-2.compute.internal   Ready    <none>   15m   v1.21.0
$ oc get pod -A
NAMESPACE                       NAME                                  READY   STATUS    RESTARTS   AGE
kube-system                     kube-flannel-ds-8qlpj                 1/1     Running   0          15m
kubevirt-hostpath-provisioner   kubevirt-hostpath-provisioner-lx55d   1/1     Running   0          2m4s
openshift-dns                   dns-default-mp8cr                     2/2     Running   0          15m
openshift-dns                   node-resolver-tfrpd                   1/1     Running   0          15m
openshift-ingress               router-default-6c96f6bc66-5x7mm       1/1     Running   0          15m
openshift-service-ca            service-ca-7bffb6f6bf-5bn2b           1/1     Running   0          15m

App 배포 테스트

Lightweight Kubernetes 라서 그런가 oc new-app 기능은 정상적으로 작동하지 못했습니다.
이유는 내부에 Openshift 의 ImageStream 이 포함이 안되어 있어서 그렇습니다.
(ImageStream 을 추가하거나 연결하면 정상적으로 구현 될 것으로 보임)

사전에 생성된 Container Image 를 통해 App 을 배포해보겠습니다.

$ cat << EOF > flask.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: flask-deployment
spec:
  selector:
    matchLabels:
      app: flask
  replicas: 2
  template:
    metadata:
      labels:
        app: flask
    spec:
      containers:
      - name: flask
        image: quay.io/chhanz/flask-example-app
        ports:
        - containerPort: 80
EOF

$ oc create -f flask.yml
deployment.apps/flask-deployment created

$ oc expose deployment/flask-deployment --type="NodePort"
service/flask-deployment exposed

아래와 같이 resource 가 생성된 것을 볼 수 있습니다.

$ oc get all -l app=flask
NAME                                    READY   STATUS    RESTARTS   AGE
pod/flask-deployment-6d7459756c-ddnmr   1/1     Running   0          110s
pod/flask-deployment-6d7459756c-zskwd   1/1     Running   0          110s

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/flask-deployment-6d7459756c   2         2         2       110s

$ oc get svc | grep flask
flask-deployment            NodePort    10.43.145.182   <none>        80:32353/TCP   18s

NodePort 를 통해 App 이 정상적으로 접근이 되는지 확인합니다.

$ curl localhost:32353
 Container LAB | POD Working : flask-deployment-6d7459756c-ddnmr | v=1
$ curl localhost:32353
 Container LAB | POD Working : flask-deployment-6d7459756c-zskwd | v=1
$ curl localhost:32353
 Container LAB | POD Working : flask-deployment-6d7459756c-ddnmr | v=1
$ curl localhost:32353
 Container LAB | POD Working : flask-deployment-6d7459756c-zskwd | v=1

마치며

아직은 공식 문서가 완벽하게 준비가 안된 것으로 보여 이슈가 되는 부분 및 설정 방법에 대한 정확한 가이드가 빠져있어서 많은 것을 확인해보지는 못하였습니다.
하지만 몇가지 기능들만 정상적으로 설정하고 작동 할 수 있다면, 충분히 매력적인 Solution 이 될 것이라 생각되어 안정화가 되길 기대합니다.

참고 자료

chhanz's profile image

chhanz

2022-11-02

Read more posts by this author