라즈베리파이엔 k3s 쓰세요

12
post-thumbnail

짧고 굵게 직관적으로

k3s 설치

# Control Plane
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server" sh -s - --token <token>

# Worker
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="agent --server https://<control plane IP>:6443 --token <token>" sh -s -

k8s 설치

너무 기니깐 맨 아래에 넣어두겠음
(대충 100줄 넘어가니 맨 아래로 밀었음)

공식 문서대로 진행해도 제대로 안될 가능성이 높기도 하고
각자의 환경에 따라 변수가 많다보니
직접 설치해보면 진짜 ㅈ같음

직접 라즈베리파이에 k8s 설치해본 글들 보면
온갖 똥꼬쇼를 방불케 하는 삽질 끝에
설치를 해낸 사람들을 보실 수 있습니다.

직접 써본 소감

Lightweight k8s를 표방하는게 k3s입니다.

k3s는 control plane이랑 worker에 각각 저거 한 줄만 넣어줘도
설치부터 연동까지 알아서 다 해줍니다.

요단강 익스프레스라는 연합우주 ActivityPub 서버를
이렇게 구성한 k3s 클러스터에서 운영중인데
ActivityPub 연합우주란 대충 마스토돈같은거, 모르겠으면 대충 X같은거... 엄... 트위터 같은거

가벼워서 CPU, Memory 차지도 많이 안하고
안정적으로 잘 운영되고 좋습니다.

주의사항이 있는데

etcd 대신 sqlite가 기본세팅

etcd를 쓰도록 만들 수도 있는데
k3s의 etcd 문서를 보면

Embedded etcd (HA) may have performance issues on slower disks such as Raspberry Pis running with SD cards.
(대충 SD카드 같은거 쓰는데서는 etcd쓰면 문제가 생길 수 있다는 뜻)

IO 속도땜에 이슈가 있다는건데
그래서 etcd 대신 sqlite로 세팅 되는 듯
속도도 이슈지만 SD카드는 수명도 그리 길지 않아서
무리가 가는 작업은 피하는게 좋긴 합니다.
(SD카드 수명 다해본적 있는데 쓰기 작업이 안됨. 계속 마지막 상태로 돌아감)

traefik이 기본으로 설치됨

traefik 이란게 기본적으로 같이 딸려서 설치가 되는데
ingress-nginx 밖에 써본적이 없던지라 빼고 갈아끼울까 했는데

Lightweight를 장점으로 내세우는 k3s가
traefik을 기본으로 넣어주는덴 이유가 있겠지 하고 그대로 써보기로 했습니다.

ingress-nginx랑 사용법이 달라서 좀 삽질을 했는데
제가 구성한 yaml을 예시로 참고하시면
어렵지 않게 traefik을 이용하실 수 있을듯 합니다.
덤으로 Cert Manager 구성까지 보실 수 있다능

총평은 매우 만족

  • 라즈베리파이5 8GB (Control Plane)
  • 라즈베리파이4B 8GB (Worker)

이렇게 두 대로 구성해서 쓰고있는데,
아직까지 아무 이슈 없고 만족스럽게 쓰고있습니다.

대충 ArgoCD로 올려서 보면 이렇습니다.
DB 백업 해서 클라우드로 보내고
클라우드의 스토리지를 마운트 해서 쓰고 그런 구성이 있는데
여기서 다 언급하기엔 주제가 흐려지므로 다음에 쓰도록 하겠습니다.

이 아래는 맨 처음에 언급했던
"너무 길어서 k8s 설치는 맨 마지막에 써놓겠다"
했던 부분입니다. 필요하신 분 아니면 대충
아 이렇게 길구나 정도로 넘겨주시면 됩니다.

조낸 긴 k8s 설치

이 아래는 아까 너무 기니까 마지막에 쓰겠다 한 k8s 직접 설치 부분입니다.
필요한거 아니면 굳이 읽어보진 마시고
"아... k8s 직접 설치하면 조낸 힘들구나..."
정도로 보시면 됩니다.

근데 그대로 붙여넣어도 실패할 수 있음

# Install k8s with containerd
tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF

modprobe overlay
modprobe br_netfilter

tee /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system

apt-get update -y
apt-get install -y apt-transport-https curl gnupg2 software-properties-common ca-certificates

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | gpg --dearmor -o /etc/apt/trusted.gpg.d/google-cloud.gpg
apt-add-repository -y "deb http://apt.kubernetes.io/ kubernetes-xenial main"

apt-get update -y
apt-get install -y containerd.io kubeadm kubelet kubectl kubernetes-cni

containerd config default | tee /etc/containerd/config.toml >/dev/null 2>&1
sed -i "s/SystemdCgroup = false/SystemdCgroup = true/g" /etc/containerd/config.toml

systemctl restart containerd
systemctl enable containerd

# init kubeadm
kubeadm init --apiserver-advertise-address "$1" > /home/vagrant/kubeadm-init.log
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
chown $(id -u):$(id -g) /etc/kubernetes/admin.conf
export KUBECONFIG=/etc/kubernetes/admin.conf
kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
kubectl label nodes master node-role.kubernetes.io/master=

# fix kubelet cert
apt-get install -y golang-cfssl
mkdir $HOME/certs
cp /etc/kubernetes/pki/ca.crt $HOME/certs/ca.pem
cp /etc/kubernetes/pki/ca.key $HOME/certs/ca.key

echo "{
  \"CN\": \"kubernetes\",
  \"hosts\": [
    \"127.0.0.1\",
    \"$1\",
    \"kubernetes\",
    \"kubernetes.default\",
    \"kubernetes.default.svc\",
    \"kubernetes.default.svc.cluster\",
    \"kubernetes.default.svc.cluster.local\"
  ],
  \"key\": {
    \"algo\": \"rsa\",
    \"size\": 2048
  },
  \"names\": [{
    \"C\": \"US\",
    \"ST\": \"NY\",
    \"L\": \"City\",
    \"O\": \"Org\",
    \"OU\": \"Unit\"
  }]
}" > $HOME/certs/kubelet-csr.json

echo '{
  "signing": {
    "default": {
      "expiry": "8760h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
          "signing",
          "key encipherment",
          "server auth",
          "client auth"
        ],
        "expiry": "8760h"
      }
    }
  }
}' > $HOME/certs/ca-config.json

echo '{
  "signing": {
    "default": {
      "expiry": "168h"
    },
    "profiles": {
      "www": {
        "expiry": "8760h",
        "usages": [
          "signing",
          "key encipherment",
          "server auth"
        ]
      },
      "client": {
        "expiry": "8760h",
        "usages": [
          "signing",
          "key encipherment",
          "client auth"
        ]
      }
    }
  }
}' > $HOME/certs/config.json

cfssl gencert -ca=$HOME/certs/ca.pem -ca-key=$HOME/certs/ca.key --config=$HOME/certs/ca-config.json -profile=kubernetes $HOME/certs/kubelet-csr.json | cfssljson -bare $HOME/certs/kubelet

cp $HOME/certs/kubelet.pem /var/lib/kubelet/pki/kubelet.crt
cp $HOME/certs/kubelet-key.pem /var/lib/kubelet/pki/kubelet.key
systemctl restart kubelet

# control plane 노드에서 아래 명령어 입력
cat kubeadm-init.log
# 각각의 worker node에 가서 위의 결과물을 sudo 권한으로 붙여넣기

# worker 등록
sudo kubectl label nodes worker1 node-role.kubernetes.io/worker= &&\
sudo kubectl label nodes worker2 node-role.kubernetes.io/worker=
profile
지상 최강의 개발자 쥬니니

4개의 댓글

comment-user-thumbnail
2024년 8월 30일

썸네일만 보면 k8s 가 더재밌어보이네요 ㅋㅋㅋㅋ

1개의 답글
comment-user-thumbnail
2024년 8월 31일

👍🏿👍🏿👍🏿👍🏿👍🏿

답글 달기
comment-user-thumbnail
2024년 10월 30일

Experience the best of both worlds with Tez888, India’s premier destination for thrilling online experiences. From cricket and football to dynamic games and interactive challenges, Tez888 provides a secure, exhilarating, and immersive environment. Play smart, make confident choices, and elevate your experience with our diverse range of gaming options! Discover more at: https://tez888in.in

답글 달기