마짱짱의 지식창고
k8s containerd, kubeadm, calico 설치 본문
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
'Kubernetes' 카테고리의 다른 글
[K8S] NFS를 이용한 Storageclass 구성 (0) | 2024.01.24 |
---|---|
Rancher를 이용하여 k8s 환경구성 (0) | 2024.01.16 |
k8s EKS velero S3 연동하여 설치하기 (0) | 2023.11.03 |
Prometheus-stack으로 Grafana까지 쉽게 설치하기 (0) | 2023.10.24 |
[Prometheus] helm을 이용한 설치 (0) | 2023.01.04 |