CKA 1차 강의 정리
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
으로 지정되어있으며 이를 각 인스턴스마다 소통을 할 수 있게끔 변경하여야 합니다.
2. Kube-apiserver
정의 : 주요 관리 구성 요소중 하나임, kubectl으로 명령어 요청을 보내면 kube apiserver가 처음 요청을 받아서 ETCD CLUSTER로 접속하여 알맞은 값을 가져옴. 그리고, 직접 ETCD 저장소와 소통하는 유일한 컴포넌트 중 하나이다.
흐름 :
- 유저 체크
- 요청이 올바른지 체크
- data 검색 및 조회
- ETCD 데이터 업데이트
- 만일 POD가 Worker Node에 있지 않았다면 새 포드를 Scheduler에 등록하고 API 서버는 해당 정보를 적절한 Worker Node에 할당함
- 완료되면 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. 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
정의 : 모든 일을 처리, 마스터 노드의 유일한 연결책, 일정 간격으로 이것을 확인 함
- Register Node
- Create PODs
- Monitor Node & PODs
다른 구성 요소들과 달리 kubelet은 kubeadm으로 설치하여도 자동으로 셋팅되지 않는다.
Worker Node에 수동으로 kubelet을 일일이 설치해야 합니다.
설치하는 방법은 공식 문서 및 타 블로그를 참조하자