[雲端] K8S / Operator
===
###### tags: `雲端 / K8s`
###### tags: `雲端`, `K8s`, `operator`, `CRD`, `CR`
<br>

[TOC]
<br>
## Hello World
### Operator in Java
- [PodSet Operator in Java Using Fabric8 Kubernetes Client](https://github.com/rohanKanojia/podsetoperatorinjava)
- [crd.yaml](https://github.com/rohanKanojia/podsetoperatorinjava/blob/master/src/main/resources/crd.yaml)

<br>
- 除了定義 [crd.yaml](https://github.com/rohanKanojia/podsetoperatorinjava/blob/master/src/main/resources/crd.yaml),對應的程式,也要撰寫對應的資源物件、控制器

- 關於 java 語言實作 operator
> 這些 java 編譯成 class 後
> 再將 class & crd 打包成 jar
> 最後,將其複製到 image 裡面
> jkube 工具(?) 幫忙生成
> - deployment.yaml
> - service.yaml
> 接著,apply deployment.yaml & service.yaml 到 k8s
> 控制器和 CRD 就掛進去
- [PodSetController.java](https://github.com/rohanKanojia/podsetoperatorinjava/blob/master/src/main/java/io/fabric8/podset/operator/controller/PodSetController.java)
- [PodSetController.java](https://github.com/rohanKanojia/podsetoperatorinjava/blob/master/src/main/java/io/fabric8/podset/operator/controller/PodSetController.java)

- tracking:
```podSetInformer.addEventHandler(...)```
```podInformer.addEventHandler(...)```
- change events:
```void enqueuePodSet(PodSet podSet)```
```void handlePodObject(Pod pod)```
- reconcile:
```void reconcile(PodSet podSet)```
- adjust:
```void createPods(int numberOfPods, PodSet podSet)```
- [cr.yaml](https://github.com/rohanKanojia/podsetoperatorinjava/blob/master/src/main/resources/cr.yaml)

- 測試自定義 PodSet 資源的範例
- 如同一般 user 在使用類似 pod, service 等內建資源的宣告<br><br>
- 參考資料
- [fabric8io / kubernetes-client](https://github.com/fabric8io/kubernetes-client/tree/master/kubernetes-client/src/main/java/io/fabric8/kubernetes/client)
<br>
<hr>
<br>
<br>
<hr>
<br>
## [How To Set Up an Nginx Ingress on DigitalOcean Kubernetes Using Helm](https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nginx-ingress-on-digitalocean-kubernetes-using-helm)
### 必要安裝
- ### [How To Install Software on Kubernetes Clusters with the Helm 3 Package Manager](https://www.digitalocean.com/community/tutorials/how-to-install-software-on-kubernetes-clusters-with-the-helm-3-package-manager)
- Step 1 — Installing Helm
- Step 2 — Installing a Helm Chart
> Helm software packages are called charts.
>
```bash
$ helm repo add stable https://kubernetes-charts.storage.googleapis.com
```
<br>
<hr>
<br>
## [Build Kubernetes Operators from Helm Charts in 5 steps](https://www.openshift.com/blog/build-kubernetes-operators-from-helm-charts-in-5-steps)
- Helm 是 K8s app 的熱門軟體套件管理器
- Helm 可將一應用程式所需的資源,打包成 Helm Chart
### Helm Chart 優勢,對於解決下列事項非常有用:
- 安裝複雜性
- 特別是無狀態應用程式的簡單升級,例如 Web app
### Helm Chart 劣勢:
- 對於有狀態的應用程式,比較不適用
- 狀態升級過程,要比升級應用程式本身複雜許多
- Therefore, Helm Charts often are insufficient for upgrading stateful applications and services (e.g. PostgreSQL or Elasticsearch)
因此,Helm Charts 通常不足以升級有狀態的應用程序和服務(例如 PostgreSQL 或Elasticsearch)
### 什麼是 Helm Operator
- 打包以及佈署 K8s app 的一種**方法**
### 使用的範例
https://github.com/helm/charts/tree/master/stable/
- [stable/mariadb](https://github.com/helm/charts/tree/master/stable/mariadb)
### 問題排解1:404 Not Found
:::warning
```
$ operator-sdk new tj-mariadb-operator --type=helm --helm-chart stable/mariadb
INFO[0000] Creating new Helm operator 'tj-mariadb-operator'.
Error: failed to create helm chart: failed to fetch chart: Failed to fetch https://charts.helm.sh/stable/mariadb-7.3.14.tgz : 404 Not Found
```
```
$ operator-sdk new tj-nginx-operator --type=helm --helm-chart stable/nginx-ingress
INFO[0000] Creating new Helm operator 'tj-nginx-operator'.
Error: failed to create helm chart: failed to fetch chart: Failed to fetch https://charts.helm.sh/stable/nginx-ingress-1.41.3.tgz : 404 Not Found
```
前往 https://charts.helm.sh/stable/ 查看,發現:
- Once Helm is set up properly, add the repo as follows:
```
sudo helm repo add stable https://charts.helm.sh/stable
```
之後可正常運作:
```bash
diatango_lin@stage-kube01:~/tj_tsai/workspace/20201127-helm$ operator-sdk new tj-nginx-operator --type=helm --helm-chart stable/nginx-ingress
INFO[0000] Creating new Helm operator 'tj-nginx-operator'.
INFO[0002] Created helm-charts/nginx-ingress
INFO[0002] Generating RBAC rules
INFO[0002] Scaffolding ClusterRole and ClusterRolebinding for cluster scoped resources in the helm chart
WARN[0002] The RBAC rules generated in deploy/role.yaml are based on the chart's default manifest. Some rules may be missing for resources that are only enabled with custom values, and some existing rules may be overly broad. Double check the rules generated in deploy/role.yaml to ensure they meet the operator's permission requirements.
INFO[0002] Created build/Dockerfile
INFO[0002] Created watches.yaml
INFO[0002] Created deploy/service_account.yaml
INFO[0002] Created deploy/role.yaml
INFO[0002] Created deploy/role_binding.yaml
INFO[0002] Created deploy/operator.yaml
INFO[0002] Created deploy/crds/charts_v1alpha1_nginxingress_crd.yaml
INFO[0002] Created deploy/crds/charts_v1alpha1_nginxingress_cr.yaml
INFO[0002] Run git init ...
Initialized empty Git repository in /home/diatango_lin/tj_tsai/workspace/20201127-helm/tj-nginx-operator/.git/
INFO[0002] Run git init done
INFO[0002] Project creation complete.
```
:::
<br>
## From Diatango
- Operator Framework 包含了三個部分 (2020/12/01)
- Operator SDK: 用來建立與開發 Operator
- Operator Lifecycle Manager (OLM): 用來管理 Operator 的發佈/安裝/升級,
- Operator Metering: 量測 Operator 使用資源量. 後續可根據資源用量來計費
<br>
## 參考資料
- [11.3. 创建基于 HELM 的 OPERATOR](https://access.redhat.com/documentation/zh-cn/openshift_container_platform/4.2/html/operators/osdk-helm)
- [Build Kubernetes Operators from Helm Charts in 5 steps](https://www.openshift.com/blog/build-kubernetes-operators-from-helm-charts-in-5-steps)
- [Operator 工作原理](https://jimmysong.io/kubernetes-handbook/develop/operator.html)
- from Diatango
- https://operatorhub.io/
Operator Hub. 一些常見的應用程式,也有推出 Operator。
不過似乎都還在開發中, 版本都是在 0.x 版號的alpha 階段,
- https://kubernetes.io/docs/concepts/extend-kubernetes/operator/
我是從這邊開始去看
- https://www.openshift.com/learn/topics/operators
What is an Operator?
它的 Operator 影片作得還滿有趣的
這篇文章底下有個 "e-book" 可以下載