마짱짱의 지식창고

k8s containerd, kubeadm, calico 설치 본문

Kubernetes

k8s containerd, kubeadm, calico 설치

마짱짱 2024. 9. 2. 01:21
반응형

2022.03.23 - [Kubernetes] - [k8s] docker, kubeadm, Calico 설치 

해당 글이 더이상 현재와 맞지도않고..

집에서 공부환경을 다시 구성하면서 새롭게 가이드를 작성하였습니다.

시스템환경

Master 1대
Worker 3대

Applicaiton

Rocky9.4
kubeadm v1.30
Calico v3.28

기본세팅(공통)

root로 진행하도록 하겠습니다.

Swap Memory 끄기

swapoff -a
free -h

# /etc/fstab 영구 등록
sed -i '/swap/s/^/#/' /etc/fstab

Selinux 비활성화

편의를 위해 비활성화 하겠습니다.

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

각 서버별 이름 정의

hostnamectl set-hostname {Server_Name}
hostnamectl set-hostname k8s-master

/etc/hosts 추가작성

vi /etc/hosts

172.22.240.11 k8s-master
172.22.240.21 k8s-worker-1
172.22.240.22 k8s-worker-2
172.22.240.23 k8s-worker-3

kubeadm 방화벽 포트정보

컨트롤 플레인

프로토콜 방향 포트 범위 용도 사용 주체
TCP 인바운드 6443 쿠버네티스 API 서버 전부
TCP 인바운드 2379-2380 etcd 서버 클라이언트 API kube-apiserver, etcd
TCP 인바운드 10250 Kubelet API Self, 컨트롤 플레인
TCP 인바운드 10259 kube-scheduler Self
TCP 인바운드 10257 kube-controller-manager Self

etcd 포트가 컨트롤 플레인 섹션에 포함되어 있지만, 외부 또는 사용자 지정 포트에서 자체 etcd 클러스터를 호스팅할 수도 있습니다.

# 컨트롤 플레인 노드 방화벽 설정
sudo firewall-cmd --permanent --add-port=6443/tcp
sudo firewall-cmd --permanent --add-port=2379-2380/tcp
sudo firewall-cmd --permanent --add-port=10250/tcp
sudo firewall-cmd --permanent --add-port=10259/tcp
sudo firewall-cmd --permanent --add-port=10257/tcp

# 변경사항 적용
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

워커 노드

프로토콜 방향 포트 범위 용도 사용 주체
TCP 인바운드 10250 Kubelet API Self, 컨트롤 플레인
TCP 인바운드 30000-32767 NodePort 서비스† 전부
# 워커 노드 방화벽 설정
sudo firewall-cmd --permanent --add-port=10250/tcp
sudo firewall-cmd --permanent --add-port=30000-32767/tcp

# 변경사항 적용
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

CNI Calico 포트정보

구성 호스트(들) 연결 유형 포트/프로토콜
Calico 네트워킹 (BGP) 전체 양방향 TCP 179
Calico 네트워킹 (IP-in-IP 활성화, 기본) 전체 양방향 IP-in-IP (프로토콜 번호 4)
Calico 네트워킹 (VXLAN 활성화) 전체 양방향 UDP 4789
Calico 네트워킹 (Typha 활성화) Typha 에이전트 호스트 인바운드 TCP 5473 (기본)
Calico 네트워킹 (IPv4 Wireguard 활성화) 전체 양방향 UDP 51820 (기본)
Calico 네트워킹 (IPv6 Wireguard 활성화) 전체 양방향 UDP 51821 (기본)
flannel 네트워킹 (VXLAN) 전체 양방향 UDP 4789
전체 kube-apiserver 호스트 인바운드 종종 TCP 443 또는 6443*
etcd 데이터스토어 etcd 호스트 인바운드 공식적으로 TCP 2379 (변경 가능)
# 노드 방화벽 설정
sudo firewall-cmd --permanent --add-port=179/tcp
sudo firewall-cmd --permanent --add-port=4789/udp
sudo firewall-cmd --permanent --add-port=5473/tcp
sudo firewall-cmd --permanent --add-port=51820/udp
sudo firewall-cmd --permanent --add-port=51821/udp
sudo firewall-cmd --permanent --add-port=4789/udp
sudo firewall-cmd --permanent --add-port=6443/tcp
sudo firewall-cmd --permanent --add-port=2379/tcp

# 변경사항 적용
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

Contaienr Runtime 설정

IPv4를 포워딩하여 iptables가 브리지된 트래픽을 보게 하기

lsmod | grep br_netfilter를 실행하여 br_netfilter 모듈이 로드되었는지 확인한다.
명시적으로 로드하려면, sudo modprobe br_netfilter를 실행한다.

리눅스 노드의 iptables가 브리지된 트래픽을 올바르게 보기 위한 요구 사항으로, sysctl 구성에서 net.bridge.bridge-nf-call-iptables가 1로 설정되어 있는지 확인한다.

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

sudo modprobe overlay
sudo modprobe br_netfilter


# 필요한 sysctl 파라미터를 설정하면, 재부팅 후에도 값이 유지된다.
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# 재부팅하지 않고 sysctl 파라미터 적용하기
sudo sysctl --system

containerd 설치

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo

sudo yum -y install containerd.io 

# 설치 후 설정파일 수정(systemd true설정)
sudo containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

# 재시작
sudo systemctl restart containerd

kubeadm, kubelet, kubectl 설치

# repo 등록
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF

# 설치
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
sudo systemctl enable --now kubelet

NetworkManager 수정

Calico 네트워킹에 필요한 작업입니다.

NetworkManager는 Calico veth 쌍이 컨테이너에 연결되도록 앵커링된 기본 네트워크 네임스페이스의 인터페이스에 대한 라우팅 테이블을 조작합니다. 이는 Calico 에이전트가 올바르게 라우팅하는 기능을 방해할 수 있습니다.

/etc/NetworkManager/conf.d/calico.confNetworkManager가 인터페이스를 방해하지 못하도록 하려면 다음 구성 파일을 생성하세요 .

sudo tee /etc/NetworkManager/conf.d/calico.conf << EOF
[keyfile]
unmanaged-devices=interface-name:cali*;interface-name:tunl*;interface-name:vxlan.calico;interface-name:vxlan-v6.calico;interface-name:wireguard.cali;interface-name:wg-v6.cali
EOF

Master 설치

Master 초기화설정

kubeadm init \
--control-plane-endpoint 192.168.70.11 \
--pod-network-cidr 10.1.0.0/16

Kubeconfig 복사

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

Worker 노드 토큰정보 복사

해당 내용은 초기화 완료시 출력내용 확인만
복사만 해놓으세요.

kubeadm join 192.168.70.11:6443 --token 51z9wf.oluxsjal4j7j8lp9 \
        --discovery-token-ca-cert-hash sha256:39d9b80026fe769bd7aeb166c61eb415374a49dd8058fd16a416c367d0ada738

Master노드 격리

클러스터는 보안상의 이유로 제어 평면 노드에서 Pod를 예약하지 않습니다.


## 확인
```bash
[lio.ma@k8s-dev ~]$ kubectl get nodes
NAME         STATUS      ROLES           AGE   VERSION
k8s-master   NotReady    control-plane   14m   v1.30.4

NotRead가 뜨는것이 정상이다.
이제 CNI 설치하자.

CNI "Calico" 설치

Tigera Calico 연산자와 사용자 정의 리소스 정의를 설치합니다.

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

필요한 사용자 정의 리소스를 생성하여 Calico를 설치합니다.

wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/custom-resources.yaml

# 원래 기본대역대는 192.168.0.0/16 이라서 설정한 값 10.1.0.0/16으로 변경
sed -i 's/192\.168\.0\.0\/16/10.1.0.0\/16/g' custom-resources.yaml
kubectl apply -f custom-resources.yaml

확인

[lio.ma@k8s-dev ~]$ kubectl get nodes
NAME         STATUS   ROLES           AGE   VERSION
k8s-master   Ready    control-plane   16m   v1.30.4
[lio.ma@k8s-dev ~]$ k get pods --all-namespaces
NAMESPACE          NAME                                       READY   STATUS    RESTARTS   AGE
calico-apiserver   calico-apiserver-67974bdb87-2fm2p          1/1     Running   0          15m
calico-apiserver   calico-apiserver-67974bdb87-l9jg5          1/1     Running   0          15m
calico-system      calico-kube-controllers-868d486878-grg5c   1/1     Running   0          16m
calico-system      calico-node-sxkkq                          1/1     Running   0          16m
calico-system      calico-typha-6985c97657-gtkgf              1/1     Running   0          16m
calico-system      csi-node-driver-5rsch                      2/2     Running   0          16m
kube-system        coredns-7db6d8ff4d-bbqtt                   1/1     Running   0          17m
kube-system        coredns-7db6d8ff4d-wm884                   1/1     Running   0          17m
kube-system        etcd-k8s-master                            1/1     Running   6          17m
kube-system        kube-apiserver-k8s-master                  1/1     Running   6          17m
kube-system        kube-controller-manager-k8s-master         1/1     Running   4          17m
kube-system        kube-proxy-544sp                           1/1     Running   0          17m
kube-system        kube-scheduler-k8s-master                  1/1     Running   6          17m
tigera-operator    tigera-operator-77f994b5bb-cqcvf           1/1     Running   0          17m

Worker 합류하기

아까 복사해놨던 명령어 각 노드별 실행

kubeadm join 192.168.70.11:6443 --token 51z9wf.oluxsjal4j7j8lp9 \
        --discovery-token-ca-cert-hash sha256:39d9b80026fe769bd7aeb166c61eb415374a49dd8058fd16a416c367d0ada738

확인

[lio.ma@k8s-dev ~]$ kubectl get nodes
NAME           STATUS   ROLES           AGE     VERSION
k8s-master     Ready    control-plane   31m     v1.30.4
k8s-worker-1   Ready    <none>          11m     v1.30.4
k8s-worker-2   Ready    <none>          8m33s   v1.30.4
k8s-worker-3   Ready    <none>          11m     v1.30.4

번외

kubectl 설치

curl -LO https://dl.k8s.io/release/v1.30.4/bin/linux/amd64/kubectl
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
kubectl version --client

# 자동완성
yum install bash-completion
kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null
exec bash

#(필요시 설정)
echo 'alias k=kubectl' >>~/.bashrc
echo 'complete -o default -F __start_kubectl k' >>~/.bashrc

k9s 설치(관리 tool)

curl -sL https://github.com/derailed/k9s/releases/download/v0.32.5/k9s_Linux_amd64.tar.gz | sudo tar xfz - -C /usr/local/bin k9s

참고사이트

https://v1-30.docs.kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
https://v1-30.docs.kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
https://docs.tigera.io/calico/latest/getting-started/kubernetes/requirements
https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart

반응형