REHL 리눅스의 대표적인 호환 리눅스인 CentOS 가 2020년 12월 이후 RHEL 정식버전 이전의 Stream 버전으로 바뀌었다. 이를 Upstream 이라고 한다.
Fedora -> RHEL -> CentOS 의 형태가
Fedora -> CentOS -> RHEL 로 흐름이 바뀌었다.
엔터프라이즈 Linux 의 가장 중요한 점은 안정성(Stablity) 와 보안(Security) 이라고 할 수 있다. 그래서 기존 CentOS 지지자들은 'CentOS is Dead' 라며 반발이 심했나보다.
이에 대한 대안으로 가장 먼저 등장한 리눅스가 Rocky Linux 이다. AWS의 Amazon 리눅스도 RHEL 계열이기에 k8s 설치와 관련해서 간단하게 정리해본다.
VM 준비
Oracle VirtualBox 혹은 VMWare 를 통해 VM 을 먼저 생성한다. 마스터노드 1기, 워커노드 2기로 구성하기 위해 세개의 VM을 생성했다. 나는 SpringBoot MSA 컨테이너 8종 및 Nodejs 컨테이너 2종 을 관리하기 위한 DevOps 환경을 위해 생성했기 때문에 자원을 좀 넉넉히 할당했다. 아래는 각 노드별 자원 할당 내용이다. 나는 그냥 기본적인 설치 옵션 안 바꾸고 깔았다. 중간에 root 사용자 패스워드 지정해주고 원격 연결 허용해 줬다.
- CPU : 4 core
- Memory : 16GB
- Disk : 100GB
Rocky 리눅스는 데스크탑 설치가 기본으로 되어 있는데, 그것도 그냥 뒀다. 나중에 Pod 의 네트워크 상태를 체크할 때 curl 명령으로 하는 것보다, 파이어폭스로 보는 것이 훨씬 시각적이라, 디버깅도 잘되기 때문이다.
설치 절차 - root 사용자
설치는 세개 노드(master 1, worker 2) 에서 동일하게 동시에 진행한다.
고정 IP 설정 : VMWare Network Editor를 통해 기존 기본 환경 말고, 추가 NAT 를 구성했다.
192.168.x.x (eg : 192.168.0.70 ~ 192.168.0.72)
Master 노드와 Worker 노드 각각에 클러스터 노드 hosts 등록하기
vi /etc/hosts
SELinux permissive mode 변경
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
vi /etc/selinux/config
Kenel module load
modprobe overlay
modprobe br_netfilter
cat > /etc/modules-load.d/k8s.conf << EOF
overlay
br_netfilter
EOF
vi /etc/modules-load.d/k8s.conf
커널 파라미터 조정
cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
cat /etc/sysctl.d/k8s.conf
커널 파라미터 reload
sysctl --system
swap 끄기
swapoff -a
sed -e '/swap/s/^/#/g' -i /etc/fstab
free -m
Linux 에 Docker Repository 추가
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
dnf makecache
docker, containerd 설치
dnf install docker-ce containerd.io --allowerasing
containerd configuration file backup and generate new
mv /etc/containerd/config.toml /etc/containerd/config.toml.orig
containerd config default > /etc/containerd/config.toml
SystemdCgroup 파라미터 편집
vi /etc/containerd/config.toml
SystemdCgroup = true 로 변경
containerd 서비스 등록
systemctl enable --now containerd.service
서비스 확인
systemctl status containerd.service
방화벽 중지
systemctl stop firewalld
systemctl disable firewalld
Linux 에 k8s Repository 등록
cat > /etc/yum.repos.d/k8s.repo << EOF
[kubernetes]
name=Kubernetes
# baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
# 2024 년 3월부터 k8s communtiy 로 저장소가 옮겨졌다. 주석처리.
baseurl=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/
enabled=1
gpgcheck=1
# gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
dnf makecache
k8s 버전 확인
dnf --showduplicates list available kubectl
k8s 설치
dnf install {kubelet,kubeadm,kubectl} --disableexcludes=kubernetes
Kubelet 서비스 등록
systemctl enable --now kubelet.service
systemctl status kubelet.service
bash 자동완성 설정 (kubectl 사용 시 유용)
source <(kubectl completion bash)
kubectl completion bash > /etc/bash_completion.d/kubectl
kubeadmin init 및 join하기전 체크사항
// 호스트명 확인
sudo hostnamectl status
// 설정방법
sudo hostnamectl set-hostname <호스트명>
k8s 마스터 노드 시작 (root 사용자)
kubeadm init
아래와 같이 나오면 성공
마스터 노드에서 CNI(Common Network Interface, 여기서는 Calico) 구성
Woker 노드에서는 필요하지 않음
curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.2/manifests/calico.yaml -Ocurl https://raw.githubusercontent.com/projectcalico/calico/v3.25.2/manifests/calico.yaml -O
kubectl apply -f calico.yaml
마스터 노드에 워커노드 join 전 확인
cat /proc/sys/net/bridge/bridge-nf-call-iptables
위에서 '1'이 아니면
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
cat /proc/sys/net/ipv4/ip_forward
위에서 '1' 이 아니면
echo 1 > /proc/sys/net/ipv4/ip_forward
Calico 동작 확인
kubectl get pods -A
혹시 이것 저건 하다가... 마스터 노드 join 키가 화면에서 사라졌다면...
kubeadm token create --print-join-command
여기까지면 설치는 끝났다.
docker 및 k8s 는 워커 노드에도 동일하게 설치했으므로 워커 노드에서 마스터 노드로 참여(join) 해보자, 이러면 클러스터구성이 완료된다.
# kubeadm token create --print-join-command 으로 출력된 값을 커맨드로 넣어준다.
kubeadm join 192.168.180.135:6443 --token ne4dl4.4fvlabaao0q03rzj --discovery-token-ca-cert-hash sha256:4908d53ac84f5d499790e1d3a86097c1fc8c5e1da6a9f1ea156575e632743253
kubectl get nodes
노드 세개가 'Ready' 상태이면 잘된거다.
테스트로 nginx 를 클러스터에 깔아보자.
kubectl create deployment web-server --image=nginx
레플리카를 세개로 늘려보자, nginx 컨테이너가 세개 보일 것이다.
kubectl scale deployment web-server --replicas=3
kubectl get pod -o wide
레플리카를 10개로 늘려보자.
kubectl scale deployment web-server --replicas=10
여기까지는 쉽게 따라올 수 있다.
이제부터 k8s 에 대해서 열공하면 된다.
하다가 클러스터를 다시 리셋할 경우가 많이 생긴다.
그럴때는 마스터 노드에서...
kubeadm reset
하면 된다. 한 30번 정도 reset 하면서 삽질을 반복 하면, 어느새 자신감이 늘어가는 자신을 발견 할 수 있을 것이다.
위, 그림 자세히 보면 ip, 호스트명이 좀 다른 걸 눈치 챈 분이 계실지 모른다. 캡쳐 시기가 각각 달라서 그렇다... 이미지를 안넣기엔 생동감이 떨어져서 좀 억지로 붙여 놓았다.
끝~
'DevOps와 Infra > Kubernetes On Premise' 카테고리의 다른 글
쿠버네티스 학습전 OSI 7 계층 개념점검 (1) | 2023.12.02 |
---|---|
알고배우자 쿠버네티스 등장배경 (0) | 2023.12.02 |
5. Storage (0) | 2023.11.06 |
4. Service (2/2) - Istio (0) | 2023.11.05 |
3. Service (1/2) - LoadBalancer (0) | 2023.11.03 |