[구름 k8s] TIL 3-1-4

Peppie·2022년 10월 7일
0

1. 쿠버네티스 환경 구성

KubeAdm을 이용한 Kubernetes 환경 구성

  1. Master node (Control plane), Worker node에 해당하는 서버 생성 (준비)
    : Kubernetes 설치 가능 최소 사양 이상으로 구성 (필수 포트 번호 확인해서 포트 개방)
    스왑의 비활성화 : kubelet이 제대로 작동하게 하려면 반드시 스왑 사용 X 설정

    sudo swapoff -a : swap 기능 off
    echo 0 > /proc/sys/vm/swappiness : 커널 속성의 swap disable, root 사용자로 전환 후 수행
    sed -e '/swap/ s/^#*/#/' -i /etc/fstab : swap을 하는 파일시스템을 찾아 삭제

  2. Master node (Control plane), Worker node에 container runtime 환경 구성
    : Docker 설치

# 도커 설치 방법은 지난 TIL 2-4-3 참고, 이후

cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

명령어 추가 실행

sudo systemctl enable --now docker
  1. kubeAdm, kubectl, kubelet 설치 - Master node / Work node에 모두 설치
  • kubeadm : 클러스터를 부트스트랩하는 명령
  • kubectl : 클러스터와 통신하기 위한 CLI, 클
  • kubelet : 클러스터의 모든 머신에서 실행되는 Pod와 Container 시작 등의 작업을 수행하는 컴포넌트
# apt 패키지 색인 업데이트 후 쿠버네티스 apt 레포지토리를 사용하는데 필요한 패키지 설치
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

# 구글 클라우드의 공개 샤이닝 키 다운로드
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

# 쿠버네티스 apt 레포지토리 추가
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list


# apt 패키지 색인 업데이트 후 kubelet, kubeadm, kubectl 설치하고 해당 버전 고정
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

# 설치 확인
kubeadm version
kubelet --version
kubectl version

쿠버네티스 클러스터 구성

  1. Master node - 클러스터를 구성하기 위한 작업
  • Master node에 클러스터 구성
kubeadm init <args> : 관리자 권한으로 실행

[ 여담) kubeadm init 명령 실행시 에러 발생 해결 방안 ]
sudo rm /etc/containerd/config.toml
sudo systemctl restart containerd
  • 클러스터 구성이 성공하면 사용자가 kubectl 명령 사용을 위한 환경 구성
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. worker node에서 master node에 연결하여 cluster 구성 완료
kubeadm join 127.0.0.1:6443 --token 2yx1k0.f12wtr0v289s4rl9 \
        --discovery-token-ca-cert-hash \
       sha256:30087c0c2541d2287dc115fc18034349a517475042408f6841e4a1286b495799
       
cat > token.txt (+ shift+enter 후 위의 값 복붙으로 값 저장 권장)
  1. CNI 구성 : 클러스터에 CNI add-on
kubectl apply <CNI 정보>

# weavenet plugin add-on
kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
(에러나면 sudo systemctl daemon-reload , sudo systemctl restart kubelet 후 위 코드 재실행)
  • 클러스터 구성 확인
kubectl get nodes

더 자세한 정보를 얻고 싶다면
kubectl get nodes -o wide
  1. Worker node에서 Master node 연결
sudo kubeadm join 127.0.0.1:6443 --token 2yx1k0.f12wtr0v289s4rl9 \
        --discovery-token-ca-cert-hash \
       sha256:30087c0c2541d2287dc115fc18034349a517475042408f6841e4a1286b495799

(이미 다운받았다는 등의 에러나면 sudo kudeadm reset 후 위 코드 재실행)
  1. Kubernetes 환경 구성 확인
kubectl get nodes
kubectl get nodes -o wide
kubectl cluster-info
kubectl get pod --all-namespaces

Kubernetes playground

https://labs.play-with-k8s.com/

  • 도커에서 제공, docker hub 계정으로 로그인
  • 하나의 세션에 대하여 4시간의 사용 시간 부여
  • control-plane, worker node를 직접 구성 -> 클러스터 직접 구성

kubeadm

https://kubernetes.io/docs/reference/setup-tools/kubeadm/

  • kubeadm init : 클러스터 초기화
  • kubeadm join : 클러스터에 연결
  • kubectl 자동완성 기능 적용

    source <(kubectl completion bash)
    echo "source <(kubectl completion bash)" >> ~/.bashrc

  • kubeadm 자동완성 기능 적용

    source <(kubeadm completion bash)
    echo "source <(kubeadm completion bash)" >> ~/.bashrc

2. 쿠버네티스 동작 원리

쿠버네티스 클러스터 이해

클러스터 구성 요소

마스터 노드 : control plane

대규모 컨테이너를 운영하려면 워커 노드의 가용 리소스 현황을 고려하여 최적의 컨테이너 배치 및 모니터링, 컨테이너에 대한 효율적인 추적 관리 수행

워커 노드

각기 다른 목적과 기능으로 세분화된 컨테이너들이 실제 배치되는 노드

Control Plane Component (마스터 노드)

클러스터의 마스터 노드가 수행하는 각 컨테이너 및 워커 노드 관리는 Control Plane Component를 통해 수행

etcd

  • 클러스터 안의 각 구성요소들에 대한 정보가 key - value 형태로 저장된 DB
  • 클러스터의 모든 핵심 데이터가 저장
  • kubectl 명령을 통해 조회 가능한 모든 정보는 etcd를 거쳐오며, 제어 명령을 통해 클러스터 변화가 적용되었다면 etcd에 업데이트됨

Scheduler (kube-scheduler)

Pod를 어느 노드에 배치할지 결정하는 프로세스

  • 실제 해당 노드에 Pod를 배치하는 작업은 kubelet에 의해 수행
  • kube-scheduler는 kube-system 네임스페이스에 kube-controller-scheduler-master Pod로 존재
    • kube-scheduler Pod 정의 파일
    • /etc/kubernetes/manifests/kube-scheduler.yaml

API 서버 (kube-apiserver)

클러스터 각 요소들을 모니터링하며 작업을 수행하도록 해주는 중앙 접근 포인트 역할

  • 유저 인증, 요청사항 검증, 데이터 수신, etcd 업데이트, 스케쥴링, kubelet 통신 등 다양한 역할 담당
  • API 서버에 대한 client가 kubectl 명령
  • API는 kube-system 네임스페이스에 kube-controller-scheduler-master Pod로 존재
    • kube-apiserver Pod 정의 파일
    • /etc/kubernetes/manifests/kube-apiserver.yaml

controller manager (kube-controller-manager)

클러스터 안에서 구동되는 다양한 리소스들을 모니터링하며 이들이 원할하게 동작하도록 관리하는 프로세스

  • Node, ReplicaSet, Deployment, StatefulSet, DaemonSet, Service Account, Cronjob, Namespace 등 각 구성요소들을 관리하는 control들이 하나로 패키징된 형태
  • API는 kube-system 네임스페이스에 kube-controller-manager-master Pod로 존재
    • kube-apiserver Pod 정의 파일
    • /etc/kubernetes/manifests/kube-controller-manager.yaml

Node Componenet (워커 노드)

각 노드에서 Pod와 컨테이너를 구동시키고 관리하기 위해 필요한 요소

kubelet

클러스터의 각 노드에서 Pod 內 컨테이너들이 정상 구동되도록 조율하는 agent

  • 마스터 노드의 스케쥴러가 노드를 Pod를 노드에 할당하면 kubelet이 해당 Pod와 컨테이너 배치
  • Pod와 컨테이너 상태를 주기적으로 체크하고 결과를 API 서버에 전송하는 역할
  • kubeadm으로 클러스터 구축시 kubelet은 포함 X
    -> 별도로 kubeadm, kubectl과 함께 설치하고 버전 일치시켜줘야

kube-proxy

클러스터의 각 노드에서 구동되는 쿠버네티스 네트워크 프록시

  • 서비스 객체로 들어오는 내/외부 트래픽을 어느 Pod로 포워딩할 것인지에 대한 규칙 생성/관리
  • kubeadm은 모든 노드에 하나씩 kube-proxy Pod를 daemonset으로 배포

container runtime

클러스터 내부에 컨테이너 이미지를 가져오고 구동시키는 엔진

  • 여러 종류의 container runtime을 지원 목적 CRI 스펙을 지원하는 container rumtime 사용 가능 구성
  • Kubernetes v1.24 이후 도커 지원 중단 but containerd와 他 대체 수단 지원 및 도커 컨테이너는 CRI 스펙 준수 => 동작 문제 X

쿠버네티스 동작 방식

쿠버네티스는 선언형 API를 사용

명령형 API

일반적으로 사용하는 CLI 명령

선언형 API

원하는 결과만 제시하고 시스템이 스스로 결과를 얻어주는 API

NginX 어플리케이션 배포/서비스 운영을 쿠버네티스에서 동작하는 과정

개발자/운영자 host

  1. 개발자/운영자는 NginX 이미지 생성
  2. NginX 이미지를 public 또는 private registry에 저장
  3. 개발자/운영자는 쿠버네티스 명령을 통해 컨테이너 생성 요청 -> 선언형 API 사용

클러스터 - Control plane (마스터 노드)

  1. 요청한 명령은 클러스터의 마스터 노드 API 서버에 전달 -> 스케쥴러에 컨테이너 생성 요청
  2. 스케쥴러는 노드 상태에 따라 특정 노드에 Pod 생성 요청

클러스터 - 노드 (워커 노드)

  1. 해당 노드의 kubelet이 스케쥴러의 요청 정보 수신
  2. 요청 수신 정보에 따라 Pod 생성
  3. 컨테이너 생성 : 현재 노드에 image가 없는 경우 레지스트리로부터 이미지 다운로드
  4. 생성된 컨테이너를 이용하여 Pod 생성

0개의 댓글