[워밍업 클럽: 쿠버네티스] 미션 #1. 쿠버네티스 설치 구간별 상태 확인
강의 수강 일자 : 25.05.28 (수)미션 수행 일자 : 25.05.28 (수), 25.05.29 (목) 위 내용은 https://cafe.naver.com/f-e/cafes/30725715/articles/24?menuid=13&referrerAllArticles=false&page=2쿠버네티스 강의를 듣고 미션을 따라가보며 쿠버네티스 환경을 이해하는 과정을 자연스럽게 적어냈다.미션은 1번 부터 시작해서 마지막 9번까지로 되어있고,분류를 했을 때, 1-3번은 개인 PC에 쿠버네티스를 설치한 후 설치가 잘 이루어졌는지, 버전을 확인하는 과정이고,4-9번은 Vagrantfile 에 적힌 내용을 해석하는 과정이다.우리는 Vagrant를 통해 가상환경을 구축하고, 쿠버네티스의 각종 노드들을 설치하는 과정을 배운다. [1-1] 내 PC 네트워크 확인▶ 윈도우 > 실행 > cmd 입력 > 확인c:\사용자>ipconfigIPv4 Address: 192.168.219.100 확인 [1-2] 내 PC 자원 확인▶ 윈도우 하단 상태바 우클릭 > 작업관리자 > 성능 탭일프로님이랑 동일한 CPU를 쓰고 있었네요... ㅎㅎ [1-3] VirtualBox 설치 버전 확인▶ Virtualbox 실행 > 도움말 > Virtualbox 정보VirtualBox version: 7.1.6 [1-4] Vagrant 설치 버전 확인▶ 윈도우 > 실행 > cmd 입력 > 확인c:\사용자>vagrant --version[1-5] 원격접속(MobaXterm) 설치 버전 확인▶ MobaXterm 실행 > Help > About MobaXterm[2-1] VirtualBox VM 확인▶ Virtualbox 실행 > VM Name 확인▶ 네이밍 : <Vagrant 폴더명>_<VM Name>_<ramdom>[2-2] 내 VM에 적용된 NAT 확인▶ Virtualbox 실행 > k8s_master-node 마우스 우클릭 > 설정 > 네트워크 > 어댑터 1NAT에 연결이 되어있다 😀[2-3] 내 VM에 적용된 Host-Only Network 확인▶ Virtualbox 실행 > k8s_master-node 마우스 우클릭 > 설정 > 네트워크 > 어댑터 2어뎁터 1에 NAT, 어뎁터 2에 Host-Only Network 가 연결된걸 확인했다.강의에서 배운대로 잘 연결되어 있는걸 보니 신기하다 😆 [2-4] VirtualBox Host-Only cidr 확인▶파일 > 도구 > Network Manager처음에 들어가서 확인했을 땐 DHCP 서버가 활성화 되어있었다.DHCP 서버 속성에서 서버 활성화를 해제해 DHCP 서버를 비활성화 해주었다.[3-1] Rocky Linux 버전 확인▶ k8s-master 원격접속 후 명령어 실행[root@k8s-master ~]# cat /etc/*-release 위 명령어로 현재 OS가 Rocky Linux ver 8.8임을 확인했다. [3-2] Hostname 확인▶ k8s-master 원격접속 후 명령어 실행[root@k8s-master ~]# hostname[3-3], [3-4] Network 확인▶ k8s-master 원격접속 후 명령어 실행[root@k8s-master ~]# ip addr[3-5] 자원(cpu, memory) 확인▶ k8s-master 원격접속 후 명령어 실행[root@k8s-master ~]# lscpu [root@k8s-master ~]# free -h CPU 4코어, 메모리 6GB 가 할당된거를 확인할 수 있었다.단계 1-3 까지는 내 PC에 대한 환경설정을 확인하는 단계였으면, 단계 4-9는 쿠버네티스 모든 node에 대한 설치 확인, master node 세팅 확인 작업이다.이걸 적으면서도 단계별로 그림이 눈에 안들어오는데, 복습의 필요성을 또 한번 느끼고 간다 😂미래의 내가 조금 더 고생해야지... [4] Rocky Linux 기본 설정▶ 타임존 설정 확인(스크립트로 적용된 명령: timedatectl set-timezone Asia/Seoul) - 중복 실행할 필요는 없습니다.[root@k8s-master ~]# timedatectl [5] kubeadm 설치 전 사전작업관련 공식 문서[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%90kubeam을 설치하기 전에 여러가지 사전 작업들을 고려한 뒤 설치를 해야하고, 2GB이상 램, 2 이상 CPU 등은 가상환경 설정 때 이미 해결한 것들이다.우리가 추가로 실천할 작업들은 다음과 같다.컴퓨터의 특정 포트들 개방 -> 네트워크 방화벽을 해제해서 모든 포트 개방스왑의 비활성화 ▶ 방화벽 해제 확인(스크립트로 적용된 명령: systemctl stop firewalld && systemctl disable firewalld) - 중복 실행할 필요는 없습니다.[root@k8s-master ~]# systemctl status firewalld 스크립트로 설정한stop firewalld 명령어로 Active: inactive 된걸 확인disable firewalld 명령어로 firewalld.service; disabled; 된걸 확인 방화벽 서비스 설정에 관한 명령어 참고했습니다 (서비스 종료 및 구동에 관한 명령어가 정리되어있다).(https://m.blog.naver.com/res0324/221988642463) ▶ 스왑(swap) 비활성화 확인(스크립트로 적용된 명령: swapoff -a && sed -i '/ swap / s/^/#/' /etc/fstab) - 중복 실행할 필요는 없습니다.[root@k8s-master ~]# free [root@k8s-master ~]# cat /etc/fstab | grep swap free로 메모리 상태를 확인해 swap된 메모리가 있는 지 확인 -> 스왑된 메모리 x/cat/fstab 파일에 swap 을 검색해 관련된 문자열을 확인 -> # 주석처리가 잘 되어있음.[6] 컨테이너 런타임 설치 [6-1] 컨테이너 런타임 설치 전 사전작업관련 공식 문서[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 ▶ 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 #설정 세팅 확인 결과#모듈 적제 확인 결과[6-2] 컨테이너 런타임 (containerd 설치)[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 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 Docs] : https://docs.docker.com/engine/install/centos/#install-using-the-repository▶ 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 도커 엔진을 사용하기 위해선 먼저 도커 저장소를 설정 해야한다.관련 스크립트를 적용하면 도커 저장소를 설정할 수 있고, 잘 적용되었는지 확인하는 과정이다.확인한 결과 docker-ce-stable 설정이 enabled로 잘 적용되어있음을 확인했다. ▶containerd 설치 확인(스크립트로 이미 적용된 명령: yum install -y containerd.io-1.6.21-3.1.el8) - 중복실행은 하지마세요![root@k8s-master ~]# systemctl status containerd 우리는 도커 엔진 중에 containerd.io 만을 설치했다.containerd가 잘 설치되어있고, 활성화된 모습을 확인했다. ▶설치 가능한 버전의 containerd.io 리스트 확인[root@k8s-master ~]# yum list containerd.io --showduplicates | sort -r [6-3] 컨테이너 런타임 (CRI활성화)쿠버네티스 문서에 Kubelet의 Cgroup의 Default가 cgroupfs라고 말씀 드렸는데, 레드햇 계열 리눅스(Rocky Linux) 의 경우 systemd를 메인으로 프로세스를 실행시키는 시스템이기 때문에, 쿠버네티스 설치시Default로 systemd가 세팅됩니다. 이 경우 containerd도 systemd로 변경하여 모두 systemd를 쓰는게 Core 사용에 부담이 없습니다. 관련 공식 문서[Kubernetes Docs] : https://kubernetes.io/ko/docs/setup/production-environment/container-runtimes/#containerd▶ 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 컨테이너 런타임(containerd) 상 systemdCroup = true 확인(systemd)만약 false 일 경우 cgroupfs 이니 systemd로 변경 필요▶ kubelet cgroup 확인 (configmap)[root@k8s-master ~]# kubectl get -n kube-system cm kubelet-config -o yaml ▶ kubelet cgroup 확인 (kubelet)[root@k8s-master ~]# cat /var/lib/kubelet/config.yaml 쿠버네티스(kubelet) 상 cgroup이 systemd인 것을 확인하였다.[7] kubeadm 설치관련 공식 문서[Kubernetes Docs] :https://kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#kubeadm-kubelet-%EB%B0%8F-kubectl-%EC%84%A4%EC%B9%98 우리가 설정했던 스크립트 중 [echo '======== [7] kubeadm 설치 ========'] 이후부터 글을 확인하면 위에 코드들이 스크립트에 적용된 걸 확인할 수 있다.▶ repo 설정 확인 [root@k8s-master ~]# yum repolist enabled 쿠버네티스가 repo에 설정된걸 확인할 수 있다. ▶ SELinux 설정 확인[root@k8s-master ~]# cat /etc/selinux/config [root@k8s-master ~]# sestatus SELINUX=permissive 확인▶ kubelet, kubeadm, kubectl 패키지 설치(스크립트로 이미 적용된 명령: yum install -y kubelet-1.27.2-150500.1.1.x86_64 kubeadm-1.27.2-150500.1.1.x86_64 kubectl-1.27.2-150500.1.1.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 #버전 보기 결과kubeadm GitVersion: "v1.27.2" , kubectl GitVersion: "v1.27.2" #상태 보기 결과kubelet active(running) 확인* 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 ▶ 실행 결과 :스크립트 상 설정했던 pod-network-cidr 값과 apiserver-advertise-address 값이 정상 적용된걸 확인할 수 있다. * Cluster가 정상이 아닐 때는 아래 명령으로 reset후 다시 init 해주기.* reset 실행 후 1분 정도 시간이 지난 후에 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 사용 설정관련 공식 문서[Kubernetes Docs] : https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#more-information▶ 인증서 설정 확인[root@k8s-master ~]# cat ~/.kube/config [8-3] CNI Plugin 설치 (calico)관련 공식 문서[Calico Docs] : https://docs.tigera.io/calico/latest/getting-started/kubernetes/self-managed-onprem/onpremises#install-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 설치가 정상이 아닐 때 (Calico가 CrashLoopBackOff 상태고, coredns가 가 Pending 상태)#Calico 삭제kubectl delete -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/calico-3.26.4/calico.yaml kubectl delete -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/calico-3.26.4/calico-custom.yaml #Calico 재설치[root@k8s-master ~]# kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/calico-3.26.4/calico.yaml [root@k8s-master ~]# kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/calico-3.26.4/calico-custom.yaml[8-4] Master에 pod를 생성 할 수 있도록 설정관련 공식 문서[Kubernetes Docs] : https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#control-plane-node-isolation▶ Master Node에 Taint 해제 확인(스크립트로 이미 적용된 명령: kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane- )[root@k8s-master ~]# kubectl describe nodes | grep Taints ▶ 실행 결과 :[9] 쿠버네티스 편의 기능 설치[9-1] kubectl 자동완성 기능▶ kubectl 기능 설정 확인[root@k8s-master ~]# cat ~/.bashrc▶ 실행 결과 :[9-2] 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 * 설치 후 kubectl top pod -A 명령시 error: Metrics API not available 메세지가 나올때최초 설치시 / VM 재기동시 매트릭 정보가 수집되는데 시간이 좀 걸릴 수 있습니다. 회고사실 강의를 들으면서 모르는게 생기면 계속 반복해서 듣게 되었고, 그렇게 강의 듣는 시간이 길어졌다 😂이렇게 복습하면서 강의 내용을 다시 되짚고, 스크립트 코드와 쿠버네티스 공식 문서들을 번갈아가며 확인해보니왜 강사님이 스크립트를 그렇게 짰고, 우리가 쿠버네티스 설정을 하기 위해 이러한 사전지식들을 알고 있어야 하는구나 깨달았다.아직 위에 4-9까지 그림이 완벽하게 이해되지는 않았다(50%정도 이해한 것 같다 ㅠ).그래도 이렇게 미션으로 실습 내용을 되짚어보고, 나중에 1.5배속으로 강의를 들으면서 했던 실습들을 리마인드 한다면!!이 쿠버네티스 개념들을 바로잡을 수 있을 것 같다는 막연한 자신감이 생겼다 ㅋㅋ쉽지는 않았지만, 이 미션이나 강의가 없었더라면 직접 공식문서를 보고, 관련블로그를 찾아가며 해결했었을 거라는 생각에 오히려 다행이라고 생각했다 😁.