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