Home k3s 구성하기
Post
Cancel

k3s 구성하기

kubernets 실습 및 스터디를 위한 간단한 k3s 구성하기

k3s란

k3s는 비교적 설치가 간단하고
IoT, edge computing 디바이스위에서 동작하도록 만들어진 경량 쿠버네티스이다.

구성

OS : ubuntu 22.04
1개의 master 노드와 2개의 worker 노드로 구성

사전 준비

k3s 공식 docs에 cluster 구성을 위해 필요한 networking에 대해 나열되어 있다.
설치할 노드에 맞게 iptables를 통해서 규칙을 추가해준다.

ProtocolPortSourceDescription
TCP6443K3s agent nodesKubernetes API Server
TCP10250K3s server and agent nodesKubelet metrics

master node

1
2
3
4
$ sudo iptables -F # 초기화
$ sudo iptables -I INPUT -p tcp --dport 6443 -j ACCEPT
$ sudo iptables -I INPUT -p tcp --dport 10250 -j ACCEPT
$ sudo iptables -I INPUT -p tcp --dport 30000:32767 -j ACCEPT # node port

worker node

1
2
3
$ sudo iptables -F # 초기화
$ sudo iptables -I INPUT -p tcp --dport 10250 -j ACCEPT
$ sudo iptables -I INPUT -p tcp --dport 30000:32767 -j ACCEPT # node port

사용하는 리소스가 cloud 리소스일 경우 보안그룹에도 규칙을 넣어줘야한다.

maser 노드 설치

아래의 명령으로 설치

1
$ curl -sfL https://get.k3s.io | sh -

설치 후에 worker 노드 설치에 필요한 TOKEN 값 확인

1
2
$ cat /var/lib/rancher/k3s/server/node-token
K10373314897d684c2bbd8b01ff147449fa35acaafc9a99e549909f7bcea514070b::server:2dc963b5a5b61b77f94418c811f059f2

worker 노드 설치

1
2
3
$ MASTER_IP=xxx.xxx.xxx.xxx
$ TOKEN=K10373314897d684c2bbd8b01ff147449fa35acaafc9a99e549909f7bcea514070b::server:2dc963b5a5b61b77f94418c811f059f2
$ curl -sfL https://get.k3s.io | K3S_URL=https://$MASTER_IP:6443 K3S_TOKEN=$TOKEN sh -

TOKEN은 master 노드에서 확인한 값을 넣어준다.

설치 확인 on master

1
2
3
4
5
6
ubuntu@master:~$ sudo kubectl cluster-info
Kubernetes control plane is running at https://127.0.0.1:6443
CoreDNS is running at https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Metrics-server is running at https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/https:metrics-server:https/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
1
2
3
4
5
ubuntu@master:~$ sudo kubectl get node
NAME      STATUS   ROLES                  AGE   VERSION
master    Ready    control-plane,master   36m   v1.25.3+k3s1
worker2   Ready    <none>                 28m   v1.25.3+k3s1
worker1   Ready    <none>                 28m   v1.25.3+k3s1

원격 kubectl

master 노드의 /etc/rancher/k3s/k3s.yaml 파일을 복사해서 ‘~/.kube/k3s-config’ 파일을 생성한다.
server의 ip는 master 노드의 ip로 수정한다.
name은 클러스터 구분자라고 생각하면된다. default로 되어있는데, 자신이 원하는 이름으로 수정하면된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: ...
    server: https://127.0.0.1:6443 <- 해당 ip를 master 노드의 ip로 수정
  name: default <- 이름 수정
contexts:
- context: 
    cluster: default <- 이름 수정
    user: default <- 이름 수정
  name: default <- 이름 수정
current-context: default <- 이름 수정
kind: Config
preferences: {}
users:
- name: default <- 이름 수정
  user:
    client-certificate-data: ...
    client-key-data: ...

default라는 이름으로 다른 클러스터를 관리하고 있다면 반드시 이름을 변경해야한다.

vi 편집기에서 아래 명령어를 통해서 일괄 변경이 쉽게 가능하다.
:%s/127.0.0.1/master-ip/g
:%s/default/your-k3s-name/g

환경변수인 KUBECONFIG에 위에서 생성한 k3s-config 파일의 경로를 추가해준다.

1
export KUBECONFIG=$HOME/.kube/k3s-config:$HOME/.kube/config:$KUBECONFIG

~/.bashrc , ~/.zshrc 등 사용하는 shell의 프로파일에 해당 내용 추가

1
2
3
4
5
6
solver@solver:~$ kubectl config use-context your-k3s-name
solver@solver:~$ kubectl get node -o wide
NAME      STATUS   ROLES                  AGE   VERSION        INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
master    Ready    control-plane,master   87m   v1.25.4+k3s1   10.0.0.167    <none>        Ubuntu 22.04.1 LTS   5.15.0-1021-oracle   containerd://1.6.8-k3s1
worker1   Ready    <none>                 86m   v1.25.4+k3s1   10.0.0.47     <none>        Ubuntu 22.04.1 LTS   5.15.0-1021-oracle   containerd://1.6.8-k3s1
worker2   Ready    <none>                 86m   v1.25.4+k3s1   10.0.0.237    <none>        Ubuntu 22.04.1 LTS   5.15.0-1021-oracle   containerd://1.6.8-k3s1

원격 kubectl시 ssl 오류가 난다면

cloud 리소스로 k3s를 구축했다면 아래와 같은 에러가 발생한다.

1
2
solver@solver:~$ kubectl get pod
Unable to connect to the server: x509: certificate is valid for 10.0.0.167, 10.43.0.1, 127.0.0.1, ::1, not xxx.xxx.xxx.xxx

에러가 나는 이유는 k3s가 구성 될때 Kubernetes API 서버의 인증서가 내부 IP로만 발행되서 생기는 문제다. 아래 목록에서 공인 ip에 대한 정보는 없다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ubuntu@master:~$ sudo kubectl -n kube-system get secrets/k3s-serving -o yaml 
apiVersion: v1
data:
  tls.crt: ...
  tls.key: ...
kind: Secret
metadata:
  annotations:
    listener.cattle.io/cn-__1-f16284: ::1
    listener.cattle.io/cn-10.0.0.167: 10.0.0.167
    listener.cattle.io/cn-10.43.0.1: 10.43.0.1
    listener.cattle.io/cn-127.0.0.1: 127.0.0.1
    listener.cattle.io/cn-kubernetes: kubernetes
    listener.cattle.io/cn-kubernetes.default: kubernetes.default
    listener.cattle.io/cn-kubernetes.default.svc: kubernetes.default.svc
    listener.cattle.io/cn-kubernetes.default.svc.cluster.local: kubernetes.default.svc.cluster.local
    listener.cattle.io/cn-localhost: localhost
    listener.cattle.io/cn-master: master
    ...

master 노드에서 아래의 절차를 진행하면 해결 할 수 있다.

/etc/systemd/system/k3s.service 파일에 k3s server가 시작될때 –tls-san 옵션을 가지고 실행되도록 수정해준다. 값은 master 노드의 public ip를 넣어준다.

1
2
ExecStart=/usr/local/bin/k3s \
    server --tls-san xxx.xxx.xxx.xxx \

기존의 k3s-serving secrets을 삭제 후 dynamic-cert.json 파일을 삭제(또는 백업) 후 k3s를 재시작하면 새로 secrets을 생성한다.

1
2
3
4
5
kubectl -n kube-system delete secrets/k3s-serving
mv /var/lib/rancher/k3s/server/tls/dynamic-cert.json /var/lib/rancher/k3s/server/tls/dynamic-cert.json.bak

systemctl systemctl daemon-reload
systemctl restart k3s

재시작 후 공인 ip 정보가 들어갔는지 확인한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ubuntu@master:~$ sudo kubectl -n kube-system get secrets/k3s-serving -o yaml 
apiVersion: v1
data:
  tls.crt: ...
  tls.key: ...
kind: Secret
metadata:
  annotations:
    listener.cattle.io/cn-__1-f16284: ::1
    listener.cattle.io/cn-10.0.0.167: 10.0.0.167
    listener.cattle.io/cn-10.43.0.1: 10.43.0.1
    listener.cattle.io/cn-127.0.0.1: 127.0.0.1
    listener.cattle.io/cn-xxx.xxx.xxx.xxx: xxx.xxx.xxx.xxx   <--- 들어갔다면 성공!
    listener.cattle.io/cn-kubernetes: kubernetes
    listener.cattle.io/cn-kubernetes.default: kubernetes.default
    listener.cattle.io/cn-kubernetes.default.svc: kubernetes.default.svc
    listener.cattle.io/cn-kubernetes.default.svc.cluster.local: kubernetes.default.svc.cluster.local
    listener.cattle.io/cn-localhost: localhost
    listener.cattle.io/cn-master: master
    ...

다시 로컬 환경에서 kubectl이 동작하는지 확인한다.

1
2
3
4
5
solver@solver:~$ kubectl get node -o wide
NAME      STATUS   ROLES                  AGE   VERSION        INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
master    Ready    control-plane,master   87m   v1.25.4+k3s1   10.0.0.167    <none>        Ubuntu 22.04.1 LTS   5.15.0-1021-oracle   containerd://1.6.8-k3s1
worker1   Ready    <none>                 86m   v1.25.4+k3s1   10.0.0.47     <none>        Ubuntu 22.04.1 LTS   5.15.0-1021-oracle   containerd://1.6.8-k3s1
worker2   Ready    <none>                 86m   v1.25.4+k3s1   10.0.0.237    <none>        Ubuntu 22.04.1 LTS   5.15.0-1021-oracle   containerd://1.6.8-k3s1

reference

This post is licensed under CC BY 4.0 by the author.

-

vscode custom snippets 설정