乐趣区

关于kubernetes:技术分享-kubernetes-operator-简介

作者:沈亚军

爱可生研发团队成员,负责公司 DMP 产品的后端开发,喜好太广,三天三夜都说不完,低调低调 …

本文起源:原创投稿

* 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。


k8s operator 介绍

k8s Operator 是一种用于特定利用的控制器,可扩大 Kubernetes API 的性能,来代表 k8s 用户创立、配置和治理简单利用的实例,它基于根本 k8s 资源和控制器概念构建,但又涵盖了特定畛域或利用的常识,用于实现其所治理的利用生命周期的自动化,常见的有 etcd-operator、prometheus-operator 等,以下是 k8s operator 执行的一些最常见性能的列表:

  • 部署指定配置和数量的利用
  • 对利用进行扩缩容
  • 启动降级、主动备份和故障复原
  • 执行任何其余能够作为代码出现的治理利用的工作

operator 工作原理

k8s operator 是应用自定义资源 (CR) 治理利用及其组件的自定义 k8s 控制器,自定义资源是 k8s 中的 API 扩大机制。自定义资源定义 (CRD) 会申明 CR 并列出 Operator 用户可用的所有配置

当 operator 被部署到 k8s 集群中会通过连贯 master 节点的 API server 监听特定资源类型的事件并基于用户在 CR 中提供的配置和嵌入在 operator 解决逻辑采取对应的操作,进行循环解决确保以后该资源的状态与现实状态相符

编写一个简略的 operator

operator SDK 是 CoreOS 公司开发和保护的用于疾速创立 operator 的工具,能够ß助咱们疾速构建 operator 利用,相似的工具还有:

  • KUDO (Kubernetes 通用申明式 Operator)
  • kubebuilder,kubernetes SIG 在保护的一个我的项目
  • Metacontroller,可与 Webhook 联合应用,以实现本人的性能

接下来会应用 operator-sdk 构建一个简略的 operator 我的项目

开发环境:

docker 20.10.5
operator-sdk 1.9.0
golang 1.16.3
kubernetes 1.19
macOS 11.4

1. 应用 operator-sdk CLI 创立 nginx-operator 我的项目

mkdir -p $HOME/nginx-operator && cd $HOME/nginx-operator
operator-sdk init --domain example.com --repo github.com/example/nginx-operator

2. 创立新的 CRD API 指定组为 proxy 类型为 Nginx 版本为 v1alpha1

operator-sdk create api --group proxy --version v1alpha1 --kind Nginx --resource --controller

该命令生成的 api/v1alpha1/nginx_types.gocontrollers/nginx_controller.go 文件是须要咱们别离实现 CR 的配置和控制器的解决逻辑

3. 定义 Nginx 资源类型 CR 并生成 CRD

批改文件 api/v1alpha1/nginx_types.go 中的 NginxSpec NginxStatus 如下

// NginxSpec defines the desired state of Nginx
type NginxSpec struct {Count int32 `json:"count"`}

// NginxStatus defines the observed state of Nginx
type NginxStatus struct {
    // Nodes are the names of the nginx pods
    Nodes []string `json:"nodes"`}

执行上面的命令生成 CR 资源相干代码,每次批改 CR 的定义都需执行该命令

make generate

执行上面的命令会生成 CRD 定义文件 nginx-operator/config/crd/bases/proxy.example.com_nginxes.yaml

make manifests

4. 控制器解决逻辑实现

须要在 controllers/nginx_controller.go 实现以下逻辑, 可参考 nginx_controller.go

实现 SetupWithManager 办法设置要监听的资源对象,如下代码中指定了次要监听对象为 Nginx,主要监听对象为 Deployment:

func (r *NginxReconciler) SetupWithManager(mgr ctrl.Manager) error {return ctrl.NewControllerManagedBy(mgr).
        For(&proxyv1alpha1.Nginx{}).
        Owns(&appsv1.Deployment{}).
        Complete(r)
}

Reconcile 办法中用来保护前 k8s 环境中监听的对象使其达到预期的状态,每当被监听的资源对象触发新的事件该办法会被调用

func (r *NginxReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {log := ctrllog.FromContext(ctx)

    return ctrl.Result{}, nil}

5. 部署 operator

1. 编译并部署 operator 镜像
批改 Makefile

-IMG ?= controller:latest
+IMG ?= $(IMAGE_TAG_BASE):$(VERSION)

编译并部署 operator 到 k8s 集群

make docker-build
make deploy

2. 查看 deployment

$ kubectl get deployment -n nginx-operator-system
NAME                                READY   UP-TO-DATE   AVAILABLE   AGE
nginx-operator-controller-manager   1/1     1            1           5m14s

3. 创立 Nginx CR
批改文件 config/samples/proxy_v1alpha1_nginx.yaml 如下:

apiVersion: proxy.example.com/v1alpha1
kind: Nginx
metadata:
  name: nginx-sample
spec:
  count: 3

执行命令 kubectl apply -f config/samples/proxy_v1alpha1_nginx.yaml 创立 CR

获取创立的 pod

$ kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
nginx-sample-66b6c48dd5-bcqc8   1/1     Running   0          15m
nginx-sample-66b6c48dd5-thnx6   1/1     Running   0          15m
nginx-sample-66b6c48dd5-xrd9l   1/1     Running   0          15m

4. 查看 CR 的状态

$ kubectl get nginx/nginx-sample -o yaml
apiVersion: proxy.example.com/v1alpha1
kind: Nginx
metadata:
  name: nginx-sample
  namespace: default
  ...
spec:
  count: 3
status:
  nodes:
  - nginx-sample-66b6c48dd5-bcqc8
  - nginx-sample-66b6c48dd5-thnx6
  - nginx-sample-66b6c48dd5-xrd9l

若须要清理执行以下命令

kubectl delete -f config/samples/proxy_v1alpha1_nginx.yaml
make undeploy
退出移动版