본문 바로가기

DevOps/쿠버네티스(Kubernetes)

[CKA] Kubernetes Kube-API Server

Kubernetes Kube-API Server

 

$ kubectl get nodes
    NAME   STATUS ROLES  AGE VERSION
    master Ready  master 20m v1.11.3
    node01 Ready  <none> 20m v1.11.3

 

Kube-api 서버는  kubernetes의 주요 관리 구성 요소이다. kubectl 명령을 실행하면 실제로 kubectl 유틸리티가 kube-apiserver에 도달한다.

 

1. Authenticate User

2. Validate Request

3. Retrieve data

 

kube-apiserver는 먼저 요청을 인증하고 유효성을 검사한다. 그런 다음 ETCD 클러스터에서 데이터를 검색하고 요청된 정보로 응답한다.

 

$ curl –X POST /api/v1/namespaces/default/pods ...[other]
Pod created!

 

kcubectl 명령을 사용할 필요 없이 게시 요청을 전송하여 API를 직접 호출할 수도 있다. 요청이 먼저 인증되고 검증되기 전에 포드를 생성하는 예를 살펴보자.

 

1. Authenticate User

2. Validate Request

3. Retrieve data

4. Update ETCD

5. Scheduler

6. Kubelet

 

이 경우 API 서버는 POD 객체를 노드에 할당하지 않고 생성하며, ETCD 서버에 정보를 업데이트하고 POD가 생성되었음을 사용자에게 알려준다. 스케줄러는 API 서버를 지속적으로 모니터링하고 할당된 노드가 없는 새 포드가 있음을 인식하며 스케줄러는 새 POD를 배치할 올바른 노드를 식별하고 kube-apiserver 서버로 다시 통신한다. 그런 다음 kube-apiserver ETCD 클러스터의 정보를 업데이트한다. 그런 다음 API 서버는 해당 정보를 적절한 Worker Node의 kubelet으로 전달한다. 그런 다음 kubelet은 노드에 POD를 생성하고 컨테이너 런타임 엔진에 애플리케이션 이미지를 배포하도록 지시한다. 완료되면 kubelet은 상태를 API 서버로 다시 업데이트하고 API 서버는 ETCD 클러스터에서 데이터를 다시 업데이트한다. 변경이 요청될 때마다 유사한 패턴이 진행된다.

kube-apiserver는 클러스터를 변경하기 위해 수행해야 하는 모든 다양한 작업의 중심에 있다.
요약하자면, 큐브-api 서버는 요청 인증 및 검증, ETCD 데이터 저장소의 데이터 검색 및 업데이트를 담당한다. 실제로 kube-apiserver는 ETCD 데이터 저장소와 직접 상호 작용하는 유일한 구성 요소이다.

 

스케줄러, kube-controller-manager 및 kubelet과 같은 기타 구성 요소들은 API 서버를 사용하여 해당 영역의 클러스터에서 업데이트를 수행한다.

 

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

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 \\
    --enable-admissionplugins=Initializers,NamespaceLifecycle,NodeRestriction,LimitRanger,ServiceAccount,DefaultStorageClass,Reso
    urceQuota \\
    --enable-swagger-ui=true \\
    --etcd-servers=https://127.0.0.1:2379 \\
    --event-ttl=1h \\
    --experimental-encryption-provider-config=/var/lib/kubernetes/encryption-config.yaml \\
    --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 \\
    --v=2


만약 kubeadm 도구를 사용하여 클러스터를 부트스트랩한다면 당신은 이것을 알 필요가 없지만, 어려운 방법으로설정하고 있다면, kubernetes 릴리스 페이지에서 kube-apiserver를 바이너리로 사용할 수 있다. 다운로드하고 kubernetes 마스터 노드에서 서비스로 실행되도록 구성한다. kube-apiserver는 여기에서 볼 수 있는 것처럼 많은 매개변수로 실행된다.

 

Kubernetes 아키텍처는 서로 작동하며 서로 다른 방식으로 대화하는 많은 다른 구성 요소들로 구성되어 있기 때문에 다른 구성 요소들이 어디에 있는지 모두 알아야 한다.이는 인증, 권한 부여, 암호화 및 보안의 다양한 형태이다. 대부분은 서로 다른 구성 요소 간의 연결을 보호하는 데 사용되는 인증서이다.

 

--etcd-servers=https://127.0.0.1:2379 \\

 

다양한 구성 요소에는 모두 인증서가 있다. ETCD-servers 옵션은 ETCD 서버의 위치를 지정하는 곳이다. 이것이 kube-apiserver가 etcd 서버에 연결되는 방법이다.

 

 

$ kubectl get pods -n kube-system

NAMESPACE   NAME                          READY STATUS RESTARTS AGE
kube-system coredns-78fcdf6894-hwrq9       1/1  Running    0    16m
kube-system coredns-78fcdf6894-rzhjr       1/1  Running    0    16m
kube-system etcd-master                    1/1  Running    0    15m
kube-system kube-apiserver-master          1/1  Running    0    15m
kube-system kube-controller-manager-master 1/1  Running    0    15m
kube-system kube-proxy-lzt6f               1/1  Running    0    16m
kube-system kube-proxy-zm5qd               1/1  Running    0    16m
kube-system kube-scheduler-master          1/1  Running    0    15m
kube-system weave-net-29z42                2/2  Running    1    16m
kube-system weave-net-snmdl                2/2  Running    1    16m


그러면 기존 클러스터의 큐브-api 서버 옵션을 어떻게 볼 수 있을까?
클러스터를 설정하는 방법에 따라 다르다.

 

$ cat /etc/kubernetes/manifests/kube-apiserver.yaml
spec:
    containers:
    - command:
        - kube-apiserver
        - --authorization-mode=Node,RBAC
        - --advertise-address=172.17.0.32
        - --allow-privileged=true
        - --client-ca-file=/etc/kubernetes/pki/ca.crt
        - --disable-admission-plugins=PersistentVolumeLabel
        - --enable-admission-plugins=NodeRestriction
        - --enable-bootstrap-token-auth=true
        - --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
        - --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
        - --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key
        - --etcd-servers=https://127.0.0.1:2379
        - --insecure-port=0
        - --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt
        - --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt
        - --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key
        - --requestheader-allowed-names=front-proxy-client
        - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
        - --requestheader-extra-headers-prefix=X-Remote-Extra-
        - --requestheader-group-headers=X-Remote-Group
        - --requestheader-username-headers=X-Remote-User

kubeadm 도구를 사용하여 설정하는 경우 kube-apiserver 마스터 노드의 kube-system 네임스페이스에 POD로 배포하면 /etc/kubernetes/manifests 폴더에 있는 POD 정의 파일 내의 옵션을 볼 수 있다. 

 

$ cat /etc/systemd/system/kube-apiserver.service
    [Service]
    ExecStart=/usr/local/bin/kube-apiserver \\
    --advertise-address=${INTERNAL_IP} \\
    --allow-privileged=true \\
    --apiserver-count=3 \\
    --audit-log-maxage=30 \\
    --audit-log-maxbackup=3 \\
    --audit-log-maxsize=100 \\
    --audit-log-path=/var/log/audit.log \\
    --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,Defa
    ultStorageClass,ResourceQuota \\
    --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 \\
    --etcdservers=https://10.240.0.10:2379,https://10.240.0.11:2379,https://10.240.0.12: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 \\

 

kubeadm 설정이 아니면 kube-apiserver 서비스는 /etc/systemd/system/kube-apiserver.service에 있다.

 

$ ps -aux | grep kube-apiserver
root 2348 3.3 15.4 399040 315604 ? Ssl 15:46 1:22 kube-apiserver --authorization-mode=Node,RBAC --
advertise-address=172.17.0.32 --allow-privileged=true --client-ca-file=/etc/kubernetes/pki/ca.crt --disableadmission-plugins=PersistentVolumeLabel --enable-admission-plugins=NodeRestriction--enable-bootstrap-tokenauth=true --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt --etcd-certfile=/etc/kubernetes/pki/apiserver-etcdclient.crt --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key --etcd-servers=https://127.0.0.1:2379 --
insecure-port=0 --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt --kubelet-clientkey=/etc/kubernetes/pki/apiserver-kubelet-client.key --kubelet-preferred-addresstypes=InternalIP,ExternalIP,Hostname --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt --proxyclient-key-file=/etc/kubernetes/pki/front-proxy-client.key--requestheader-allowed-names=front-proxy-client --
requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --requestheader-extra-headers-prefix=X-RemoteExtra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secureport=6443 --service-account-key-file=/etc/kubernetes/pki/sa.pub --service-cluster-ip-range=10.96.0.0/12 --tlscert-file=/etc/kubernetes/pki/apiserver.crt --tls-private-key-file=/etc/kubernetes/pki/apiserver.key

마스터 노드에서 프로세스를 나열하고 kube-apiserver를 검색하여 실행 중인 프로세스와 유효한 옵션을 볼 수 있다.

 

 

 

 

 

 

출처:

https://www.udemy.com/course/certified-kubernetes-administrator-with-practice-tests/learn/lecture/14298426#content