当前位置: 首页 > news >正文

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.lryc.cn/news/267659.html

相关文章:

  • 图片批量处理:图片批量缩放,高效调整尺寸的技巧
  • 直接插入排序【从0-1学数据结构】
  • C++/CLI——1简介
  • C#实现串口通讯
  • NLP论文阅读记录 - 以大语言模型为参考学习总结
  • 前端---资源路径
  • 【2024考研】心情记录
  • MySQL数据库日志管理和数据的备份及恢复
  • node-schedule nodejs定时提醒(并判断段是否是工作日)
  • LeetCode 75| 前缀和
  • 智能,轻量,高效的爬虫工具 (爬虫宝第一代), HSpider
  • IDEA Maven Helper插件 解决jar冲突
  • 装饰 Web3 项目的用户交互界面(Web3项目二实战之四)
  • 【数据库系统概论】第3章-关系数据库标准语言SQL(3)
  • 理解io/nio/netty
  • 旅游品牌网站搭建的作用是什么
  • Linux操作系统——进程(五)环境变量
  • 西门子博途怎么使用PID_Compact做pid调试
  • 结构型模式 | 适配器模式
  • 基于Python的车牌识别系统实现
  • 时间序列预测模型介绍及使用经验总结
  • Docker知识总结
  • 算法训练营Day25
  • docker笔记2-docker 容器
  • redis 从0到1完整学习 (七):ZipList 数据结构
  • 2015年第四届数学建模国际赛小美赛C题科学能解决恐怖主义吗解题全过程文档及程序
  • 基于Java开发的微信约拍小程序
  • 蓝桥杯的学习规划
  • EMC噪声的本质
  • Redis遇到过的问题 (Could not get a resource from the pool )