1. MicroK8s 설치

  • Ubuntu 환경에서 MicroK8s 설치
# 최신 버전의 MicroK8s 설치
$ sudo snap install microk8s --classic

# 특정 버전의 MicroK8s 설치
$ sudo snap install microk8s --classic --channel=1.27

1.1. 관리자 권한 그룹에 추가

  • MicroK8s 설치 후, 사용자가 MicroK8s를 사용하기 위해서는 관리자 권한 그룹에 추가해야 함
# 관리자 그룹에 MicroK8s 추가
sudo usermod -a -G microk8s $USER
sudo chown -f -R $USER ~/.kube

# 새로운 그룹 적용
$ newgrp microk8s

1.2. MicroK8s 시작 및 중지

  • MicroK8s 시작과 중지 방법
# MicroK8s 시작
$ microk8s start

# MicroK8s 중지
$ microk8s stop

1.3. MicroK8s with Kubectl

  • MicroK8s 는 kubectl 을 자체 패키지로 제공하고 있음
# MicroK8s 에서 제공하는 kubectl 명령어
$ microk8s kubectl get all --all-namespaces
  • kubectl 을 사용하기 위해서는 MicroK8s 의 config 내용을 .kube/config 에 복사해야 함
# MicroK8s 의 config 내용을 .kube/config 에 복사
$ microk8s config > ~/.kube/config

# kubectl 명령어 실행
$ kubectl get all --all-namespaces

2. MicroK8s add Node (Worker Node)

  • MicroK8s 에서는 add-node 명령어를 통해 Worker Node 를 추가할 수 있음
  • Master Node 에서 add-node 명령어를 실행하면, Worker Node 에서 실행할 수 있는 명령어를 제공함
# MicroK8s 에서 제공하는 add-node 명령어
$ microk8s add-node

# MicroK8s 에서 제공하는 add-node 명령어의 결과
From the node you wish to join to this cluster, run the following:
microk8s join <MASTER_IP>:25000/<TOKEN>

Use the '--worker' flag to join a node as a worker not running the control plane, eg:
microk8s join <MASTER_IP>:25000/<TOKEN> --worker

If the node you are adding is not reachable through the default interface you can use one of the following:
microk8s join <MASTER_IP>:25000/<TOKEN>
microk8s join 10.0.0.1:25000/<TOKEN>
microk8s join 172.17.0.1:25000/<TOKEN>

2.1. MicroK8s Worker Node join

  • Master Node 에서 획득한 add-node 명령어를 Worker Node 에서 실행하면, Worker Node 가 Master Node 에 join 됨
# worker node join
$ microk8s join <MASTER_IP>:25000/<TOKEN> --worker

2.1.1. Worker Node Host 정보 추가

  • Master Node 로 join 을 위해 Worker Node 의 Host 정보를 추가해야 함
# hosts 파일 수정
$ sudo vi /etc/hosts

# Worker Node 의 Host IP 와 Host Name 추가
<WORKER_IP>   worker

2.2. Master Node 에서 Worker Node 추가 확인

  • Master Node 에서 Worker Node 가 정상적으로 추가되었는지 확인
# Master Node 에서 Worker Node 확인
$ microk8s kubectl get nodes

NAME     STATUS   ROLES    AGE   VERSION
master   Ready    <none>   10d   v1.27.4
worker   Ready    <none>   10d   v1.27.4

3. Multus 에드온 설치

Multus 사용을 위해 Multus 에드온을 설치해야 함

3.1. Multus 에드온 설치

  • Multus 에드온 설치를 위해 MicroK8s 에서 제공하는 community 에드온을 활성화 해야 함
  • community 에드온을 활성화 후 Multus 에드온 설치
# Multus Community 에드온 활성화
$ microk8s enable community

# Multus 에드온 설치
$ microk8s enable multus

3.2. Multus 에드온 확인

  • Multus 에드온이 정상적으로 설치되었는지 확인
# Multus 에드온 확인
$ microk8s kubectl get pods -n kube-system --selector=app=multus

NAME                   READY   STATUS    RESTARTS        AGE
kube-multus-ds-bdqcq   1/1     Running   0               3d22h
kube-multus-ds-8mq2j   1/1     Running   1 (3d20h ago)   3d22h

4. ROS2 통신을 위한 Multus 설정

  • Multus 사용을 위한 Network 생성
  • 사용할 Network IP 확인 후 Multus 설정
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: my-network
  namespace: my-namespace
spec:
  config: '{
   "cniVersion": "0.3.0",
   "name": "my-network",
   "type": "macvlan",
   "master": "eth0",
   "mode": "bridge",
   "isDefaultgateway": true,
   "ipam": {
    "type": "host-local",
    "ranges": [ [ {
        "subnet": "192.168.0.0/16",
        "rangeStart": "192.168.1.160",
        "rangeEnd": "192.168.1.180",
        "gateway": "192.168.70.1"
        } ] ] }
    }'

4.1. ip route 확인

  • Multus 에서 사용할 Network IP 확인
# ip route 확인
$ ip route

default via 192.168.70.1 dev eth0 proto dhcp metric 100 
10.1.102.64/26 via 10.1.102.64 dev vxlan.calico onlink 
blackhole 10.1.235.0/26 proto 80 
10.1.235.13 dev cali3beb9936836 scope link 
10.1.235.15 dev cali7701ec796a3 scope link 
... 생략 ...
169.254.0.0/16 dev eth0 scope link metric 1000 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 
192.168.70.0/24 dev eth0 proto kernel scope link src 192.168.70.15 metric 100 

4.2. Multus Network 사용 설정

  • Deployment 에 Multus Network 사용 설정 예시
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ros-talker-deployment
  namespace: my-namespace
  labels:
    app: ros-talker
spec:
  selector:
    matchLabels:
      app: ros-talker
  template:
    metadata:
      labels:
        app: ros-talker
      annotations:
        k8s.v1.cni.cncf.io/networks: my-network # 생성된 Multus Network 사용 설정
    spec:
    ... 생략 ...

4.3. Multus Network 사용 확인

  • Multus Network 사용 설정이 정상적으로 되었는지 확인
# Multus Network 사용 확인
$ microk8s kubectl get describe pod ros-talker-deployment-5f9b9b6d6f-4q9qf -n my-namespace

Name:             ros-talker-deployment-69f999bbc4-crtbw
Namespace:        default
Priority:         0
Service Account:  default
Node:             worker-node-1/192.168.0.10
Start Time:       Thu, 03 Aug 2023 15:50:42 +0900
Labels:           app=ros-talker
                  pod-template-hash=69f999bbc4
Annotations:      cni.projectcalico.org/containerID: 46d80536187192d787e05cae17efd93b5992738d43a8b945bc1f14dbd580a6ff
                  cni.projectcalico.org/podIP: 10.1.102.106/32
                  cni.projectcalico.org/podIPs: 10.1.102.106/32
                  k8s.v1.cni.cncf.io/network-status:
                    [{
                        "name": "k8s-pod-network",
                        "ips": [
                            "10.1.102.106"
                        ],
                        "default": true,
                        "dns": {}
                    },{
                        "name": "my-namespace/my-network",
                        "interface": "net1",
                        "ips": [
                            "192.168.1.163"
                        ],
                        "mac": "8a:e9:bc:15:77:82",
                        "dns": {}
                    }]
                  k8s.v1.cni.cncf.io/networks: my-network
                  k8s.v1.cni.cncf.io/networks-status:
                    [{
                        "name": "k8s-pod-network",
                        "ips": [
                            "10.1.102.106"
                        ],
                        "default": true,
                        "dns": {}
                    },{
                        "name": "my-namespace/my-network",
                        "interface": "net1",
                        "ips": [
                            "192.168.1.163"
                        ],
                        "mac": "8a:e9:bc:15:77:82",
                        "dns": {}
                    }]
Status:           Running
... 생략 ...