[Kubernetes] 쿠버네티스 설치하기
in Kubernetes on Kubernetes
##
클러스터 설치 및 Pod 확인
설치
# 패키지 업데이트
yum -y update
# 타임존 설정(서울)
timedatectl set-timezone Asia/Seoul
# [WARNING FileExisting-tc]: tc not found in system path 로그 관련 업데이트
# 리눅스 시스템에서 네트워크 트래픽 제어와 관련된 유틸리티 모음
# 기본적으로 설치되어 있지 않기 때문에 바이너리 파일을 찾지 못해 에러가 발생한 것
# 향후 네트워크 기능 확장 및 안정성을 위해 쿠버네티스 공식 문서에서 의존성이 필요하다고 명시되어 있음
# Calico와 같이 쿠버네티스 네트워크 플러그인이 iproute-tc에 의존
# 노드 수준 트래픽 제어, 네트워크 보안 및 모니터링에 사용됨
yum install -y yum-utils iproute-tc
# /etc/hosts에 정적 호스트 네이밍과 IP 주소를 매핑
cat << EOF >> /etc/hosts
192.168.56.30 k8s-master
EOF
# 포트 관련 설정을 생략하기 위해 방화벽 비활성화
systemctl stop firewalld && systemctl disable firewalld
# 스왑 기능 비활성화
# systemd/cgroupfs 모두 컨테이너의 메모리 리소스의 할당량은 제어하는데 스왑을 설정하면 이러한 제한을 무시할 수 있기 때문
swapoff -a && sed -i '/ swap / s/^/#/' /etc/fstab
# 쿠버네티스 클러스터를 구성하기 위해 리눅스 커널에서 특정 모듈과 커널 파라미터 로드 & 설정
cat <<EOF |tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
# overlay 모듈 로드
# 컨테이너 이미지 레이어를 mount하는 용도
# 컨테이너 런타임에서 이미지 레이어 관리 시 필요
modprobe overlay
# br_netfilter 모듈 로드
# 브릿지 네트워크 장치에 대한 패킷 필터링 활성화하는 용도
# 쿠버네티스 네트워크 플러그인에서 브릿지를 사용하기 때문에 로드
modprobe br_netfilter
# net.bridge.bridge* : 브릿지 설정
# 리눅스 브릿지가 IPv4, IPv6 트래픽을 iptable에 전달하도록 설정
# 쿠버네티스 네트워크 정책 등에서 트래픽 필터링을 수행하기 위함
# net.ipv4.ip_forward : 리눅스 커널의 IP 포워딩을 활성화
# 한 네트워크 인터페이스에서 다른 인터페이스로 패킷을 전달 가능
# 쿠버네티스 노드에서 pod 간 통신을 위해 IP 포워딩을 사용하기 때문에 필수
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 디렉토리에 정의된 커널 파라미터 값 적용
sysctl --system
# 도커에서 제공하는 containerd.io를 통해 runC와 containerd를 함께 설치하기 위해 ret hat 계열인 CentOS의 도커 레포지토리 연결
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# containerd & runC 다운
yum install -y containerd.io-1.6.21-3.1.el9.aarch64
systemctl daemon-reload
systemctl enable --now containerd
# containerd를 패키지로 설치한 경우 CRI가 비활성화 되어있으므로 이를 활성화
# red hat 계열 리눅스는 기본적으로 systemd를 사용하므로 CRI 활성화 시 systemd 사용
containerd config default > /etc/containerd/config.toml
sed -i 's/ SystemdCgroup = false/ SystemdCgroup = true/' /etc/containerd/config.toml
systemctl restart containerd
# 쿠버네티스 설치
# kubelet, kubeadm, kubectl는 별도로 버전을 지정해 설치할 것이므로 제외
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의 엄격한 정책으로 인해 쿠버네티스 컴포넌트나 컨테이너 실행에 문제가 발생할 수 있으므로 일시적으로 비활성화
# 설치 후 활성화시키는 것이 보편적인 방법
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 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
# kubeadm으로 pod 네트워크 설정
# CIDR로 네트워크 대역폭 설정
# apiserver IP 주소 설정
kubeadm init --pod-network-cidr=20.96.0.0/12 --apiserver-advertise-address 192.168.56.30
# kubectl 사용 설정
# kubectl 구성 파일 저장 디렉토리
mkdir -p $HOME/.kube
# /etc/kubernetes/admin.conf 파일을 $HOME/.kube/config로 복사
# admin.conf 파일은 쿠버네티스 API 서버에 인증하고 액세스할 수 있는 인증 정보와 클러스터 정보가 포함되어 있음
# -i를 통해 덮어쓰기 활성화
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 파일의 소유권을 현재 사용자(= root)로 변경
chown $(id -u):$(id -g) $HOME/.kube/config
# CNI 플러그인 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
# 마스터 노드 taint 삭제
# taint로 인해 마스터 노드에는 사용자가 직접 생성한 애플리케이션이 pod로 스케줄링되지 않음
# 현재 실습 환경은 마스터 노드만이 존재하기 때문에 이를 비활성화해 마스터 노드에도 pod 스케줄링이 되도록 설정
kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane-
# kubectl 자동완성 설정
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
# 대시보드 설치
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/dashboard-2.7.0/dashboard.yaml
# metric 서버 설치
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/metrics-server-0.6.3/metrics-server.yaml
pod 확인
k get pods -A
대시보드 접속
https://192.168.56.30:30000/#/login
설치 과정 설명
모든 노드
- rocky linux 기본 설정
- 패키지 업데이트, 타임존 설정
- kubeadm 설치 전 사전 작업
- 방화벽 해제, 스왑 비활성화
- 컨테이너 런타임 설치
- containerd, cri-o, 도커 엔진, 미란티스 컨테이너 런타임 등
- 컨테이너 런타임 설치 전 사전 작업
- iptables으로 IPv4를 포워딩해 브릿지된 트래픽을 보도록 설정
- 쿠버네티스 클러스터의 가상 네트워크 솔루션은 노드 간 통신을 위해 리눅스 브릿지를 사용하기 때문
- 노드 머신이 브릿지를 통해 전달되는 트래픽을 볼 수 있도록 허용하는 설정
- 리눅스의 네트워크가 쿠버네티스의 pod 네트워크로 접근할 수 있도록 하는 과정
- iptables으로 IPv4를 포워딩해 브릿지된 트래픽을 보도록 설정
- systemd/cgroups
- 쿠버네티스가 컨테이너 관리와 리소스 제어를 위해 사용하는 커널 기능
- 쿠버네티스 설치 시 systemd/cgroupfs로 설정한 값과 컨테이너 런타임의 설정을 통일시켜야 함
- 쿠버네티스, containerd의 기본 값은 cgroups
- red hat 계열은 기본 값이 systemd이기 때문에 스크립트에서는 systemd로 설정을 변경
- cgroups
- 프로세스를 계층 구조로 그룹화하고 그룹별로 리소스 사용량(CPU, 메모리, 디스크 I/O 등)을 제한하고 모니터링 할 수 있는 커널 기능
- 쿠버네티스에서는 각 컨테이너를 별도의 cgroup에 할당하여 컨테이너 간 리소스 분리 보장
- systemd
- 리눅스 시스템 및 서비스 관리자로, 프로세스 관리와 기능을 cgroups와 연동하여 수행
- 컨테이너 런타임인 containerd 설치
- 도커에서 제공하는 containerd.io를 통해 runC와 containerd를 함께 설치
- 도커 엔진 설치를 위해 repository 설정 후 containerd 설치
- 설치 시 쿠버네티스와 호환되는 버전인지 확인하고 신규 기능이 필요하지 않는 이상 LTS 버전을 사용할 것을 권장
- 설치 후 파일 확인
- cntainerd를 패키지를 통해 설치했다면 CRI가 비활성화 되어 있기 때문에 이를 활성화
- 도커에서 제공하는 containerd.io를 통해 runC와 containerd를 함께 설치
- 쿠버네티스 패키지 설치
- kubelet, kubeadm, kubectl 설치
- kubelet
- 쿠버네티스 노드에서 실행되는 에이전트로, 컨테이너가 실행되는 환경 관리
- 노드의 Pod 스펙을 기반으로 컨테이너를 실행하고 관리
- 각 노드는 반드시 kubelet를 설치해야 함
- kubeadm
- 쿠버네티스 클러스터를 부트스트랩하고 관리하는 도구
- 클러스터 초기화, 노드 조인, 업그레이드, 설정 관리 등의 작업 수행
- kubectl
- 쿠버네티스 클러스터와 상호작용하기 위한 커맨드라인 도구
- kubelet
- kubelet, kubeadm, kubectl 설치
마스터 노드 세팅
- kubeadm으로 클러스터 생성
- 클러스터 초기화
- 다음과 같은 컴포넌트가 pod 형태로 초기화
- kube-scheduler
- 쿠버네티스 클러스터의 스케줄러 역할을 수행하는 컴포넌트
- 새로 생성된 Pod를 적절한 노드에 할당하고 리소스를 효율적으로 분배
- control-mgmt
- 쿠버네티스 클러스터의 다양한 컨트롤러를 관리하는 컴포넌트
- 노드 관리, 레플리케이션 관리, 엔드포인트 관리, 서비스 어카운트/토큰 관리 등의 역할 수행
- etcd
- 분산 키-값 저장소로, 쿠버네티스 클러스터의 모든 클러스터 데이터를 저장하는 역할
- 클러스터 상태, 구성 정보, 시크릿 데이터 등 관리
- kube-proxy
- 노드 수준의 네트워크 규칙을 관리하고 유지하는 컴포넌트
- 클러스터 내부 및 외부에서 Kubernetes 서비스에 접근할 수 있도록 기능 제공
- kube-apiserver
- 쿠버네티스 API를 제공하는 컴포넌트
- kube-scheduler
- Pod 네트워크 세팅
- CIDR을 통해 네트워크 대역을 새롭게 세팅
- 약 100만 개 정도의 pod를 생성할 수 있는 대역
- 초기화 이후 쿠버네티스에 접속할 수 있는 인증서 생성
- 다음과 같은 컴포넌트가 pod 형태로 초기화
- kubectl 사용 설정
- 쿠버네티스 설치 및 초기화 이후 생성된 인증서를 사용할 수 있도록 설정
- 인증서를 통해 kube-apiserver에 API를 보내 CLI 통신 가능
- CNI(Container Network Interface) 플러그인 설치(calico)
- 컨테이너들 간의 통신을 관리하는 쿠버네티스와 네트워크 간의 인터페이스
- 마스터에 pod를 생성할 수 있도록 설정
- kubeadm, 대시보드 pod는 마스터에 올라가도 되도록 설정이 되어 있음
- 마스터에 유저가 만든 pod는 일반적으로 올리지 않는 것이 암묵적인 원칙
- 현재 환경은 마스터 노드만 존재하기 때문에 관련된 설정을 수행하는 과정
- 클러스터 초기화
- 쿠버네티스 편의 기능 설치
- kubectl 자동완성 기능
- Dashboard 설치
- Metrics Server 설치
- 컨테이너 CPU, Memory는 기본적으로 컨테이너 런타임이 관리
- Metrics Server가 Pod에 존재하는 모든 컨테이너의 Metrics를 조회해 표시