minicube搭建golang容器服务

引言

最近在自己电脑上搭建一个小型k8s环境,以学习云原生相关内容。这里我主要分为三部分记录:

  • 容器及容器编排理论
  • 环境安装相关
  • rpcx服务实战

还在调试中,先总结整理下,这里后续补充上我的github工程链接。

一、容器及容器编排理论

容器技术中有三个核心概念:容器(Container)、镜像(Image),以及镜像仓库(Registry)

如何通过Docker File构建镜像?
=> 首先编写Docker File文件, Docker build 命令构建镜像 ,Docker run 依照新编写好的镜像运行容器实例。

操作容器的常用命令有 docker ps、docker run、docker exec、docker stop 等;操作镜像的常用命令有 docker images、docker rmi、docker build、docker tag 等;操作镜像仓库的常用命令有 docker pull、docker push 等。

Kubernetes 就是一个生产级别的容器编排平台和集群管理系统,不仅能够创建、调度容器,还能够监控、管理服务器。

快速搭建 Kubernetes 环境的工具选择minikube, 最大特点就是“小而美”,可执行文件仅有不到 100MB,运行镜像也不过 1GB,但就在这么小的空间里却集成了 Kubernetes 的绝大多数功能特性,不仅有核心的容器编排功能,还有丰富的插件,例如 Dashboard、GPU、Ingress、Istio、Kong、Registry 等等,综合来看非常完善。

总结差异:

容器技术只解决了应用的打包、安装问题,面对复杂的生产环境就束手无策了,解决之道就是容器编排,它能够组织管理各个应用容器之间的关系,让它们顺利地协同运行。

Kubernetes 源自 Google 内部的 Borg 系统,也是当前容器编排领域的事实标准。minikube 可以在本机搭建 Kubernetes 环境,功能很完善,适合学习研究。操作 Kubernetes 需要使用命令行工具 kubectl,只有通过它才能与 Kubernetes 集群交互。kubectl 的用法与 docker 类似,也可以拉取镜像运行,但操作的不是简单的容器。

docker和k8s之间的区别,一个是容器技术,一个是容器编排技术,两者思考的维度是不一样的,就容器而言,容器解决的问题是隔离,是一次打包到处运行的问题,最大的价值就在于镜像的迁移。编排技术则是关注的是整个系统的问题,如果你只关注一个服务,迁移一个服务,那docker就够,但要迁移整个系统以及运维,那就需要编排,包括网络关系,负载均衡,回滚,监控,扩缩容问题则需要容器编排技术。

二、环境安装相关

我的电脑是mac m2,因此需要安装一些arm架构的软件。首先安装docker,主要使用的命令记录:

因为安装的是docker 桌面版本,终端可能找不到docker命令,因此添加环境变量:
export PATH="$PATH:/Applications/Docker.app/Contents/Resources/bin/"验证:
docker --version  

之后安装minikube,这里使用命令行安装arm架构版本:

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-arm64
sudo install minikube-darwin-arm64 /usr/local/bin/minikube验证:
minikube version

不过 minikube 只能够搭建 Kubernetes 环境,要操作 Kubernetes,还需要另一个专门的客户端工具“kubectl”。kubectl 的作用有点类似之前我们学习容器技术时候的工具“docker”,它也是一个命令行工具,作用也比较类似,同样是与 Kubernetes 后台服务通信,把我们的命令转发给 Kubernetes,实现容器和集群的管理功能。

 minikube kubectlminikube dashboard此时可以界面化查看: http://127.0.0.1:52337/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/#/pod?namespace=default

➜ k8s minikube version
minikube version: v1.32.0
commit: 8220a6eb95f0a4d75f7f2d7b14cef975f050512d
➜ k8s minikube kubectl – version
Client Version: v1.28.3
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.28.3

三、rpcx服务实战

RPCX是一个分布式的Go语言的 RPC 框架,支持Zookepper、etcd、consul多种服务发现方式,多种服务路由方式,这里首先基于该框架在本机测试代码,之后开始考虑生成镜像并本地部署。

3.1 本地运行及测试服务代码

服务端rpcx_server.go代码:

package mainimport ("context""flag""log""time"example "github.com/rpcxio/rpcx-examples""github.com/smallnest/rpcx/client"
)var (addr = flag.String("addr", "localhost:8972", "server address")
)func main() {flag.Parse()d, _ := client.NewPeer2PeerDiscovery("tcp@"+*addr, "")xclient := client.NewXClient("Arith", client.Failtry, client.RandomSelect, d, client.DefaultOption)defer xclient.Close()args := &example.Args{A: 10,B: 20,}for {reply := &example.Reply{}err := xclient.Call(context.Background(), "Mul", args, reply)if err != nil {log.Fatalf("failed to call: %v", err)}log.Printf("%d * %d = %d", args.A, args.B, reply.C)time.Sleep(1e9)}
}

客户端rpcx_client.go代码:

package mainimport ("flag"example "github.com/rpcxio/rpcx-examples""github.com/smallnest/rpcx/server"
)var addr = flag.String("addr", "localhost:8972", "server address")func main() {flag.Parse()s := server.NewServer()// s.RegisterName("Arith", new(example.Arith), "")s.Register(new(example.Arith), "")s.Serve("tcp", *addr)
}

本地通过go run测试验证成功。

3.2 编写dockfile生成镜像

服务端:

FROM golang:1.19-alpine as builder
WORKDIR /usr/src/app
ENV GOPROXY=https://goproxy.cn
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \apk add --no-cache ca-certificates tzdata
COPY ./go.mod ./
COPY ./go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -ldflags "-s -w" -o rpcx_serverFROM scratch as runner
COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /usr/src/app/rpcx_server /opt/app/EXPOSE 8972CMD ["/opt/app/rpcx_server"]

客户端:

FROM golang:1.19-alpine as builder
WORKDIR /usr/src/app
ENV GOPROXY=https://goproxy.cn
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \apk add --no-cache ca-certificates tzdata
COPY ./go.mod ./
COPY ./go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -ldflags "-s -w" -o rpcx_client FROM busybox as runner
COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /usr/src/app/rpcx_client /opt/app/CMD ["/opt/app/rpcx_client"]

分别指向以下命令进行生成及验证:

docker build . -t rpcx-server-demo:0.1.0
docker build . -t rpcx-client-demo:0.1.0之后通过docker images查看:
docker images                                     
REPOSITORY                    TAG       IMAGE ID       CREATED         SIZE
rpcx-server-demo              0.1.0     a13acd11fc0e   19 hours ago    10.7MB
3.3 通过yaml部署发布

服务端:

kubectl apply -f rpcx-server-demo.yaml
kubectl apply -f rpcx-server-demo-service.yaml

Kubernetes 中的服务(Service)和部署(Deployment)是两个不同的资源对象,需要分别定义和创建。

  1. rpcx-server-demo.yaml 文件用于创建 RPCX 服务器的部署。这个文件定义了部署所需的配置,如容器镜像、副本数、资源限制等。通过执行 kubectl apply -f rpcx-server-demo.yaml 命令,您将创建一个部署对象,该对象将负责管理和运行 RPCX 服务器的实例。
  2. rpcx-server-demo-service.yaml 文件用于创建 RPCX 服务器的服务。服务是 Kubernetes 中的一种资源对象,用于公开应用程序的网络访问。通过执行 kubectl apply -f rpcx-server-demo-service.yaml 命令,您将创建一个服务对象,该对象将为 RPCX 服务器提供一个稳定的网络地址,以便其他应用程序可以通过该地址与服务器进行通信。

通过将这两个 YAML 文件分开,您可以更好地组织和管理应用程序的部署和服务。部署文件负责定义和管理应用程序的实例,而服务文件负责定义和管理应用程序的网络访问。这种分离可以提高可维护性和灵活性,并使您能够更好地管理应用程序的不同方面。

客户端:

kubectl apply -f rpcx-client-demo.yaml

客户端通常不需要像服务端那样暴露网络服务,所以不需要创建服务对象。

在这种情况下,只需使用 kubectl apply -f rpcx-client-demo.yaml 命令来创建客户端的部署对象即可。该部署对象将负责管理和运行 RPCX 客户端的实例。

客户端通常是作为一个独立的应用程序运行,它会连接到服务端提供的网络地址进行通信。因此,不需要为客户端创建服务对象,因为客户端不需要公开网络访问。

参考:

极客时间部分教程
想学习k8s但没有环境?使用minikube轻松搭建一个 https://mp.weixin.qq.com/s/aExQHKHsqsOChDrT4Lz0vw
构建 Golang 应用最小 Docker 镜像 https://www.cnblogs.com/hahaha111122222/p/17878985.html

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

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

相关文章

java八股 redis

Redis篇-01-redis开篇_哔哩哔哩_bilibili 1.缓存穿透 2.缓存击穿 逻辑过期里的互斥锁是为了保证只有一个线程去缓存重建 3.缓存雪崩 4.双写一致性 4.1要求一致性(延迟双删/互斥锁) 延迟双删无法保证强一致性 那么前两步删缓和更新数据库哪个先呢&#xf…

基于Java SSM框架实现实现定西扶贫惠农推介志愿者系统项目【项目源码+论文说明】

基于java的SSM框架实现定西扶贫惠农推介志愿者系统演示 摘要 扶贫工作是党中央、国务院的一项重要战略部署。党政机关定点扶贫是中国扶贫开发战略部署的重要组成部分,是新阶段扶贫开发的一项重大举措,对推动贫困地区经济社会的发展有着积极的意义。 本…

Linux命令的操作练习

1.创建ss别名,查看长格式详细信息 alias ssls -l 2.创建ss别名,复制boot文件夹下的内容到data文件夹下 alias sscp -r /boot /data 3.删除别名ss unalias ss 4. 复制test文件夹下的passwd文件到qq文件夹下,并改名为ww cp test/pas…

Ethercat“配置从站地址”报文分析(0x0010:0x0011)

基于IgH主站接了3个从站,分析报文。 涉及的从站寄存器:Configured Station Address 0x0010:0x0011。 使用场景举例: IgH启动后,通过“配置从站地址”报文将所有从站地址清零,然后通过APWR指令“配置从站地址”报文&a…

MinIO客户端之stat

MinIO提供了一个命令行程序mc用于协助用户完成日常的维护、管理类工作。 官方资料 mc stat 获取指定桶或者对象的信息,包含对象的元数据。 指定桶bkt1,查看信息,命令如下: ./mc stat --recursive local1/bkt1控制台的输出&…

TIA博途Wincc_通过VBS脚本实现电机风扇或水泵旋转动画的具体方法

TIA博途Wincc_通过VBS脚本实现电机风扇或水泵旋转动画的具体方法 前面和大家介绍了通过在PLC中编程,结合HMI的图形IO域实现电机风扇或水泵旋转动画的具体方法,详细内容可参考以下链接: TIA博途Wincc中制作电机风扇或水泵旋转动画的具体方法示例 本次和大家分享通过VBS脚本实…

windows下使用vccode+cmake编译cuda程序

1、在vscode中安装Nsight Visual Studio Code Edition 在vscode中安装插件能够对cuda的代码进行语法检查 2、编写cuda程序 #include <iostream>__global__ void mykernelfunc(){}; int main() {mykernelfunc<<<1,1>>>();std::cout << "hel…

华为OD机试 - 亲子游戏(Java JS Python C)

题目描述 宝宝和妈妈参加亲子游戏,在一个二维矩阵(N*N)的格子地图上,宝宝和妈妈抽签决定各自的位置,地图上每个格子有不同的糖果数量,部分格子有障碍物。 游戏规则是妈妈必须在最短的时间(每个单位时间只能走一步)到达宝宝的位置,路上的所有糖果都可以拿走,不能走障…

Tiny Object Detection

文章目录 RFLA: Gaussian Receptive Field based Label Assignment for Tiny Object Detection&#xff08;ECCV2022&#xff09;Dynamic Coarse-to-Fine Learning for Oriented Tiny Object Detection&#xff08;CVPR2023&#xff09;TOD-CMLNN&#xff08;2023&#xff09; …

C/C++中double类型的比较

C/C中double类型的比较C/C中double类型的比较 由于double浮点数的精度问题&#xff0c;所以在比较大小的时候&#xff0c;不能像int整数型那样&#xff0c;直接if(ab)&#xff0c;if(a<b)&#xff0c;if(a>b) 要使用一个精度EPS&#xff1a; #include <math.h> …

OpenSource - SCM服务管理平台

文章目录 官方网址文档下载版本功能解决了哪些问题使用对象优势Linxu版本scm-dev deb服务列表 Windows版本scm-dev 服务列表scm-all 服务列表scm-jdk 服务列表scm-springboot 精简版本服务列表scm-springboot 服务列表scm-tomcat 服务列表 SCM 截图 官方网址 https://scm.chus…

RabbitMQ入门指南(七):生产者可靠性

专栏导航 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、消息丢失的可能性 1.发送消息时丢失&#xff1a; 2.MQ导致消息丢失&#xff1a; 3.消费者处理消息时消息丢失&#xff1a; 二、生产者可靠性 1.生产者重试机制 2.生产者确认机制 总结 前言 Ra…

Plantuml之对象图语法介绍(十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

VSCode运行时弹出powershell

问题 安装好了vscode并且装上code runner插件后&#xff0c;运行代码时总是弹出powershell,而不是在vscode底部终端 显示运行结果。 解决方法 打开系统cmd ,在窗口顶部条右击打开属性&#xff0c;把最下面的旧版控制台选项取消&#xff0c;即可

Flink系列之:Checkpoints 与 Savepoints

Flink系列之&#xff1a;Checkpoints 与 Savepoints 一、概述二、功能和限制 一、概述 从概念上讲&#xff0c;Flink 的 savepoints 与 checkpoints 的不同之处类似于传统数据库系统中的备份与恢复日志之间的差异。 Checkpoints 的主要目的是为意外失败的作业提供恢复机制。 …

【Hadoop】Zookeeper是什么?怎么理解它的工作机制?

Zookeeper是什么Zookeeper工作机制 Zookeeper是什么 Zookeeper是一个开源的分布式的&#xff0c;为别的分布式矿建提供协调服务的Apache项目。分布式简单地理解就是多台机器共同完成一个任务。 Zookeeper工作机制 从设计模式的角度来理解&#xff0c;是一个基于观察者模式设…

LV.13 D6 Linux内核安装及交叉编译 学习笔记

一、tftp加载Linux内核及rootfs 1.1 uboot内核启动命令 bootm 启动指定内存地址上的Linux内核并为内核传递参数 bootm kernel-addr ramdisk-addr dtb-addr 注: kernel-addr: 内核的下载地址 ramdisk-addr: 根文件系统的下载地址 …

postMessage——不同源的网页直接通过localStorage/sessionStorage/Cookies——技能提升

最近遇到一个问题&#xff0c;就是不同源的两个网页之间进行localstorage或者cookie的共享。 上周其实遇到过一次&#xff0c;觉得麻烦就让后端换了种方式处理了&#xff0c;昨天又遇到了同样的问题。 使用场景 比如从网页A通过iframe跳转到网页B&#xff0c;而且这两个网页…

工具系列:PyCaret介绍_Fugue 集成_Spark、Dask分布式训练

文章目录 1、分布式计算场景&#xff08;1&#xff09;分类&#xff08;2&#xff09;回归&#xff08;3&#xff09;时间序列 2、分布式应用技巧(1)一个更实际的案例(2) 在设置中使用lambda而不是dataframe(3) 保持确定性(4) 设置n_jobs(4)设置适当的批量大小(5) 显示进度(6)自…

java旅游攻略管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web旅游攻略管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…