3.1.2 쿠버네티스 구성하기

estar987·2023년 8월 31일

Kubernetes

목록 보기
8/64

교재에서 나온 필자의 깃허브 링크에 있는 파일을 다운 받아 실습을 진행하였습니다.
깃허브 링크 : https://github.com/sysnet4admin/_Book_k8sInfra

Vagrantfile

C:\HashiCorp_Book_k8sInfra-main_Book_k8sInfra-main\ch3\3.1.3\Vagrantfile
을 문서 편집기로 열어 코드를 확인합니다.

Vagrantfile은 베이그런트 프로비저닝을 위한 정보를 담고있는 메인 파일입니다.
명령 프롬프트를 실행하고 Vagrantfile이 있는 경로에서 vagrant up 명령을 입력하면 현재 호스트 내부에 Vagrantfile에 정의된 가상 머신들을 생성하고 생성한 가상 머신에 쿠버네티스 클러스트를 구성하기 위한 파일들을 호출해 쿠버네티스 클러스터를 자동으로 구성합니다.

5번째 줄

N = 3 # max number of worker nodes

쿠버네티스에서 작업을 수행할 워커 노드의 수를 변수(N = 3)로 받습니다. 그리고 해당 변수를 24번째 줄(arg: N)과 46번째 줄(arg:N)에서 config.sh로 넘깁니다. 이는 사용자가 워커 노드의 개수를 직접 조절할 수 있게 합니다.

6번째 줄

Ver = '1.18.4' # Kubernetes Version to install

쿠버네티스 버전을 설정할 수 있습니다. 본인의 쿠버네티스 버전에 맞게 수정하세요

25번째 줄

cfg.vm.provision "shell", path: "install_pkg.sh", args: [ Ver, "Main" ]

args:[Ver, "Main"] 코드를 추가해 쿠버네티스 버전 정보와 Main이라는 문자를 install_pkg.sh로 넘깁니다. 두 번째 인자인 Main 문자는 install_pkg.sh에서 조건문으로 처리해 마스터 노드에만 이 책의 전체 실행코드를 내려받게 합니다.

26번째 줄 & 48번째 줄

cfg.vm.provision "shell", path: "master_node.sh"
cfg.vm.provision "shell", path: "work_nodes.sh"

쿠버네티스 마스터 노드를 위한 master_node.sh와 워커 노드를 위한 work_node.sh 코드를 추가했습니다.

config.sh

C:\HashiCorp_Book_k8sInfra-main_Book_k8sInfra-main\ch3\3.1.3\config.sh

  • config.sh는 kubeadm으로 쿠버네티스를 설치하기 위한 사전 조건을 설정하는 스크립트 파일입니다.

4번째 줄

echo 'alias vi=vim' >> /etc/profile
vi를 호출하면 vim을 호출하도록 프로파일에 입력합니다. 이렇게 하면 코드에 하이라이트를 넣어 코드를 쉽게 구분할 수 있습니다.

7번째 줄

swapoff -a
쿠버네티스의 설치 요구 조건을 맞추기 위해 스왑되지 않도록 설정합니다.

9번째 줄

sed -i.bak -r 's/(.+ swap .+)/#\1/' /etc/fstab

시스템이 다시 시작되더라도 스왑되지 않도록 설정합니다.

스왑의 이해를 돕기 위해 아래 블로그 링크를 첨부하였습니다.

https://it-serial.tistory.com/entry/Linux-Swap-%ED%8C%8C%ED%8B%B0%EC%85%98%EC%9D%B4%EB%9E%80-CPU-RAM-%ED%95%98%EB%93%9C-%EB%94%94%EC%8A%A4%ED%81%AC-%E2%91%A0

12번째 줄

gg_pkg="packages.cloud.google.com/yum/doc" # Due to shorten addr for key

쿠버네티스의 레포지터리를 설정하기 위한 경로가 너무 길어지지 않게 경로를 변수로 처리합니다.

13 ~ 21번째 줄

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
  [kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://${gg_pkg}/yum-key.gpg https://${gg_pkg}/rpm-package-key.gpg
EOF

쿠버네티스를 내려받을 레포지터리를 설정하는 구문입니다

24 ~ 25번째 줄

setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

selinux가 제한적으로 사용되지 않도록 permissive 모드로 변경합니다.
아래는 selinux에 대한 설명이 있습니다.
https://www.redhat.com/ko/topics/linux/what-is-selinux

28 ~ 31번째 줄

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

브리지 네트워크를 통과하는 IPv4 와 IPv6 패킷을 iptables가 관리하게 설정합니다.
파드(Pod, 쿠버네티스에서 실행되는 객체의 최소 단위)의 통신을 iptable로 제어합니다.
필요에 따라 IPVS(IP Virtual Server) 같은 방식으로도 구성할 수 있습니다.

32번째 줄

modprobe br_netfilter

br_netfilter 커널 모듈을 사용해 브리지로 네트워크를 구성합니다. 이때 IP 마스커레이드(Masquerade)를 사용해 내부 네트워크와 외부 네트워크를 분리합니다.
IP 마스커레이드는 쉽게 설명하면 커널에서 제공하는 NAT 기능으로 이해하면 됩니다.
실제로는 br_netfilter를 적용함으로써 28~31번째 줄에서 적용한 iptables가 활성화됩니다.

35 ~ 36번째 줄

echo "192.168.1.10 m-k8s" >> /etc/hosts
for (( i=1; i<=$1; i++  )); do echo "192.168.1.10$i w$i-k8s" >> /etc/hosts; done

쿠버네티스 안에서 노드 간 통신을 이름으로 할 수 있도록 각 노드의 호스트 이름과 IP를 /etc/hosts 에 설정합니다.
이때 워커 노드는 Vagrantfile에 넘겨 받은 N변수로 전달된 노드 수에 맞게 동적으로 생성합니다.

39 ~ 42번째 줄

cat <<EOF > /etc/resolv.conf
nameserver 1.1.1.1 #cloudflare DNS
nameserver 8.8.8.8 #Google DNS
EOF

외부와 통신할 수 있게 DNS 서버를 지정합니다.

install_pkg.sh

  • Install_pkg.sh는 클러스터를 구성하기 위해서 가상 머신에 설치돼야 하는 의존성 패키지를 명시합니다. 또한 실습에 필요한 소스 코드릴 특정 가상머신(m-k8s) 내부에 내려받도록 설정돼 있습니다.

6번째 줄

yum install git -y

깃 허브에서 코드를 내려받을 수 있게 깃(git)을 설치합니다.

9번째 줄

yum install docker -y && systemctl enable --now docker

쿠버네티스를 관리하는 컨테이너를 설치하기 위해 도커를 설치하고 구동합니다.

12 ~ 13번째 줄

yum install kubectl-$1 kubelet-$1 kubeadm-$1 -y
systemctl enable --now kubelet

쿠버네티스를 구성하기 위해 첫 번째 변수($1=Ver='1.18.3')로 넘겨받은 1.18.4버전의 kubectl, kubelet, kubeadm을 설치하고 kubelet을 시작합니다.

16 ~ 20번째 줄

if [ $2 = 'Main' ]; then
  git clone https://github.com/sysnet4admin/_Book_k8sInfra.git
  mv /home/vagrant/_Book_k8sInfra $HOME
  find $HOME/_Book_k8sInfra/ -regex ".*\.\(sh\)" -exec chmod 700 {} \;
fi

전체 실행 코드를 마스터 노드에만 내려받도록 Vagrantfile에서 두 번째 변수($2= 'Main')를 넘겨 받습니다. 그리고 깃에서 코드를 내려받아 실습을 진행할 루트 홈디렉터리(/root)로 옮깁니다. 배스 스크립트(.sh)를 find로 찾아 바로 실행 가능한 상태가 되도록 권한을 700으로 설정합니다.(chmod 700)

master_node.sh

  • 1개 이상 가상 머신(m-k8s)을 쿠버네티스 마스터 노드로 구성하는 스크립트입니다.
    쿠버네티스를 구성할 때 꼭 선택해야하는 컨테이너 네트워크 인터페이스(CNI Container Network Interface)도 함께 구성합니다.

4 ~ 5번째 줄

kubeadm init --token 123456.1234567890123456 --token-ttl 0 \
--pod-network-cidr=172.16.0.0/16 --apiserver-advertise-address=192.168.1.10 

kubeadm을 통해 쿠버네티스의 워커 노드를 받아들일 준비를 합니다. 먼저 토큰을 지정하고 ttl(time to live 유지되는 시간)을 0으로 설정해서 기본값인 24시간 후에 토큰이 계속 유지되게 합니다. 그리고 워커 노드가 정해진 토큰으로 들어오게 합니다.
쿠버네티스가 자동으로 컨테이너에 부여하는 네트워크를 172.16.0.0/16 제공하고 워커 노드가 접속하는 API 서버의 IP를 192.168.1.10으로 지정해 워커 노드들이 자동으로 API 서버에 연결되게 합니다.

8 ~ 10번쨰 줄

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

마스터 노드에서 현재 사용자가 쿠버네티스를 정상적으로 구동할 수 있게 설정 파일을 루트의 홈디렉터리에 복사하고 쿠버네티스를 이용할 사용자에게 권한을 줍니다.

14 ~ 14번째 줄

kubectl apply -f \
https://raw.githubusercontent.com/sysnet4admin/IaC/master/manifests/172.16_net_calico.yaml

컨테이너 네트워크 인터페이스인 캘리코(Clico)의 설정을 적용해 쿠버네티서의 네트워크를 구성합니다.

work_nodes.sh

  • 3대 이상의 가상 머신에 쿠버네티스 워커 노드를 거성하는 스크립트입니다. 마스터 노드에 구성된 클러스터에 조인이 필요한 정보가 모두 코드화돼 있어 스크립트를 실행하기만 하면 편하게 워커 노드로서 쿠버네티스 클러스터에 조인됩니다.

4 ~ 5번째 줄

kubeadm join --token 123456.1234567890123456 \
             --discovery-token-unsafe-skip-ca-verification 192.168.1.10:6443

kubeadm 을 이용해 쿠버네티스 마스터 노드에 접속합니다. 이때 연결에 필요한 토큰은 기존에 마스터 노드에서 생성한 토큰을 사용합니다. 간단하게 구성하기 위해 --discovery....-skip....로 인증을 무시하고 API 서버 주소로 6443포트를 이용하여 접속하도록 설정합니다.

위의 설정 실행하기

C:\HashiCorp_Book_k8sInfra-main_Book_k8sInfra-main\ch3\3.1.3 경로로 cmd창에서 이동합니다.
이동후 vagrant up으로 실행합니다.

cd C:\HashiCorp_Book_k8sInfra-main_Book_k8sInfra-main\ch3\3.1.3
vagrant up

모든 컨테이너 실행되면 m-k8s(마스터 노드)에서 명령어 입력으로 워커ㅓ 노드들이 정상적으로 생서외고 연결됐는지 확인합니다.

profile
System / Cloud / DevOps Engineer

0개의 댓글