[Kubernetes] 시작 및 설치

쿠버네티스는 자체 클라우드를 구성할 수 있게 해주는 컨테이너 기반 플랫폼이다.

컨테이너의 제어를 포함한 서비스의 전반적인 관리 기능을 제공해주는 플랫폼이고, 도커의 상위호환이라 보면 된다.
처음에는 도커를 기반으로 레이어를 올려 만들어졌으나, 지금은 도커를 버리고 나아가고 있다.

웬만한 대기업들은 다 이 쿠버네티스로 자체 인프라를 구축해 사용중이다. 잘 활용하는게 어렵고, 또 잘 하는 사람도 그리 많지는 않다.

본 포스트에서는 기본 도구 설치만 다뤄보겠다.




설치하기 in Linux (kubeadm, kubelet, kubectl)

설치는 다음과 같이 수행할 수 있다.

쿠버네티스를 제대로 세팅하기 위해서는, kubeadm, kubelet, kubectl 3가지의 시스템을 설치해야 한다.

먼저 kubeadm은 쿠버네티스 클러스터를 초기 구축해주는 도구고, kubelet은 컨테이너를 띄워주는 도구다.
그리고 kubectl이 쿠버네티스에 접속할 수 있는 클라이언트 도구로, 통상적으로 가장 자주 사용하게 될 녀석이다.

저 3가지를 한번에 받는 방법은 다음과 같다.
저걸 순서대로 다 넣어서 실행해주자.

CNI_VERSION="v0.8.2"
sudo mkdir -p /opt/cni/bin
curl -L "https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-linux-amd64-${CNI_VERSION}.tgz" | sudo tar -C /opt/cni/bin -xz
DOWNLOAD_DIR=/usr/local/bin
sudo mkdir -p $DOWNLOAD_DIR
CRICTL_VERSION="v1.17.0"
curl -L "https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-amd64.tar.gz" | sudo tar -C $DOWNLOAD_DIR -xz
RELEASE="v1.24.17" # 원하는 버전이 있다면 여기 할당
cd $DOWNLOAD_DIR
sudo curl -L --remote-name-all https://storage.googleapis.com/kubernetes-release/release/${RELEASE}/bin/linux/amd64/{kubeadm,kubelet,kubectl}
sudo chmod +x {kubeadm,kubelet,kubectl}

RELEASE_VERSION="v0.4.0"
curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubelet/lib/systemd/system/kubelet.service" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /etc/systemd/system/kubelet.service
sudo mkdir -p /etc/systemd/system/kubelet.service.d
curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubeadm/10-kubeadm.conf" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
 sudo systemctl enable --now kubelet

그래서 각자 잘 실행된다면 잘 깔린 것이다.




설치하기 in Linux (kubectl만)

쿠버네티스가 이미 구축되어있어서 kubectl만 깔면 된다면 다음과 같이 하면 된다.
curl로 파일 받고, install로 설치하면 된다.

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

그래서 이렇게 실행되면 잘 깔린 것이다.




컨테이너 런타임 설정

쿠버네티스는 내부적으로 어떤 컨테이너 형식을 쓸 것인지 정해서 쓸 수 있다.

현재는 containerd, CRI-O, 도커의 3가지 형식을 지원하는데, 가장 권장하는건 CRI-O인듯하다.
뭘 사용해도 문제는 없다.




컨테이너 런타임: 도커

도커를 사용할 경우엔 다음 명령을 추가로 수행해줘야 한다. 도커도 당연히 이미 깔려있어야 한다.

sudo mkdir /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker



컨테이너 런타임: containerd

별도 포스트를 참조한다.
https://blog.naver.com/sssang97/223012990001




컨테이너 런타임: CRIO

crio를 사용할 경우는 다음과 같다.
나는 crio를 선택했다.

# Create the .conf file to load the modules at bootup
cat <<EOF | sudo tee /etc/modules-load.d/crio.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# Set up required sysctl params, these persist across reboots.
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

sudo sysctl --system

저걸 다 돌려주고 나서

환경변수로 OS와 쿠버네티스 버전을 임시로 넣어준다.

쿠버네티스 버전은 도구 아무걸로나 버전 찍어보면 나오는데, 마이너버전은 떼서 넣는다.

OS 값은 저기에서 조회해서 맞춰보면 된다.
https://kubernetes.io/docs/setup/production-environment/container-runtimes/#cri-o

그래서 이렇게 넣어주고

아래 명령들을 추가로 수행해주면 된다.

cat <<EOF | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /
EOF
cat <<EOF | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.list
deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/ /
EOF

curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/Release.key | sudo apt-key --keyring /etc/apt/trusted.gpg.d/libcontainers.gpg add -
curl -L https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$VERSION/$OS/Release.key | sudo apt-key --keyring /etc/apt/trusted.gpg.d/libcontainers-cri-o.gpg add -

sudo apt-get update
sudo apt-get install cri-o cri-o-runc
sudo systemctl daemon-reload
sudo systemctl enable crio --now

그렇다.




kubeadm으로 구성 초기화

이 단계만 해주면 클러스터 기본 구성은 되는 것이다.

아래 코드 돌려줘서 불순물들 좀 처리하고

# 스왑 끄기
sudo swapoff -a 

sudo modprobe br_netfilter

sudo echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
sudo echo 1 > /proc/sys/net/ipv4/ip_forward

초기화용 yaml 파일을 만든다.

# kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
nodeRegistration:
  criSocket: "unix:/var/run/crio/crio.sock"
---
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
kubernetesVersion: v1.24.17
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd

이건 crio를 사용할 경우의 예제다.

그리고 아래 커맨드로 실행하면

sudo kubeadm init --config kubeadm-config.yaml --ignore-preflight-errors=FileExisting-conntrack

약간의 딜레이와 함께 처리가 된다.

오류 없이 성공했다면, 아래 스크립트만 돌리면 끝이다.

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

그래서 이런식으로 접속이 되면 기본 세팅은 된 것이다.

만약 저기서 Status가 NotReady로 뜬다면 다음 포스트를 참고한다.
https://blog.naver.com/sssang97/223326157138




참조
https://kubernetes.io/ko/docs/setup/production-environment/container-runtimes/
https://kubernetes.io/ko/docs/setup/_print/#pg-a16f59f325a17cdeed324d5c889f7f73