PaaS 환경 구축/운영 방식 추가
4. 쿠버네티스 아키텍처 및 구성요소
4.1 Control Plane
kube-apiserver
쿠버네티스 클러스터로 들어오는 요청을 가장 앞에서 접수하는 역할을 합니다.
kubectl을 사용하여 명령을 수행할 경우 kube-apiserver로 전송합니다.
kube-scheduler
새로 생성된 파드를 감지하고, 어떤 노드에 배치되어야 하는지 판단합니다.
파드 스케줄링 결정을 위해 요구사항, 정책제어, 어피니티, 라벨 등 요소를 고려합니다.
kube-controller-manager
컨트롤러 프로세스를 실행하는 컨트롤 플레인 컴포넌트
노드 컨트롤러 : 노드가 다운되었을 때 통지와 대응에 관한 책임을 가집니다.
잡 컨트롤러 : 일회성 작업인 Job 오브젝트를 감시하여 해당 작업을 완료할 때까지 동작하는 파드를 생성합니다.
엔드포인트 컨트롤러 : 서비스와 파드를 연결합니다.
서비스 어카운트&토큰 컨트롤러 : 새로운 네임스페이스에 대한 기본 계정과 API 접근 토큰을 생성합니다.
ETCD
모든 클러스터 데이터를 담는 Key-Value 저장소입니다.
etcd 백업 기능으로 특정 시간의 데이터 백업 수행합니다.
4.2 Node 컴포넌트
kubelet
클러스터의 각 노드에서 실행되는 에이전트
파드에서 컨테이너가 확실하게 동작하도록 관리합니다.
파드 스펙(PodSpec)을 받아 컨테이너 동작을 확실히하며, 쿠버네티스를 통해 생성되지 않은 컨테이너는 관리하지 않습니다.
kube-proxy
각 노드에서 실행되는 네트워크 프록시로, 쿠버네티스 서비스 개념의 구현부
노드의 네트워크 규칙을 유지 관리하여, 클러스터&파드의 통신을 가능하게 해줍니다.
Container Runtime
컨테이너 실행을 담당하는 소프트웨어
쿠버네티스 CRI 구현체인 containerd, CRI-O 와 같은 런타임을 지원합니다.
쿠버네티스에서는 도커를 런타임으로 지원하였으나, v1.24 버전부터 기본 엔진에서 제외했습니다.
그림 출처 - https://www.docker.com/products/container-runtime/
Container Network Interface (CNI)
컨테이너 간의 네트워킹을 제어할 수 있는 플러그인을 만들기 위한 표준
CNI를 준수하는 다양한 플러그인이 존재( Calico, Weave, Cilium 등)
CNI 요구사항
veth 페어 생성 및 컨테이너 네트워크 인터페이스와 연결
파드 네트워크 대역 확인 후 IP 설정
CNI 설정 파일 작성
IP 설정 및 관리
컨테이너 내 기본 라우팅 정보 삽입(default route rule)
다른 노드들에게 IP 라우팅 정보 전달(advertising the routes)
호스트 서버에 라우팅 정보 삽입
네트워크 정책에 따라 트래픽 처리
…
4.3 컴포넌트 통신 플로우
Control plane의 API Server와 Worker Node의 kubelet을 통해 클러스터 관리합니다.
관리자는 kubectl 명령어를 사용하여 클러스터를 관리합니다.
사용자는 Proxy(Service IP)를 통해 접근하여 서비스 접속할 수 있습니다.
5. 쿠버네티스 구축
이번 실습은 Centos 7.8에서 Kubeadm을 이용해 마스터와 워커 노드를 1대 씩 구축해보도록 하겠습니다.
5.1 요구 사항
머신 당 최소 2GB 이상의 RAM과 2 CPU 이상을 필요로 합니다.
클러스터에 있는 모든노드들은 서로 네트워크로 연결되어 있어야 합니다.
모든 노드가 각자 고유한 호스트 이름, MAC 주소 및 Product_uuid를 가져야 합니다.
포트 설정. 자세한 내용은 여기를 참조하세요.
kubelet이 제대로 작동하려면 스왑을 비활성화 해야 합니다.
스왑을 활성화 하게 되면, 메모리 사용량이 실제로는 물리 메모리와 디스크 합으로 계산되어 메모리 사용량을 정확히 파악 할 수가 없기 때문에 리소스 관리에 문제가 생길 수 있습니다.
5.2 구축 실습
# 마스터와 워커에서 모두 진행 # MAC 주소 확인 ip link # Product_uuid 확인 cat /sys/class/dmi/id/product_uuid # 스왑 비활성화 swapoff -a # Selinux 비활성화 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # kubeadm, kubelet, kubectl 설치를 위해 레포지토리 및 GPG 키 추가 tee /etc/yum.repos.d/kubernetes.repo<<EOF [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg EOF # 레포지토리를 최신화 yum clean all yum update -y # kubeadm, kubelet, kubectl 설치 yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes # kubelet 시작 및 활성화 systemctl start kubelet systemctl enable kubelet # 커널 모듈 활성화 modprobe overlay modprobe br_netfilter # overlay란? File System과 관련있는 Linux kernal 모듈 # br_netfilter란? network 관련 Linux kernal 모듈 # 재기동해도 커널 모듈이 유지되도록 설정 cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 EOF # 재부팅 없이 새 sysctl 구성을 적용 sysctl --system # containerd 설치를 위해 레포지토리 추가 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 레포지토리 업데이트 yum update -y # containerd 설치 yum install -y containerd.io # containerd 구성 파일 설정 containerd config default > /etc/containerd/config.toml # containerd 시작 및 활성화 systemctl restart containerd systemctl enable containerd # 마스터에서만 진행 # 클러스터 초기화 kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=10.10.10.238 # 권한 설정하기 # 일반 유저인 경우 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # root 유저인 경우 export KUBECONFIG=/etc/kubernetes/admin.conf # cluster를 초기화하고 나온 정보는 join하는데 필요하니 꼭 메모해주세요. kubeadm join 10.10.10.238:6443 --token 65zdpt.i1vzr571eo22pcff \ --discovery-token-ca-cert-hash sha256:0d50fa4f095d8cd106fb1121cc7893c288184257ec31e81ae5a0a0602a68b315 # CNI(컨테이너 네트워크 인터페이스) 플러그인 설치 및 실행 kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/tigera-operator.yaml kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/custom-resources.yaml # 워커노드에서만 진행 kubeadm join 10.10.10.238:6443 --token 65zdpt.i1vzr571eo22pcff \ --discovery-token-ca-cert-hash sha256:0d50fa4f095d8cd106fb1121cc7893c288184257ec31e81ae5a0a0602a68b315 # 확인해보기 # Not Ready에서 Ready 상태로 변경되는데 약 10초정도 소요됩니다. kubectl get nodes NAME STATUS ROLES AGE VERSION master-node.novalocal Ready control-plane 14m v1.26.2 worker-node.novalocal Ready <none> 44s v1.26.2