本实验参照 JAVA OPERATOR SDK官方实例开发一个operator程序。
编译项目代码, crd 文件会在编译过程通过 annotation process 生成, 地址位于 apis/target/classes/META-INF/
mvn clean package -D maven.test.skip=true
部署 crd 到 kubernetes 集群, crd 是集群资源, 没有命名空间, 注意 webpages.operator.k8s.huang.org-v1.yml 文件时maven生成的,需要执行 mvn 编译才会有
kubectl apply -f apis/target/classes/META-INF/fabric8/webpages.operator.k8s.huang.org-v1.yml
部署完成 crd 就可以部署 WebPage(cr), 不过此时还没有处理 WebPage(cr) 的控制器(operator也是控制器), 所以部署上去没有任何效果, 仅仅在服务器添加一行记录而已.
部署 operator 和部署其他 web 服务没有什么不同, 集群不会和 operator 交互,没有特殊配置, operator 启动后自己去调用集群的 api watch 相关资源, 所以 operator 的 pod 需要配置 service account 以及相关的权限. operator 可以部署在任何命名空间, 这里部署在 webpage-operator 命名空间(写死在 k8s/operator.yaml 中了)。 可以做集群外部署和集群内部署两种方式:
idea环境确保 kubernetes 的配置~/.kube/config 是正确的. 在idea中直接启动main函数
打包 operator 程序 docker 镜像。这里镜像版本号要和 k8s/operator.yaml 中配置保持一致
docker buildx b ./operator/ -t webpage-operator:0.0.1
部署镜像服务到集群
kubectl apply -f k8s/operator.yaml
部署后检查部署状态
kubectl get all -n webpage-operator
部署用户自定义资源 WebPage, 这里部署在默认的命名空间
kubectl apply -f k8s/webpage.yaml
部署成功后查看 WebPage 已经部署
kubectl get wb
operator 监控到 WebPage 创建会生成一个 configmap(hello-operator-html), 一个 deployment(deployment.apps/hello-operator) 和 一个 service(service/hello-operator). 并且 service 已经通过 nodeport 暴露
kubectl get all
获取 nodeport, 假设是 30816, 通过浏览器访问页面成功显示 k8s/operator.yaml 中 .spec.html 内容。如果部署在wsl上请用firefox访问, chrome和 edge可能会无法访问 http://localhost:30816/
修改 k8s/operator.yaml 中 .spec.html 内容, 重新部署
kubectl apply -f k8s/webpage.yaml
operator 监控到 WebPage 更新, 会更新对应的资源, 再次刷新浏览器, 显示修改成功(通常需要等待一两分钟).
删除webpage
kubectl delete -f k8s/webpage.yaml
检查自定义资源已经被删除
kubectl get wb
operator 监控到 WebPage 删除会删除对应的资源. 检查相关联的标准资源对象也被删除
# deployment, service
kubectl get all
# configmap
kubectl get cm
删除operator
kubectl delete -f k8s/operator.yaml
# 删除crd
kubectl delete -f apis/target/classes/META-INF/fabric8/webpages.operator.k8s.huang.org-v1.yml