새로운 클러스터를 생성할 때마다 쿠버네티스를 처음부터 구축하는건 상당히 귀찮다.
중간에 설정이 꼬여서 서버를 날리고 새로 구축하는 경우가 종종 있는데 ..
그럴 때마다 공식문서나 블로그를 참고해 처음부터 설치하려니 시간이 정말 아까웠다.
그래서 그냥 스크립트로 만들어서 반 자동화 설치 루틴을 만들었다.
테스트 완료 Linux 서버
- Ubuntu 18.04 LTS
- Ubuntu 20.04 LTS
직접 만든 스크립트 입니다.
피드백은 감사히 받고 적극 반영 하겠습니다!
도커 설치 스크립트
#!/bin/bash
echo "=============================="
echo "======= INSTALL DOCKER ======="
echo "=============================="
# Check Ubuntu Version
VERSION=$(cat /etc/issue)
if [[ "$VERSION" == *"Ubuntu"* ]]; then
echo "============================"
echo "Server platform is "$VERSION
echo "============================"
else
echo "Only available Linux/Ubuntu"
exit 1
fi
# update & upgrade package
sudo apt-get update
sudo apt-get upgrade -y
if [[ "$VERSION" == *"Ubuntu 18."* ]]; then
# Install Docker using the repository
sudo apt install apt-transport-https ca-certificates curl software-properties-common
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
sudo apt update
sudo apt-cache policy docker-ce
sudo apt install docker-ce
sudo systemctl status docker
elif [[ "$VERSION" == *"Ubuntu 20."* ]]; then
# Install Docker using the repository
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin
fi
# Grant docker.sock privileges to the current user
sudo usermod -a -G docker $USER
sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
sudo chmod g+rwx "/home/$USER/.docker" -R
# Apply changes
sudo service docker stop
sudo service docker start
우선 K8s의 컨테이너 런타임으로 Docker를 사용할 것이다.
따라서 Docker 먼저 설치하자.
만약 Docker가 이미 설치되어 있다면 이 과정을 생략해도 된다.
Ubuntu의 버전(20.04 LTS, 18.06 LTS)에 따라 Docker의 설치 방법이 조금 다른 것을 반영하였다.
설치 이후에 docker ps 명령어가 권한 때문에 동작하지 않는다면 서버를 재부팅 하면 될 것이다.
kubeadm 설치 및 k8s 설정 스크립트
#!/bin/bash
if [[ "$1" == "reset" ]]
then
sudo apt-mark unhold kubelet kubeadm kubectl
yes | sudo kubeadm reset
sudo systemctl restart kubelet
sudo apt purge kubeadm -y
sudo apt purge kubelet -y
sudo apt purge kubectl -y
sudo rm -rf ~/.kube/
sudo rm -rf /etc/kubernetes/
exit 1
fi
# Config docker drivergroup
# cgroupfs -> systemd
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
# Apply systemd
sudo systemctl daemon-reload
sudo systemctl restart docker
# install kubernetes cluster
sudo swapoff -a
sudo sed -i.bak -r 's/(.+ swap .+)/#\1/' /etc/fstab
# update package
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
# echo "============================"
# echo "Enter the user K8s Version"
# echo "1.18.4"
# echo "1.21.12"
# echo "1.22.9"
# echo "1.23.6"
# echo "1.24.0"
# echo "version: "
# read version
# version=$version"-00"
# echo "Entered Version: $version"
version="1.23.6-00"
echo "============================"
echo "Install start"
echo "============================"
sleep 1
# install kubelet, kubeadm, kubectl
sudo apt-get install -y kubelet=${version} kubeadm=${version} kubectl=${version}
# version hold
sudo apt-mark hold kubelet kubeadm kubectl
# if CentOS
# setenforce 0
# sed -i 's/^SELINUX=enforcing $/SELINUX=permissive/' /etc/selinux/config
# config bridge network using br_betfilter
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
현재 스크립트는 쿠버네티스 버전을 1.23.6 으로 고정해서 설치하게 된다.
만약 동적으로 버전을 달리 설치하고 싶다면 57,58,59 라인을 주석 해제하고, 60라인을 주석처리하면 중간에 버전을 입력받을 수 있다.
*주요 특징*
1.
./config-k8s.sh reset
명령을 입력하면 현재 설치된 kubectl, kubeadm, kubelet을 모두 삭제하고 k8s를 초기화 한다.
(/etc/sysctl.d/k8s.conf의 net bridge 설정은 초기화하지 않는다.)
2.
브리지 네트워크를 통과하는 IPv4와 IPv6의 패킷을 linux의 iptables가 관리하도록 설정한다.
-> 파드의 통신을 iptables로 제어하게 된다.
-> 하지만 br_netfilter를 적용해주지 않아서 iptables가 활성화되지 않을 것이다. ()
3.
호스트 네임을 따로 설정해주지는 않음
4.
Docker의 Cgroup을 systemd로 설정해줌
kubeadm을 사용한 K8s 설치 및 마스터 노드 설정 스크립트
#!/bin/bash
# init K8s
sudo kubeadm init --token-ttl 0 --pod-network-cidr=192.168.0.0/16 >> kubeadm-init-result.txt
sudo rm k8s-token.txt
# token saved at k8s-token.txt
# This token has no expiry date
cat kubeadm-init-result.txt | tail -2 >> k8s-token.txt
sudo rm kubeadm-init-result.txt
# config for master only
# Master get kubectl privileges
mkdir -p $HOME/.kube
sudo rm -f $HOME/.kube/config
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# config Calico network
curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O
kubectl apply -f calico.yaml
*주요 특징*
1. kubeadm을 사용해 K8s 클러스터를 시작한다.
2. 파드의 network cidr를 192.168.0.0/16 으로 설정해 주고 설치 후 발행되는 인증 토큰의 유효기간을 무한대로 설정한다.
3. 설치가 끝나면 출력되는 토큰과 워커 노드 설치 명령어를 k8s-token.txt에 저장한다.
4. 쿠버네티스 사용자에게 권한을 준다. (현재 사용자)
5. 컨테이너 네트워크 인터페이스 Calico 설정을 적용해서 쿠버네티스의 네트워크를 구성한다. (필수)
'DevOps > Kubernetes' 카테고리의 다른 글
Kubernetes, GitHub Actions, ArgoCD를 사용한 자동화 CI/CD 파이프라인 구축기 (1) | 2022.11.02 |
---|---|
[kubernetes] ubuntu에 kubeadm으로 K8s 설치하기 (cgroup, coredns 해결) (0) | 2022.04.05 |
[kubernetes] Helm으로 nginx ingress controller 설치하기 (1) | 2022.04.04 |
[Kubernetes] No Ingressclass resource with name nginx found 문제 해결하기 (Helm stable repo) (0) | 2022.03.31 |
[kubernetes] #10 쿠버네티스 영속성 데이터와 볼륨 (0) | 2022.03.14 |