카테고리 없음

쿠버네티스 무게감 있게 설치하는 방법 - 2/2

종종이94 2024. 3. 7. 17:53

사실 1/2는 몸 풀기죠!?

여기서부터가 중요합니다!

[4]부터 [7]까지는 쿠버네티스 기본 설치이고 모든 node(master or worker)에 동일하게 적용되고

[8]부터 [9]까지는 Master node에만 적용됩니다

질문 위치를 명확하게 하기 위해서 강의 내용과 순서는 다르니,

질문이 있을 땐 해당 번호를 다는 센스 부탁드려요!

쿠버네티스 무게감 있게 설치하는 방법 2/2

1. CNI Plugin

CNCF(Cloud Native Computing Foundation)의 프로젝트 중 하나인 CNI는 컨테이너 간의 네트워킹을 제어할 수 있는 플러그인을 만들기 위한 표준입니다. 다양한 형태의 컨테이너 런타임과 오케스트레이터 사이의 네트워크 계층을 구현하는 방식이 다양하게 분리되어 각자만의 방식으로 발전하게 되는 것을 방지하고 공통된 인터페이스를 제공하기 만들어 졌습니다. 쿠버네티스에서는 Pod 간의 통신을 위해서 CNI 를 사용합니다. 

 

쿠버네티스 뿐만 아니라 Amazon ECS, Cloud Foundry 등 컨테이너 런타임을 포함하고 있는 다양한 플랫폼들은 CNI를 사용하고 있습니다. 쿠버네티스는 기본적으로 'kubenet' 이라는 자체적인 CNI 플러그인을 제공하지만 네트워크 기능이 매우 제한적인 단점이 있습니다.

 

그 단점을 보완하기 위해, 3rd-party 플러그인을 사용하는데 그 종류에는 Flannel, Calico, Weavenet, NSX 등 다양한 종류의 3rd-party CNI 플러그인들이 존재합니다. 

 

 

 

2. CRI Plugin

CRI는 쿠버네티스 시스템에서 컨테이너를 실행하는 데 사용되는 인터페이스입니다. CRI를 통해 쿠버네티스는 다양한 컨테이너 런타임(예: Docker, containerd, CRI-O 등)을 지원할 수 있습니다. 따라서 CRI는 쿠버네티스의 컨테이너 런타임과 통신하는 데 사용되는 표준 인터페이스입니다.

 
 
 

 

 

 

 

 

 

 

 

kubeadm을 설치할 때 pc의 최소사양 및 요구사항들을 유의하자

 

 

 


[4] Rocky Linux 기본 설정

▶ 패키지 업데이트 진행

 

[root@k8s-master ~]# yum -y update

 

 

▶ 실행 결과


▶ 타임존 설정 확인

(스크립트로 적용된 명령: timedatectl set-timezone Asia/Seoul)

[root@k8s-master ~]# timedatectl

 

 

▶ 실행 결과

[5] kubeadm 설치 전 사전작업

▶ 방화벽 해제 확인

(스크립트로 적용된 명령: systemctl stop firewalld && systemctl disable firewalld)

 

[root@k8s-master ~]# systemctl status firewalld

▶ 실행 결과


▶ 스왑(swap) 비활성화 확인

(스크립트로 적용된 명령: swapoff -a && sed -i '/ swap / s/^/#/' /etc/fstab)

 

[root@k8s-master ~]# free
[root@k8s-master ~]# cat /etc/fstab | grep swap

▶ 실행 결과

Swap에 할당된 자원이 없어야함

# <- 주석 처리가 잘 됐는지

[Kubernetes Docs] : https://kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-%EC%A0%84%EC%97%90

 

 

 

[6] 컨테이너 런타임 설치

[6-1] 컨테이너 런타임 설치 전 사전작업

 

 

 

 

 

▶ iptables 세팅

 

# 설정 세팅 확인
[root@k8s-master ~]# cat /etc/modules-load.d/k8s.conf
[root@k8s-master ~]# cat /etc/sysctl.d/k8s.conf
# 모듈 적제 확인
[root@k8s-master ~]# lsmod | grep overlay
[root@k8s-master ~]# lsmod | grep br_netfilter

▶ 실행 결과

[Kubernetes Docs] : https://kubernetes.io/ko/docs/setup/production-environment/container-runtimes/#ipv4%EB%A5%BC-%ED%8F%AC%EC%9B%8C%EB%94%A9%ED%95%98%EC%97%AC-iptables%EA%B0%80-%EB%B8%8C%EB%A6%AC%EC%A7%80%EB%90%9C-%ED%8A%B8%EB%9E%98%ED%94%BD%EC%9D%84-%EB%B3%B4%EA%B2%8C-%ED%95%98%EA%B8%B0

 

 

 

 

[6-2] 컨테이너 런타임 (containerd 설치)

 

쿠버네티스랑 컨테이너 ​런타임을 설치할 때 C그룹에는 두가지 기술이 잇다.

Kubernetes에서 systemd로 설정을 했으면 컨테이너 런타임도 systemd로 변경해줘야한다.

(Kubernetes와 containerd의 default가 cgroupfs이다.)

 

 

[Kubernetes Docs] : https://kubernetes.io/ko/docs/setup/production-environment/container-runtimes/#containerd

[Containerd Release] : https://github.com/containerd/containerd/blob/main/RELEASES.md#kubernetes-support

 

 

 

 

[6-2-1] containerd 패키지 설치 (option2)

 

containerd와 runc 및 이에 대한 의존성 패키지가 필요한데 도커를 설치하면 이걸 한 큐에 해결 가능하다???

 

 

 

[Containerd Docs] : https://github.com/containerd/containerd/blob/main/docs/getting-started.md#option-2-from-apt-get-or-dnf

 

 

 

[6-2-1-1] docker engine (containerd.io)만 설치

▶ docker repo 설정 확인

(스크립트로 적용된 명령: yum install -y yum-utils, yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo)

 

 
[root@k8s-master ~]# yum repolist enabled

 

▶ 실행 결과


 

 

containerd 설치 확인

(스크립트로 적용된 명령: yum install -y containerd.io-1.6.21-3.1.el8)

 

[root@k8s-master ~]# systemctl status containerd

 

 

▶ 실행 결과

-> 확인 후 [ctrl + c]로 빠져나오기

[Docker Docs] : https://docs.docker.com/engine/install/centos/#install-using-the-repository


설치 가능한 버전의 containerd.io 리스트 확인

 
[root@k8s-master ~]# yum list containerd.io --showduplicates | sort -r

 

 

[6-3] 컨테이너 런타임 (CRI활성화)

* 쿠버네티스 문서에 Kubelet의 Cgroup의 Default가 cgroupfs라고 말씀 드렸는데, 레드햇 계열 리눅스의 경우 systemd를 메인으로 프로세스를 실행시키는 시스템이기 때문에, 쿠버네티스 설치시 Default systemd가 세팅됩니다. 이 경우 containerd도 systemd로 변경하여 모두 systemd를 쓰는게 Core 사용에 부담이 없습니다.

▶ cri 활성화 설정 확인

(스크립트로 적용된 명령: containerd config default > /etc/containerd/config.toml; sed -i 's/ SystemdCgroup = false/ SystemdCgroup = true/' /etc/containerd/config.toml)

 
[root@k8s-master ~]# cat /etc/containerd/config.toml

 

▶ 실행 결과 :

* false 일 경우 cgroupfs

▶ kubelet cgroup 확인 (configmap)

root@k8s-master ~]# kubectl get -n kube-system cm kubelet-config -o yaml
[root@k8s-master ~]# cat /var/lib/kubelet/config.yaml
▶ 실행 결과 :

 

 

 

 

▶ kubelet cgroup 확인 (kubelet)

[root@k8s-master ~]# kubectl get -n kube-system cm kubelet-config -o yaml
[root@k8s-master ~]# cat /var/lib/kubelet/config.yaml

 

▶ 실행 결과 :

 

* kubelet에서 cgroup 수정 필요시 적용 방법

 
// 아래 두 군데에서 cgroupDriver를 systemd 혹은 cgroupfs로 변경
[root@k8s-master ~]# vi /var/lib/kubelet/config.yaml
[root@k8s-master ~]# kubectl edit -n kube-system cm kubelet-config
[root@k8s-master ~]# systemctl restart kubelet

 

[Kubernetes Docs] : https://kubernetes.io/ko/docs/setup/production-environment/container-runtimes/#containerd

 

 

[7] kubeadm 설치

▶ repo 설정 확인

[root@k8s-master ~]# yum repolist enabled

▶ 실행 결과

 


▶ SELinux 설정 확인

SELinux
Linux의 Kernel을 보호하기 위한 도구
[root@k8s-master ~]# cat /etc/selinux/config
[root@k8s-master ~]# sestatus

 

▶ 실행 결과


 

▶ kubelet, kubeadm, kubectl 패키지 설치

(스크립트로 적용된 명령: yum install -y kubelet-1.27.1-0.x86_64 kubeadm-1.27.1-0.x86_64 kubectl-1.27.1-0.x86_64 --disableexcludes=kubernetes)

 

 
#버전 보기
[root@k8s-master ~]# kubeadm version
[root@k8s-master ~]# kubectl version

#상태 보기
[root@k8s-master ~]# systemctl status kubelet

#설정 파일 위치
[root@k8s-master ~]# cat /var/lib/kubelet/config.yaml

#로그 조회
 journalctl -u kubelet | tail -10

▶ 실행 결과

-> 확인 후 [ctrl + c]로 빠져나오기

 

* stop 상태일 때는 아래 명령으로 올리기

[root@k8s-master ~]# systemctl restart kubelet

 

 

 

 

 

▶ 설치 가능한 버전의 kubeadm 리스트 확인

[root@k8s-master ~]# yum list --showduplicates kubeadm --disableexcludes=kubernetes

▶ 실행 결과


[8] kubeadm으로 클러스터 생성

[Kubernetes Docs] : https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/

[8-1] 클러스터 초기화 (Pod Network 세팅)

▶ 클러스터 상태 확인

(스크립트로 적용된 명령: kubeadm init --pod-network-cidr=20.96.0.0/12 --apiserver-advertise-address 192.168.56.30)

 
# master node 상태확인
[root@k8s-master ~]# kubectl get node

# pod network cidr 설정 확인
[root@k8s-master ~]# kubectl cluster-info dump | grep -m 1 cluster-cidr

# apiserver advertise address 적용 확인
[root@k8s-master ~]# kubectl cluster-info

# kubernetes component pod 확인
[root@k8s-master ~]# kubectl get pods -n kube-system

 

 

 

▶ 실행 결과 :

[Kubernetes Docs] : https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#initializing-your-control-plane-node

* Cluster가 정상이 아닐 때는 아래 명령으로 reset후 다시 init 해주기)

[root@k8s-master ~]# kubeadm reset
[root@k8s-master ~]# kubeadm init --pod-network-cidr=20.96.0.0/12 --apiserver-advertise-address 192.168.56.30
 

 

 

 

[8-2] kubectl 사용 설정

▶ 인증서 설정 확인

 
[root@k8s-master ~]# cat ~/.kube/config

 

▶ 실행 결과 :

[Kubernetes Docs] : https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#more-information

 

 

[8-3] CNI Plugin 설치 (calico)

▶ calico pod 설치 및 pod network cidr 적용 확인

# Calico Pod 상태 확인
[root@k8s-master ~]# kubectl get -n calico-system pod
[root@k8s-master ~]# kubectl get -n calico-apiserver pod

# Calico에 pod network cidr 적용 확인
[root@k8s-master ~]# kubectl get installations.operator.tigera.io default -o yaml  | grep cidr
▶ 실행 결과 :

[Calico Docs] : https://docs.tigera.io/calico/latest/getting-started/kubernetes/self-managed-onprem/onpremises#install-calico

* Calico 설치가 정상이 아닐 때 (Calico가 CrashLoopBackOff 상태고, coredns가 가 Pending 상태)

 

 

 

[8-4] Master에 pod를 생성 할 수 있도록 설정

▶ Master Node에 Taint 해제 확인

(스크립트로 적용된 명령: kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane- )

 

 

 

 

 

▶ 실행 결과 :

[Kubernetes Docs] : https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#control-plane-node-isolation

[9] 쿠버네티스 편의 기능 설치

[9-1] kubectl 자동완성 기능

▶ kubectl 기능 설정 확인

 

 

 

▶ 실행 결과 :

[kubectl Cheat Sheet] : https://kubernetes.io/docs/reference/kubectl/cheatsheet/

[9-2] Dashboard 설치

▶ dashboard 설치 확인

 

▶ dashboard 설치 확인

[root@k8s-master ~]# kubectl get pod -n kubernetes-dashboard
 

 

 

 

▶ 실행 결과 :

 

 

 

 

 

[9-3] Metrics Server 설치

▶ metrics server 설치 확인

[root@k8s-master ~]# kubectl get pod -n kube-system  | grep metrics
[root@k8s-master ~]# kubectl top pod -A

 

 

자료는 쿠버네티스 어나더 클래스(지상편) - Sprint1의 강의를 듣고 정리한 자료입니다.
https://www.inflearn.com/course/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%96%B4%EB%82%98%EB%8D%94-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%A7%80%EC%83%81%ED%8E%B8-sprint1/dashboard