k8s

Mac M2 UTM k8s 로컬 환경 구성

089 2023. 11. 23. 18:25

UTM에 Ubuntu 설치하는 내용은 없습니다. 구글링하시면 많이 나와요

 

UTM의 Ubuntu 20.04로 로컬 환경을 구축하였다.

마스터 노드 이외의 세팅은 모든 노드에 적용되어야 한다.
총 세개의 노드로 구성하였다.
Master
worker1 
worker2

 

  1. swap memory off
    https://askubuntu.com/questions/214805/how-do-i-disable-swap

모든 노드에서 진행한다

sudo swapoff -a # 현재 시스템에 적용(리부팅하면 재설정 필요)
sudo sed -i '/ swap / s/^\\(.*\\)$/#\\1/g' /etc/fstab # 리부팅 필수

위와 같이 swap 메모리를 off 해주고 kubernetes 설치를 진행한다.

컨테이너 런타임 구성

# Using Docker Repository
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list

# containerd 설치
sudo apt update
sudo apt install -y containerd.io
# sudo systemctl status containerd # Ctrl + C를 눌러서 나간다.

# Containerd configuration for Kubernetes
cat <<EOF | sudo tee -a /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
EOF

sudo sed -i 's/^disabled_plugins \=/\#disabled_plugins \=/g' /etc/containerd/config.toml
sudo systemctl restart containerd

# 소켓이 있는지 확인한다.
ls /var/run/containerd/containerd.sock

kubeadm, kubelet 및 kubectl 설치

모든 머신에 다음 패키지들을 설치한다.

  • kubeadm: 클러스터를 부트스트랩하는 명령이다. 클러스터를 초기화하고 관리하는 기능을 갖는다.
  • kubelet: 클러스터의 모든 머신에서 실행되는 파드와 컨테이너 시작과 같은 작업을 수행하는 컴포넌트이다. 데몬으로 동작하며 컨테이너를 관리한다.
  • kubectl: 클러스터와 통신하기 위한 커맨드 라인 유틸리티이다. 클라이언트 전용 프로그램이다.

모든 노드에서 다음 명령을 실행한다.

sudo mkdir /etc/apt/keyrings

cat < kube_install.sh
# 1. apt 패키지 색인을 업데이트하고, 쿠버네티스 apt 리포지터리를 사용하는 데 필요한 패키지를 설치한다.
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

# 2. 구글 클라우드의 공개 사이닝 키를 다운로드 한다.
curl -fsSL <https://packages.cloud.google.com/apt/doc/apt-key.gpg> | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg

# 3. 쿠버네티스 apt 리포지터리를 추가한다.
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] <https://apt.kubernetes.io/> kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

# 4. apt 패키지 색인을 업데이트하고, kubelet, kubeadm, kubectl을 설치하고 해당 버전을 고정한다.
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
EOF

sudo bash kube_install.sh

kubeadm 버전을 확인한다.

kubeadm version

넷필터 브릿지 설정

모든 노드에 다음 명령으로 넷필터 브릿지 설정

sudo -i
modprobe br_netfilter
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
exit

클러스터 구성

지금까지는 모든 노드에 실행되는 작업이 동일했다. 하지만 여기부터는 각 노드에서 작업하는 내용이 다르기 때문에 주의가 필요하다.

마스터 노드 초기화

마스터 노드에서 init 작업을 시작한다.

sudo kubeadm init

본인은 sudo kubeadm init 명령시 해당 에러가 발생하였다.

[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR IsPrivilegedUser]: user is not running as root
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

해결

sudo rm /etc/containerd/config.toml
sudo systemctl restart containerd

sudo rm /etc/containerd/config.toml
sudo apt update (이 명령어는 빠져도 될 것 같다. 기억이 안남)
sudo apt install -y containerd.io

sudo kubeadm init 명령어 입력 후 성공

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  <https://kubernetes.io/docs/concepts/cluster-administration/addons/>

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.64.10:6443 --token rh9fia.l2nm5bv9ar37vmlk \\
	--discovery-token-ca-cert-hash sha256:1fbf915d51e2702001ec197b5927ed6ce9776dd90462c4068451083109b6ed80

유저 설정

다음 명령을 실행하면 .kube/config 파일이 설정되면서 사용이 가능해진다. 이 실습은 마스터 노드에서만 진행한다.

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

인증 정보를 사용해 노드 목록을 확인한다.

$ kubectl get nodes
NAME       STATUS     ROLES           AGE   VERSION
master-1   NotReady   control-plane   5m    v1.26.0

워커 노드 조인하기

본인의 콘솔에 출력된 토큰과 hash 값을 사용해 조인을 수행해야 한다. 다음 명령은 워커 노드에서 실습을 진행한다.

kubeadm join 192.168.64.10:6443 --token rh9fia.l2nm5bv9ar37vmlk \\
	--discovery-token-ca-cert-hash sha256:1fbf915d51e2702001ec197b5927ed6ce9776dd90462c4068451083109b6ed80

마스터 노드에서 노드 목록을 조회한다.

$ kubectl get nodes
NAME       STATUS     ROLES           AGE     VERSION
master-1   NotReady   control-plane   7m55s   v1.26.0
worker-1   NotReady   <none>          14s     v1.26.0
worker-2   NotReady   <none>          23s     v1.26.0

💡 init이나 join을 잘못 수행한 경우 sudo kubeadm reset을 사용해 초기 설정으로 돌아갈 수 있다.

 

💡 token 재발급 받는 방법 (마스터 노드에서 실습)

  • 토큰 리스트 확인하기: sudo kubeadm token list
  • 토큰 재발급하기: sudo kubeadm token create --print-join-command

 

파드 네트워크 배포

마스터 노드에서 다음 명령을 실행하면 앞서 구성한 유저 설정을 통해 클러스터에 cilium을 설치한다.

https://kubernetes.io/docs/tasks/administer-cluster/network-policy-provider/cilium-network-policy/

!!!!!이거아님!!!!!
curl -LO <https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz>
sudo tar xzvfC cilium-linux-amd64.tar.gz /usr/local/bin
rm cilium-linux-amd64.tar.gz
cilium install

해당 명령어를 입력하니

ubuntu@master-1:~$ cilium install
bash: /usr/local/bin/cilium: cannot execute binary file: Exec format error

실행 중인 바이너리 파일이 시스템과 호환되지 않는 경우 발생하는 일반적인 에러 메시지가 발생했다.

 

 

해결

uname -m (시스템 아키텍처를 터미널에 출력)
lsb_release -a(시스템 운영 체제 정보를 출력)

내 아키텍처는 aarch64 였다..

sudo curl -LO <https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-arm64.tar.gz>
sudo tar xzvfC cilium-linux-arm64.tar.gz /usr/local/bin
sudo rm cilium-linux-arm64.tar.gz
cilium install

해당 명령어로 수정해서 install 하니 성공

VM Restart 이후 필수 실행 명령어

sudo -i
# swapoff
sudo swapoff -a
sudo sed -i '/ swap / s/^\\(.*\\)$/#\\1/g' /etc/fstab

# netfilter bridge configure

modprobe br_netfilter
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
exit