学习K8S 使用Operator部署管理Nginx

创建一个Kubernetes Operator 部署 nginx 的大致过程如下:

  1. 确定您要使用的 Operator SDK 版本并安装它。
  2. 使用 Operator SDK 命令行创建新的 Operator 项目。
  3. 定义 CustomResourceDefinition(CRD),即将在 Kubernetes 中定义的自定义资源规范,以及该资源的状态和操作。例如,定义一个名为 Nginx 的 CRD,其中包括名称、镜像、端口等参数。
  4. 使用 Operator SDK 生成代码以处理 CRD 并实现控制器逻辑。例如,在 handler.go 中编写一个 Reconcile 函数来确保指定的nginx Pod 正常运行。
  5. 构建自己的 Docker 镜像,并将其推送到您选择的 Docker registry。
  6. 将自定义资源存储在 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.iohttps://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() 函数

 

 

 

 

 

 
posted @   潇潇暮鱼鱼  阅读(417)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示