728x90

컨테이너 오케스트레이션

컨테이너 오케스트레이션은 컨테이너를 사용하는 라이프사이클을 자동화한다. 쿠버네티스 뿐만 아니라, 도커의 swarm이나 미니 쿠버 등 여러 종류가 존재한다.

다음은 CentOS7, 8에서 Kubernetes 1.22.5 버전을 설치하는 방법이다. 따라만 하면 다 된다!

공식 설치 가이드

 

쿠버네티스 설치 순서

설치 전 사전 작업 (모든 노드 공통)

yum update -y 후 systemctl 명령어가 안 먹는다면 다음 명령어 입력 kill -TERM 1

 

1. Linux Hostname 변경

Control plane(이하 마스터) 노드와 Worker 노드들의 Linux hostname을 각각 다르게 변경해 준다. 호스트 네임이 같을 경우, 설치에 문제가 생길 수 있다.

hostnamectl set-hostname [사용할 호스트명]

테스트 환경 내역

Hostname IP
master 10.100.31.110
worker1 10.100.31.111
worker2 10.100.31.112
worker3 10.100.31.113

다 변경했다면, 본인의 환경에 맞추어 /etc/hosts 파일을 편집해 준다.

cat <<EOF >> /etc/hosts
10.100.31.110 master
10.100.31.111 worker1
10.100.31.112 worker2
10.100.31.113 worker3
EOF

 

2. Swap 비활성화

kubelet이 제대로 작동하게 하려면 반드시 swap을 사용하지 않도록 설정해야 한다. swap은 메모리 내부 공간이 부족할 경우 하드 디스크의 공간을 메모리 역할로 활용하는 기술이다. 1.21 버전까지는 swap 메모리 사용을 지원하지 않았으나, 1.22 버전에서 swap memory를 사용할 수 있도록 지원이 추가되었으나, 아직 정식 출시되지 않았기 때문에 꺼 주기로 하자. 관련 문서

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

 

3. iPtable 트래픽 설정

리눅스 커널의 iptables가 브리지된 트래픽을 볼 수 있도록 커널을 수정해 준다. iptables와 netfilter의 작동 원리를 알면 좋다.

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

lsmod | grep br_netfilter 명령어를 통해 br_netfilter 모듈이 로드되었는지 확인할 수 있다. 로드되지 않았다면 modprobe br_netfilter 명령어를 쳐 보자.

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

sysctl 구성에서 net.bridge.bridge-nf-call-iptables가 1로 설정되어 있는지도 확인해야 한다.

 

4. 방화벽 확인

별도 방화벽이 존재할 경우 firewall을 disable 해 준다. 필수로 열어야 하는 포트는 미리 확인 후 오픈이 필요하다. 관련 포트

systemctl stop firewalld 
systemctl disable firewalld

 

5. SELinux permissive mode로 변경

sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

리눅스의 보안 관련 설정을 꺼 준다. getenforce 명령어로 확인 가능하다.

 

6. Docker 설치

이전 게시글을 참고해서 모든 노드에 Docker 설치해 준다.

 

kubeadm, kubelet, kubectl 설치

* kubeadm: 클러스터를 부트스트랩하는 명령
* kubelet: 클러스터의 모든 머신에서 실행되는 파드와 컨테이너 시작과 같은 작업을 수행하는 컴포넌트
* kubectl: 클러스터와 통신하기 위한 커맨드 라인 유틸리티

 

1. kubernetes 설치를 위한 리포지토리 설정

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

 

2. 1.22.5 버전 설치

다른 버전 설치시 숫자만 바꿔 주면 된다.

sudo yum install -y kubelet-1.22.5 kubeadm-1.22.5 kubectl-1.22.5 --disableexcludes=kubernetes

최신 버전은 아래의 명렁어로 설치하면 된다. 다만 안정성을 위해 추천하지 않는다.

sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

 

3. 서비스 실행

sudo systemctl enable --now kubelet
sudo systemctl start kubelet
sudo systemctl status kubelet
# 참고: 서비스에 등록하고 실행하려면
systemctl daemon-reload
systemctl restart kubelet
systemctl enable kubelet

 

4. cgroup driver 설정

그냥 설치하게 되면 도커에서 사용하는 cgroup manager과 쿠버네티스에서 사용하는 게 다르기 때문에 충돌이 생긴다. 도커는 기본적으로 cgroupfs를 사용하고, 쿠버네티스는 systemd를 사용한다. docker의 config 파일을 수정해서 해결하는 방법과, k8s의 yaml을 파일로 우회하는 방법이 있다. 여기에서는 docker의 config 파일을 수정해 주겠다. 관련 문서

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

설정을 마쳤으면, docker를 다시 시작해 준다.

sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

 

kubeadm으로 클러스터 생성

설치가 완료되었다면, 클러스터를 구성한다. 관련 문서

 

1. 마스터 노드에서 초기화 실행

컨트롤 플래인 컴포넌트가 작동하기 위해 초기화를 해 준다. 필요에 따라 관련 문서에서의 선택 옵션들을 추가해 준다. 기본 명령어는 아래와 같으나, 아래 명령어는 반드시 마스터 노드에서만 실행한다.

kubeadm init

혹시나 해당 명령어를 워커 노드에서 실행하였거나, 초기화가 제대로 안 되었을 시 다음 명령어로 리셋이 가능하다.

kubeadm reset

 

정상적으로 초기화를 마치면 하단에 다음과 같은 명령어가 뜬다.

더보기
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

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

You can now join any number of machines by running the following on each node
as root:

  kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

특히 마지막 줄은 worker node에서 클러스터에 join할 수 있는 token값이 포함된 명령어인데, 이를 파일로 저장해 두면 좋다. 해당 토큰은 24시간 동안 유효하며, 노드 중설 시에는 토큰을 새로 생성해야 한다.

워커 노드에서 클러스터에 조인하는 명령어는 다음과 같다.

kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

 

2. 마스터 노드에서 kubectl 명령어를 사용하기 위한 설정

Linux의 root에서 실행시 아래처럼 환경 변수에 등록해 준다.

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

일반 유저 사용 시에는 권한 설정이 필요하다.

# ex) guru 계정에서 kubectl 명령어 사용 권한을 줄 때
mkdir -p ~guru/.kube
sudo scp master:/etc/kubernetes/admin.conf ~guru/.kube/config
sudo chown guru:guru ~guru/.kube/config

 

3. 마스터 노드에서 CNI 설치

CNI(Container Network Interface)는 Pod가 생성, 삭제될 때 호출되는 API의 규격과 인터페이스 등을 정의한다. 호스트에 VxLAN 생성 Overlay Network 구성, 호스트마다 IP, Subnet을 할당해 주고 Pod ID 부여해 주는 등 많은 역할을 한다.

CNI에는 플라넷, 위브넷, 칼리코 등이 있는데 각 환경에 맞는 CNI를 선택하여 사용하면 된다.

 

참고) centos8에서 Trident를 설치 시 CNI를 calico로 설치하면 오류난다. weave net으로 설치했을 시 정상 작동하였다.

 

* calico 설치 관련 문서

curl https://docs.projectcalico.org/manifests/canal.yaml -O
kubectl apply -f canal.yaml

* weave net 설치 관련 문서

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

CNI 설치 후 /etc/cni/net.d에서 CNI config 파일 확인이 가능하다.

 

 

4. 워커 노드에서 cluster join

초기화 후 저장해 두었던 kubeadm join 명령어를 각 워커 노드에서 실행한다.

kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

 

설치가 완료되었다면 다음 명령어로 클러스터 구성이 제대로 되었는지 확인 가능하다. Ready 상태면 정상적으로 클러스터 구성도 완료된 것이다.

[root@master /]# kubectl get nodes
NAME      STATUS   ROLES                  AGE    VERSION
master    Ready    control-plane,master   125m   v1.22.5
worker1   Ready    <none>                 117m   v1.22.5
worker2   Ready    <none>                 117m   v1.22.5
worker3   Ready    <none>                 117m   v1.22.5

[root@master /]# kubectl cluster-info
Kubernetes control plane is running at https://10.100.31.110:6443
CoreDNS is running at https://10.100.31.110:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

 

Shell 자동 완성 활성화

명령어를 칠 때 tap 키를 통해 자동 완성을 하기 위해서는 패키지를 설치해야 한다. 관련 문서

yum install bash-completion
echo 'source <(kubectl completion bash)' >>~/.bashrc
kubectl completion bash >/etc/bash_completion.d/kubectl
728x90