[kubernetes] 쿠버네티스 설치하기

2해승·2024년 7월 10일

쿠버네티스?!

목록 보기
3/16

지난 시간에는 로컬 환경에 실습과 테스트를 위한 경량 쿠버네티스를 설치해보았다. 이번에는 본격적으로 쿠버네티스를 설치하고 구성하기까지의 과정을 정리해보겠다.

설치 전 환경 설정

쿠버네티스 실습 환경 구성

우선 쿠버네티스 노드를 구성하기 앞서 이전에 활용해봤던 multipass를 가지고 VM을 올려줄 것이다.

쿠버네티스 공식 문서에서는 쿠버네티스를 사용하기 위해서 최소한의 사양을 지정해주는데 그에 맞춰 VM을 생성해주어야한다.

  • 2 GB or more of RAM per machine (any less will leave little room for your apps).
  • 2 CPUs or more.
    kubernetes.io
$ multipass launch --name k8s-master --cpus 2 --memory 4G --disk 5G jammy
$ multipass launch --name k8s-node1 --cpus 2 --memory 2G --disk 5G jammy
$ multipass launch --name k8s-node2 --cpus 2 --memory 2G --disk 5G jammy

$ multipass list
Name                    State             IPv4             Image
k8s-master              Running           192.168.64.9     Ubuntu 22.04 LTS
k8s-node1               Running           192.168.64.7     Ubuntu 22.04 LTS
k8s-node2               Running           192.168.64.8     Ubuntu 22.04 LTS

master, node1, node2 공통 설치 및 환경 설정

기본 환경 설정

# Swap disable & Disabling Swaps on Reboot
$ swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab

# Letting iptables see bridged traffic & Apply kernel parameters
$ cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sysctl --system

# Disable firewall
$ systemctl stop ufw
# systemctl disable ufw

방화벽의 경우 편리함을 위해 비활성화 시켜놨지만 쿠버네티스 공식문서에서 친절하게 필요한 port를 명시해준다.

링크를 참고하시오. >> Ports and Protocols

도커 설치

기본적인 환경 설정이 끝났다면 각 노드들에 도커를 설치해주자. 참고로 나는 공식문서에서 제공되는 순서를 그대로 따라 했다.

# Add Docker's official GPG key:
$ sudo apt-get update
$ sudo apt-get install ca-certificates curl
$ sudo install -m 0755 -d /etc/apt/keyrings
$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
$ sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update

# Install docker package
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 설치 확인
$ docker version

kubeadm, kubectl, kubelet 설치

$ sudo apt-get update

# Download the public signing key
$ curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# Add Kubernetes apt repository
$ echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

# Update the apt package index, install kubelet, kubeadm and kubectl, and pin their version
$ sudo apt-get update
$ sudo apt-get install -y kubelet kubeadm kubectl
$ sudo apt-mark hold kubelet kubeadm kubectl

# Enable the kubelet service before running kubeadm
$ systemctl start kubelet && systemctl enable kubelet

쿠버네티스 클러스터 생성

master node 구성 (kubeadm init & Installing a Pod network add-on)

클러스터를 생성하면 마지막에 나오는 kubeadm 명령어를 잘 복사해서 보관하고 있어야한다. 해당 명령어는 나중에 워커 노드들이 마스터에 join하기 위해 필요하다!

# Kubernetes control-plane initialize
$ kubeadm init
.
.
.
kubeadm join 192.168.64.9:6443 --token <token> \
	--discovery-token-ca-cert-hash <cert-hash>
    
    
# Settings for writing kubectl commands
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

만일 root가 아닌 다른 일반 계정에서도 kubectl 명령어를 사용하고 싶다면 동일하게 위의 과정을 진행하면 된다. 사실 나는 sudo를 매번 붙이는게 귀찮아서 root 계정에서 설정하고 있다.

쿠버네티스 pod 네트워크 구성을 하기위해 CNI 설치가 필요하다. CNI에는 여러 종류가 있으며 그 중에서 Weave Net을 설치했다.

# Installing a Pod network add-on
$ kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml

네트워크 구성이 완료되면 NotReady -> Ready로 변경되는 것을 확인할 수 있다.

$ kubectl get nodes // 네트워크 구성 전
NAME         STATUS     ROLES           AGE     VERSION
k8s-master   NotReady   control-plane   2m36s   v1.30.2

$ kubectl get nodes // 네트워크 구성 후
NAME         STATUS   ROLES           AGE     VERSION
k8s-master   Ready    control-plane   4m21s   v1.30.2

worker node 구성

kubeadm init이 끝나고 메모해두었던 join 명령어를 실행해준다.

kubeadm join 192.168.64.9:6443 --token <token> \
	--discovery-token-ca-cert-hash <cert-hash>

마스터 노드에서 kubectl 명령어로 구성이 잘 됐는지 확인해준다.

$ kubectl get nodes -o wide
NAME         STATUS   ROLES           AGE     VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
k8s-master   Ready    control-plane   15m     v1.30.2   192.168.64.9   <none>        Ubuntu 22.04.4 LTS   5.15.0-113-generic   containerd://1.7.18
k8s-node1    Ready    <none>          9m53s   v1.30.2   192.168.64.7   <none>        Ubuntu 22.04.4 LTS   5.15.0-113-generic   containerd://1.7.18
k8s-node2    Ready    <none>          9m27s   v1.30.2   192.168.64.8   <none>        Ubuntu 22.04.4 LTS   5.15.0-113-generic   containerd://1.7.18

※기타※

트러블 슈팅

kubeadm 혹은 kubectl get nodes 할 경우 종종 발생하는 에러가 있다.

[ERROR CRI]: container runtime is not running: output: time="2024-07-10T12:03:04+09:00" level=fatal msg="validate service connection: validate CRI v1 runtime API for endpoint \"unix:///var/run/containerd/containerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"
, error: exit status 1

대충 요론 에러인데 containerd를 재시작 해주는 것으로 금방 해결할 수 있다.

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

kubectl 자동완성 기능 추가

kubectl 명령어를 사용하다보면 처음부터 끝까지 다 수동으로 적어야할때 정말 귀찮을 수 있다. 시스템 상에 등록해주고 편리하게 쿠버네티스를 사용할 수 있다.

source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
profile
주니어 데브옵스 엔지니어

0개의 댓글