[Kubernetes] kubeadm 설치

곽동규·2024년 6월 15일

Rocky 9.4
Kubernetes 1.27

  • Master node1
  • Worker node1
  • Worker node2

master, worker node 공통 설정

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

Master node 설정 (single node)

  • 마스터 노드 IP: 172.16.1.38
  • 워커 노드1 IP: 172.16.3.100
  • 워커 노드2 IP: 172.16.3.101
  • Pod 네트워크: 10.1.0.0/16 (충돌 방지를 위해 노드 네트워크와 다른 범위 사용)

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

Worker node 설정

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 ~]#

Master node

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

Calico 설치

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

0개의 댓글