Kubernetes API Aggregation
Kubernetes API Aggregation이란?
Aggregator, Aggregation layer 라고도 불려짐
API Aggregation은 Kubernetes의 Custom Resource 생성방법 중 한가지로
CRD로 생성하는 경우보다 어렵지만 더 많은것을 컨트롤 할 수 있는 Custom Resource 생성 방법.
CRD가 많이 업데이트 되서 API Aggregation보다 CRD를 더 많이 사용하지만
kubernetes를 더 깊고 상세하게 컨트롤 해야하는 경우에는 아직 API Aggregation을 사용해야함.
Kubernetes Aggregator는 Kubernetes Core API가 제공하는 기능 이외에
더 많은 기능을 제공할 수 있도록 사용자가 원하는 기능을 수행하는 API를 추가할 수 있고
추가한 API는 Custom-apiserver(extension-apiserver 라고도 함)와 연동되어 사용할 수 있게 됨.
즉 kube-apiserver와 같은 API Server를 직접 구현해서 추가할 수 있음.
그렇다면 API Aggregation을 사용하게 되면
기존의 kube-apiserver가 여러대가 되는것인가?
그건 아님.
기존의 kube-apiserver에 API Registration 기능이 제공되고 있어서
해당 기능을 사용하면 사용자가 구현한 Custom-apiserver를 kube-apiserver에 등록하는 방식으로
kube-apiserver를 확장하는 개념으로 사용됨.
실제 API Aggregation을 사용하는 예를 들자면 아래과 같은 Metrics-Server 구조를 예로 들 수 있음.
API Aggregation는 그림의 빨간 네모 부분에 해당함
참고 : Kubernetes Monitoring : HPA
위에서 설명한 것과 비교를 하면 Custom API Server에 해당하는 것이 바로 Metrics Server이고
해당 Metrics Server를 kube-apiserver에 등록시켜서 사용하게 됨.
특징
1. GO언어로 개발해서 바이너리와 이미지를 만들어야함.
2. 주기적으로 업스트림의 소스를 가져와서 변경사항을 반영하고
새로운 kube-apiserver 바이너리를 만드는 작업을 직접 진행해야함
3. CRD에 비해서 더 정교하게 API를 만들 수 있으나 어려움.
4. API 동작 제어 강화
위 내용을 한줄로 설명하자면 Kubernetes Aggregator는 CRD(Custom Resource Definition)와는 다르며,
kube-apiserver가 새로운 종류의 Object를 인식하도록 하는 방법임.
참고) 추가 API는 서비스-카탈로그와 같이 미리 만들어진 솔루션이거나 사용자가 직접 개발한 API일 수 있음.
Kubernetes API Aggregation 예제
사용되는 예시로는 Metrics-Server가 있음.
Metrics-Server는 System Metric 정보를 추출하여
Metrics API를 통해 각 Object에서 해당 정보를 조회할 수 있도록 제공하는데
Metirs-Server의 경우 CPU와 Memory 정보만 조회함.
kubernetes API Aggregation을 이해하기 위해
예제로 Metrics-Server와 비교,분석해보기로 함.
참고
https://github.com/kubernetes-sigs/metrics-server
https://kubernetes.io/ko/docs/tasks/debug-application-cluster/resource-usage-monitoring/
1. Custom-apiserver(extension-apiserver)를 생성
Metircs-Server의 경우
Custom-apiserver역할을 하는 metrics-server를
kube-system namespace에 배포함.
k8s.gcr.io/metrics-server/metrics-server:v0.3.7 이미지는
kubelet의 cAdvisor가 kubelet에 push한 metrics 정보를 가져오는 Server임.
이런 custom-apiserver 생성하는 예제 코드는 아래와 같음.
https://github.com/kubernetes-sigs/custom-metrics-apiserver
가져온 Metrics는 메모리에 저장해놓음
apiVersion: apps/v1 kind: Deployment metadata: name: metrics-server namespace: kube-system labels: k8s-app: metrics-server spec: selector: matchLabels: k8s-app: metrics-server template: metadata: name: metrics-server labels: k8s-app: metrics-server spec: serviceAccountName: metrics-server volumes: # mount in tmp so we can safely use from-scratch images and/or read-only containers - name: tmp-dir emptyDir: {} containers: - name: metrics-server image: k8s.gcr.io/metrics-server/metrics-server:v0.3.7 imagePullPolicy: IfNotPresent args: - --cert-dir=/tmp - --secure-port=4443 ports: - name: main-port containerPort: 4443 protocol: TCP securityContext: readOnlyRootFilesystem: true runAsNonRoot: true runAsUser: 1000 volumeMounts: - name: tmp-dir mountPath: /tmp nodeSelector: kubernetes.io/os: linux |
2. kube-apiserver와 Custom-apiserver 연동
상위에서 생성한 metrics-server를 kubernetes cluster가 인식할 수 있도록 해야함.
그러기 위해 기존의 kube-apiserver에 metrics-server를 연동시키는데
이러한 작업을 API Aggregation이라고 함
kube-apiserver와 custom-apiserver는 API access token을 서로 주고 받으며
HTTPS 방식으로 통신하게 됨.
kind는 APIService를 사용함.
apiVersion: apiregistration.k8s.io/v1beta1 kind: APIService metadata: name: v1beta1.metrics.k8s.io spec: service: name: metrics-server # metrics-server라는 Custom-apiserver(extension-apiserver)와 연동가능 namespace: kube-system # 해당 metrics-server는 kube-system에 있음 group: metrics.k8s.io # kubernetes에서 사용가능한 API version을 추가하는 것 version: v1beta1 insecureSkipTLSVerify: true groupPriorityMinimum: 100 versionPriority: 100 |
[옵션 설명]
name: metrics-server, namespace: kube-system
해당 설정은 위에서 생성한 custom-apiserver(extension-apiserver) deployment의
name, namespace와 일치해야함
custom-apiserver(extension-apiserver)를 바라보도록 하기 위함
group: metrics.k8s.io, version: v1beta1
CustomResourceDefinition(CRD)와 비교를 하자면
crd yaml 설정 중 group과 동일한 의미.
kuberentes 에서 이제 group에 명시한 API Verison을 사용할 수 있도록 설정함.
즉 이제 kubernetes yaml 혹은 kubectl 명령시 metrics.k8s.io/v1beta1 API를 사용하게 되면
kube-apiserver에서 custom-apiserver로 request가 전달되고
custom-apiserver가 respones를 다시 kube-apiserver로 전달해서
사용자가 최종적으로 응답을 받게됨.
아래 그림을 참고하면 이해됨.
참고) kubernetes 사용가능 api version 조회 명령어 = kubectl api-versions
3. Custom-apiserver 사용 예시 : Horizontal Pod Autoscaler(HPA)
API Aggregation을 통해서
위와같이 custom-apiserver인 metrics-server를
kube-apiserver에 연동 시켰음.
이제 연동된 metrics-server kubelet에 내장된 cAdvisor와 통신하여 metrics정보를 가져옴
CRD에서 언급됐던 custom-controller와 비슷한 역할을 하지만
custom controller는 controller 자체에서 역할을 수행하고 respones를 줬지만
metrics-server는 하위에 cAdvisor결과를 전달해주는 역할을 수행함.
일반적으로 이러한 custom-apiserver는
custom metrics 정보를 전송하기 위해서 사용된다고함.
즉 개발자는 본인 정의한 특정 metrics를 수집하는 agent를 모든 kubernetes node에 배포하고
custom apiserver를 정의해서
agent가 수집한 custom metrics정보를 수집하는데 주로 이용한다고 함.
[custom metrics apiserver 표준 예제 코드]
https://github.com/kubernetes-sigs/custom-metrics-apiserver
[custom metrics server 참고]
https://github.com/draios/kubernetes-sysdig-metrics-apiserver
-k8s.io/apiserver/pkg/server 참고 : https://godoc.org/k8s.io/apiserver/pkg/server
-k8s.io/kube-openapi/cmd/openapi-gen 참고 : https://github.com/kubernetes/kube-openapi
제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!
참고
https://kubernetes.io/ko/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/
https://kubernetes.io/docs/tasks/extend-kubernetes/configure-aggregation-layer/
https://kubernetes.io/docs/tasks/extend-kubernetes/setup-extension-api-server/
https://github.com/kubernetes-sigs/apiserver-builder-alpha/blob/master/docs/concepts/auth.md
https://github.com/kubernetes/sample-apiserver/blob/master/main.go
https://itnext.io/our-journey-in-building-a-kubernetes-aggregated-api-server-29a4f9c1de22
https://blog.naver.com/alice_k106/221579974362
[custom-apiserver 와 kube-apiserver 통신 과정 정리]
https://medium.com/@vanSadhu/kubernetes-api-aggregation-setup-nuts-bolts-733fef22a504
[api aggregation 과 hpa ]
https://medium.com/@thescott111/autoscaling-kubernetes-custom-resource-using-the-hpa-957d00bb7993
https://sysdig.com/blog/kubernetes-autoscaler/
[Custom API Server 인증 설정]
https://github.com/kubernetes-sigs/apiserver-builder-alpha/blob/master/docs/concepts/auth.md
[Metrics-Server 분석]
[custom metrics apiserver 표준 예제 코드]
https://github.com/kubernetes-sigs/custom-metrics-apiserver
[custom metrics server 참고]
https://github.com/draios/kubernetes-sysdig-metrics-apiserver
'Kubernetes > Kubernetes 이론' 카테고리의 다른 글
udemy kubernetes 강의 : Lightning Lab - 1 답 정리 (0) | 2021.07.24 |
---|---|
kubectl 축약어 정리 (0) | 2021.07.24 |
Kubernetes Pod Container의 Networking 정보를 Host에서 확인 (0) | 2021.04.05 |
Kubernetes Pod Container의 Application PID를 Host에서 확인 (0) | 2021.04.05 |
Pod안에 CentOS(application이 없는 OS 이미지) Container 실행하기 (0) | 2021.01.12 |