해당 글은 일프로 님의 인프런 강의 쿠버네티스 어나더 클래스 (지상편) - Sprint 1, 2의 내용을 정리한 글입니다.
해당 글에 사용된 내용, 사진 및 그림은 모두 강의와 강의 자료에 포함된 내용입니다.
ssh root@192.168.56.30
# 패키지 업데이트
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
k get pods -A
https://192.168.56.30:30000/#/login