operator连接k8s集群并调试

以nacos operator为例

下载源码

git clone GitHub - nacos-group/nacos-k8s: This project contains a Nacos Docker image meant to facilitate the deployment of Nacos on Kubernetes using StatefulSets.

安装go语言环境

由于nacos operator 是go语法编写,所以需要本地安装go语言环境

go语言环境安装包下载:Downloads - The Go Programming Language

下载版本建议与项目所需版本一致 比如nacos operator中Dockerfile文件定义的是golang:1.13 所以下载安装的是1.13版本

查看go版本:go version

查看go的环境参数: go env

安装go语言开发工具

下载安装GoLand软件

并配置go版本

在preferences中配置

>GO>GOROOT (可通过go env查看并进行配置)

>GO>GOPATH   下载的依赖包所存放的位置

>GO>GO Modules 配置为这个GOPROXY=https://goproxy.cn,https://goproxy.io,direct

使用命令go mod download 将依赖下载到本地

连接到k8s集群

operator项目连接k8s集群

将k8s集群的认证文件放入到~/.kube 名为config文件

本地连接远程k8s集群

1、下载新版docker 以支持kubectl命令(20.10.16)

2、将k8s集群认证文件放入到/etc/kubernetes下 名为admin.conf文件

3、执行命令kubectl get node 测试是否正确连接到集群

本地ping不通k8s podip

可采用kt-connet方式

  • 安装kubectl(即以上步骤)

    • 更新docker版本(20.10.16)

    • 配置完成后打开cmd,运行kubectl get node测试是否正确连接到集群

  • 给k8s所有节点服务器安装socat

    • yum install -y socat

  • ktctl连接k8s集群

  • 可以ping通了

可以开始调试测试

启动main.go

### 关于Kubernetes CRD和Operator模式 #### 自定义资源定义(CRD) CRD允许扩展API服务器的功能,无需修改核心组件即可引入新的API对象。通过CRD可以创建特定业务需求的对象类型[^1]。 ```yaml apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: kvdis.example.com spec: group: example.com versions: - name: v1alpha1 served: true storage: true scope: Namespaced names: plural: kvdis singular: kvdI kind: Kvdi shortNames: - kd ``` 这段YAML配置文件展示了如何定义一个新的名为`kvdI`的自定义资源,在命名空间范围内可用,属于`example.com`组的一部分。 #### Operator模式 Operators是一种封装、部署管理Kubernetes应用的方法。它利用定制控制器来实现复杂的状态管理和操作逻辑自动化。对于像KVDI这样的虚拟桌面基础设施项目来说,operator可以帮助简化集群中的VDI环境管理工作流。 为了构建一个基于Go语言编写的简单Operator,通常会遵循如下结构: - 定义所需的Custom Resource Definitions (CRDs). - 创建Controller用于监听这些新类型的事件变化. - 编写Reconcile函数处理实际的任务执行. ```go package main import ( "context" appsv1 "k8s.io/api/apps/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" ctrl "sigs.k8s.io/controller-runtime" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/manager/signals" ) func main() { ctx := context.Background() log := logf.Log.WithName("controller_kvd") mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{}) if err != nil { panic(err.Error()) } clientset, _ := kubernetes.NewForConfig(mgr.GetConfig()) kvdiCtrl := &KvdiController{ ClientSet: clientset, Log: log, Scheme: mgr.GetScheme(), } err = kvdiCtrl.SetupWithManager(mgr) if err != nil { panic(err.Error()) } log.Info("starting manager") if err := mgr.Start(signals.SetupSignalHandler()); err != nil { log.Error(err, "problem running manager") } } ``` 上述代码片段提供了一个基本框架,其中包含了启动带有自定义控制器的manager所需的关键部分. #### 最佳实践建议 当开发针对KVDI或其他项目的operators时,请考虑以下几点最佳做法: - **模块化设计**: 将功能分解成独立的小型服务或库,以便更容易维护和发展。 - **幂等性保障**: 确保每次调用都能得到相同的结果,即使重复多次也不会影响最终状态。 - **错误恢复机制**: 实现重试策略和其他方法来应对临时性的失败情况。 - **监控与日志记录**: 添加足够的指标暴露以及详细的日志输出支持调试工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值