박종훈 기술블로그

microk8s로 cluster 구축하기 (with oracle cloud)

oracle 클라우드에서는 무료 인스턴스를 제공해준다.

** x86 CPU 아키텍처(AMD 및 Intel)의 1 OCPU = 2 vCPU, Arm CPU 아키텍처의 (Ampere) 1 OCPU = 1 vCPU

받아놓고 필요한 일이 있을때마다 잘 사용했는데 요즘에는 사용을 할일이 크게 없어 어떻게 쓰면 유용하게 쓸까 고민하다가 microk8s라는 것을 알게 되어 k8s 환경을 구축해봐야겠다 생각이 들었다.

오늘 실천으로 옮겨보았고, 내용이 길지는 않지만, 많은 삽질을 통해 얻은 내용을 정리해본다.


먼저 docker, kubectl을 설치해야 한다.

docker와 kubectl이 설치되었다면, microk8s을 설치한다.

설치 방법은 microk8s 메인 페이지에 잘 적혀있다.

순서대로 따라하다보면 microk8s status --wait-ready 에서 다음과 같이 에러가 발생할 것이다.

Insufficient permissions to access MicroK8s.
You can either try again with sudo or add the user ubuntu to the 'microk8s' group:

    sudo usermod -a -G microk8s ubuntu
    sudo chown -R ubuntu ~/.kube

After this, reload the user groups either via a reboot or by running 'newgrp microk8s'.

그대로 따라했을 때 아래와 같이 .kube가 없다고 나온다면

sudo chown -R ubuntu ~/.kube
chown: cannot access '/home/ubuntu/.kube': No such file or directory

아래 방법을 통해 .kube 디렉터리와 config 파일을 생성해준다.

mkdir .kube
cd .kube
microk8s config > config

cluster 생성하기 (add node)

Create a MicroK8s cluster

이 부분에서 많이 해맸다.

인스턴스간 통신 가능 여부 확인하기

우선 oracle에서 제공한 각 인스턴스는 10.0.0.x 의 private ip를 가지고 있다. (x는 각 인스턴스마다 다름)

각 인스턴스마다 서로 통신이 되는지 확인하는것이 중요하다. 나는 telnet을 통해 포트가 오픈되어있는지 확인하였다.

telnet 10.0.0.x 25000

만약 telnet으로 연결이 되지 않는다면 2가지를 설정해줘야 한다.

  1. oracle cloud console 에서 ingress rule 설정해주기 oracle-cloud-console-ingress-rule

    10.0.0.0/24 는 private ip 대역이므로 다 오픈하였다.

  2. ubuntu vm 내에서 방화벽 설정해주기

sudo vim /etc/iptables/rules.v4

에서

-A INPUT -s 10.0.0.0/24 -j ACCEPT

를 추가해준다.

sudo iptables-restore < /etc/iptables/rules.v4

를 입력하면 적용이 완료된다.

microk8s add-node

microk8s add-node 명령어를 수행하면 현재 인스턴스에 join 할수 있는 명령어가 만들어 지게 된다.

microk8s-add-node

이 생성된 join명령어를 다른 인스턴스에서 실행하면 된다.
* 해당 토큰 값은 한 번 사용하면 이후에는 사용하지 못하므로 주의한다. (동일한 명령어를 수행하여 재생성 하면 된다.)

근데 여기서 문제가 위에서 제대로 통신이 되는지 확인하지 않았다면 join에 성공하였다고는 뜨나 정상적으로 연결이 되지는 않고 microk8s가 고장이 났다. (명령어들이 정상 수행되지 않고 에러가 발생되거나 계속 멈춰있는다. 1.28, 1.29 버전 기준)

위와 같은 상황이 나왔을 경우 해결 방법은 찾기 못하였고 재설치 하여 해결하였다. 삭제 명령어는 다음과 같다.

sudo snap remove microk8s

마무리

연결 완료 화면은 다음과 같다.

microk8s-kubectl-get-nodes

기타

File “/etc/docker/daemon.json” does not exist.

microk8s inspect 를 수행하면 현재 microk8s의 상태에 대해서 검점을 해준다.

만약 아래와 같은 이슈가 나왔다면

File "/etc/docker/daemon.json" does not exist.
You should create it and add the following lines:
{
    "insecure-registries" : ["localhost:32000"]
}

안내에 따라 "/etc/docker/daemon.json" 파일을 만들고 insecure-registries 를 설정해주면 해결된다.

microk8s 포트 정보

https://microk8s.io/docs/services-and-ports

microk8s 사용을 위한 minimum requirement

recommend a system with at least 20G of disk space and 4G of memory.

위 조건을 amd 인스턴스는 만족하지 못해 결국 cluster에서 삭제를 해줬다. (스펙이 부족한지 계속 not ready 상태로 이동되었다., amd 인스턴스는 각 1gb 메모리를 가지고 있다.)

아래 명령어를 통해 join되어 있는 노드를 삭제해주었다.

microk8s remove-node {node-name}

categories: 개발

tags: k8s , kubernetes , microk8s , node , cluster , docker , kubectl , iptables , rules , firewall