Programming/Bash Shell Script

[Bash Shell Script] CentOS 7 Kubernetes 자동 설치 쉘 스크립트(mater node version)

Nirsa 2020. 2. 24. 23:41
반응형

 

  • Kubernetes 자동 설치 쉘 스크립트

Kubernetes 자동 설치 쉘 스크립트 입니다. 이 쉘 스크립트는 마스터노드에 해당 하며, 워커노드는 추후 시간 될 때 제작할 예정 입니다.

글을 작성한 날짜(2020-02-24)를 기준으로 쉘 스크립트로 정상 설치 확인 하였습니다.

 

  • 쉘 스크립트 초기 실행 화면

 

 

 

  • 테스트 환경 및 참고 사항

테스트 환경 및 참고 사항은 아래와 같습니다. 당연히 테스트 서버에서 먼저 진행 하겠지만, 혹여나 실서버에 바로 적용할 경우 크리티컬한 상황이 발생할 가능성이 존재하니 잘 확인 해주세요.

혹여나 참고 사항에 적지 못한 부분이 있을 수 있으니 스크립트를 잘 확인 후 필요하지 않은 부분은 주석 처리하여 사용 해주세요.

  • Tools : VMware Workstation 15
  • OS : CentOS 7.7 1908
  • 참고 사항1 : ens33 인터페이스 IP를 기준으로 설정 합니다. 설정할 IP가 잡혀있는 인터페이스로 변경 해주세요. (3line)
  • 참고 사항2 : firewalld가 실행 되므로 firewalld를 사용하지 않고 서비스하고 있는 상황의 경우 관련 내용을 주석 처리 해주셔야 합니다. (firewalld를 사용하지 않던 환경에서는 장애 발생 가능성 존재)
  • 참고 사항3 : selinux 비활성화, br_netfilter 모듈 활성화, swap 사용이 중지 됩니다.
  • 참고 사항4 : hosts 파일에 마스터노드는 master , 워커노드는 node[숫자] 으로 저장 됩니다.
  • 참고 사항5 : 호스트명이 변경 됩니다.
  • 참고 사항6 : /k8s_tok 파일이 생성 됩니다. 이 파일은 추후 워커노드를 클러스터에 붙일 때 사용되니 소지하고 계셔야 합니다.

 

  • 쉘 스크립트 소스 코드

#!/bin/bash

masterip=`ifconfig ens33 | grep 'inet ' | awk '{print $2}'`
mastername='master'

echo "ex) 172.16.0.0/16"
echo -e "사용할 Pod Network CIDR을 입력 해주세요: \c"
read pod_ip

echo "--------------------------입력 전에 잠깐 읽어주세요!--------------------------"
echo "Worker Node 개수 입력에 따라 호스트명과 IP 대역이 달라집니다."
echo "Worker Node가 시작될 IP 입력 시 입력값에 맞춰  가장 뒷자리가 1씩 증가 합니다."
echo "ex) Worker Node 10대 추가 입력"
echo "ex) 시작될 IP 192.168.0.1 입력"
echo "ex) hostname : node1~10"
echo "ex) IP : 192.168.0.1~10"
echo "------------------------------------------------------------------------------"

echo -e "Worker Node를 몇개 추가 하십니까?: \c"
read select

echo -e "Worker Node가 시작될 IP를 입력 해주세요: \c"
read selectip

chk_num1="^[0-9]+$"
chk_num2="^[0-9][0-9]+$"
chk_num3="^[0-9][0-9][0-9]+$"

worker_host_num=1

ip_chk1=`echo "${selectip: -1}" | egrep "[0-9]"`
ip_chk2=`echo "${selectip: -2}" | egrep "[0-9][0-9]"`
ip_chk3=`echo "${selectip: -3}" | egrep "[0-9][0-9][0-9]"`

echo "hosts 파일을 수정 합니다."
if [ "0$ip_chk3" -ge "100" -a "0$ip_chk3" -le "254" ] ;then
        worker_ip_num=${selectip: -3}
        worker_ip_range=`expr $worker_ip_num + $select - 1`
        for i in $(seq $worker_ip_num $worker_ip_range); do
                echo "${selectip:0: -3}$i node$worker_host_num" >> /etc/hosts
                worker_host_num=`expr $worker_host_num + 1`
        done
elif [ "0$ip_chk2" -ge "10" -a "0$ip_chk2" -le "99" ] ;then
        worker_ip_num=${selectip: -2}
        worker_ip_range=`expr $worker_ip_num + $select - 1`
        for i in $(seq $worker_ip_num $worker_ip_range); do
                echo "${selectip:0: -2}$i node$worker_host_num" >> /etc/hosts
                worker_host_num=`expr $worker_host_num + 1`
        done
elif [ "0$ip_chk1" -ge "1" -a "0$ip_chk1" -le "9" ] ;then
        worker_ip_num=${selectip: -1}
        worker_ip_range=`expr $worker_ip_num + $select - 1`
        for i in $(seq $worker_ip_num $worker_ip_range); do
                echo "${selectip:0: -1}$i node$worker_host_num" >> /etc/hosts
                worker_host_num=`expr $worker_host_num + 1`
        done
fi
echo "-------------------------------------"

echo "호스트명을 변경 합니다."
echo "master" > /proc/sys/kernel/hostname
hostnamectl set-hostname master
echo "-------------------------------------"

echo "방화벽 정책을 수정 합니다."
systemctl start firewalld
firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=2379-2380/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10251/tcp
firewall-cmd --permanent --add-port=10252/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --reload
echo "-------------------------------------"

echo "selinux를 비활성화 합니다."
setenforce 0
sed "s/SELINUX=enforcing/SELINUX=disabled/g" -i /etc/sysconfig/selinux
echo "-------------------------------------"

echo "br_netfilter 모듈을 활성화 합니다."
modprobe br_netfilter
echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
echo "-------------------------------------"

echo "swap을 중지 합니다."
swapoff -a
sed -e 's/\(.*swap\)/#\1/' -i /etc/fstab
echo "-------------------------------------"

echo "Docker를 설치 합니다."
yum -y install yum-utils device-mapper-persistent-data lvm2 && yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo && yum -y install docker-ce
echo "-------------------------------------"

echo "쿠버네티스 저장소를 추가 합니다."
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=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
echo "-------------------------------------"

echo "쿠버네티스를 설치 합니다."
yum install -y kubelet kubeadm kubectl
echo "-------------------------------------"


echo "docker와 kubelet를 실행 합니다."
systemctl start docker && systemctl enable docker
systemctl start kubelet && systemctl enable kubelet
echo "-------------------------------------"

echo "master를 초기화 합니다."
echo "토큰을 /k8s_tok 파일로 저장 합니다."
kubeadm init --apiserver-advertise-address=$masterip --pod-network-cidr=$pod_ip | egrep "kubeadm join $masterip|--discovery-token-ca-cert-hash sha256" > /k8s_tok
echo "-------------------------------------"

echo "cluster에게 root 권한을 부여 합니다."
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
echo "-------------------------------------"

echo "k8s 정상 작동을 확인합니다."
kubectl get nodes
echo "-------------------------------------"

 

반응형