2024. 1. 4. 15:27ㆍTechnology[DevOps]
[ 이번 게시글에서 구현할 사항 ]
- Kubernetes 환경을 구축합니다.
Kubernetes 환경 구축 효과
- Traffic Management : AutoScaling & LoadBalancing
- Non Stop Deploy : Rolling Update
- State Management : Pod Health Check
- Resource Management : Pod Resource Allocation
- Single Point of Failure Management : ReplicationController / ReplicaSet
- API Gateway (single Endpoint) : Ingress Controller
저장소 설정
Docker 설치를 위해 먼저 apt 패키지를 업데이트한다.
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
Docker’s 공식 GPG key 추가하기 위해 다음 절차를 진행한다.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Stable repository 설정을 위해 다음 명령을 수행한다.
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
Docker 엔진 설치
최신 버전의 Docker Engine 및 containerd를 설치하기 위해 다음 명령을 수행한다.
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
설치가 완료되면 Docker 버전 확인한다.
sudo docker version
설치된 버전
- Client: Docker Engine - Community
- Version: 20.10.13
- Server: Docker Engine - Community
- Version: 20.10.13
Docker를 서비스 등록 및 실행하기 위해 다음을 수행한다.
sudo systemctl enable docker
sudo systemctl start docker
- windows WSL 환경에서 systemctl 명령어가 동작하지 않는 경우 sudo service docker start 명령어 사용
Kubernetes 설치
Docker 설치가 완료되었다면 kubernetes 설치를 진행한다. k8s는 kubeadmin을 통해 설치를 진행할 수 있다.
설치 전 확인 사항 (master, node)
각 노드들은 Swap Disable 해야하기 때문에 각 노드별로 다음 명령을 통해 설정한다.
swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab
혹은
sudo swapoff -a && sudo sed -i '/swap/s/^/#/' /etc/fstab
그리고 iptable 설정하기 위해 다음 명령을 수행한다.
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
통신을 위해 방화벽 예외 설정을 수행한다.
sudo systemctl stop firewalld
sudo systemctl disable firewalld
kubelet, kubeadm, kubectl 설치 (master, node)
쿠버네티스 설치를 진행하기위해 저장소 업데이트 및 필수 패키지 추가한다.
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
구글 클라우드 퍼블릭 키 다운로드를 수행한다.
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
쿠버네티스를 설치하기 위해 Kubernetes 저장소 추가한다.
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
저장소 업데이트 후 kubelet, kubeadm, kubectl 설치를 순차적으로 진행한다.
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
쿠버네티스를 서비스 등록 및 재시작을 수행한다.
sudo systemctl daemon-reload
sudo systemctl restart kubelet
/etc/containerd/config.toml 파일을 수정합니다.
vi /etc/containerd/config.toml
위 파일에서 disabled_plugin -> enabled_plugin 으로 변경해줍니다. 이후 containerd service를 재시작합니다.
systemctl restart containerd
/proc/sys/net/ipv4/ip_forward값을 1로 설정합니다.
vi /etc/sysctl.conf
위 파일에서 net.ipv4.ip_forward=1행의 주석을 제거합니다. 이후 아래 명령어를 실행해 적용합니다.
sysctl -p
Control-plane 구성 (master only)
contol-plane 노드 초기화 - 해당 작업은 반드시 master에서만 진행한다.
sudo kubeadm init --pod-network-cidr=192.168.0.0/16
default pod-network-cidr를 192.168.0.016로 지정
위 kubeadm join 구문을 추후 worker node에서 실행
모든 사용자가 kube 명령어를 사용할 수 있게 하기 위해 다음을 설정한다.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Pod network 애드온 설치 (master only)
Pod 간의 네트워크 통신 위해 다음 명령을 통해 써드파티 애드온인 Calico 3.24.1 버전 설치 수행한다.
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/tigera-operator.yaml
kube 디렉토리 생성 및 이동
mkdir /kube && cd /kube
calico custom yaml 파일 생성 후 아래 파일의 내용으로 수정 후 저장
vi calico-resources.yaml
kubernetes 환경에 calico-resources.yaml 파일 적용
kubectl create -f calico-resources.yaml
containerd 서비스 재시작
systemctl restart containerd
Node 연결 (worker only)
앞서 control plane에서 kubeadm init 할 때 출력된 kubeadm join 명령어를 Worker Node 환경에서 실행
Control Plain
연결된 전체 노드를 출력했을 때
아래와 같이 control-plane과 worker node가 STATUS Ready 상태로 정상적으로 연결됨을 확인
kubectl get nodes
현재 실행되고 있는 전체 pod의 리스트를 출력했을 때
아래와 같이 전체 pod의 STATUS 가 Running 상태로 정상적으로 실행됨을 확인
kubectl get pods --all-namespaces
- CLI calico의 BIRD 통신이 안될 경우 : 179번 포트 허용 필요
ufw allow 179/tcp
- kubectl get nodes 로 노드의 상태를 봤을 때 NotReady 상태인 경우 apparmor 서비스 중지 필요
systemctl stop apparmor
systemctl disable apparmor
systemctl restart containerd
- 0/2 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }, 1 node(s) had untolerated taint {node.kubernetes.io/unreachable: }. preemption: 0/2 nodes are available: 2 Preemption is not helpful for scheduling.. → taint의 문제가 발생한다면 node의 taint 재설정 필요
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
'Technology[DevOps]' 카테고리의 다른 글
Kubernetes 환경 구축 ( Ubuntu ) - 3 (1) | 2024.01.09 |
---|---|
Kubernetes 환경 구축 ( Ubuntu ) - 2 (1) | 2024.01.06 |
Jenkins 복호화 (1) | 2023.08.14 |
git-secret 암호화 (1) | 2023.08.14 |
Logstash를 이용하여 RDB와 엘라스틱서치 동기화하기 (1) | 2023.08.09 |