K8s 微服务自动化部署容器(Rancher 流水线)

SegmentFault

共 6015字,需浏览 13分钟

 ·

2021-03-08 22:00

作者:汤青松
来源:SegmentFault 思否社区




一、背景


最近公司上线办公网零信任安全网关系统,由我负责部署上线,在部署的时候同时也在想如何保障稳定性,以及后续部署的简便性;


想起了 k8s 微服务的成熟方案,不仅可以自动重启还可以监控容器运行状态,也可以集成自动化部署,于是找了一些资料将之前接触过的 rancher 用了起来,首先要做的就是简化安装方式,下面是我的一些过程,同时也可以给大家提供参考。




二、操作步骤


  1. 让Rancher能访问GitLab

  2. 在流水线添加项目

  3. 在仓库添加必备文件

  4. CICD自动部署调试




三、gitlab添加oauth授权


在进入集群的命名空间中,可以在菜单栏点击工具-流水线,然后就可以看到如下图所示的界面




接下来打开gitlab,然后打开设置页面:

http://xx.xx.xx.xx/admin/applications/4


如下图所示



在上图中将所需信息填写进去,然后点击保存


保存之后,gitlab会生成Application Id和Secret,我们将它复制出来



复制出来之后,切回rancher系统中,将其一一填写进来,如下图所示



点击完成后,会有一个弹窗进行授权,授权完成后rancher就可以访问到gitlab仓库了。





四、在rancher中添加代码仓库


在确保rancher可以访问gitlab仓库之后,在rancher菜单栏点击工具-流水线,将需要自动化部署的项目启用并保存,如下图所示



保存之后,回到CICD列表中,可以看到两个已经启用的项目,如下图所示





五、添加部署必备个文件


接下来就可以开始在代码中启用CICD自动化部署了,需要在项目根目录添加三个文件,分别是:


  1. .rancher-pipeline.yml

  2. Dockerfile

  3. deployment.yaml


5.1 设置发布流程


自动部署首先需要确定部署流程,主要用到文件.rancher-pipeline.yml,这里我是golang 的项目,使用了三个流程。


首先编译项目;接着构建镜像推送到rancher的镜像仓库中,最后使用容器编排文件发布项目,配置代码核心关注点如下图红色区域所示



stages:
- name: Build
  steps:
  - runScriptConfig:
      image: golang:1.16
      shellScript: |-
        go env -w GO111MODULE=on && go env -w GOPROXY=https://goproxy.cn,direct
        go mod tidy
        pwd
        go build -o ./bin/funfecenter
- name: Publish
  steps:
  - publishImageConfig:
      dockerfilePath: ./Dockerfile
      buildContext: .
      tag: funfecenter:${CICD_EXECUTION_SEQUENCE}
- name: Deploy
  steps:
  - applyYamlConfig:
      path: ./deployment.yaml
timeout: 60
notification: {}


5.2 构建镜像


在上一步中已经将项目编译好,接着就需要将编译好的可执行文件放入到镜像中,这里起作用的主要是Dockerfile文件,配置代码比较简单,如下所示


FROM golang:1.16
EXPOSE 1333
COPY ./bin/funfecenter /data/funfecenter/center
COPY ./init/ /
COPY script.py /root/
RUN  apt update -y
RUN  apt install -y python3
#CMD ["python3","/root/script.py"]
CMD ["/data/funfecenter/center"]


5.3 容器编排


上一步已经将需要运行的镜像推送到rancher的镜像仓库之后,接下来就需要构建pod来运行容器,这里发挥作用的主要是deployment.yaml 文件。


这个文件如果没有接触过k8s的同学可能会比较陌生,这里我将每一行都写了注释,并将需要修改的地方用红色标记圈出来了,如下图所示



参考配置如下所示


kind: Service      # 指定创建资源的角色/类型
apiVersion: v1     # 指定api版本,此值必须在kubectl api-versions中
metadata:          # 资源的元数据/属性
  name: funfe-center    # 资源的名字,在同一个namespace中必须唯一
spec:               # 资源规范字段
  selector:         # 选择器
    app: center
  type: NodePort    # 端口类型
  ports:
    - protocol: TCP     # 协议
      port: 80          # service 端口
      targetPort: 80    # 容器暴露的端口
---
apiVersion: apps/v1   # 指定api版本,此值必须在kubectl api-versions中
kind: Deployment      # 指定创建资源的角色/类型
metadata:             # 资源的元数据/属性
  name: funfe-center    # 资源的名字,在同一个namespace中必须唯一
  namespace: default    # 资源的名字,在同一个namespace中必须唯一
spec:                 # 资源规范字段
  replicas: 1         # 声明副本数目
  selector: # 选择器
    matchLabels: # 匹配标签
      app: center
  template:           # 模版
    metadata: # 资源的元数据/属性
      labels: # 设定资源的标签
        app: center
    spec:             # 资源规范字段
      imagePullSecrets:                    # 镜像仓库拉取密钥
        - name: pipeline-docker-registry
      containers:
        - name: funfe                  # 容器的名字
          image: ${CICD_IMAGE}:${CICD_EXECUTION_SEQUENCE}   # 容器使用的镜像地址
          ports:
            - containerPort: 80               # 容器开发对外的端口
         




六、修改代码自动部署


修改代码后会自动执行编译、推送到镜像库、拉取代码部署


现在我修改代码仓库的代码,回到rancher流水线中,就看到有一个任务在执行自动部署流程,如下图所示



执行完成周,回到集群的工作负载当中,就可以看到已经有一个服务自动化部署到K8s中






点击左下角阅读原文,到 SegmentFault 思否社区 和文章作者展开更多互动和交流,扫描下方”二维码“或在“公众号后台回复“ 入群 ”即可加入我们的技术交流群,收获更多的技术文章~

- END -


浏览 27
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报