이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

Kubernetes/Kubernetes 이론

Kubernetes API Aggregation

이쿠우우 2021. 6. 20. 20:41
반응형

 

 

 

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 분석]

https://levelup.gitconnected.com/kubernetes-monitoring-101-core-pipeline-services-pipeline-a34cd4cc9627

 

[custom metrics  apiserver 표준 예제 코드]

https://github.com/kubernetes-sigs/custom-metrics-apiserver

 

[custom metrics server 참고]

https://github.com/draios/kubernetes-sysdig-metrics-apiserver

 

 

 

 

 

 

반응형