学习K8S 使用Operator部署管理Nginx
创建一个Kubernetes Operator 部署 nginx 的大致过程如下:
- 确定您要使用的 Operator SDK 版本并安装它。
- 使用 Operator SDK 命令行创建新的 Operator 项目。
- 定义 CustomResourceDefinition(CRD),即将在 Kubernetes 中定义的自定义资源规范,以及该资源的状态和操作。例如,定义一个名为 Nginx 的 CRD,其中包括名称、镜像、端口等参数。
- 使用 Operator SDK 生成代码以处理 CRD 并实现控制器逻辑。例如,在 handler.go 中编写一个 Reconcile 函数来确保指定的nginx Pod 正常运行。
- 构建自己的 Docker 镜像,并将其推送到您选择的 Docker registry。
- 将自定义资源存储在 Kubernetes 中以供使用。
1.安装 Operator SDK 工具
1)在centos7中安装 Operator SDK 工具。
$ sudo yum install wget git
2)下载Operator SDK二进制文件
$ mkdir -p /data/operator-sdk $ cd /data/operator-sdk $ wget https://github.com/operator-framework/operator-sdk/releases/download/v1.12.0/operator-sdk_linux_amd64
3)将下载的Operator SDK二进制文件标记为可执行
$ chmod +x operator-sdk_linux_amd64
4)将Operator SDK二进制文件移动到/usr/local/bin目录中,以便在整个系统范围内使用它:
$ sudo mv operator-sdk_linux_amd64 /usr/local/bin/operator-sdk
5)检查operator-sdk版本是否正确安装
$ operator-sdk version
2.安装kubernetesbuilder
下载最新版本的 Kubebuilder 压缩包,可以通过以下链接查找并确定最新版本 https://github.com/kubernetes-sigs/kubebuilder/releases/
wget https://github.com/kubernetes-sigs/kubebuilder/releases/download/v3.10.0/kubebuilder_linux_amd64
mv kubebuilder_linux_amd64 /usr/local/bin/kubebuilder
3.创建一个新的 Operator 项目并使用以下命令初始化
#需要添加--repo参数,使可以在
$GOPATH外使用,否则会报错
go: cannot determine module path for source directory /data/operator/demo/src/github.com/nginxdemo (outside GOPATH, module path must be specified)
operator-sdk init nginx --repo=server
operator-sdk init demo --repo=server
#执行很慢并报错go: sigs.k8s.io/controller-runtime@v0.13.0: Get "https://proxy.golang.org/sigs.k8s.io/controller-runtime/@v/v0.13.0.mod": dial tcp 142.251.42.241:443: i/o timeout Error: failed to initialize project: unable to scaffold with "base.go.kubebuilder.io/v3": exit status 1
#原因默认GoPROXY配置是:GOPROXY=https://proxy.golang.org,国内访问不到,所以推荐使用
https://mirrors.aliyun.com/goproxy/,https://goproxy.io
或https://goproxy.cn
#设置goproxy
export GOPROXY=https://mirrors.aliyun.com/goproxy/
#再次执行operator初始化
operator-sdk init nginx-operator
4.创建 Nginx 资源的 CRD
operator-sdk create api --group nginx --version v1alpha1 --kind Nginx --resource --controller
#出现了api目录
5.在api/v1alpha1/nginx_types.go
中定义 CustomResourceDefinition 的规范和状态字段。
其中只用填写NginxSpec和NginxStatus ,Nginx和NginxList的内容不用做变更
package v1alpha1 import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) type NginxSpec struct { Replicas int32 `json:"replicas"` Image string `json:"image"` Port int32 `json:"port"` } type NginxStatus struct { AvailableReplicas int32 `json:"availableReplicas"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object type Nginx struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` Spec NginxSpec `json:"spec,omitempty"` Status NginxStatus `json:"status,omitempty"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object type NginxList struct { metav1.TypeMeta `json:",inline"` metav1.ListMeta `json:"metadata,omitempty"` Items []Nginx `json:"items"` }
6.在controller/nginx_controller.go
中编写 Reconcile()
函数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?