Kubernetes 설치 및 설정 Code 분석, Pod 생명주기, 기본 명령어
※ 「컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 - 길벗」를 참고하여 작성하였습니다.
쿠버네티스의 구조
쿠버네티스 구조에 대한 자세한 설명과 아키텍쳐는 *링크 를 통해 확인할 수 있다.
쿠버네티스 설치를 직접 VirtualBox를 복제해서 하나하나 생성하려다보니 생각보다 복잡하더군요..
그래서 이전에 하던 방식은 잡시 접어두고
다양한 실습을 위해 Vagrant로 서버를 셋팅해두고 이를 활용하는 방식을 사용했습니다.
아래는 Vagrant를 활용해서 셋팅했던 코드 중 일부입니다.
이 코드들은 쿠버네티스를 설치하는 데 주요한 코드들로 볼 수도 있습니다.
파드의 생명주기(Lifecycle of a Pod)
P88) config.sh
- 1번)
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
브리지 네트워크를 통과하는 IPv4와 IPv6의 패킷을 iptables가 관리하도록 설정하는 Code
파드의 통신을 iptables로 제어한다. 필요에 따라 IPVS(IP Virtual Server) 같은 방식으로도 구성 가능
- 2번)
modprobe br_netfilter
br_netfilter 커널 모듈을 사용해 브리지로 네트워크를 구성. 이 때 IP 카스커레이드(Masquerade)를 사용해 내부 네트워크와 외부 네트워크를 분리한다. 실제로는 br_netfilter를 적용함으로써 위의 1번 코드가 활성화된다.
*IP 마스커레이드 : 커널에서 제공하는 NAT(Network Address Translation) 기능.
- 3번)
# config DNS
cat <<EOF > /etc/resolv.conf
nameserver 1.1.1.1 #cloudflare DNS
nameserver 8.8.8.8 #Google DNS
EOF
외부와 통신할 수 있게 DNS 서버 지정
P90) install_pkg.sh
- 1번)
# install kubernetes cluster ($1에는 버전이 전달됨)
yum install kubectl-$1 kubelet-$1 kubeadm-$1 -y
systemctl enable --now kubelet
쿠버네티스 구성을 위한 kubectl, kubelet, kubeadm을 설치하고 kubelet을 시작
P91) master_node.sh
- 1번)
#!/usr/bin/env bash
# init kubernetes
kubeadm init --token 123456.1234567890123456 --token-ttl 0 \
--pod-network-cidr=172.16.0.0/16 --apiserver-advertise-address=192.168.1.10
kubeadm을 통해 쿠버네티스의 워커노드를 받아들일 준비를 한다.
(토큰을 123456.1234567890123456으로 지정하고 ttl(time to live, 유지시간)을 0으로 설정해서 기본값인 24시간 후에 토큰이 계속 유지되도록 한다. 또 워커 노드가 정해진 토큰으로 들어오게 한다.
쿠버네티스가 자동으로 컨테이너에 부여하는 네트워크를 172.16.0.0/16(172.16.0.1~172.16.255.254)으로 제공하고,
워커 노드가 접속하는 API 서버의 IP를 192.168.1.10으로 지정해서 워커 노드들이 자동으로 API서버에 연결되게 한다.
- 2번)
# config for master node only
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
마스터노드에서 현재 사용자가 쿠버네티스를 정상적으로 구동할 수 있게 설정 파일을 루트의 홈 디렉터리(/root)에 복사하고 쿠버네티스를 이용할 사용자에게 권한을 준다.
- 3번)
# config for kubernetes's network
kubectl apply -f \
https://raw.githubusercontent.com/sysnet4admin/IaC/master/manifests/172.16_net_calico.yaml
컨테이너 네트워크 인터페이스(CNI)이니 캘리코(Calico)의 설정을 적용해 쿠버네티스의 네트워크를 구성한다.
P91) work_node.sh
- 1번)
#!/usr/bin/env bash
# config for work_nodes only
kubeadm join --token 123456.1234567890123456 \
--discovery-token-unsafe-skip-ca-verification 192.168.1.10:6443
kubeadm을 이용해 쿠버네티스 마스터노드에 접속한다. 이 때 연결에 필요한 토큰은 기존에 마스터노드에서 생성한 123456.1234567890123456을 사용한다. 간단하게 구성하기 위해 --discovery-token-unsafe-skip-ca-verification으로 인증을 무시하고, API 서버 주소인 192.168.1.10으로 기본 포트 번호인 6443번 포트에 접속하도록 설정한다.
참고할 만한 사이트들
unable to locate package kubeadm 에러
[Redis + Kubernetes + MSA + Spring] MSA 아키텍처의 프로젝트를 쿠버네티스에서 운용할 때 캐시 적용 방법
kubernetes 구축시 swap 메모리 off해야 하는 이유
SELinux(Security-Enhanced Linux)란?
SELinux(Security-Enhanced Linux)
· 관리자가 시스템 액세스 권한을 효과적으로 제어할 수 있는 Linux® 시스템용보안 아키텍처
· SELinux는 Linux 배포판에 내장된 시스템에 추가 보안 계층을 제공합니다.
· SELinux 활성화 : /etc/selinux/config 편집 → SELINUX=permissive 설정
'Data Engineering > docker, kubernetes(k8s)' 카테고리의 다른 글
Kubernetes 서비스의 개념과 인그레스 (0) | 2024.12.19 |
---|---|
Kubernetes 노드/파드 운영을 위한 명령어(생성, 변경, 삭제, replica, cordon, drain) (1) | 2024.12.18 |
Kubernetes(쿠버네티스, k8s)의 구조와 기본 용어 (feat. 한 권으로 배우는 도커&쿠버네티스, 한빛미디어) (0) | 2024.12.16 |
도커 네트워크 종류(bridge, host, container, none)와 통신상태 확인 (port, ping) 방법 (0) | 2024.12.15 |
도커 네트워크와 컨테이너 포트 포워딩 기본 개념 (1) | 2024.12.15 |
댓글