AWS/Project

[CI/CD] 환경 구성 - EC2(K8S Master / Worker) 구성

jih0ssang 2024. 6. 22. 15:29

참고 블로그: https://www.skyer9.pe.kr/wordpress/?p=8209

k8s Master Node, Worker Node 생성 

시스템 업데이트

sudo apt update
sudo sed -i "/#\$nrconf{restart} = 'i';/s/.*/\$nrconf{restart} = 'a';/" /etc/needrestart/needrestart.conf
sudo apt -y upgrade

 

Swap off <optional>

AWS EC2 인스턴스는 default로 swap을 disable 하여 필요 없다. 선택사항!

sudo swapoff -a && sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

방화벽 off

sudo ufw disable

커널 파라미터 수정

sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF


sudo modprobe overlay
sudo modprobe br_netfilter

 

sudo tee /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

sudo sysctl --system

 

 

 

 

보안그룹 설정

allow-kubernetes 라는 이름의 보안그룹을 생성한다.
inbound/outbound 는 설정하지 않는다.

 

protect-kubernetes 라는 이름의 보안그룹을 생성한다.
inbound 에 아래와 같이 설정한다.

  • 유형 : 모든 TCP
  • 포트범위 : 0 – 65535
  • 소스 : allow-kubernetes

allow-kubernetes, protect-kubernetes 를 모든 master/worker node 에 할당한다.

 

 

 

 

모든 인스턴스에 도커 설치

sudo apt-get update

sudo apt-get install -y \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
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 install -y docker-ce docker-ce-cli containerd.io
sudo docker version
sudo systemctl enable docker
sudo systemctl start docker
sudo systemctl enable containerd
sudo systemctl start containerd
sudo mkdir -p /etc/docker
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

sudo systemctl daemon-reload
sudo systemctl restart docker
# cri-docker Install
VER=$(curl -s https://api.github.com/repos/Mirantis/cri-dockerd/releases/latest|grep tag_name | cut -d '"' -f 4|sed 's/v//g')
echo $VER
wget https://github.com/Mirantis/cri-dockerd/releases/download/v${VER}/cri-dockerd-${VER}.amd64.tgz
tar xvf cri-dockerd-${VER}.amd64.tgz
sudo mv cri-dockerd/cri-dockerd /usr/local/bin/

# cri-docker Version Check
cri-dockerd --version

wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.service
wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.socket
sudo mv cri-docker.socket cri-docker.service /etc/systemd/system/
sudo sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service

sudo systemctl daemon-reload
sudo systemctl enable cri-docker.service
sudo systemctl enable --now cri-docker.socket

# cri-docker Active Check
sudo systemctl restart docker && sudo systemctl restart cri-docker
sudo systemctl status cri-docker.socket --no-pager

 

sudo docker info | grep Cgroup

 

 

모든 인스턴스에 Kubernetes 설치

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/kubernetes-xenial.gpg
sudo apt-add-repository -y "deb http://apt.kubernetes.io/ kubernetes-xenial main"

sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

 

*여기서 Unable to locate package kubelet, kubeadm, kubectl 에러가 뜬다면 [CI/CD] TroubleShooting 페이지 참조

 

 

 

 

 

 

Control-plane 구성 <MasterNode만 수행>

# sudo kubeadm init

sudo kubeadm init --cri-socket unix:///var/run/cri-dockerd.sock

해당 명령어가 수행되면

토큰이 출력되는데 따로 메모장에 복사해둔다.

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

위의 명령어들은 sudo 없이 kubectl을 실행할 수 있도록 설정하는 내용이다.

 

 

지금은 NotReady 상태이다. 아직 신경쓰지 않아도 된다.

 

 

 

 

 

Worker-Node구성 <WorkerNode만 수행>

sudo kubeadm join 10.50.40.116:6443 --token  [아까 Master Node에서 옮겨둔 토큰 붙여넣기] \
        --discovery-token-ca-cert-hash [아까 Master Node에서 옮겨둔 토큰 붙여넣기] \
        --cri-socket unix:///var/run/cri-dockerd.sock

sudo와 --cri-socker을 추가하여 Master Node에 Worker Node #1, #2를 등록한다.

 

 

Worker Node에서도 kubectl get nodes로 확인할 수 있다.

*여기서 node 에러가 뜬다면 [CI/CD] TroubleShooting 페이지 참조

 

 

 

 

 

 

Control-plane 구성 <MasterNode만 수행>

 

Pod network 애드온 설치

# kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml

kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml
kubectl get nodes
kubectl get pods -n kube-system