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.hqwc.cn/news/323477.html

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

相关文章

手机卡丢了不要急,全新补卡攻略赶紧收藏!

最近收到一些小伙伴的留言,手机卡办了好几张,所以就出现了手机卡丢失的现象。手机卡丢失补办更是让一些小伙伴们摸不着头脑。怎么补?如何补?需要哪些资料等等一系列的问题,让许多小伙伴都无从下手。今天小编就给大家整…

内网穿透的应用-使用Docker本地部署可编辑导航页结合内网穿透实现远程访问

文章目录 1. 使用Docker搜索镜像2. 下载镜像3. 查看镜像4. 启动容器5. 浏览器访问6. 远程访问6.1 内网穿透工具安装6.2 创建远程连接公网地址6.3 使用固定二级子域名地址远程访问 今天和大家分享如何使用Docker本地部署一个开源的简约风格网址导航页,支持五种搜索引…

Selenuim实现自动登录社交媒体账号和自动发布文章

在当今社交媒体盛行的时代,程序员们经常需要在不同的平台上自动执行一些任务,比如登录社交媒体账号并发布文章。本文将介绍如何利用Selenium浏览器自动化框架实现这一任务,同时结合万媒易发多平台内容同步助手,提高文章发布的效率…

矢量,矢量化的梯度下降以及多元线性回归

一、矢量 定义:按照特定顺序排列的元素集合。可以被视为一维数组。 在机器学习中的作用: 特征表示:在机器学习任务中,输入数据通常以矢量的形式表示。例如,图像可以表示为像素值的矢量,文本可以表示为词…

TinyTu-跨平台图片压缩软件

我平时压缩图片通常会使用类似tinify这样的在线图片压缩网站,这些网站有很多,但使用起来总是感觉不太舒爽,似乎差了点什么,仔细想想它们或多或少有这些缺点: 有的网站需要收费或者半收费。支持图片格式不全&#xff0…

BERT(从理论到实践): Bidirectional Encoder Representations from Transformers【3】

这是本系列文章中的第3弹,请确保你已经读过并了解之前文章所讲的内容,因为对于已经解释过的概念或API,本文不会再赘述。 本文要利用BERT实现一个“垃圾邮件分类”的任务,这也是NLP中一个很常见的任务:Text Classification。我们的实验环境仍然是Python3+Tensorflow/Keras…

对低效的会议说“不!”

根据微软对全球 31, 000 名员工开展的一项调查,低效的会议是影响工作效率的第一大干扰因素,其次是召开过多的会议。 大大小小的同步会、讨论会、审查会、复盘会不仅将工作时间拆解得支离破碎,还会让成员因「会议恢复综合症」而无法立即从无效…

DevOps(9)

目录 45.如何在Linux中将一个文件附加到另一个文件? 46.解释如何使用终端找到文件? 47.解释如何使用终端创建文件夹? 48.解释如何使用终端查看文本文件? 49.解释如何在Ubuntu LAMP堆栈上启用curl? 50.解释如何在…

排除启动类故障----三大实验

目录 一、模拟破坏mbr和分区表然后修复 二、修复grub引导故障 三、遗忘root用户密码 一、模拟破坏mbr和分区表然后修复 1、mbr处于第一块磁盘的第一个物理扇区,总共512个字节,前446个字节是grub程序,后面64个字节是分区表 2、故障原因&a…

# [NOIP2016 提高组] 玩具谜题#洛谷

题目背景 NOIP2016 提高组 D1T1 题目描述 小南有一套可爱的玩具小人,它们各有不同的职业。 有一天,这些玩具小人把小南的眼镜藏了起来。小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外。如下图: 这…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)创建并初始化TcpServer实例

对于一个TcpServer来说,它的灵魂是什么?就是需要提供一个事件循环EventLop(EventLoop),不停地去检测有没有客户端的连接到达,有没有客户端给服务器发送数据,描述的这些动作,反应堆模型能够胜任。当服务器和…

再次拓宽信创生态版图,思迈特与统信软件完成产品兼容适配认证

近日,思迈特软件与统信软件科技有限公司(简称“统信软件”)完成产品兼容性适配互认证,加速国产信创生态化建设进程。 本次测试由商业智能与数据分析软件(简称:Smartbi Insight V11)产品与统信服…