53 [十二基于k8s部署服务] :devops

2 篇文章 0 订阅

目录


一、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都行
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值