最近在入门k8s相关的二次开发领域,所以想手动实现一个简易的crd controller。如果有任何建议或是想加入的小伙伴,文末有项目链接,可以使用issue pick的方式,让我们一起交流学习~
背景:
一般工作中在kubernetes部署应用,大多数都是基于无状态的应用服务为主,都是使用kubernetes内置的资源Deployment进行部署。但是由于deployment中管理的pod可能会有滚动更新、服务下线等问题,可能会进行更换,因此kubernetes从网络角度抽象出service(也是一种资源)的概念,让用户可以使用单一的ip进行访问服务,不必担心应用服务更新或是下线后的问题。
思路与功能:
一般在集群上部署应用都需要deployment+service的方式进行部署,在实际过程中会相对比较麻烦,本项目基于此背景下,创建CRD自定义对象,让调用方只要创建一个自定义对象,就能拉起整个deployment+service 自定义CRD启动时,会启动自己的Controller,并同时关联和拉起Deployment、Service。
支持功能:
- 使用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脚手架实现