如何使用 KubeBuilder 开发一个 Operator

通过 Operator 的方案,可以对 Kubernetes 的功能进行友好地扩展。Operatpr = CRD + Controller。首先通过 yaml 定义,生成 CRD ,然后 Controller 不断地监听 etcd 中的数据,执行相应动作。开发 Operator 时,有很多繁琐且重复的事情。KubeBuilder 可以帮助我们快速生成骨架代码,开发一个 Kubernetes 的扩展功能, 更多介绍可以参考文档:Kubernetes 复杂有状态应用管理框架 – Operator 。本篇文档,主要是尝试使用 KubeBuilder 开发一个 Operator 。

1. 环境准备

  • Go 开发环境
  • 远程 Kubernetes 环境
1
git diff Dockerfile 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
@@ -7,7 +7,7 @@ COPY go.mod go.mod
 COPY go.sum go.sum
 1. cache deps before building and copying source so that we don't need to re-download as much
 1. and so that source changes don't invalidate our downloaded layer
-RUN go mod download
+RUN GOPROXY=https://gocenter.io go mod download

 1. Copy the go source
 COPY main.go main.go
@@ -19,7 +19,7 @@ RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GO111MODULE=on go build -a -o manager

 1. Use distroless as minimal base image to package the manager binary
 1. Refer to https://github.com/GoogleContainerTools/distroless for more details
-FROM gcr.io/distroless/static:latest
+FROM gcr.azk8s.cn/distroless/static:latest
 WORKDIR /
 COPY --from=builder /workspace/manager .
 ENTRYPOINT ["/manager"]

2.5. 构建并推送镜像测试

  • 本地构建并推送镜像
    • 安装 kustomize
    1
    
    brew install kustomize
    
    • 部署 CRD
    1
    
    make install
    
    • 查看 CRD
    1
    2
    3
    
    kubectl get crd
    NAME                                      CREATED AT
    apiexampleas.groupa.k8s.chenshaowen.com   2019-09-24T07:24:45Z
    
    • 部署 Controller
    1
    
    make deploy
    
    • 查看 deployment
    1
    2
    3
    
    kubectl get deploy  -n kube-api-system
    NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
    kube-api-controller-manager   1/1     1            1           46s
    
    • 创建 CRD 对象
    1
    
    kubectl apply -f config/samples/groupa_v1beta1_apiexamplea.yaml
    
    • 查看 CRD 对象
    1
    2
    3
    4
    
    kubectl get apiexampleas.groupa.k8s.chenshaowen.com
    
    NAME                 AGE
    apiexamplea-sample   61s
    
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    
    kubectl get apiexampleas.groupa.k8s.chenshaowen.com apiexamplea-sample  -o yaml
    
    apiVersion: groupa.k8s.chenshaowen.com/v1beta1
    kind: ApiExampleA
    metadata:
      annotations:
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"groupa.k8s.chenshaowen.com/v1beta1","kind":"ApiExampleA","metadata":{"annotations":{},"name":"apiexamplea-sample","namespace":"default"},"spec":{"foo":"bar"}}
      creationTimestamp: "2019-09-24T07:29:16Z"
      generation: 1
      name: apiexamplea-sample
      namespace: default
      resourceVersion: "635450"
      selfLink: /apis/groupa.k8s.chenshaowen.com/v1beta1/namespaces/default/apiexampleas/apiexamplea-sample
      uid: 05398ab4-7d4a-4f2e-af30-b59e61680c7e
    spec:
      foo: bar
    

    3. 在 Project 中写入逻辑