Rocky 9.4
Kubernetes 1.27
1. chrony 설정 (시간 동기화)
# dnf update -y
# dnf install -y chrony
# sed -i 's/pool 2.rocky.pool.ntp.org iburst/#pool 2.rocky.pool.ntp.org iburst/' /etc/chrony.conf
# echo "server time.bora.net iburst" >> /etc/chrony.conf
# timedatectl set-timezone Asia/Seoul
# systemctl restart chronyd
2. swap memory off
K8s에서 노드의 자원을 정밀하게 관리하기 위하여 off.
메모리 자원이 mem이 아니라 swap에 사용되어 성능저하가 발생할 수도 있기 때문이다.
# swapoff -a
/etc/fstab swap 부분 주석처리 후 재부팅
# sed -i '/swap/s/^/#/' /etc/fstab
3. Enable IPv4 packet forwarding
Kubernetes 클러스터를 구성할 때 필요한 overlay 및 br_netfilter 커널 모듈을 부팅 시 자동으로 로드하도록 설정하는 과정
# 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
확인
# lsmod | grep br_netfilter
br_netfilter 36864 0
bridge 409600 1 br_netfilter
4. OS Cgroup 설정 확인
Cgroup을 systemd로 맞춰서 진행한다. (아래 내용 확인)
아니라면 cgroupfs나 systemd로 맞출지 결정해야한다.
cgroupfs 드라이버가 권장되지 않는 때가 있는데, systemd가 init 시스템인 경우이다. 이것은 systemd가 시스템에 단 하나의 cgroup 관리자만 있을 것으로 기대하기 때문이다. 또한, cgroup v2를 사용할 경우에도 cgroupfs 대신 systemd cgroup 드라이버를 사용한다.
# ps -p 1
PID TTY TIME CMD
1 ? 00:00:02 systemd
도커가 이미 있다면 아래로도 확인 가능
# docker info | grep -i cgroup
Cgroup Driver: systemd
Cgroup Version: 2
cgroupns
5. 컨테이너 런타임 설치
# dnf install -y containerd
없으면 생성
# mkdir -p /etc/containerd
환경 설정
# containerd config default | sudo tee /etc/containerd/config.toml
Cgroup을 Systemd로 변경
# sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
확인
# cat /etc/containerd/config.toml | grep SystemdCgroup
SystemdCgroup = true
containerd 재시작
# systemctl restart containerd
6. Kubeadm 설치 (1.27v)
k8s 패키지 저장소 추가
# cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
SELinux 비활성화
# sudo setenforce 0
# sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
Kube 패키지 설치
# cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
SELinux 비활성화
# sudo setenforce 0
# sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
1. 마스터 초기화
# kubeadm init --apiserver-advertise-address 172.16.1.38 --pod-network-cidr=10.1.0.0/16
- apiserver-advertise-address
이 옵션은 Kubernetes API 서버가 바인딩할 IP 주소를 지정합니다. 마스터 노드의 IP 주소를 설정합니다.
- pod-network-cidr
이 옵션은 클러스터 내의 Pod 네트워크의 CIDR 범위를 지정합니다. 여기서 중요한 것은 Pod 네트워크는 클러스터의 노드 네트워크와 겹치지 않아야 한다는 점입니다.
완료 메시지
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
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 172.16.1.38:6443 --token 57plfs.dtkslwj3xjea3e2p \
--discovery-token-ca-cert-hash sha256:cc6d48df180a0300cd3130ea5e7b58dd3a8f3bcf2e61d2487e446bdee618b14f
2. kubectl 설정
초기화 완료 후 일반 사용자로서 kubectl 을 사용하기 위해 설정
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
아직까지는 master node만 나온다. (NAME 은 기존에 쓰던 hostname으로 잡힌 것)
# kubectl get node
NAME STATUS ROLES AGE VERSION
docker-proxy NotReady control-plane 4m40s v1.27.14
Master node 초기화 시 발생한 join 명령 입력
# kubeadm join 172.16.1.38:6443 --token 57plfs.dtkslwj3xjea3e2p \
--discovery-token-ca-cert-hash sha256:cc6d48df180a0300cd3130ea5e7b58dd3a8f3bcf2e61d2487e446bdee618b14f
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
[root@k8s-worker02 ~]#
node 확인 시 worker 가 추가 된것을 볼 수 있으나 Not Ready 상태이다.
[root@k8s-master01 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
docker-proxy NotReady control-plane 32m v1.27.14
k8s-worker01 NotReady <none> 23m v1.27.14
k8s-worker02 NotReady <none> 23m v1.27.14
CNI(container network interface) - Master node와 Worker node 를 같은 네트워크로 묶어주는 방식
[root@k8s-master01 ~]# mkdir calico
이동/설치
[root@k8s-master01 calico]# kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.3/manifests/tigera-operator.yaml
파일 생성 및 설정
cidr 부분은 만들어둔 pod netowrk 로 설정
[root@k8s-master01 calico]# vi calico-resources.yaml
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
name: default
spec:
calicoNetwork:
bgp: Disabled
ipPools:
- blockSize: 26
cidr: 10.1.0.0/16
natOutgoing: Enabled
encapsulation: VXLAN
---
apiVersion: operator.tigera.io/v1
kind: APIServer
metadata:
name: default
spec: {}
pod 생성 배포
[root@k8s-master01 calico]# kubectl create -f calico-resources.yaml
상태 확인
[root@k8s-master01 calico]# kubectl get all -n calico-system
생성이 완료된 후 확인
[root@k8s-master01 calico]# kubectl get node
NAME STATUS ROLES AGE VERSION
docker-proxy Ready control-plane 87m v1.27.14
k8s-worker01 Ready <none> 78m v1.27.14
k8s-worker02 Ready <none> 78m v1.27.14
[root@k8s-master01 calico]# kubectl get ns
NAME STATUS AGE
calico-apiserver Active 2m28s
calico-system Active 4m32s
default Active 88m
kube-node-lease Active 88m
kube-public Active 88m
kube-system Active 88m
tigera-operator Active 15m
[root@k8s-master01 ~]# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
docker-proxy Ready control-plane 18h v1.27.14 172.16.1.38 <none> Rocky Linux 9.4 (Blue Onyx) 5.14.0-427.20.1.el9_4.x86_64 containerd://1.6.33
k8s-worker01 Ready <none> 18h v1.27.14 172.16.3.100 <none> Rocky Linux 9.4 (Blue Onyx) 5.14.0-427.16.1.el9_4.x86_64 containerd://1.6.33
k8s-worker02 Ready <none> 18h v1.27.14 172.16.3.101 <none> Rocky Linux 9.4 (Blue Onyx) 5.14.0-427.20.1.el9_4.x86_64 containerd://1.6.33