目录
文章目录
一、devops持续集成
1、通过多阶段构建对go镜像瘦身
1.引入
Dockerfile
#先在机器上编译
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o hello main.go
CGO_ENABLED:
cgo表示go中的工具 这个表示是否禁用cgo ,1表示启用
GOOS: 目标操作系统
mac: darwin
linux: linux
windows: windows
GOARCH: 目标操作系统的架构(386, amd64, arm), amd64, mac m1 arm架构的
#再编译
docker build -t first .
查看镜像大小
这里是7.4M原来是340多M,极大减小内存,但是这里仍依赖宿主机上的环境
//有没有办法解决 1. 可以在隔离的go的容器环境中编译,同时还能减少 空间
//使用多阶段构建
2.多阶段构建
#Dockerfile
然后进行构建docker build -t first . 即可
其他参数:
- 编译环境设置
ENV CGO_ENABLED 0
ENV GOOS linux
ENV GOPROXY https://goproxy.cn,direct - 拷贝当前文件下所有文件到镜像中
COPY . . - 为什么使用COPY . . 还要把go.mod 和 go.sum单独拎出来?
- RUN go env 看参数是否设置成功
- -ldflags=" -s -w"为文件瘦身,死写法
2、devops介绍
https://www.cnblogs.com/qingqing-919/p/15136818.html
CI过程:
3、如何构建一个生产环境的镜像
1.实现目标
2.pipeline参数化构建
注意注意注意:上面不是
(
b
r
a
n
c
h
)
而是
(branch) 而是
(branch)而是{branch}
脚本路径要改成gitee上代码上的jenkinsfile文件路径
jenkins服务器防止构建过程提示输入yes而hang住
git config --system --unset credential.helper
CI系统会抽取代码中的Dockerfile进行构建和Jenkinsfile进行集成
Jenkinsfile包含Dockerfile的执行过程,Jenkinsfile运行Dockerfile
CD过程就是通知k8s我要部署了,我把yaml传你给,你帮我部署一下
3.编写Dockerfile
FROM golang:1.19.4-alpine3.17 AS builder
WORKDIR /build
ENV CGO_ENABLED 0
ENV GOOS linux
ENV GOPROXY https://goproxy.cn,direct
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
RUN go build -ldflags="-s -w" -o cmd/server cmd/server.go
FROM alpine
WORKDIR /build
ENV TZ Asia/Shanghai
COPY --from=builder /build/cmd/server .
CMD ["./server"]
然后将myserver项目传到构建服务器
4.编写Jenkinsfile完成docker构建和发布
jenkins使用文档
Jenkinsfile:
pipeline {
agent any
environment {
// Harbor仓库地址
REGISTRY = "192.168.2.34:30002"
}
stages {
stage('docker login') {
steps {
echo "=============== docker login ================"
sh """
docker login -u admin -p Harbor12345 http://$REGISTRY
"""
}
}
stage('docker build') {
steps {
echo "=============== docker build ================"
sh """
docker build -f build/Dockerfile -t $REGISTRY/mxshop/myserver:\${version}.\${branch} .
"""
}
}
stage('docker push') {
steps {
echo "=============== docker push ================"
sh """
docker push $EGISTRY/mxshop/myserver:\${version}.\${branch}
"""
}
}
}
}
5.jenkins构建后发布到k8s中
1.首先推代码到gitee
2.写完以后在代码(构建)服务器,添加jenkins服务器的jenkins组
[root@unknown080027aacc86 myserver]# usermod -a -G docker jenkins
[root@unknown080027aacc86 myserver]# grep docker /etc/group
docker:x:993:jenkins
[root@unknown080027aacc86 myserver]# systemctl restart docker
[root@unknown080027aacc86 myserver]# vim /etc/docker/daemon.json
[root@unknown080027aacc86 myserver]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://t7ls2f7s.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.2.34:30002"]#添加这一行 ,地址是harbor服务器地址
}
[root@unknown080027aacc86 myserver]#
修改jenkins脚本路径为gitee上Jenkinsfile文件路径
3.去kubesphere添加工作负载,查找harbor中镜像即可
4、对user服务进行ci构建
1.添加Dockerfile和Jenkinsfile
修改jenkinsfile的SERVICE和SERVER_NAME
pipeline {
agent any
environment {
// Harbor仓库地址
REGISTRY = "192.168.2.34:30002"
SERVICE = "userserver"
SERVER_NAME = "user"
}
stages {
stage('docker login') {
steps {
echo "=============== docker login ================"
sh """
docker login -u admin -p Harbor12345 http://$REGISTRY
"""
}
}
stage('docker build') {
steps {
echo "=============== docker build ================"
sh """
docker build -f build/docker/$SERVER_NAME/Dockerfile -t $REGISTRY/mxshop/$SERVICE:\${version}.\${branch} .
"""
}
}
stage('docker push') {
steps {
echo "=============== docker push ================"
sh """
docker push $EGISTRY/mxshop/$SERVICE:\${version}.\${branch}
"""
}
}
}
}
2.创建gitee仓库并推送代码
在mxshop项目下git bash,git clone刚创建的项目
然后git add .
git commit
git push
3.添加uesr-service 流水线
基于已有的myserver流水线构建
修改代码仓库
修改脚本路径
开始构建
4.kubesphere添加用户服务工作负载
修=Dockerfile 暴露grpc端口,就可以在部署工作负载的时候有“使用默认端口”按钮
修改Dockerfile,启动参数路径修改
拷贝logs服务需要的文件到kubesphere当前目录
然后重新push,Jenkins重新build
挂载外部配置文件user/srv.yaml,即添加配置字典并挂载
添加userserver-config配置字典
选择“每次都拉取镜像”
好处是:如果只有一个版本,将容器组不小心删除,它会重新拉取。不选的话就不会自动拉取。
挂载userserver-config配置字典配置的"srv.yaml"到"/build/configs/user"路径下,因为Dockerfile中执行命令"./configs/user/srv.yaml"需要srv.yaml。
5.修改用户服务的yaml配置
1.将host修改为: “0.0.0.0”
2.修改mysq
将host改为mysql内部域名(DNS)
创建mxshop_user_srv时使用navicat连接mysql外部域名
注意:中途修改配置可以删除对应容器组,容器组会自动重启
3.同理修改consul和jaeger配置
consul
jaeger
nacos
6.解决gmicro的ip地址bug
如果没有设置端口或者监听端口为0.0.0.0的时候,我们希望nacos注册服务的时候,能够自己发现ip地址,并注册到注册中心去。
listenAndEndpoint能够将0.0.0.0获取到对应的ip地址(谁对应地址?启动服务的地址)
原来是不管如何都获取rpcServer.Address()
现在改成,如果Endpoint不为空(Address为0.0.0.0或其他原因导致),则优先使用由0.0.0.0转化为的Endpoint服务地址
暴露use-service服务,只用与测试,正常不用暴露
7.user服务测试
同步数据库表
实际开发中,各个服务肯定是部署到注册中心,通过注册中心访问的,只是测试时需要走服务暴露的外部address:port
8.负载均衡,在k8s启动多个副本非常简单
k8s的service的负载均衡和本地负载均衡的区别
本地起多个副本,需要命令行传入多个端口,这个在k8s就不存在了,因为映射到同一个端口,不通的虚拟ip,就相当于主机都不一样,端口一样也没事
最小最大都设为2个副本,在容器组就会产生两个实例
然后创建"服务"暴露外部访问端口,记得选择外部访问模式为"LoadBalancer"
目前k8s负载均衡不足:
不支持长连接https
5、部署admin的api服务
1.添加Dockerfile和Jenkinsfile
修改jenkinsfile的SERVICE和SERVER_NAME
pipeline {
agent any
environment {
// Harbor仓库地址
REGISTRY = "192.168.2.34:30002"
SERVICE = "adminserver"
SERVER_NAME = "admin"
}
stages {
stage('docker login') {
steps {
echo "=============== docker login ================"
sh """
docker login -u admin -p Harbor12345 http://$REGISTRY
"""
}
}
stage('docker build') {
steps {
echo "=============== docker build ================"
sh """
docker build -f build/docker/$SERVER_NAME/Dockerfile -t $REGISTRY/mxshop/$SERVICE:\${version}.\${branch} .
"""
}
}
stage('docker push') {
steps {
echo "=============== docker push ================"
sh """
docker push $EGISTRY/mxshop/$SERVICE:\${version}.\${branch}
"""
}
}
}
}
2.push代码
3.添加admin-service 流水线
复制user-service的流水线
只修改脚本路径就可以
然后Jenkins构建
4.kubesphere添加用户api服务(即admin服务)工作负载
1.添加admin-config配置字典
2.添加admin-service工作负载
挂载路径:/build/configs/admin
5.外部测试
指定工作负载暴露该api服务:
6、为服务service配置路由(添加域名)
类似配置kong(通过nginx做的),k8s内部通过ingress(也是通过nginx做的)将路由信息映射到service上,service内部有负载均衡,注意这里是针对服务,而不是容器组pod
1.为admin-service创建内部访问服务
2.为service配置路由
没有外部域名,这里用在电脑上配置本地域名测试
点击启用网关,选NodePort或LoadBalancer都行