Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

KJH

k8s Operator 본문

Kubernetes

k8s Operator

모이스쳐라이징 2021. 10. 11. 16:17

1. CRD (CustomResourceDestination)

  • default k8s에 없는 기능을 만들수 있게 해주는 역할을 합니다.
  • crd는 cr을 위해 배포 되는데 cr에서 사용할 파라미터 형태를 지정하는 내용으로 구성됩니다.
  • 해당 crd로 배포한 내역은 앞에서 설정한 kind 명으로 목록을 조회할 수 있습니다.

crd.yaml

2. CR (CustomResource)

  • CRD에서 지정한 파라미터 기반으로 값을 지정해서 배포합니다.

cr.yaml

 

3. Operator

  • 오퍼레이터는 운영자가 주로 하는 작업들을 묶어서 자동화하는 것이 목표 입니다. 
  • 운영자가 사용할 crd를 배포 합니다. crd에는 배포될 파드의 spec을 정의하는 내용이 들어 있고, 
    crd에 있는 spec의 규정에 맞게 cr을 추가로 배포합니다.


 

3.1 default Operator

  • 기존의 쿠버네티스 형태입니다. default controller가 주기적으로 배포되어있는 object들을 모니터링을 하고, 
    변동 사항에 대해 반응하고 조치를 취하는 형태입니다.

default k8s

 

3.2 Custom Operator

  • crd 오퍼레이터의 형태입니다. custom controller를 배포하고, 해당 컨트롤러는 cr을 모니터링하면서 사양에 맞게 조정 합니다.

custom operator

 

3.3 Prometheus Operator

  • 중간에 진한 파란색 박스안에 있는 ServiceMonitor와 Prometheus는 CRD 입니다. 
  • 하단의 Operator가 CRD를 모니터링 하면서 Prometheus Server를 총괄하게 됩니다.

prometheus operator architecture

 

3.3.1 Prometheus Operator Service Monitor List

  • ServiceMonitor는 위와 같은 형태로 구성되어 있는데 어떤것을 모니터링 할지 설정 하는 과정이고, 
    서비스를 추가, 삭제가 가능하며 ServiceMonitor를 추가하게 되면 Operator가 자동으로 프로메테우스를 재시작 합니다.

Prometheus Servicemonitor

 

4. Operator Tool

  • Operator-sdk, Kubebuilder, kudo 등 여러가지가 있지만,  그중 가장 많이 사용되고 있는 Operator-sdk를 사용했습니다.
  • 배포한 어플리케이션은 삭제, 수정이 불가 하며 오로지 cr을 통해 삭제, 수정이 가능합니다.
  • Operator가 외부로 부터의 삭제, 수정을 감지 할 경우 Operator가 가지고 있는 yaml을 바탕으로 원복합니다.

 

4.1 실습에 필요한 Client 설치

 

  • Operator-sdk Client 설치
$ RELEASE_VERSION=v0.19.4
$ curl -OJL https://github.com/operator-framework/operator-sdk/releases/download/${RELEASE_VERSION}/operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu
  •  Client 등록
$ chmod +x operator-sdk-v0.19.4-x86_64-linux-gnu
$ mv operator-sdk-v0.19.4-x86_64-linux-gnu operator-sdk
$ cp operator-sdk /usr/local/bin/
$ ln -s /usr/local/bin/operator-sdk /usr/bin/operator-sdk
  • Helm 설치
$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 > get_helm.sh
$ chmod +x get_helm.sh 
$ ./get_helm.sh
  • Docker 설치
$ curl https://releases.rancher.com/install-docker/20.10.3.sh | sh
$ usermod -aG docker centos

 

 

4.2 Operator 프로젝트 생성

operator-sdk new rancher-op \
  --api-version=rancher.com/v1alpha1 \
  --kind=Rancher \
  --type=helm \
  --helm-chart=rancher-stable/rancher

 

이름 내용
operator-sdk  cli로 operator를 만들수 있게 해줍니다. 여러 operator 프레임워크중에 가장 많이 사용합니다. 
new  operator-sdk로 프로젝트를 생성합니다.
api-version cr이 사용할 api를 생성합니다.
kind  새로운 controller를 만들기 때문에 이름을 지정합니다.
type  helm 배포를 위해 type을 지정합니다. helm operator를 베이스로 사용하게 됩니다.
helm-chart 사용할 helm chart를 지정합니다.

 

4.3 프로젝트 폴더 구조

~/rancher-op/deploy
├── deploy
│   ├── crds
│   │   ├── rancher.com_ranchers_crd.yaml
│   │   └── rancher.com_v1alpha1_rancher_cr.yaml
│   ├── operator.yaml
│   ├── service_account.yaml
│   ├── role.yaml
│   └── role_binding.yaml

 

이름 내용
rancher.com_ranchers_crd.yaml CRD
rancher.com_v1alpha1_rancher_cr.yaml CR
operator.yaml Deployment 형태로 배포됩니다. 앞에서 생성한 api가 배포된 operator에서 동작을 하기 때문에 cr을 배포하면 operator pod에게 요청을 보내 operator는 해당 정보를 바탕으로 배포하고, 배포한 어플리케이션의 yaml 정보를 가지고 있습니다.
ServiceAccount.yaml operator가 사용할 ServiceAccount 생성합니다.
role.yaml operator가 deployment, service 등등 많은 기능을 사용하기 때문에 이를 access 할 수 있는 권한을 부여합니다.
role_binding.yaml ServiceAccount와 role을 매핑 시켜줍니다.

 

CR배포 후 Operator log

 

4.4 Operator Deploy

  • operator를 helm 타입으로 사용하면 입력 받을 파라미터는 helm-chart의 value.yaml에 다 정의가 되어 있기 때문에 crd에서 수정할 내용은 없으므로 바로 배포
$ kubectl create -f deploy/crds/rancher.com_ranchers_crd.yaml
  • operator 배포를 위한 과정
$ docker login 
$ operator-sdk build {docker ID}/rancher-op:v0.1.6
$ docker push {docker ID}/rancher-op:v0.1.6
  • ServiceAccoutn 배포
kubectl create -f deploy/service_account.yaml
  • 바로 배포하면 권한 에러가 나고 rbac 권한을 아래와 같이 설정하면 동작을 합니다. 
vi deploy/role.yaml
-----------------------------
...

- apiGroups:
  - rbac.authorization.k8s.io
  resources:
  - '*'
  verbs:
  - '*'
...
-----------------------------
  • role 배포
kubectl create -f deploy/role.yaml
  • default namespace가 이상한 값으로 들어가 있기 때문에 지정하고 배포합니다. 지우면 안되고 꼭 한곳을 지정 해야 합니다.
kubectl create -f deploy/role_binding.yaml
  • operator Image를 지정합니다.
sed -i 's|REPLACE_IMAGE|{docker ID}/rancher-op:v0.1.6|g' deploy/operator.yaml
kubectl create -f deploy/operator.yaml
  • helm values.yaml과 형태가 같습니다. 필요한 부분을 수정합니다.
helm values.yaml과 형태가 같습니다. 필요한 부분을 수정합니다.
vi deploy/crd/rancher.com_v1alpha1_rancher_cr.yaml
-----------------------------
  hostname: rancher-op.{DOMAIN}.com
    tls:
      source: secret
-----------------------------
  • cr 배포, 배포 후 수정이 안되기 때문에 삭제하고 재배포 해야 합니다.
kubectl apply -f deploy/crd/rancher.com_v1alpha1_rancher_cr.yaml

 

5. 결과

# rancher 배포를 확인하고, 배포된 rancher의 정보를 삭제, 수정해도 원복 되는걸 확인 할 수 있습니다.

 

'Kubernetes' 카테고리의 다른 글

K8S best practices #1  (0) 2022.10.10
K8S Network  (0) 2021.10.24
K8S Volume  (0) 2021.10.06
K8S Ingress  (0) 2021.10.04
K8S Service  (0) 2021.10.02