Study/K8S

CKA 1차 강의 정리

monitor 2023. 8. 13. 16:00

1. ETCD


역할 : key value 쌍으로 데이터를 저장하는 DataBase

데이터 : 노드, 포드, Config, Secret, 계정 정보, role, binding, others...

흐름 : Cluster 내부의 변화가 있으면 모두 ETCD 클러스터에 저장 되었을 때만 완료된 것으로 간주된다.

1. SETUP - MANUAL


wget -q --show-progress --https-only --timestamping "https://github.com/coreos/etcd/releases/download/v3.5.3/etcd-v3.5.3-linux-amd64.tar.gz

 

ETCD.SERVICE

ExecStart=/usr/local/bin/etcd \
--name ${ETCD_NAME} \
--cert-file=/etc/etcd/kubernetes.pem \
--key-file=/etc/etcd/kubernetes-key.pem \
--peer-cert-file=/etc/etcd/kubernetes.pem \
--peer-key-file=/etc/etcd/kubernetes-key.pem \
--trusted-ca-file=/etc/etcd/ca.pem \
--peer-trusted-ca-file=/etc/etcd/ca.pem \
--peer-client-cert-auth \
--client-cert-auth \
--initial-advertise-peer-urls https://${INTERNAL_IP}:2380 \
--listen-peer-urls https://${INTERNAL_IP}:2380 \
--listen-client-urls https://${INTERNAL_IP}:2379,https://127.0.0.1:2379 \
--advertise-client-urls https://${INTERNAL_IP}:2379 \
--initial-cluster-token etcd-cluster-0 \
--initial-cluster controller-0=https://${CONTROLLER0_IP}:2380,controller-1=https://${CONTROLLER1_IP}:2380 \
--initial-cluster-state new \
--data-dir=/var/lib/etcd

 

 

advertise-client-urls 부분이 kube API 설정시 해당 IP로 지정이 되어야 합니다. 그래야 ETCD 서버로 접속을 할 수 있기 때문입니다.

2. SETUP - Kubeadm


kubectl get pods -n kube-system

이렇게 하면 별도의 설정이 필요 없이 이 포드를 이용해서 ETCD를 탐색할 수 있습니다.

ETCD의 저장된 key 를 보고 싶다면 아래 명령어를 실행하세요

kubectl exec etcd-master –n kube-system etcdctl get / --prefix –keys-only

3. 고가용성 환경에서의 ETCD - ETCD in HA Environment


다중 마스터 노드의 ETCD가 있을 것이고 이때 서로의 인스턴스를 알게하여야 합니다.

초기 클러스터 옵션은

ETCD.SERVICE

ExecStart=/usr/local/bin/etcd \
--name ${ETCD_NAME} \
--cert-file=/etc/etcd/kubernetes.pem \
--key-file=/etc/etcd/kubernetes-key.pem \
--peer-cert-file=/etc/etcd/kubernetes.pem \
--peer-key-file=/etc/etcd/kubernetes-key.pem \
--trusted-ca-file=/etc/etcd/ca.pem \
--peer-trusted-ca-file=/etc/etcd/ca.pem \
--peer-client-cert-auth \
--client-cert-auth \
--initial-advertise-peer-urls https://${INTERNAL_IP}:2380 \
--listen-peer-urls https://${INTERNAL_IP}:2380 \
--listen-client-urls https://${INTERNAL_IP}:2379,https://127.0.0.1:2379 \
--advertise-client-urls https://${INTERNAL_IP}:2379 \
--initial-cluster-token etcd-cluster-0 \
--initial-cluster controller-0=https://${CONTROLLER0_IP}:2380,controller-1=https://${CONTROLLER1_IP}:2380 \
--initial-cluster-state new \
--data-dir=/var/lib/etcd

으로 지정되어있으며 이를 각 인스턴스마다 소통을 할 수 있게끔 변경하여야 합니다.

 

고가용성 환경에서는 위와 같이 구성한다고 한다. 강의상에서는 HA 강의시 디테일하게 강의를 한다고 하니 우선 공식문서를 참고해보자<https://kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/ha-topology/>

 

 


 

2. Kube-apiserver


정의 : 주요 관리 구성 요소중 하나임, kubectl으로 명령어 요청을 보내면 kube apiserver가 처음 요청을 받아서 ETCD CLUSTER로 접속하여 알맞은 값을 가져옴. 그리고, 직접 ETCD 저장소와 소통하는 유일한 컴포넌트 중 하나이다.

흐름 :

  1. 유저 체크
  1. 요청이 올바른지 체크
  1. data 검색 및 조회
  1. ETCD 데이터 업데이트
  1. 만일 POD가 Worker Node에 있지 않았다면 새 포드를 Scheduler에 등록하고 API 서버는 해당 정보를 적절한 Worker Node에 할당함
  1. 완료되면 kubelet에 해당 요청들을 api server를 이용해서 업데이트 됌

kube-apiserver.service

 

ExecStart=/usr/local/bin/kube-apiserver \
--advertise-address=${INTERNAL_IP} \
--allow-privileged=true \
--apiserver-count=3 \
--authorization-mode=Node,RBAC \
--bind-address=0.0.0.0 \
--client-ca-file=/var/lib/kubernetes/ca.pem \
--enable-admissionplugins=Initializers,NamespaceLifecycle,NodeRestriction,LimitRanger,ServiceAccount,DefaultStorageClass,Reso
urceQuota \
--enable-swagger-ui=true \
--etcd-cafile=/var/lib/kubernetes/ca.pem \
--etcd-certfile=/var/lib/kubernetes/kubernetes.pem \
--etcd-keyfile=/var/lib/kubernetes/kubernetes-key.pem \

--etcd-servers=https://127.0.0.1:2379 \
--event-ttl=1h \
--experimental-encryption-provider-config=/var/lib/kubernetes/encryption-config.yaml \
--kubelet-certificate-authority=/var/lib/kubernetes/ca.pem \
--kubelet-client-certificate=/var/lib/kubernetes/kubernetes.pem \
--kubelet-client-key=/var/lib/kubernetes/kubernetes-key.pem \
--kubelet-https=true \

--runtime-config=api/all \
--service-account-key-file=/var/lib/kubernetes/service-account.pem \
--service-cluster-ip-range=10.32.0.0/24 \
--service-node-port-range=30000-32767 \

 

kube-apiserver는 위 중요한 매개변수를 이용해서 구성 요소들을 구성할 수 있습니다.

 

그리고, api-server가 요청시에 위와 같은 유저 체크 및 요청 체크 등을 하기 때문에 기본적으로 설정할 것이 많습니다.

 

다수의 인증서들은 각각의 컴포넌트가 유효한지 체크합니다. (우선은 연결된 인증서들이 존재한다는 것만 체크하고 넘어갑니다.)

1. View api-server - kubeadm


kubectl get pods -n kube-system

위 명령어를 이용해서 kube-system 네임스페이스 하부의 kube-apiserver-master를 확인 할 수 있습니다.

그리고, 상세하게 정의된 옵션을 보기 위해서 아래 옵션을 사용 할 수 있습니다.

2. View api-server options - kubeadm


cat /etc/kubernetes/manifests/kube-apiserver.yaml

해당 명령어로 볼 수 있으며 spec으로 정의된 부분을 참고하면 옵션을 볼 수 있습니다.

ps -aux | grep kube-apiserver

이것을 이용하면 지금 돌아가는 kube-apiserver의 상태 및 옵션을 확인 할 수 있습니다.

 

 


3. Contoller - Manager


정의 : Controller는 부서의 마스터 쉽 같은 존재

  1. 지속적인 상태 정보 감시
  2. 상황을 재조정 하기 위한 조치를 함

1. Monitoring

 

예시로 2가지 Controller를 보자.

 

1. Node Controller

  • 노드 컨트롤러는 응용 프로그램이 적절한 처리를 하는지 5초마다 kube-apiserver를 통해서 각 pod, node를 감시한다.
  • 그리고, 5초 마다 감시하지만 40초 이후에 그것이 정상이 아닌지 파악 할 수 있다.
  • 그리고, POD의 Eviction 상태로 만드는 시간은 5m이다.

2. ReplicaSet Controller

  • 레플리카 셋을 감시하고 해당 replica 갯수에 맞게 끔 검사함.

위와 같이 두가지의 경우 외에도 상당히 많은 컨트롤러가 설치가 되는데 이를 한 번에 관리하는 것이 Kube-Controller-Manager이다.

2. How To Install kube-controller-manager

wget https://storage.googleapis.com/kubernetes-release/release/v1.13.0/bin/linux/amd64/kube-controller-manager

Kube-controller-manager.service
ExecStart=/usr/local/bin/kube-controller-manager \
--address=0.0.0.0 \
--cluster-cidr=10.200.0.0/16 \
--cluster-name=kubernetes \
--cluster-signing-cert-file=/var/lib/kubernetes/ca.pem \
--cluster-signing-key-file=/var/lib/kubernetes/ca-key.pem \
--kubeconfig=/var/lib/kubernetes/kube-controller-manager.kubeconfig \
--leader-elect=true \
--root-ca-file=/var/lib/kubernetes/ca.pem \
--service-account-private-key-file=/var/lib/kubernetes/service-account-key.pem \
--service-cluster-ip-range=10.32.0.0/24 \
--use-service-account-credentials=true \
--v=2
--node-monitor-period=5s
--node-monitor-grace-period=40s
--pod-eviction-timeout=5m

위 세가지 옵션은 아까 예시로 든 노드 모니터 시간 5초 노드가 정상 상태가 아닌 것을 인지하는 시간 40초 pod eviction 상태로 만드는 시간 5분을 의미한다.

여기서 초기 옵션을 변경을 할 수 있다.

그리고, Controller가 이상하다면 Kube-controller-manager.service 이것을 다시 확인하면 된다고 한다.

현재 실행중인 controller-manager의 option을 확인 하는 방법

ps -aux | grep kube-controller-manager

위 명령어를 실행 시 아래와 같이 뜸

root 1994 2.7 5.1 154360 105024 ? Ssl 06:45 1:25 kube-controller-manager --
address=127.0.0.1 --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt --cluster-signingkey-file=/etc/kubernetes/pki/ca.key
--controllers=*,bootstrapsigner,tokencleaner --
kubeconfig=/etc/kubernetes/controller-manager.conf --leader-elect=true --root-cafile=/etc/kubernetes/pki/ca.crt
--service-account-private-key-file=/etc/kubernetes/pki/sa.key
--use-service-account-credentials=true
 

 

 


4. Kube-Scheduler


정의 : 스케줄러는 어느 노드로 포드가 들어갈지 결정만 하는 역할, 실제 이를 수행하는 것은 kubelet이다.

1. WHY DO YOU NEED SCHEDULER?

컨테이너를 수용 할 수 있는 알맞게 노드에 포드를 배치해야 한다.

리소스 요청이 다를 수 있으니 이를 감안해서 각 노드에 배치하게 된다.

CPU 사용량이 10인 포드가 있다고 하면 우선 CPU가 맞지 않는 노드는 걷어낸다. 그러면 남은 것중에 가장 적합한 노드는 어떻게 알까?

POD 배치하고 나서 CPU 사용량이 최적이 될 것이 배치를 받게된다.

사실 이런 흐름은 사람이 직접 설정 할 수 있는 곳이기에 추후 강의에서 논의될 사항이다.

2. HOW DO I INSTALL KUBE SCHEDULER

설치하는 방법

wget https://storage.googleapis.com/kubernetes-release/release/v1.13.0/bin/linux/amd64/kube-scheduler

설치 이후 서비스 확인시 옵션 설정 법
kube-scheduler.service

ExecStart=/usr/local/bin/kube-scheduler \\
--config=/etc/kubernetes/config/kube-scheduler.yaml \\
--v=2

옵션 확인 방법

cat /etc/kubernetes/manifests/kube-scheduler.yaml

스펙 부분 확인하면 됌

spec:
containers:
- command:
- kube-scheduler
- --address=127.0.0.1
- --kubeconfig=/etc/kubernetes/scheduler.conf
- --leader-elect=true

실행 중인 scheduler 확인 법

ps -aux | grep kube-scheduler
 

5. Kubelet


정의 : 모든 일을 처리, 마스터 노드의 유일한 연결책, 일정 간격으로 이것을 확인 함

  1. Register Node
  2. Create PODs
  3. Monitor Node & PODs

다른 구성 요소들과 달리 kubelet은 kubeadm으로 설치하여도 자동으로 셋팅되지 않는다.

Worker Node에 수동으로 kubelet을 일일이 설치해야 합니다.

 

 

설치하는 방법은 공식 문서 및 타 블로그를 참조하자