k8s operator 简易部署方案 AppDeployer

304 阅读2分钟

最近在入门k8s相关的二次开发领域,所以想手动实现一个简易的crd controller。如果有任何建议或是想加入的小伙伴,文末有项目链接,可以使用issue pick的方式,让我们一起交流学习~

背景:

一般工作中在kubernetes部署应用,大多数都是基于无状态的应用服务为主,都是使用kubernetes内置的资源Deployment进行部署。但是由于deployment中管理的pod可能会有滚动更新、服务下线等问题,可能会进行更换,因此kubernetes从网络角度抽象出service(也是一种资源)的概念,让用户可以使用单一的ip进行访问服务,不必担心应用服务更新或是下线后的问题。

参考:K8S-概念-service-deployment

思路与功能:

一般在集群上部署应用都需要deployment+service的方式进行部署,在实际过程中会相对比较麻烦,本项目基于此背景下,创建CRD自定义对象,让调用方只要创建一个自定义对象,就能拉起整个deployment+service 自定义CRD启动时,会启动自己的Controller,并同时关联和拉起Deployment、Service。

image.png 支持功能:

  • 使用CRD资源对象创建Deployment、Service
  • 支持多容器以sidecar方式部署(环境变量、command等都支持)
  • 支持自定义是否使用Service功能
  • 支持自定义支持Service种类(NodePort or ClusterIP)
  • 支持configmap挂载给pod,并实现热更新(即:不需要重新手动删除pod。)

CRD yaml文件:

apiVersion: deploy.jiang.operator/v1
kind: AppDeployer
metadata:
  name: appdeployer-sample
spec:
  size: 1 # pod副本
  containers:
    - name: c1
      image: busybox:1.34
      command:
        - "sleep"
        - "3600"
      resources:
        limits:
          memory: "128Mi"
          cpu: "500m"
      volumeMounts:
        - name: appdeployer-sample # 限定与AppDeployer自己的名字相同,不然会报错。
          mountPath: /etc/config # 可自由修改
    - name: c2
      image: busybox:1.34
      command:
        - "sleep"
        - "3600"
      resources:
        limits:
          memory: "128Mi"
          cpu: "500m"
  service: true   # 自定义是否要配置Service
  service_type: NodePort # 目前支持NodePort ClusterIP 转换,注意:如果使用ClusterIP nodePort端口字段必须删除,否则会报错。
  ports:  #端口
    - port: 80
      targetPort: 80 # 容器端口
      nodePort: 30002 #service端口  注意:如果使用ClusterIP nodePort端口字段必须删除,否则会报错。
  # 支持configmap 挂载给pod,并实现自动热更新
  configmap: true # 可以设置为false,即不需要configmap挂载
# configmap的配置 key-value
configmap_data:
  data:
    player_initial_lives: "3"
    ui_properties_file_name: "user-interface.properties"

附注:使用简易的kubebuilder脚手架实现

项目地址:github.com/googs1025/K…