专栏首页深入浅出微服务及云原生技术【Kubernetes系列】第8篇 CI/CD之组件部署
原创

【Kubernetes系列】第8篇 CI/CD之组件部署

前言

应对敏捷开发的需求,对CI(持续集成))/CD(持续交付)的提出了更高的标准,今天来讨论下,如何基于开源组件(gitlab/jenkins/harbor/kubernetes)使用CI/CD,赋能团队的开发、运维。

核心组件

组件名称

版本

备注

kubernetes

v1.15.3

10.0.0.182:6443

jenkins

2.176.2

集群内部署/ namespace: devops

gitlab

11.8

主机部署

harbor

v1.7.4

docker-compose部署

基本流程

  1. 在GitLab创建对应的项目。
  2. 开发者将代码提交到GitLab。
  3. Jenkins创建对应的任务(Job),集成该项目的Git地址和Kubernetes集群。
  4. 如有配置钩子,推送(Push)代码会自动触发Jenkins构建,如没有配置钩子,需要手动构建。
  5. Jenkins控制Kubernetes(使用的是Kubernetes插件)创建Jenkins Slave。
  6. Jenkins Slave根据流水线(Pipeline)定义的步骤执行构建。
    1. 检出代码、打包、编译。
    2. 通过Dockerfile生成镜像。
    3. 将镜像提送(Push)到私有Harbor。
    4. Jenkins再次控制Kubernetes进行最新的镜像部署。

:

  • 上面所述为一般步骤,中间还可能会涉及自动化测试等步骤,可自行根据业务场景添加。
  • 上面流水线步骤一般由应用代码库的根目录下Jenkinsfile决定,Jenkins会自动读取该文件;另外如果需要对具体的应用流水线实施强管控,可以独立管理jenkinsfile模板,然后根据jenkins API接口即时生成流水线。
  • 默认使用的Dockerfile放置在代码仓库的根目录下。

组件部署

  1. kubernetes 第4篇 Kubernetes集群安装部署
  2. gitlab 无忌过招:手把手教你搭建自己的GitLab库
  3. harbor 安装配置指南
  4. jenkins

: 本文主要说明下jenkins的部署及配置,其他组件如果你部署有问题,欢迎留言。

Jenkins 部署及配置

说明:

  • 以下的yaml文件均在 k8s master节点的 /home/jenkins_deploy目录下,
  • 部署示例的depployment.yaml 的注解
    • nodeName ipaddress , ipaddress 请确认其为一个有效的ip.
    • 示例中jenkins的目录 /var/jenkins_home 是直接挂载到host_path, 如果你有条件,建议替换为共享存储。
    • 因使用的jenkins-master 的基础镜像来自公网,需要k8s maste 节点也要可以访问外网,或者你可以将 jenkins/jenkins:lts-alpine 推送至自己的内网镜像仓库。
  • 部署示例的ingress.yaml 的注解
    • 需要你也需要办公网(集群外)访问,请将jenkins.dev.hanker.net, 改为有效的域名地址,或是你也可以通过NodePort的形式声明 service,就可以直接通过ip:port的形式访问jenkins了。

1. 准备部署yaml

  • deployment.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: devops
  
# Deployment 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: jenkins
  namespace: devops
spec:
  replicas: 1
  revisionHistoryLimit: 3
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      nodeName: 1.1.1.1
      serviceAccountName: jenkins-admin
      containers:
      - image: jenkins/jenkins:lts-alpine
        imagePullPolicy: IfNotPresent
        name: jenkins
        volumeMounts:
        - name: jenkins-volume
          mountPath: /var/jenkins_home
        - name: jenkins-localtime
          mountPath: /etc/localtime
        env:
          - name: JAVA_OPTS
            value: '-Xms256m -Xmx1024m -Duser.timezone=Asia/Shanghai'
          - name: TRY_UPGRADE_IF_NO_MARKER
            value: 'true'
        ports:
        - name: http
          containerPort: 8080
        - name: agent
          containerPort: 50000
        resources:
          requests:
            cpu: 1000m
            memory: 1Gi
          limits:
            cpu: 1200m
            memory: 2Gi
      volumes:
        - name: jenkins-localtime
          hostPath:
            path: /etc/localtime
        - name: jenkins-volume
          hostPath:
            path: /home/jenkins/jenkins_home
  • 配置service, services.yaml
---
apiVersion: v1
kind: Service
metadata:
  name: jenkins-service
  namespace: devops
spec:
  ports:
  - name: http
    protocol: TCP
    port: 8080
    targetPort: 8080
  - port: 50000
    targetPort: 50000
    name: agent
  selector:
    app: jenkins
  • 授权jenkins对k8s的访问 rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: jenkins
  name: jenkins-admin
  namespace: devops
​
---
​
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: jenkins-rbac
  namespace: devops
rules:
  - apiGroups: ["","extensions","app"]
    resources: ["pods","pods/exec","deployments","replicasets"]
    verbs: ["get","list","watch","create","update","patch","delete"]
​
---
​
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: jenkins-admin
  namespace: devops
  labels:
    k8s-app: jenkins
subjects:
  - kind: ServiceAccount
    name: jenkins-admin
    namespace: devops
roleRef:
  kind: ClusterRole
  name: jenkins-rbac
  apiGroup: rbac.authorization.k8s.io
  • 为了便于办公网(集群外)访问,ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: jenkins-ingress
  namespace: devops
spec:
  rules:
  - host: jenkins.dev.hanker.net
    http:
      paths:
      - backend:
          serviceName: jenkins-service
          servicePort: 8080
        path: /

2. 应用yaml,部署jenkins

$ pwd
$ /home/jenkins_deploy
$ kubectl apply -f *.yaml

3. 确认jenkins 服务状态

[root@node0 jenkins_deploy]# kubectl -n devops get deployment jenkins
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
jenkins   1/1     1            1           51d
[root@node0 jenkins_deploy]# 

4. 访问jenkins 安装插件、设置

注: 步骤1 声明的域名 jenkins.dev.hanker.net 已经解析至ingress,故可直接访问; 如果你也想通过自定义域名访问jenkins,麻请解析至正确的ingress服务节点,即可。

1)确认你也已经安装了kubernetes/ kubernetes cli 插件

操作指引: 【Manage Jenkins】 -> 【Manage Plugins】

你应该可以通过类似的指令获取jenkins-master的密码

$ kubectl -n devops exec jenkins-pod-name cat /var/jenkins_home/secrets/initialAdminPassword

2) 配置Kubernetes 插件

操作指引: 【Manage Jenkins】->【Configure System】

图中标注:

  1. 请修改为你所在环境对应的k8s master
  2. 声明jenkins-agent 的命令空间,也可以根据需要调整;
  3. jenkins-master的访问地址,本示例使用的是 service-name的形式访问。
  4. 测试与k8s分享群的连接情况。如果你获取到『 Connection test successful』,恭喜你可以继续。
  5. 配置Kubernetes Pod Template

图中标注:

  1. 设置基础的jenkins-agent镜像;
  2. 指定工作目录;
    • 如果你需要下载、导出或是缓存构建的话,指定一个为共享存储的目录就很有意义了。

3. 设置目录挂载

  • 如步骤2如说,你可以将宿主机的目录或是网络存储挂载至jenkins-agent.

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ShaderHelper2 组件升级,支持自动枚举参数!

    ShaderHelper2 组件我们已经介绍过两次了,不了解的伙伴可以看下面两篇文章:

    张晓衡
  • 利用 GitHub 从零开始搭建一个博客

    趁着周末,搭建了一下 NightTeam 的官方博客和官方主页,耗时数个小时,两个站点终于完工了。这里写一篇文章顺手记录了下来。不过这篇原创我发在了 Night...

    崔庆才
  • 4399AT UI自动化CI与CD

    看完了这三者的区别,目前4399AT是达到了CI和CD(持续交付)阶段,接下来我们说下4399AT的CI与CD; 以下均以安卓项目APP为基础来进行讲解: 软件...

    八音弦
  • Python技术周刊:第 14 期

    欢迎来到《Python技术周刊》这是第14期,每周六发布,让我们直接进入本周的内容。由于微信不允许外部链接,你需要点击页尾左下角”阅读原文“,才能访问文中的链接...

    逍遥散人2019
  • IDEA中对Git的常规操作(合并,提交,新建分支,更新)

    创建好项目,选择VCS - > Import into Version Control -> Create Git Repository

    Java编程指南
  • 20行代码爬取Github上Star最多的Python项目

    传说Github上有一种叫做star的宝藏,海贼王罗杰临刑前说将所有的star都放到了那里,伟大Python的终点——机器学习。无数人为此奔向机器学习的大坑。从...

    HuangWeiAI
  • 一百款wordpress经典主题盘点,找主题不发愁

    一百款wordpress经典主题盘点,找主题不发愁,wordpress有哪些经典的主题,今天给大家盘点一些wordpress经典的主题吧,将会用连载的形式,每次...

    wordpress建站吧
  • 无忌过招:手把手教你搭建自己的GitLab库

    本文Gitlab的安装为主机方式, 获取其他安装方式请点击https://git.lug.ustc.edu.cn/help/install/README.md

    HankerCloud
  • [golang]写了一个可以用 go 来写脚本的工具:gosl

    代码和使用说明可以看这里: http://github.com/daviddengcn/gosl

    landv
  • 通过WGCNA作者的测试数据来学习

    在这样的测试数据里面很容易跟着作者的文档,一步步掌握WGCNA,文档步骤目录如下:

    生信技能树

扫码关注云+社区

领取腾讯云代金券