go构建项目与打包

环境搭建

  • 使用的组件及版本

    • operator-sdk v1.22.0
    • go 1.20.0 linux/amd64
    • git 1.8.3.1
    • k8s 1.18.5
    • docker 20.10.5
  • 前期配置

    • 安装Git yum install git
    • 安装docker yum install docker-ce
    • 安装go 官网下载 tar -C /usr/local/ -xvf go1.20.linux-amd64.tar.gz
  • 环境配置

// 将go配置到/etc/profile
export GOROOT=/usr/local/go
export GOPATH=/data/gopath // 路径自定义
export PATH=$GOROOT/bin:$PATH
export GO111MODULE=on  //可有可无
export GOPROXY=https://goproxy.cnsource /etc/profile> - `GO111MODULE=off` 无模块支持,go 会从 GOPATH 和 vendor 文件夹寻找包。
> - `GO111MODULE=on` 模块支持,go 会忽略 GOPATH 和 vendor 文件夹,只根据 `go.mod` 下载依赖。
> - `GO111MODULE=auto` 在 `$GOPATH/src` 外面且根目录有 `go.mod` 文件时,开启模块支持。
  • 安装operator-sdk(直接下载可执行文件)
curl -LO https://github.com/operator-framework/operator-sdk/releases/download/v1.7.2/operator-sdk_linux_amd64
chmod +x operator-sdk_linux_amd64
mv operator-sdk_linux_amd64 /usr/local/bin/operator-sdk

创建项目

  1. 创建一个项目目录,使用operator-sdk进行初始化init
mkdir rds-operator
cd rds-operator
operator-sdk init --domain=example.com --repo=paas.cvicse.com/rds/app
  1. 创建api
*(注意,若使用低版本如v1.1.0则还需要加一个参数  --make=false,否则会报错。当前使用的版本只需要执行以下命令即可)*
operator-sdk create api --group rds --version v1 --kind Rds --resource=true --controller=true
  1. 修改代码(红色标记处需要替换)
    在这里插入图片描述
    修改完后执行命令,重新生成 zz_generated.deepcopy.go 文件
    make generate

运行

运行方式两种

  • 本地代码运行
    • 代码在k8s节点上,直接在项目的根目录运行如下命令(此方式主要开发测试使用)make generate && make manifests && make install && make run

注意:

  1. 本机需确保安装了 kubectl 工具,并且证书文件 ~/.kube/config 存在(保证为集群管理员权限)
  2. 测试完毕后使用 ctrl + c 停止程序,然后 make uninstall 删除 crd 定义
  3. 若没有发生依赖改变,可直接使用go run main.go指令执行代码

make generate:生成包含 DeepCopy、DeepCopyInto 和 DeepCopyObject 方法实现的代码

make manifests:生成 WebhookConfiguration、ClusterRole 和 CustomResourceDefinition 对象

make install:将 CRD 安装到 ~/.kube/config 中指定的 K8s 集群中

make run:运行代码

make uninstall: 从 ~/.kube/config 中指定的 K8s 集群中卸载 CRD

  • 在k8s集群中运行

修改Dockerfile文件(文件在项目的根目录下),修改内容如下

# Build the manager binaryFROM golang:1.15 as builderWORKDIR /workspace# Copy the Go Modules manifestsCOPY go.mod go.modCOPY go.sum go.sum# cache deps before building and copying source so that we don't need to re-download as much# and so that source changes don't invalidate our downloaded layerENV GOPROXY https://goproxy.cn,directRUN go mod download# Copy the go sourceCOPY main.go main.goCOPY api/ api/COPY controllers/ controllers/COPY resource/ resource/# BuildRUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GO111MODULE=on go build -a -o manager main.go# Use distroless as minimal base image to package the manager binary# Refer to https://github.com/GoogleContainerTools/distroless for more details# 使用 distroless 作为最小基础镜像来打包管理器二进制文件# FROM gcr.io/distroless/static:nonrootFROM kubeimages/distroless-static:latestWORKDIR /COPY --from=builder /workspace/manager .USER 65532:65532ENTRYPOINT ["/manager"]
  • 增加了环境变量 ENV GOPROXY https://goproxy.cn,direct
  • 增加了COPY resource/ resource/
  • 修改FROM镜像 FROM kubeimages/distroless-static:latest

执行如下命令制作镜像

make docker-build IMG=***.***.**.**:5000/redis-operator:v1.0

运行operator-controller-manager
operator-controller-manager运行后会启动两个容器 [kube-rbac-proxy manager]

容器manager所使用的镜像是【步骤2】所制作的镜像

容器kube-rbac-proxy所使用的镜像需要修改(只需修改镜像), 路径: 项目根目录/config/default/manager_auth_proxy_patch.yaml,内容如下:

# This patch inject a sidecar container which is a HTTP proxy for the# controller manager, it performs RBAC authorization against the Kubernetes API using SubjectAccessReviews.apiVersion: apps/v1kind: Deploymentmetadata:name: controller-managernamespace: systemspec:template:spec:containers:- name: kube-rbac-proxyimage: 124.223.82.79:5000/kube-rbac-proxy:v0.11.0  # 默认镜像为grc.io/kubesphere/kube-rbac-proxy:v0.8.0, 拉取不到,可从dockerhub上拉取, 此镜像需要修改!!!args:- "--secure-listen-address=0.0.0.0:8443"- "--upstream=http://127.0.0.1:8080/"- "--logtostderr=true"- "--v=10"ports:- containerPort: 8443name: https- name: managerargs:- "--health-probe-bind-address=:8081"- "--metrics-bind-address=127.0.0.1:8080"- "--leader-elect"

kube-rbac-proxy镜像拉取地址: https://hub.docker.com/r/kubesphere/kube-rbac-proxy/tags

执行如下命令创建 operator-controller-manager

make deploy IMG=**.**.**.**:5000/redis-operator:v1.0
  1. 创建ClusterRoleBinding

    创建operator-controller-manager后,直接创建自定义资源,查看controller的日志会发现权限报错,报错信息如下:

    E0210 05:45:33.131287       1 reflector.go:138] pkg/mod/k8s.io/client-go@v0.20.2/tools/cache/reflector.go:167: Failed to watch *v1.StatefulSet: failed to list *v1.StatefulSet: statefulsets.apps is forbidden: User "system:serviceaccount:redis-operator-system:redis-operator-controller-manager" cannot list resource "statefulsets" in API group "apps" at the cluster scope
    E0210 05:45:34.271962       1 reflector.go:138] pkg/mod/k8s.io/client-go@v0.20.2/tools/cache/reflector.go:167: Failed to watch *v1.StatefulSet: failed to list *v1.StatefulSet: statefulsets.apps is forbidden: User "system:serviceaccount:redis-operator-system:redis-operator-controller-manager" cannot list resource "statefulsets" in API group "apps" at the cluster scope
    E0210 05:45:36.971944       1 reflector.go:138] pkg/mod/k8s.io/client-go@v0.20.2/tools/cache/reflector.go:167: Failed to watch *v1.StatefulSet: failed to list *v1.StatefulSet: statefulsets.apps is forbidden: User "system:serviceaccount:redis-operator-system:redis-operator-controller-manager" cannot list resource "statefulsets" in API group "apps" at the cluster scope
    E0210 05:45:40.383080       1 reflector.go:138] pkg/mod/k8s.io/client-go@v0.20.2/tools/cache/reflector.go:167: Failed to watch *v1.StatefulSet: failed to list *v1.StatefulSet: statefulsets.apps is forbidden: User "system:serviceaccount:redis-operator-system:redis-operator-controller-manager" cannot list resource "statefulsets" in API group "apps" at the cluster scope
    
    • 方案一:直接将controller-manager绑定到集群管理员cluster-admin

    创建cluster-admin.yaml文件,内容如下:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:name: cluster-admin-rolebinding
    roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
    subjects:
    - kind: ServiceAccountname: redis-operator-controller-managernamespace: redis-operator-system
    

    创建命令如下:

    kubectl apply -f clutser-admin.yml
    
    • 方案二:修改rbac目录下role.yaml
  2. 创建CRD资源

    文件路径: 项目根目录/config/samples/rds_v1_rds.yaml

    在项目根目录下执行如下命令进行创建:

    kubectl apply -f ./config/samples/rds_v1_rds.yaml
    
  3. 删除CRD资源

    make uninstall
    
  4. 删除controller-manager

    make undeploy
    

make undeploy: 从 ~/.kube/config 中指定的 K8s 集群中卸载controller

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/600183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【赠书第16期】码上行动:用ChatGPT学会Python编程

文章目录 前言 1 ChatGPT简介 2 Python编程简介 3 使用ChatGPT学习Python编程 4 如何使用ChatGPT学习Python编程 5 推荐图书 6 粉丝福利 前言 随着人工智能技术的不断发展,聊天机器人已经成为我们日常生活和工作中不可或缺的一部分。其中,ChatGP…

HarmonyOS@Extend装饰器:定义扩展组件样式

Extend装饰器:定义扩展组件样式 在前文的示例中,可以使用Styles用于样式的扩展,在Styles的基础上,我们提供了Extend,用于扩展原生组件样式。 说明 从API version 9开始,该装饰器支持在ArkTS卡片中使用。…

静态网页设计——红旗汽车官网(HTML+CSS+JavaScript)

前言 声明:该文章只是做技术分享,若侵权请联系我删除。!! 感谢大佬的视频: https://www.bilibili.com/video/BV1gK411x7Bg/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术:HTMLCSSJS(…

git克隆失败提示RPC failed的解决方法

现象 $ git clone https://github.com/guillemj/dpkg.git Cloning into dpkg... remote: Enumerating objects: 113312, done. remote: Counting objects: 100% (18045/18045), done. remote: Compressing objects: 100% (3915/3915), done. error: RPC failed; curl 18 trans…

在Uniapp中使用Echarts创建可视化图表

在uniapp中可以引入echarts创建数据可视化图表。 1. 安装Echarts 使用npm安装echarts插件,命令如下: npm install echarts --save2. 引入Eharts 在需要使用Echarts的页面引入: import *as echarts from echarts3. 创建实例 创建画布元素…

跟我用路由器学Linux编程 - 专栏目录

专栏文章目录 序言 本专栏文章以梅林、openwrt等linux路由为基础硬件,和笔者一起学习使用shell语言。带你从编写简单的插件开始,学习怎么折腾路由器,顺便学会编程。专门找一台Linux主机用来学习很不容易,但软路由用的都是Linux基…

三极管组成的光控开关电路原理图

什么是光控开关 光控开关/光控时控器采用先进的嵌入式微型计算机控制技术,融光控功能和普通时控器两大功能为一体的多功能高级时控器(时控开关),根据节能需要可以将光控探头(功能)与时控功能同时启用&…

【51单片机】LED灯的进阶操作(闪烁、流水)

上篇文章我们讲到了Keil5与STC的使用方式点亮第一个LED灯 这篇将继续进行一些LED灯的进阶操作 目录 LED灯闪烁:LED流水灯普通LED流水灯LED流水灯PLUS LED灯闪烁: 上文我们说只要通过P2这个寄存器就可以控制LED亮灭,现在我们要将其变为闪烁状…

React基础应用及常用代码

目录 基础知识 babel.config.js js,html,css,Vue,react,angular,nodejs,webpack,less,ES6,commonjs等的关系 ECMAScript 6(ES6) let、const、var 的区别 Webpack、npm、node关系 props和state区别 通用框架类 ES 6 export React React.Fragm…

pyparamvalidate 重构背景和需求分析

目录 一、前置说明1、总体目录2、相关回顾3、本节目标 二、重构背景三、需求分析三、后置说明1、要点小结2、下节准备 一、前置说明 1、总体目录 《 pyparamvalidate 参数校验器,从编码到发布全过程》 2、相关回顾 param_validator 常用校验器的实现 3、本节目…

前端算法之堆 -- 计数排序

堆用于解决什么问题 堆排序(Heap Sort):优先队列(Priority Queue):图算法中的最短路径和最小生成树问题:中位数查找:合并K个有序数组: 例子:库存管理 III On时…

分享一个java中读取excel的方法

一、前端传递后端一个excel文件 代码&#xff1a; String file param.get("file").split(",")[1];byte[] content Base64.decodeBase64(file);InputStream inputStream new ByteArrayInputStream(content);Map<String, List<Map<String, Stri…

CAD二开—WblockCloneObjects函数用法

public void WblockCloneObjects(ObjectIdCollection identifiers, ObjectId id, IdMapping mapping, Autodesk.AutoCAD.DatabaseServices.DuplicateRecordCloning cloning, [MarshalAs(UnmanagedType.U1)] bool deferTranslation );其中各个参数的意义如下&#xff1a; ident…

git本地创建分支并推送到远程关联起来

git本地创建分支并推送到远程关联起来 git本地基于当前分支创建个新的分支&#xff0c;然后推送到远程&#xff0c;并把本地新创建的分支和远程分支关联 在当前分支下&#xff0c;新建分支 git checkout -b test推送到远程仓库 git push origin test将本地分支和远程分支关联…

SAP设置修改删除自动JOB

一、设置JOB 方法一 一个不需要单独记事务码的方式 如果FS要求开发做了程序的话&#xff0c;直接执行事务码&#xff0c;点击左上角 程序-后台执行 输出设备选择LP01 打勾&#xff0c;有可能还有一个对话框&#xff0c;也打勾 打勾后设置周期值 系统预设的会有小时、天、周…

论文阅读_InP-Based_Generic_Foundry_Platform_for_Photonic_Integrated_Circuits

InP-Based_Generic_Foundry_Platform_for_Photonic_Integrated_Circuits 时间&#xff1a;2018年 作者&#xff1a;Luc M. Augustin, Member, IEEE, Rui Santos, Erik den Haan, Steven Kleijn, Peter J. A. Thijs, Sylwester Latkowski, Senior Member, IEEE, Dan Zhao, Wei…

STM32F407-14.3.10-表73具有有断路功能的互补通道OCx和OCxN的输出控制位-01x11

如上表所示&#xff0c;MOE0&#xff0c;OSSI1&#xff0c;CCxE1&#xff0c;CCxNE1 时&#xff0c;如下框图OISx与CCxP异或&#xff0c;OISxN与CC1NP异或&#xff0c;然后相与后决定 OCx与OCxN的输出是否相对于OISx与OISxN取反。&#xff08;异或门参考逻辑门符号-CSDN博客&…

【华为OD真题 Python】查找众数及中位数

文章目录 题目描述输入描述输出描述示例1输入输出示例2输入输出示例3输入输出实现代码题目描述 1.众数是指一组数据中出现次数量多的那个数,众数可以是多个 2.中位数是指把一组数据从小到大排列,最中间的那个数,如果这组数据的个数是奇数,那最中间那个就是中位数,如果这组…

‘str‘ object has no attribute ‘capabilities‘

selenium 版本&#xff1a;4.16.0 报错代码&#xff1a; from selenium import webdriverdriver_pathrC:\\xxx\\drivers\\chromedriver\\win64\\120.0.6099.109\\chromedriver-win32/chromedriver.exe driver webdriver.Chrome(driver_path) 解决方法&#xff1a; 等待30秒时…

大数据情况下如何保证企业数据交换安全

数据交换是指在网络或其他方式下&#xff0c;不同主体按照规定的规则和标准实现数据的共享、传输和处理的过程。大数据时代的到来使得数据交换的重要性更为凸显&#xff0c;大数据带来了海量、多样、高速、低价值密度等特点&#xff0c;也带来了更多的价值挖掘和应用场景。 保障…