KJH
k8s Operator 본문
1. CRD (CustomResourceDestination)
- default k8s에 없는 기능을 만들수 있게 해주는 역할을 합니다.
- crd는 cr을 위해 배포 되는데 cr에서 사용할 파라미터 형태를 지정하는 내용으로 구성됩니다.
- 해당 crd로 배포한 내역은 앞에서 설정한 kind 명으로 목록을 조회할 수 있습니다.
2. CR (CustomResource)
- CRD에서 지정한 파라미터 기반으로 값을 지정해서 배포합니다.
3. Operator
- 오퍼레이터는 운영자가 주로 하는 작업들을 묶어서 자동화하는 것이 목표 입니다.
- 운영자가 사용할 crd를 배포 합니다. crd에는 배포될 파드의 spec을 정의하는 내용이 들어 있고,
crd에 있는 spec의 규정에 맞게 cr을 추가로 배포합니다.
3.1 default Operator
- 기존의 쿠버네티스 형태입니다. default controller가 주기적으로 배포되어있는 object들을 모니터링을 하고,
변동 사항에 대해 반응하고 조치를 취하는 형태입니다.
3.2 Custom Operator
- crd 오퍼레이터의 형태입니다. custom controller를 배포하고, 해당 컨트롤러는 cr을 모니터링하면서 사양에 맞게 조정 합니다.
3.3 Prometheus Operator
- 중간에 진한 파란색 박스안에 있는 ServiceMonitor와 Prometheus는 CRD 입니다.
- 하단의 Operator가 CRD를 모니터링 하면서 Prometheus Server를 총괄하게 됩니다.
3.3.1 Prometheus Operator Service Monitor List
- ServiceMonitor는 위와 같은 형태로 구성되어 있는데 어떤것을 모니터링 할지 설정 하는 과정이고,
서비스를 추가, 삭제가 가능하며 ServiceMonitor를 추가하게 되면 Operator가 자동으로 프로메테우스를 재시작 합니다.
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을 매핑 시켜줍니다. |
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 |