이 게시물은 인프런 -
쿠버네티스 어나더 클래스 (지상편) - Sprint 1, 2
강의에 대한 복습 및 정리용 게시물입니다.
그리고 여기에서 나오는 모든 이미지들은 해당 강의가 출처임을 미리 말씀드립니다.
Vagrant + Virtual Box 로 설치하는 방법은
https://www.inflearn.com/blogs/3689 에 간단히 나와있으니 참고 바랍니다.
지금부터는 해당 다운로드 방법을 세세히 파헤쳐보면서
전반적인 시스템의 구성 방식과 그 요소들을 살펴보겠습니다.
Vagrant 가 뭔지 모르면 제가 이전에 작성한 글을 참고하시기 바랍니다.
위 그림은 전~체적인 VirtualBox 에 대한 설정입니다.
가볍게 전반적인 그림을 가볍게 파악해봅시다.
일단 로컬 PC 에는 네트워크가 192.168.219.100 이라는 IP 를 할당 받은 상태입니다.
그리고 VM 에는 2개의 IP 가 할당되어 있는데,
하나는 NAT
(외부에서 파일 다운로드 받기 위한 것)인데,
이건 VM 위에 설치된 Rocky linux 에서 yum 을 통해서 여러 패키지를
다운로드 받을 텐데, 그때 VM 이 인터넷에 접근하기 위한 것입니다.
다른 하나는 Host-Only Network
(호스트 PC 와 VM 1:1 통신용) 가 있네요.
Host-Only Network
는 추후에 Host 머신과 VM 에 설치될 k8s dashboard
과
통신하는 용도입니다.
VM 설정에 의해 cpu: 4core, 메모리: 4Gi
를 할당 받는 것도 확인됩니다.
VirtaulBox 를 많이 사용해신 분들이라면 파악하는데 어려움은 없을거라 생각됩니다.
혹여 위 그림에서 NAT, Host-Only NetWork 가 이해가 안되시는 분들은
https://forums.virtualbox.org/viewtopic.php?t=96608 를 참고하시기 바랍니다.
그림으로 잘 설명해줍니다.
위에서 전체흐름을 봤는데, 그 흐름에 맞게 Vagrantfile 을 어떻게
작성했는지 하나하나 알아봅시다.
config.vm.box
: 사용할 Vagrant box 지정 (전역설정)config.vm.provision :shell
: 쉘스크립트를 실행합니다.$default_script
를 실행합니다.config.vm.define
: 하나의 VM(=마스터 노드) 에 대한 상세 설정을 지정합니다.
master.vm.hostname
: host 이름 지정
master.vm.network
: virtual box
의 host-only network 아아피 하나 할당
master.vm.provider
: provider(= virtualBox)에 필요한 설정 작성
vb.memory
: vm 이 사용할 메모리를 지정합니다.vb.cpus
: vm 이 사용할 cpu 를 지정합니다.vb.customize
: VBoxManage에서 제공하는 명령어를 vm 이 booting 되기 바로 이전에 실행할 수 있는 기능입니다.modifyvm
명령어 참고:id
는 특별한 파라미터로, 실제 생성되는 VM 의 아이디 값으로 치환됩니다.master.vm.provision: shell
: 마지막으로 이 vm(=마스터 노드)에만 필요한 쉘스크립트를 실행합니다.
위에서 각각의 구문에 대한 링크를 같이 넣었으니 최대한 참조하고,
그외에도 더 자세히 알고 싶다면 https://developer.hashicorp.com/vagrant/docs 를
참고하시기 바랍니다.
위에서 본 Vagrant 파일에서 Shell 스크립트에 대한 설명이
빠져있는데, 그 내용은 모드 쿠버네티스 설치와 관련된 것이어서 넘어갔습니다.
지금부터 해당 스크립트가 하는 작업들이 어떤 것이 있는지 파악해보죠.
일단 쿠버네티스 설치는 공식 설치 문서 를 보는 것이 설치의 첫걸음입니다.
전반적인 설치흐름을 따라가 보면 다음과 같습니다.
아래 나오는 모든 스크립트는 일프로 강사님의 github 에 공유한 Vagrantfile 내용을 일부 가져온 것입니다. $install_default, $install_master 변수에 있는 스크립트 내용을 참고했습니다.
일부 핵심이 아닌 내용은 제외했으니, 더 자세히 알고 싶다면 다운로드 받아서 보시기 바랍니다.
0. hosts 파일 설정
echo '======= [4-4] hosts 설정 =========='
cat << EOF >> /etc/hosts
192.168.56.30 k8s-master
EOF
1. 방화벽 설정 해제
systemctl stop firewalld && systemctl disable firewalld
2. Swap 비활성화
swapoff -a && sed -i '/ swap / s/^/#/' /etc/fstab
3. 컨테이너 런타임 설치 전 사전작업 - iptables
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
4. 컨테이너 런타임 설치 (containerd 설치)
## repository 추가
## https://docs.docker.com/engine/install/centos/#install-using-the-repository 참고
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 컨테이너 런타임 (containerd) 설치
yum install -y containerd.io-1.6.21-3.1.el8
systemctl daemon-reload
systemctl enable --now containerd
## 중요! 여기서 사용되는 containerd.io 버전 지정은 매우 중요합니다.
## 버전 지정 기준은 조금 있다가 설명하겠습니다!
# 컨테이너 런타임 : CRI 활성화
# defualt cgroupfs에서 systemd로 변경 (kubernetes default는 systemd)
containerd config default > /etc/containerd/config.toml
sed -i 's/ SystemdCgroup = false/ SystemdCgroup = true/' /etc/containerd/config.toml
systemctl restart containerd
여기서 말하는 cgroupfs, systemd 라는 것들은 모두 cgroup 의 구현체다.
cgroup 은 특정 프로세스들이 사용하는 CPU, 메모리 등의
컴퓨터 자원을 isolate 해주는 기능이다.
kubernetes
에서도 cgroup 구현체를 뭘 사용할지 설정하는 것이 있는데,
여기에 더해서 쿠버네티스가 사용할 컨테이너 런타임 또한 똑같은 cgroup 구현체를
사용해야 하기 때문에 위처럼sed
를 통한 설정 파일 내용 변경을 하는 것이다.
cgroupfs 와 systemd 에 대해 더 알고 싶다면
https://juhyungson.com/blog/cgroup-systemd-cgroupfs- 을 빠르게 보고오자.
주의!
containerd.io 와 kubernetes 버전 호환성
containerd.io 와 kubernetes 는 버전호환성에 유의해야 합니다.
이 링크를 따라가면 아래와 같은 화면을 확인할 수 있습니다.
이번에 설치할 k8s 는 1.27 인데 이와 호환되는 버전은 아래와 같다.
그런데 2개의 버전이 있다. 이럴때는 LTS 를 지원하는 버전을 사용하면 된다.
지금 설치한 1.6.21 버전이 바로 그 LTS 지원 버전이다.
5. 쿠버네티스 설치 kubeadm, kubelet 및 kubectl 설치
## repo 설정
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 설정
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
## 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
## 백그라운드 실행
systemctl enable --now kubelet
참고: containerd, k8s 설치할 수 있는 버전 항목 조회하기
yum list containerd.io --showduplicates | sort -r
yum list --showduplicates kubeadm --disableexcludes=kubernetes
여기서부터는 마스터 노드에만 필요한 설정입니다!
echo '======== [8] kubeadm으로 클러스터 생성 ========'
echo '======== [8-1] 클러스터 초기화 (Pod Network 세팅) ========'
kubeadm init --pod-network-cidr=20.96.0.0/16 --apiserver-advertise-address 192.168.56.30
echo '======== [8-2] kubectl 사용 설정 ========'
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
echo '======== [8-3] Pod Network 설치 (calico) ========'
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/calico-3.26.4/calico.yaml
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/calico-3.26.4/calico-custom.yaml
# 여기 나오는 calico 는 Kuberenetes Pod 간의 통신을 위한 인터페이스(CNI)의 구현체입니다.
echo '======== [8-4] Master에 Pod를 생성 할수 있도록 설정 ========'
kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane-
## 원래는 마스터 노드에 사용자가 생성하는 pod 를 생성하지 못하게 설정되어 있습니다.
## 일반적이로 이런 pod 들은 worker node 에서만 생성하는게 관례입니다.
echo '======== [8-4] Master에 Pod를 생성 할수 있도록 설정 ========'
kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane-
echo '======== [9] 쿠버네티스 편의기능 설치 ========'
echo '======== [9-1] kubectl 자동완성 기능 ========'
echo "source <(kubectl completion bash)" >> ~/.bashrc
echo 'alias k=kubectl' >>~/.bashrc
echo 'complete -o default -F __start_kubectl k' >>~/.bashrc
echo '======== [9-2] Dashboard 설치 ========'
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/dashboard-2.7.0/dashboard.yaml
echo '======== [9-3] Metrics Server 설치 ========'
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/metrics-server-0.6.3/metrics-server.yaml
## Metric 서버는 container runtime 으로부터 CPU, 메모리의 사용량을 알아오기 위한 서버이고,
## 이를 시각화하는게 Dashboard 입니다.
위의 명령어들을 따르면
결과적으로 아래와 같은 작업이 완료됩니다.