현재 수강중인 강의에서 나왔던 내용을 간략하게 정리해 보고자 한다.
위 그림은 전반적인 테스트환경 구성도이며, 테스트를 위한 Linux 가상머신(rocky linux)이 설치되어 있다고 가정한다.
1번부터 3번은 리눅스 설치 및 테스트 환경 구성에 대한 내용이므로 생략한다.
위 그림을 기준으로 4번부터 간략하게 정리하면 다음과 같다.
쿠버네티스 설치 (모든 node)
4. 테스트 환경을 위한 rocky linux 기본 설정
가장 먼저 패키지를 업데이트하고 timezone을 설정한다.
yum -y update # 패키지 업데이트
timedatectl set-timezone Asia/Seoul # timezone을 Asia/Seoul로 변경
yum install -y yum-utils iproute-tc # traffic-control이 시스템 경로에 없다는 경고문구 이슈 업데이트
여기서 iproute-tc는 tc 유틸리티를 포함하고 있다. tc는 trafiic-control 인데, 이는 네트워크 트래픽을 제어하는 데 사용되며, Kubernetes와 같은 시스템에서 네트워크 관리에 필요할 수 있다.
5. kubeadm 설치 전 사전작업
kubeadm?
kubeadm은 Kubernetes 클러스터를 쉽게 설치하고 관리할 수 있도록 도와주는 도구이다.
Kubernetes는 컨테이너화 된 애플리케이션의 배포, 확장 및 관리를 자동화하는 시스템인데, kubeadm은 이 Kubernetes 클러스터를 설정하는 과정을 단순화 해준다.
아래는 방화벽을 비활성화 하고 스왑 메모리를 비활성화 하는 단계이다.
systemctl stop firewalld && systemctl disable firewalld # 방화벽 해제
swapoff -a && sed -i '/ swap / s/^/#/' /etc/fstab # swap memory off
방화벽을 비활성화 하는 이유는 네트워크 트래픽 때문이다.
Kubernetes는 클러스터 내 노드 간에 많은 네트워크 트래픽을 주고 받아야 한다. 이 때 방화벽이 활성화 되어 있으면, 필수적인 포트가 차단되어 노드간 통신이 원활하지 않을 수 있다.
스왑 메모리를 비활성화 하는 이유는 kubelet 설정과 성능 및 안정성 때문이다.
Kubernetes의 주요 컴포넌트 중 하나인 Kubelte은 기본적으로 스왑 메모리를 사용하지 않도록 설정되어 있다.
스왑 메모리가 활성화 되어 있으면 Kubelte이 제대로 동작하지 않을 수 있다.
6. 컨테이너 런타임 설치
컨테이너 런타임은 컨테이너를 생성하고 실행하는 소프트웨어다.
kubernetes는 컨테이너를 이용하기 때문에 필수적으로 수행해야 하는 과정이다.
컨테이너 런타임을 본격적으로 설치하기 전 사전 작업들을 수행해야 한다.
6-1. 컨테이너 런타임 설치 전 사전작업: iptables 세팅
iptables는 네트워크 패킷을 필터링하여 해당 패킷을 허용하거나 차단할 수 있다.
현재 kubernetes 설치 가이드에선 런타임 설치 전 아래 과정을 수행하라고 명시되어 있다.
# 커널 모듈 로드 설정
cat <<EOF |tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
이 명령은 `overlay` 와 `br_netfiltet`라는 두 개의 커널 모듈을 `/etc/modules-load.d/k8s.conf` 파일에 추가하고, 시스템이 부팅 될 때 이 모듈들이 자동으로 로드되도록 설정한다.
# 커널 모듈 로드
modprobe overlay
modprobe br_netfilter
앞서 설정한 `overlay`와 `br_netfilter` 모듈을 즉시 로드한다. `modprobe` 명령어는 지정한 커널 모듈을 커널에 로드하는 역할을 한다.
# 네트워크 설정 구성
cat <<EOF |tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
이 명령은 네트워크 설정을 `/etc/sysctl.d.k8s.conf` 파일에 추가한다.
각각의 설정은 아래와 같다.
- net.bridge.bridge-nf-call-iptables = 1: 브릿지 네트워크를 통한 패킷이 iptables 규칙을 통과하도록 설정
- net.bridge.bridge-nf-call-ip6tables = 1: 브릿지 네트워크를 통한 IPv6 패킷이 ip6tables 규칙을 통과하도록 설정
- net.ipv4.ip_forward = 1: IP 포워딩을 활성화하여 라우팅 기능을 허용
6-2. 컨테이너 런타임 (containerd 설치)
containerd는 docker engine에 속해있는 하나의 기능으로 docker에서 가장 중요한 container 생성만을 담당한다.
kubernetes는 기본적으로 컨테이너 생성의 역할도 하기 때문에(정확히는 생성 명령을 내리기 때문에)
정상적으로 구동하기 위해서 설치해야 한다.
Docker를 설치하려면 containerd와 runc가 필요한데, runc는 container의 low level로, containerd가 low level로 생성명령을 내리는 프로그램이다. 여기서는 Docker engine을 설치하여 필요한 패키지를 설치할건데, docker engine 전부는 필요하지 않고 container.io를 설치하는 방법을 사용한다.
# Docker 저장소 추가
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
이 명령은 Docker의 공식 저장소를 CentOS(Rocky Linux) 시스템의 yum 리포지토리에 추가하는 것이다.
이를 통해 Docker 관련 패키지들을 쉽게 설치하게 된다.
# containerd 설치
yum install -y containerd.io-1.6.21-3.1.el9.aarch64
systemctl daemon-reload
systemctl enable --now containerd
여기서 containerd 패키지의 특정 버전을 설치하고 중간에 붙어있는 -y 옵션은 설치 과정에서 모든 질문들에 자동으로 `yes` 라고 응답 하도록 한다.
그 후에 systemd 데몬을 재로 드하고 설치 된 containerd 를 인식하도록 한 후 containerd 서비스를 활성화 한다.
참고로 버전을 선택할때는 오랜기간 업데이트를 지원해주는 LTS 버전을 선택하는것이 좋다.
물론 그 LTS 버전이 다른 서비스와 인터페이스가 맞는지도 확인해야 한다.
6-3. CRI(Container Runtime Interface) 활성화
CRI는 Kubernetes에서 컨테이너 런타임을 추상화 하기 위한 표준 인터페이스다.
Kubernetes는 이 인터페이스를 통해 다양한 컨테이너 런타임과 통신할 수 있고, 특정 런타임에 종속되지 않고도 다양한 컨테이너 런타임을 사용할 수 있게 된다.
우리는 containerd를 설치할 때 패키지를 통해 설치했으므로 이 설정이 비활성화 되어 있다.
아래 명령어를 이용하여 CRI를 활성화 하자.
# CRI 활성화 후 ststemctl 재시작
containerd config default > /etc/containerd/config.toml
sed -i 's/ SystemdCgroup = false/ SystemdCgroup = true/' /etc/containerd/config.toml
systemctl restart containerd
7. kubeadm 설치
다음으로 kubeadm을 설치하기위한 repo 설정을 진행한다.
# kubeadm repo 설정
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
다음은 SELinux 관련 설정을 변경한다.
SELinux(Security-Enhanced Linux)는 리눅스 커널에서 제공하는 보안 모듈로, 시스템의 접근 제어 정책을 강력하게 시행하여 보안을 강화하는 역할을 한다.
아래 명령어는 SELinux를 비활성화 하는 명령어다.
# SELinux 비활성화
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
이 명령어를 왜 수행해야 하냐면, Kubernetes 클러스터나 컨테이너 환경에서는 SELinux를 비활성화 하거나 `permissive` 모드로 설정하는 경우가 많다.
SELinux가 활성화 된 상태에서는 컨테이너 및 Pod가 특정 시스템 리소스에 접근하는 데 문제가 발생할 수 있기 때문이다.
SELinux 설정이 끝났다면 다음으로 kubelet, kubeadm, kubectl을 설치한다.
# kubelet, kubeadm, kubectl 설치
yum install -y kubelet-1.27.2-150500.1.1.aarch64 kubeadm-1.27.2-150500.1.1.aarch64 kubectl-1.27.2-150500.1.1.aarch64 --disableexcludes=kubernetes
systemctl enable --now kubelet
Master Node 세팅
이전까지가 모든 node에 필요한 설치였다면, 이번엔 master node의 세팅을 해야 한다.
master node는 클러스터의 모든 작업을 조정하고, 클러스터 내의 모든 노드와 리소스를 관리한다.
8. kubeadm으로 클러스터 생성
이제 kubeadm을 이용하여 클러스터를 생성해보자. 크게 4가지 단계로 나눠서 설명을 진행한다.
8-1. 클러스터 초기화 (Pod Network 세팅)
아래 명령어를 이용하여 클러스터를 초기화 할 수 있다.
# 클러스터 초기화 (Pod Network 세팅)
kubeadm init --pod-network-cidr=20.96.0.0/16 --apiserver-advertise-address 192.168.56.30
해당 명령어 동작 시, 아래의 쿠버네티스 컴포넌트들이 설치된다.
- kube-scheduler
- control-mgmt
- etcd
- kube-proxy
- kube-apiserver
모두 pod 형태로 기동이 되고, 이미지 자체도 인터넷으로 받아오기 때문에 시간이 오래 걸릴 수 있다. 또한 cidr(Classless Inter-Domain Routing)을 설정하여 Pod Network 대역을 새로 지정했다.
8-2. kubectl 사용 설정
쿠버네티스 설치가 끝나면 쿠버네티스에 접속할 수 있는 인증서가 만들어져 있다.
이제 만들어진 인증서를 kubectl이 가져와서 사용할 수 있게 설정해야 한다.
# kubectl 사용 설정
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config # 설정 파일 복사
chown $(id -u):$(id -g) $HOME/.kube/config # 파일의 소유권 변경
이 동작이 끝나면 kubectl로 kube-apiserver에 api를 날리면서 CLI통신을 할 수 있는 사용자 환경 구성이 종료된다.
8-3. Pod Network 설치(calico)
다음으로 CNI(Container Network Interface) Plugin으로 calico를 설치해야 한다.
앞서 언급한 CRI(Container Runtime Interface)는 컨테이너를 생성하고 관리하는 부분에 있어서 쿠버네티스와 런타임간의 인터페이스라면, CNI는 컨테이너 간의 통신을 관리하는 부분에 대한 쿠버네티스와 네트워크간의 인터페이스다.
여기서 calico는 네트워크를 제공하는 여러 솔루션 중에 하나이다.
# Pod Network(calico) 설치
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/calico-3.26.4/calico.yaml
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/calico-3.26.4/calico-custom.yaml
Linux OS에 할당된 Network가 쿠버네티스의 Pod Network로 연결이 되려면 iptables를 통과해야하고,
이 과정에서 문제가 생기지 않도록 설정한 것이다.
PC브라우저에서 Dashboard까지 연결되는 과정을 간단하게 정리하면,
- 대시보드는 Pod network로부터 받은 IP가 있음
- 리눅스 네트워크에는 30000번의 포트가 열려있음
- 해당 port로 접속하면 그 트래픽은 리눅스의 iptables를 거쳐서 calico 네트워크망으로 들어가게 됨
- 망 내에서 대시보드 ip를 찾음
- iptables를 들어가보면 30000번 포트와 대시보드 ip가 매핑되어 있음
8-4. Master에 Pod를 생성할 수 있도록 설정
이제 Master에 Pod를 생성할 수 있도록 설정해야 한다.
이는 kubeadm에서 생성되는 컴포넌트나 대시보드는 Pod들이 마스터에 올라가도 되도록 설정되어 있다.
그리고 User가 만든 Pod는 Master에 올리지 않는게 정석이다. 하지만 여기서는 master 노드만 만들것이기 때문에
관련 설정을 해제하여 Master node에서도 Pod를 실행할 수 있도록 해준다.
# k8s-master 노드에서 일반적인 애플리케이션 Pod도 스케줄링 될 수 있도록 함
kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane-
9. 쿠버네티스 편의기능 설치
마지막으로 편의 기능들을 설치하고 쿠버네티스 설치를 마무리한다.
# 자동 완성 기능
yum -y install bash-completion
echo "source <(kubectl completion bash)" >> ~/.bashrc
echo 'alias k=kubectl' >>~/.bashrc
echo 'complete -o default -F __start_kubectl k' >>~/.bashrc
source ~/.bashrc
# Dashboard 설치
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/dashboard-2.7.0/dashboard.yaml
# Metrics Server 설치 (CPU, Memory등의 정보 제공)
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/metrics-server-0.6.3/metrics-server.yaml
이 포스트는 쿠버네티스 어나더 클래스 (지상편) - Sprint 1, 2를 기반으로 작성되었습니다.
'DevOps' 카테고리의 다른 글
[MySQL] MySQL DB를 PostgreSQL DB로 마이그레이션 하는 방법 (0) | 2024.06.14 |
---|---|
[MySQL] 간단한 1회성 마이그레이션 스크립트를 수행해야 한다면? (0) | 2024.06.11 |
[k8s] 쿠버네티스와 컨테이너 한방 정리 (0) | 2024.05.14 |
[AWS] AWS CLI 여러 계정 사용하기 (1) | 2022.05.07 |
DockerFile 작성하기 (0) | 2021.12.28 |