Kubernetes是一个优秀的容器编排和管理平台,为应用的部署、伸缩和管理提供了强大的能力。Deployment提供了Pod的管理,Service为一组相同功能的Pod提供了统一的入口,而这些都是由Kubernetes自身提供的Controller(控制器)完成的。Kubernetes Operator作为一种新型的自定义控制器,为开发人员和运维团队带来了更高级别的抽象,进一步简化了容器化应用的管理和运维。
Operator模式介绍
Operator是一种自定义控制器,基于Kubernetes API和自定义资源定义(CRD)来实现对特定应用或服务的自动化管理。它通过扩展Kubernetes控制平面,为特定应用或服务提供了自定义的管理逻辑和行为。Operator通过监视和响应自定义资源对象的状态变化,自动化地执行必要的操作,以确保应用或服务的正确部署、运行和维护。
举个例子,运维人员需要部署一套Redis集群,需要正确部署、配置相关参数、启动运行、出现宕机需要重新拉取等工作。Operator模式可以把运维怎样部署、出现问题如何恢复等一系列工作在Kubernetes中操作自动化,实现自动化部署、自动化拉起故障节点等。
Operator使用场景
- 数据库管理:Operator可以自动创建、配置和管理数据库实例,提供高可用、备份恢复和扩展性等功能;
- 监测和警报:Operator可以监测应用的状态和性能指标,并根据预设的规则生成警报,实现实时监测和故障排查;
- 日志和指标收集:Operator可以集成日志和指标收集工具,自动收集和分析应用的日志和指标数据,为性能优化和故障排查提供支持。
Operator主要应用场景是需要部署有状态应用情况下,如Redis主从多活集群, Prometheus集群。
Docker安装
Mac在docker-desktop下寻找合适的版本。
Linux的话,
$ curl -sSL https://get.daocloud.io/docker | sh
通过docker version命令,验证安装是否成功。
安装kubectl
下载
x86-64
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
ARM64
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/arm64/kubectl"
下一步安装
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
验证
kubectl version --client
Kubernetes安装
Kind是一个使用Docker容器作为“节点”实现部署Kubernetes集群的工具,我们默认已经安装了GoLang环境。
安装Kind
curl -Lo ./kind "https://kind.sigs.k8s.io/dl/v0.17.0/kind-$(uname)-amd64"
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
安装Kubernetes环境
kind create cluster --image=kindest/node:v1.22.0 --name=dev
这一步比较慢需要等一会,等执行完了。
kubectl get node
kubectl get pod -n kube-system
有没有内容,如果不是空的,恭喜你Kubernetes环境安装成功了。
Kubebuilder安装配置
到现在,我们已经成功了一半了,继续…
Kubebuilder是一个用于Operator程序构建和发布工具,我们可以使用他快速开发一个Operator程序。
安装Kubebuilder
curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/$\(go env GOOS)/$(go env GOARCH)
chmod +x kubebuilder
sudo mv kubebuilder /usr/local/bin
安装helm
可以参考https://helm.sh/docs/intro/install/
好了,到此为止所有要装的工具都已经装完了,离成功只差一步之遥了。
实例工程
借用《Kubernetes Operator开发进阶》的示例,开发一个operator,自动创建一个Deployment和Service。
代码在github的https://github.com/daniel-hutao/Advanced-Kubernetes-Operator中,进入ch7的application-operator中.
主要开两个核心代码,一个是自定义CR,在apis/apps/v1/application_types.go
type ApplicationSpec struct {
Deployment DeploymentTemplate `json:"deployment,omitempty"`
Service ServiceTemplate `json:"service,omitempty"`
}
定义了两个自定义资源。
还有一个是Controller,在controllers/apps/application_controller.go
// 创建Deployment
result, err = r.reconcileDeployment(ctx, app)
if err != nil {
log.Error(err, "Failed to reconcile Deployment.")
return result, err
}
// 创建Service
result, err = r.reconcileService(ctx, app)
if err != nil {
log.Error(err, "Failed to reconcile Service.")
return result, err
}
部署Controller:
# 投建镜像
make docker-build IMG=application-operator:v0.0.1
# 推送到kind上
kind load docker-image application-operator:v0.0.1 --name dev
# 部署CRD
make install
# 部署控制器
make deploy IMG=application-operator:v0.0.1
# 结果检查
kubectl get pod -n application-operator-system
一个简单的Operator可以运行成功了。
总结
Kubernetes Operator作为一种创新的自定义控制器,为容器化应用的管理和运维带来了革命性的改进。它通过自动化运维、领域专属、声明式配置和扩展性等特点,简化了容器化应用的管理复杂性,提高了效率和稳定性。
参考:
还在苦恼快速搭建K8S环境,试试Kind吧
Kubernetes Install Tools
Kubernetes Operators: what are they? Some examples
《Kubernetes Operator开发进阶》
如有侵权,请及时与我联系,谢谢。