컨테이너 인프라 환경(3) 쿠버네티스 1. 쿠버네티스란?

InSeok·2023년 3월 4일
0

쿠버네티스란?

  • 컨테이너 오케스트레이션을 위한 솔루션
  • 오케스트레이션(Orchestration)
    • 복잡한 단계를 관리하고 요소들의 유기적인 관계를 미리 정의해 손쉽게 사용하도록 서비스를 제공하는 것
  • 컨테이너 오케스트레이션
    • 다수의 컨테이너를 유기적으로 연결, 실행, 종료할 뿐만 아니라 상태를 추적하고 보존하는 등 컨테이너를 안정적으로 사용할 수 있게 만들어준다.

쿠버네티스 구성 방법

  1. 퍼블릭 클라우드 업체에서 제공하는 관리형 쿠버네티스인 EKS, AKS, GKE 등을 사용
    1. 구성이 이미 다 갖춰져 있고, 마스터 노드를 클라우드 업체에서 관리한다
  2. 수세의 Rancher, 레드햇의 OpenShift와 같은 플랫폼에서 제공하는 설치형 쿠버네티스를 사용한다. → 유료
  3. 사용하는 시스템에 쿠버네티스 클러스터를 자동으로 구성해주는 솔루션을 사용한다.(구성형 쿠버네티스)
    1. kuebeadm, kops, krib, kubespray 등
    2. kuebeadm 온프레미스와 클라우드 모두 지원하며 배우기 쉬움

쿠버네티스 구성하기

Vagrant.configure("2") do |config|
  N = 3 # max number of worker nodes
  Ver = '1.18.4' # Kubernetes Version to install

cfg.vm.provision "shell", path: "install_pkg.sh", args: [ Ver, "Main" ]
#Ver qustnsms 각노드에 해당버전의 쿠버네티스를 설치하게 만듬
# Main은 조건문으로 처리해 마스터 노드에만 전체실행코드를 내려받게 한다.
config.sh
			
echo 'alias vi=vim' >> /etc/profile #vi를 호출하면 vim을 호출하도록 프로파일에 입력
swapoff -a #쿠버네티스의 설치 요구조건을 맞추기위해 스왑되지 않도록 설정
sed -i.bak -r 's/(.+ swap .+)/#\1/' /etc/fstab #시스템이 다시 시작되더라도 스왑되지 않도록 설정

#쿠버네티스를 내려받을 리포지터리 설정
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

#selinux가 제한적으로 사용되지 않도록 permissive모드로 변경
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

#브리지 네트워크를 통과하는 IPV4와 IPV6의 패킷을 iptables가 관리하게 설정
#파드의 통신을 iptables로 제어한다.
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

#br_netfilter 커널 모듈을 사용해 브리지로 네트워크를 구성한다. 이때 IP 마스커레이드를 사용해
#내부네트워크와 외부네트워클르 분리한다.
modprobe br_netfilter

# 쿠버네티스 안에서 노드간 통신을 이름으로 할 수 있ㄷ록 각 노드의 호스트 이름과 IP를 /etc/hosts에 설정한다.
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

#외부와 통신할 수 있게 DNS 서버를 지정
nameserver 1.1.1.1 #cloudflare DNS
nameserver 8.8.8.8 #Google DNS
EOF

파드(Pod) 쿠버네티스에서 실행되는 객체의 최소단위

IP 마스커레이드 : 커널에서 제공하는 NAT(Network Address Translation)기능

install_pkg.sh
#깃허브에서 코드를 내려받을 수 있게 깃을 설치
yum install git -y

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

# install kubernetes cluster
yum install kubectl-$1 kubelet-$1 kubeadm-$1 -y
systemctl enable --now kubelet #kubelet 실행

# git clone _Book_k8sInfra.git
# 전체 실행콛를 마스터 노드에만 내려받고, 루트로 옮긴뒤 배시 스크립트를 찾아 실행가능한상태로 변경
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
master_node.sh

# init kubernetes
#kubeadm을 통해 쿠버네티스의 워커 노드를 받아들일 준비를 한다.
#토큰을 지정하고, 기본값인 24시간 후에 토큰이 계속유지되게한다. 그리고, 워커 노드가 정해진 토큰으로 들어오게  한다.
#쿠버네티스가 자동으로 컨테이너에 부여하는 네트워크를 172.16.0.1 ~ 172.16.255.254로 제공
#워커 노드가 접속하는 API서버의 IP를 192.168.1.10으로 지정해 워커 노드들이 자동으로 API 서버에 연결되게 한다.
kubeadm init --token 123456.1234567890123456 --token-ttl 0 \ 
--pod-network-cidr=172.16.0.0/16 --apiserver-advertise-address=192.168.1.10

# config for master node only 
# 마스터 노드에서 현재 사용자가 쿠버네티스를 정상적으로 구동할 수있게 설정 파일을 루트의 홈디렉터리에 복사하고 쿠버네티스르 이요할 사용자에게  권한부여
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

# config for kubernetes's network 
#컨테이너 네트워크 인터페이스(CNI)인 캘리코의 설정을 적용해 쿠버네티스의 네트워크를 구성한다.
kubectl apply -f \
https://raw.githubusercontent.com/sysnet4admin/IaC/master/manifests/172.16_net_calico.yaml

ttl(Time To Live) 유지되는 시간

worker_nodes.sh

#kubeadm을 이용해 쿠버네티스 마스터 노드에 접속한다. 연결에 필요한 토큰은 마스터노드에서 생성한 토큰을 사용하며
# 간단하게 구성하기위해 인증을 무시하고 API 주소인 192.168.1.10으로 기본 포트번호인 6443번 포트에 접속하도록 설정한다.
kubeadm join --token 123456.1234567890123456 \
             --discovery-token-unsafe-skip-ca-verification 192.168.1.10:6443
profile
백엔드 개발자

0개의 댓글