Kubernetes 환경 구축 ( Ubuntu ) - 1

2024. 1. 4. 15:27Technology[DevOps]

[ 이번 게시글에서 구현할 사항 ]

- Kubernetes 환경을 구축합니다.

Kubernetes 환경 구축 효과

- Traffic Management : AutoScaling & LoadBalancing
- Non Stop Deploy : Rolling Update
- State Management : Pod Health Check
- Resource Management : Pod Resource Allocation
- Single Point of Failure Management : ReplicationController / ReplicaSet
- API Gateway (single Endpoint) : Ingress Controller

저장소 설정

Docker 설치를 위해 먼저 apt 패키지를 업데이트한다. 

sudo apt-get update
 
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

 

Docker’s 공식 GPG key 추가하기 위해 다음 절차를 진행한다. 

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

 

Stable repository 설정을 위해 다음 명령을 수행한다. 

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 > /dev/null

 

Docker 엔진 설치

최신 버전의 Docker Engine 및 containerd를 설치하기 위해 다음 명령을 수행한다. 

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

 

설치가 완료되면 Docker 버전 확인한다. 

sudo docker version

 

설치된 버전

  • Client: Docker Engine - Community
    • Version: 20.10.13
  • Server: Docker Engine - Community
    • Version: 20.10.13

Docker를 서비스 등록 및 실행하기 위해 다음을 수행한다. 

sudo systemctl enable docker
sudo systemctl start docker

 

- windows WSL 환경에서 systemctl  명령어가 동작하지 않는 경우 sudo service docker start 명령어 사용

Kubernetes 설치

Docker 설치가 완료되었다면 kubernetes 설치를 진행한다. k8s는 kubeadmin을 통해 설치를 진행할 수 있다. 

설치 전 확인 사항 (master, node)

각 노드들은 Swap Disable 해야하기 때문에 각 노드별로 다음 명령을 통해 설정한다. 

swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab
 
혹은
 
sudo swapoff -a && sudo sed -i '/swap/s/^/#/' /etc/fstab

 

그리고 iptable 설정하기 위해 다음 명령을 수행한다. 

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
 
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sudo sysctl --system

 

통신을 위해 방화벽 예외 설정을 수행한다. 

sudo systemctl stop firewalld
sudo systemctl disable firewalld

 

kubelet, kubeadm, kubectl 설치 (master, node)

쿠버네티스 설치를 진행하기위해 저장소 업데이트 및 필수 패키지 추가한다.

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

 

구글 클라우드 퍼블릭 키 다운로드를 수행한다. 

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

 

쿠버네티스를 설치하기 위해 Kubernetes 저장소 추가한다. 

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

 

저장소 업데이트 후 kubelet, kubeadm, kubectl 설치를 순차적으로 진행한다. 

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

 

쿠버네티스를 서비스 등록 및 재시작을 수행한다. 

sudo systemctl daemon-reload
sudo systemctl restart kubelet

 

/etc/containerd/config.toml 파일을 수정합니다.

vi /etc/containerd/config.toml

 

위 파일에서 disabled_plugin -> enabled_plugin 으로 변경해줍니다. 이후 containerd service를 재시작합니다.

systemctl restart containerd

 

/proc/sys/net/ipv4/ip_forward값을 1로 설정합니다.

vi /etc/sysctl.conf

 

위 파일에서 net.ipv4.ip_forward=1행의 주석을 제거합니다. 이후 아래 명령어를 실행해 적용합니다.

sysctl -p

Control-plane 구성 (master only)

contol-plane 노드 초기화 - 해당 작업은 반드시 master에서만 진행한다. 

sudo kubeadm init --pod-network-cidr=192.168.0.0/16

 

default pod-network-cidr를 192.168.0.016로 지정

 

위 kubeadm join 구문을 추후 worker node에서 실행

 

모든 사용자가 kube 명령어를 사용할 수 있게 하기 위해 다음을 설정한다.

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

Pod network 애드온 설치 (master only)

Pod 간의 네트워크 통신 위해 다음 명령을 통해 써드파티 애드온인 Calico 3.24.1 버전 설치 수행한다. 

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/tigera-operator.yaml

 

kube 디렉토리 생성 및 이동

mkdir /kube && cd /kube

 

calico custom yaml 파일 생성 후 아래 파일의 내용으로 수정 후 저장

vi calico-resources.yaml

 

calico-resources.yaml
0.00MB

 

kubernetes 환경에 calico-resources.yaml 파일 적용

kubectl create -f calico-resources.yaml

 

containerd 서비스 재시작

systemctl restart containerd

 

Node 연결 (worker only)

앞서 control plane에서 kubeadm init 할 때 출력된 kubeadm join 명령어를 Worker Node 환경에서 실행

Control Plain

연결된 전체 노드를 출력했을 때

아래와 같이 control-plane과 worker node가 STATUS Ready 상태로 정상적으로 연결됨을 확인

kubectl get nodes

 

현재 실행되고 있는 전체 pod의 리스트를 출력했을 때

아래와 같이 전체 pod의 STATUS 가 Running 상태로 정상적으로 실행됨을 확인

kubectl get pods --all-namespaces

 

- CLI calico의 BIRD 통신이 안될 경우 : 179번 포트 허용 필요

ufw allow 179/tcp

 

- kubectl get nodes 로 노드의 상태를 봤을 때 NotReady 상태인 경우 apparmor 서비스 중지 필요

systemctl stop apparmor

systemctl disable apparmor

systemctl restart containerd

 

- 0/2 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }, 1 node(s) had untolerated taint {node.kubernetes.io/unreachable: }. preemption: 0/2 nodes are available: 2 Preemption is not helpful for scheduling.. → taint의 문제가 발생한다면 node의 taint 재설정 필요

kubectl taint nodes --all node-role.kubernetes.io/control-plane-