基于K8s的DevOps平台实践(一)

这篇具有很好参考价值的文章主要介绍了基于K8s的DevOps平台实践(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

本篇文章基于 k8s 集群部署 gitlab、sonarQube、Jenkins 等工具,并把上述工具集成到 Jenkins 中,以 Django 项目和 SpringBoot 项目为例,通过多分支流水线及 Jenkinsfile 实现项目代码提交到不同的仓库分支,实现自动代码扫描、单元测试、docker 容器构建、k8s 服务的自动部署。

1. DevOps介绍

Continuous Integration (CI) 和 Continuous Delivery (CD)

传统的软件交付流程如下:

k8s devops,Kubernetes原理与实战,devops,kubernetes,云原生,docker

一个软件从零开始到最终交付,大概包括以下几个阶段:规划、编码、构建、测试、发布、部署和维护,基于这些阶段,我们的软件交付模型大致经历了以下几个阶段。

🍑 瀑布式流程

前期需求确立之后,软件开发人员花费数周和数月编写代码,把所有需求一次性开发完,然后将代码交给 QA(质量保障)团队进行测试,然后将最终的发布版交给运维团队去部署。

瀑布模型,简单来说,就是等一个阶段所有工作完成之后,再进入下一个阶段。这种模式的问题也很明显,产品迭代周期长,灵活性差。一个周期动辄几周几个月,适应不了当下产品需要快速迭代的场景。

k8s devops,Kubernetes原理与实战,devops,kubernetes,云原生,docker

🍑 敏捷开发

任务由大拆小,开发、测试协同工作,注重开发敏捷,不重视交付敏捷。

k8s devops,Kubernetes原理与实战,devops,kubernetes,云原生,docker

🍑 DevOps

开发、测试、运维协同工作,持续开发+持续交付。

k8s devops,Kubernetes原理与实战,devops,kubernetes,云原生,docker

我们是否可以认为 DevOps = 提倡开发、测试、运维协同工作来实现持续开发、持续交付的一种软件交付模式?

大家想一下为什么最初的开发模式没有直接进入 DevOps 的时代?

原因是:沟通成本。

各角色人员去沟通协作的时候都是手动去做,交流靠嘴,靠人去指挥,很显然会出大问题。所以说不能认为 DevOps 就是一种交付模式,因为解决不了沟通协作成本,这种模式就不具备可落地性。

那 DevOps 时代如何解决角色之间的成本问题?DevOps 的核心就是自动化。自动化的能力靠什么来支撑,工具和技术。

DevOps工具链

k8s devops,Kubernetes原理与实战,devops,kubernetes,云原生,docker

靠这些工具和技术,才实现了自动化流程,进而解决了协作成本,使得 devops 具备了可落地性。因此我们可以大致给 devops 一个定义:

devops = 提倡开发、测试、运维协同工作来实现持续开发、持续交付的一种软件交付模式 + 基于工具和技术支撑的自动化流程的落地实践。

因此 devops 不是某一个具体的技术,而是一种思想+自动化能力,来使得构建、测试、发布软件能够更加地便捷、频繁和可靠的落地实践。

本篇文章的核心内容就是要教会大家如何利用工具和技术来实现完整的 DevOps 平台的建设。我们主要使用的工具有:

  1. gitlab,代码仓库,企业内部使用最多的代码版本管理工具。
  2. Jenkins, 一个可扩展的持续集成引擎,用于自动化各种任务,包括构建、测试和部署软件。
  3. robotFramework, 基于Python的自动化测试框架
  4. sonarqube,代码质量管理平台
  5. maven,java包构建管理工具
  6. Kubernetes
  7. Docker

2. Jenkins初体验

关于 Jenkins 的介绍这里不过多叙述,除了下面我自己的部署方案,大家还可以参考这个网站:Jenkins部署方案

🍑 K8s环境中部署jenkins

安装的注意点:

  1. 第一次启动很慢
  2. 因为后面 Jenkins 会与 kubernetes 集群进行集成,会需要调用 kubernetes 集群的 api,因此安装的时候创建了 ServiceAccount 并赋予了 cluster-admin 的权限
  3. 初始化容器来设置权限
  4. ingress 来外部访问
  5. 数据存储通过 pvc 挂载到宿主机中

(1)jenkins/jenkins-all.yaml 文件

apiVersion: v1
kind: Namespace
metadata:
  name: jenkins
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: jenkins
  namespace: jenkins
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: nfs
  resources:
    requests:
      storage: 200Gi
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins
  namespace: jenkins
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: jenkins-crb
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: jenkins
  namespace: jenkins
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins-master
  namespace: jenkins
spec:
  replicas: 1
  selector:
    matchLabels:
      devops: jenkins-master
  template:
    metadata:
      labels:
        devops: jenkins-master
    spec:
      serviceAccount: jenkins #Pod 需要使用的服务账号
      initContainers:
      - name: fix-permissions
        image: busybox
        command: ["sh", "-c", "chown -R 1000:1000 /var/jenkins_home"]
        securityContext:
          privileged: true
        volumeMounts:
        - name: jenkinshome
          mountPath: /var/jenkins_home
      containers:
      - name: jenkins
        image: jenkinsci/blueocean:1.24.7
        imagePullPolicy: IfNotPresent
        ports:
        - name: http #Jenkins Master Web 服务端口
          containerPort: 8080
        - name: slavelistener #Jenkins Master 供未来 Slave 连接的端口
          containerPort: 50000
        volumeMounts:
        - name: jenkinshome
          mountPath: /var/jenkins_home
        env:
        - name: JAVA_OPTS
          value: "-Xms4096m -Xmx5120m -Duser.timezone=Asia/Shanghai -Dhudson.model.DirectoryBrowserSupport.CSP="
      volumes:
      - name: jenkinshome
        persistentVolumeClaim:
          claimName: jenkins
---
apiVersion: v1
kind: Service
metadata:
  name: jenkins
  namespace: jenkins
spec:
  ports:
  - name: http
    port: 8080
    targetPort: 8080
  - name: slavelistener
    port: 50000
    targetPort: 50000
  type: ClusterIP
  selector:
    devops: jenkins-master
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: jenkins-web
  namespace: jenkins
spec:
  rules:
  - host: jenkins.luffy.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service: 
            name: jenkins
            port:
              number: 8080

(2)创建服务:

## 部署服务
$ kubectl create -f jenkins-all.yaml
## 查看服务
$ kubectl -n jenkins get po
NAME                              READY   STATUS    RESTARTS   AGE
jenkins-master-767df9b574-lgdr5   1/1     Running   0          20s

# 查看日志,第一次启动提示需要完成初始化设置
$ kubectl -n jenkins logs -f jenkins-master-767df9b574-lgdr5
......
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

5396b4e1c395450f8360efd8ee641b18

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************

(3)访问服务:

配置 hosts 解析,172.21.51.143 jenkins.luffy.com,然后使用浏览器域名访问服务。第一次访问需要大概几分钟的初始化时间。

k8s devops,Kubernetes原理与实战,devops,kubernetes,云原生,docker

使用 jenkins 启动日志中的密码,或者执行下面的命令获取解锁的管理员密码:

$ kubectl -n jenkins exec jenkins-master-767df9b574-lgdr5 bash 
/ # cat /var/jenkins_home/secrets/initialAdminPassword
35b083de1d25409eaef57255e0da481a

点击叉号,跳过选择安装推荐的插件环节,直接进入 Jenkins。由于默认的插件地址安装非常慢,我们可以替换成国内清华的源,进入 jenkins 工作目录,目录下面有一个 updates 的目录,下面有一个 default.json 文件,我们执行下面的命令替换插件地址:

$ cd /var/jenkins_home/updates
$ sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json 
$ sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json

注意:暂时先不用重新启动 pod,汉化后一起重启。

选择右上角 admin->configure->password 重新设置管理员密码,设置完后,会退出要求重新登录,使用 admin/xxxxxx (新密码),登录即可。

k8s devops,Kubernetes原理与实战,devops,kubernetes,云原生,docker

🍑 安装汉化插件

Jenkins -> manage Jenkins -> Plugin Manager -> Avaliable,搜索 chinese 关键字

k8s devops,Kubernetes原理与实战,devops,kubernetes,云原生,docker

选中后,选择 [Install without restart],等待下载完成,然后点击 [ Restart Jenkins when installation is complete and no jobs are running ],让 Jenkins 自动重启

启动后,界面默认变成中文。

3. Jenkins基本使用演示

🍑 演示目标

  • 代码提交 gitlab,自动触发 Jenkins 任务
  • Jenkins 任务完成后发送钉钉消息通知

🍑 演示准备

gitlab 代码仓库搭建

## 全量部署的组件
$ gitlab-ctl status
run: alertmanager: (pid 1987) 27s; run: log: (pid 1986) 27s
run: gitaly: (pid 1950) 28s; run: log: (pid 1949) 28s
run: gitlab-exporter: (pid 1985) 27s; run: log: (pid 1984) 27s
run: gitlab-workhorse: (pid 1956) 28s; run: log: (pid 1955) 28s
run: logrotate: (pid 1960) 28s; run: log: (pid 1959) 28s
run: nginx: (pid 2439) 1s; run: log: (pid 1990) 27s
run: node-exporter: (pid 1963) 28s; run: log: (pid 1962) 28s
run: postgres-exporter: (pid 1989) 27s; run: log: (pid 1988) 27s
run: postgresql: (pid 1945) 28s; run: log: (pid 1944) 28s
run: prometheus: (pid 1973) 28s; run: log: (pid 1972) 28s
run: puma: (pid 1968) 28s; run: log: (pid 1966) 28s
run: redis: (pid 1952) 28s; run: log: (pid 1951) 28s
run: redis-exporter: (pid 1971) 28s; run: log: (pid 1964) 28s
run: sidekiq: (pid 1969) 28s; run: log: (pid 1967) 28s

部署分析:

  1. 依赖 postgres
  2. 依赖 redis

使用 k8s 部署:

(1)准备 secret 文件

$ cat gitlab-secret.txt
postgres.user.root=root
postgres.pwd.root=1qaz2wsx

$ kubectl -n jenkins create secret generic gitlab-secret --from-env-file=gitlab-secret.txt

(2)部署postgres

注意点:

  • 使用 secret 来引用账户密码
  • 使用 postgres=true 来指定节点
$ cat postgres.yaml
apiVersion: v1
kind: Service
metadata:
  name: postgres
  labels:
    app: postgres
  namespace: jenkins
spec:
  ports:
  - name: server
    port: 5432
    targetPort: 5432
    protocol: TCP
  selector:
    app: postgres
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: postgredb
  namespace: jenkins
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: nfs
  resources:
    requests:
      storage: 200Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: jenkins
  name: postgres
  labels:
    app: postgres
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      tolerations:
      - operator: "Exists"
      containers:
      - name: postgres
        image:  postgres:11.4
        imagePullPolicy: "IfNotPresent"
        ports:
        - containerPort: 5432
        env:
        - name: POSTGRES_USER           #PostgreSQL 用户名
          valueFrom:
            secretKeyRef:
              name: gitlab-secret
              key: postgres.user.root
        - name: POSTGRES_PASSWORD       #PostgreSQL 密码
          valueFrom:
            secretKeyRef:
              name: gitlab-secret
              key: postgres.pwd.root
        resources:
          limits:
            cpu: 1000m
            memory: 2048Mi
          requests:
            cpu: 50m
            memory: 100Mi
        volumeMounts:
        - mountPath: /var/lib/postgresql/data
          name: postgredb
      volumes:
      - name: postgredb
        persistentVolumeClaim:
          claimName: postgredb
          


#创建postgres
$ kubectl create -f postgres.yaml

# 创建数据库gitlab,为后面部署gitlab组件使用
$ kubectl -n jenkins exec -ti postgres-7ff9b49f4c-nt8zh bash
root@postgres-7ff9b49f4c-nt8zh:/# psql
root=# create database gitlab;
CREATE DATABASE

(3)部署 redis

$ cat redis.yaml
apiVersion: v1
kind: Service
metadata:
  name: redis
  labels:
    app: redis
  namespace: jenkins
spec:
  ports:
  - name: server
    port: 6379
    targetPort: 6379
    protocol: TCP
  selector:
    app: redis
---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: jenkins
  name: redis
  labels:
    app: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      tolerations:
      - operator: "Exists"
      containers:
      - name: redis
        image:  sameersbn/redis:4.0.9-2
        imagePullPolicy: "IfNotPresent"
        ports:
        - containerPort: 6379
        resources:
          limits:
            cpu: 1000m
            memory: 2048Mi
          requests:
            cpu: 50m
            memory: 100Mi
            
# 创建
$ kubectl create -f redis.yaml

(4)部署gitlab

注意点:

  • 使用 ingress 暴漏服务
  • 添加 annotation,指定 nginx 端上传大小限制,否则推送代码时会默认被限制 1m 大小,相当于给 nginx 设置 client_max_body_size 的限制大小
  • 使用服务发现地址来访问 postgres 和 redis
  • 在 secret 中引用数据库账户和密码
  • 数据库名称为 gitlab
   $ cat gitlab.yaml
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: gitlab
     namespace: jenkins
     annotations:
       nginx.ingress.kubernetes.io/proxy-body-size: "50m"
   spec:
     rules:
     - host: gitlab.luffy.com
       http:
         paths:
         - path: /
           pathType: Prefix
           backend:
             service: 
               name: gitlab
               port:
                 number: 80
   ---
   kind: PersistentVolumeClaim
   apiVersion: v1
   metadata:
     name: gitlab
     namespace: jenkins
   spec:
     accessModes:
       - ReadWriteOnce
     storageClassName: nfs
     resources:
       requests:
         storage: 200Gi
   ---
   apiVersion: v1
   kind: Service
   metadata:
     name: gitlab
     labels:
       app: gitlab
     namespace: jenkins
   spec:
     ports:
     - name: server
       port: 80
       targetPort: 80
       protocol: TCP
     selector:
       app: gitlab
   ---
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     namespace: jenkins
     name: gitlab
     labels:
       app: gitlab
   spec:
     replicas: 1
     selector:
       matchLabels:
         app: gitlab
     template:
       metadata:
         labels:
           app: gitlab
       spec:
         tolerations:
         - operator: "Exists"
         containers:
         - name: gitlab
           image:  sameersbn/gitlab:13.2.2
           imagePullPolicy: "IfNotPresent"
           env:
           - name: GITLAB_HOST
             value: "gitlab.luffy.com"
           - name: GITLAB_PORT
             value: "80"
           - name: GITLAB_SECRETS_DB_KEY_BASE
             value: "long-and-random-alpha-numeric-string"
           - name: GITLAB_SECRETS_DB_KEY_BASE
             value: "long-and-random-alpha-numeric-string"
           - name: GITLAB_SECRETS_SECRET_KEY_BASE
             value: "long-and-random-alpha-numeric-string"
           - name: GITLAB_SECRETS_OTP_KEY_BASE
             value: "long-and-random-alpha-numeric-string"
           - name: DB_HOST
             value: "postgres"
           - name: DB_NAME
             value: "gitlab"
           - name: DB_USER
             valueFrom:
               secretKeyRef:
                 name: gitlab-secret
                 key: postgres.user.root
           - name: DB_PASS
             valueFrom:
               secretKeyRef:
                 name: gitlab-secret
                 key: postgres.pwd.root
           - name: REDIS_HOST
             value: "redis"
           - name: REDIS_PORT
             value: "6379"
           ports:
           - containerPort: 80
           resources:
             limits:
               cpu: 2000m
               memory: 5048Mi
             requests:
               cpu: 100m
               memory: 500Mi
           volumeMounts:
        - mountPath: /home/git/data
             name: data
         volumes:
         - name: data
           persistentVolumeClaim:
             claimName: gitlab
   
   
   # 创建
   $ kubectl create -f gitlab.yaml
   

配置 hosts 解析:

172.21.51.143 gitlab.luffy.com

设置root密码

访问 http://gitlab.luffy.com,设置管理员密码

配置 k8s-master 节点的 hosts

$ echo "172.21.51.143 gitlab.luffy.com" >>/etc/hosts

myblog 项目推送到 gitlab

mkdir demo
cp -r python-demo demo/
cd demo/myblog
git remote rename origin old-origin
git remote add origin http://gitlab.luffy.com/root/myblog.git
git push -u origin --all
git push -u origin --tags

钉钉推送

官方文档

  • 配置机器人

  • 试验发送消息

$ curl 'https://oapi.dingtalk.com/robot/send?access_token=4778abd23dbdbaf66fc6f413e6ab9c0103a039b0054201344a22a5692cdcc54e' \
   -H 'Content-Type: application/json' \
   -d '{"msgtype": "text", 
        "text": {
             "content": "基于K8s的DevOps平台实践"
        }
      }'
      

🍑 演示过程

流程示意图:

k8s devops,Kubernetes原理与实战,devops,kubernetes,云原生,docker

(1)安装 gitlab plugin

插件中心搜索并安装gitlab,直接安装即可

(2)配置 Gitlab

系统管理->系统配置->Gitlab,其中的 API Token,需要从下个步骤中获取

k8s devops,Kubernetes原理与实战,devops,kubernetes,云原生,docker

(3)获取 AccessToken

登录 gitlab,选择 user->Settings->access tokens 新建一个访问 token

(4)配置 host 解析

由于我们的 Jenkins 和 gitlab 域名是本地解析,因此需要让 itlab 和 Jenkins 服务可以解析到对方的域名。两种方式:

  • 在容器内配置hosts

  • 配置coredns的静态解析

             hosts {
                 172.21.51.143 jenkins.luffy.com  gitlab.luffy.com
                 fallthrough
             }

(5)创建自由风格项目

  • gitlab connection 选择为刚创建的 gitlab
  • 源码管理选择 Git,填项项目地址
  • 新建一个 Credentials 认证,使用用户名密码方式,配置 gitlab 的用户和密码
  • 构建触发器选择 Build when a change is pushed to GitLab
  • 生成一个 Secret token
  • 保存

(6)到 gitlab 配置 webhook

  • 进入项目下 settings->Integrations
  • URL:http://jenkins.luffy.com/project/free
  • Secret Token 填入在 Jenkins 端生成的token
  • Add webhook
  • test push events,报错:Requests to the local network are not allowed

(7)设置 gitlab 允许向本地网络发送 webhook 请求

访问 Admin Aera -> Settings -> Network,展开Outbound requests

Collapse,勾选第一项即可。再次 test push events,成功。

k8s devops,Kubernetes原理与实战,devops,kubernetes,云原生,docker

(8)配置 free 项目,增加构建步骤,执行 shell,将发送钉钉消息的 shell 保存

(9)提交代码到 gitlab 仓库,查看构建是否自动执行

4. Master-Slaves(agent)模式

上面演示的任务,默认都是在 master 节点执行的,多个任务都在 master 节点执行,对 master 节点的性能会造成一定影响,如何将任务分散到不同的节点,做成多 slave 的方式?

(1)添加 slave 节点

  • 系统管理 -> 节点管理 -> 新建节点
  • 比如添加 172.21.51.68,选择固定节点,保存
  • 远程工作目录 /opt/jenkins_jobs
  • 标签为任务选择节点的依据,如 172.21.51.68
  • 启动方式选择通过 java web 启动代理,代理是运行 jar 包,通过 JNLP(是一种允许客户端启动托管在远程 Web 服务器上的应用程序的协议 )启动连接到 maste r节点服务中

k8s devops,Kubernetes原理与实战,devops,kubernetes,云原生,docker

(2)执行 java 命令启动 agent 服务

## 登录172.21.51.68,下载agent.jar
$ wget http://jenkins.luffy.com/jnlpJars/agent.jar
## 会提示找不到agent错误,因为没有配置地址解析,由于连接jenkins master会通过50000端口,直接使用cluster-ip
$ kubectl -n jenkins get svc #在master节点执行查询cluster-ip地址
NAME      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)              AGE
jenkins   ClusterIP   10.99.204.208   <none>        8080/TCP,50000/TCP   4h8m

## 再次回到68节点
$ wget 10.99.204.208:8080/jnlpJars/agent.jar
$ java -jar agent.jar -jnlpUrl http://10.99.204.208:8080/computer/172.21.51.68/slave-agent.jnlp -secret 4be4d164f861d2830835653567867a1e695b30c320d35eca2be9f5624f8712c8 -workDir "/opt/jenkins_jobs"
...
INFO: Remoting server accepts the following protocols: [JNLP4-connect, Ping]
Apr 01, 2020 7:03:51 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Agent discovery successful
  Agent address: 10.99.204.208
  Agent port:    50000
  Identity:      e4:46:3a:de:86:24:8e:15:09:13:3d:a7:4e:07:04:37
Apr 01, 2020 7:03:51 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Handshaking
Apr 01, 2020 7:03:51 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Connecting to 10.99.204.208:50000
Apr 01, 2020 7:03:51 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Trying protocol: JNLP4-connect
Apr 01, 2020 7:04:02 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Remote identity confirmed: e4:46:3a:de:86:24:8e:15:09:13:3d:a7:4e:07:04:37
Apr 01, 2020 7:04:03 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Connected

若出现如下错误:

SEVERE: http://jenkins.luffy.com/ provided port:50000 is not reachable
java.io.IOException: http://jenkins.luffy.com/ provided port:50000 is not reachable
        at org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver.resolve(JnlpAgentEndpointResolver.java:311)
        at hudson.remoting.Engine.innerRun(Engine.java:689)
        at hudson.remoting.Engine.run(Engine.java:514)

可以选择: 配置从节点 -> 高级 -> Tunnel连接位置,参考下图进行设置:

k8s devops,Kubernetes原理与实战,devops,kubernetes,云原生,docker

(3)查看 Jenkins 节点列表,新节点已经处于可用状态

k8s devops,Kubernetes原理与实战,devops,kubernetes,云原生,docker

(4)测试使用新节点执行任务

  • 配置 free 项目

  • 限制项目的运行节点 ,标签表达式选择 172.21.51.68

  • 立即构建

  • 查看构建日志

Started by user admin
Running as SYSTEM
Building remotely on 172.21.51.68 in workspace /opt/jenkins_jobs/workspace/free-demo
using credential gitlab-user
Cloning the remote Git repository
Cloning repository http://gitlab.luffy.com/root/myblog.git
 > git init /opt/jenkins_jobs/workspace/free-demo # timeout=10
 ...

5. Jenkins定制化容器

由于每次新部署 Jenkins 环境,均需要安装很多必要的插件,因此考虑把插件提前做到镜像中。

Dockerfile

FROM jenkinsci/blueocean:1.23.2
LABEL maintainer="inspur_lyx@hotmail.com"

ENV JENKINS_UC https://updates.jenkins-zh.cn
ENV JENKINS_UC_DOWNLOAD https://mirrors.tuna.tsinghua.edu.cn/jenkins
ENV JENKINS_OPTS="-Dhudson.model.UpdateCenter.updateCenterUrl=https://updates.jenkins-zh.cn/update-center.json"
ENV JENKINS_OPTS="-Djenkins.install.runSetupWizard=false"

## 用最新的插件列表文件替换默认插件文件
COPY plugins.txt /usr/share/jenkins/ref/

## 执行插件安装
RUN /usr/local/bin/install-plugins.sh < /usr/share/jenkins/ref/plugins.txt

plugins.txt

ace-editor:1.1
allure-jenkins-plugin:2.28.1
ant:1.10
antisamy-markup-formatter:1.6
apache-httpcomponents-client-4-api:4.5.10-1.0
authentication-tokens:1.3
...

get_plugin.sh

admin:123456@localhost 需要替换成 Jenkins 的用户名、密码及访问地址

#!/usr/bin/env bash
curl -sSL  "http://admin:123456@localhost:8080/pluginManager/api/xml?depth=1&xpath=/*/*/shortName|/*/*/version&wrapper=plugins" | perl -pe 's/.*?<shortName>([\w-]+).*?<version>([^<]+)()(<\/\w+>)+/\1:\2\n/g'|sed 's/ /:/' > plugins.txt

执行构建,定制 jenkins 容器

$ docker build . -t 172.21.51.143:5000/jenkins:v20200414 -f Dockerfile
$ docker push 172.21.51.143:5000/jenkins:v20200414

至此,我们可以使用定制化的镜像启动 jenkins 服务

## 删掉当前服务
$ kubectl delete -f jenkins-all.yaml

## 删掉已挂载的数据
$ rm -rf /var/jenkins_home

## 替换使用定制化镜像
$ sed -i 's#jenkinsci/blueocean#172.21.51.143:5000/jenkins:v20200404#g' jenkins-all.yaml

## 重新创建服务
$ kubectl create -f jenkins-all.yaml

6. 总结

自由风格项目弊端:文章来源地址https://www.toymoban.com/news/detail-780461.html

  • 任务的完成需要在Jenkins端维护大量的配置
  • 没法做版本控制
  • 可读性、可移植性很差,不够优雅

到了这里,关于基于K8s的DevOps平台实践(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【DevOps基础篇之k8s】如何通过Kubernetes CKA认证考试

    推荐超级课程: Docker快速入门到精通 Kubernetes入门到大师通关课 这些是我在准备CK

    2024年03月15日
    浏览(46)
  • 基于jenkins+k8s实现devops

    由于jenkins运行在k8s上能够更好的利用动态agent进行构建。所以写了个部署教程,亲测无坑 1、创建ns kubectl create namespace devops 2、kubectl apply -f jenkins.yml 注意:镜像建议使用最新版本,因为jenkin平台默认提供了最新的插件,且无法选择版本,所以如果jenkins版本过低会导致插件不

    2024年02月06日
    浏览(40)
  • DevOps基于k8s发布系统的实现

    首先,本篇文章所介绍的内容,已经有完整的实现,可以参考这里。 在微服务、DevOps和云平台流行的当下,使用一个高效的持续集成工具也是一个非常重要的事情。虽然市面上目前已经存在了比较成熟的自动化构建工具,比如jekines,还有一些商业公司推出的自动化构建工具

    2023年04月09日
    浏览(44)
  • K8S+DevOps架构师实战课 | 汇总

    视频来源:B站《Dockerk8s教程天花板,绝对是B站讲的最好的,这一套学会k8s搞定Docker 全部核心知识都在这里》 一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持! 1.K8S+DevOps架构师实战课 | 认识docker_热爱编程的通信人的博客-CSDN博客 2.K8S+Dev

    2024年02月13日
    浏览(45)
  • K8s+Docker+KubeSphere+DevOps笔记

    提示:这里可以添加本文要记录的大概内容: 提示:以下是本篇文章正文内容,下面案例可供参考 云服务器ECS–实例–选区–创建–付费模式(按量付费)–服务器架构选择(包含服务器内存及数量)–镜像(操作系统)–选择实例基础存储–确认购买–选择网络(默认或

    2024年02月12日
    浏览(67)
  • Azure Devops上模版化K8s部署

    在2022年我们终于完成了主要业务系统上K8s的计划,在这里总结下我们上K8s时候的模版工程。   前提条件 本文不讨论K8s是什么,什么是容器化,为什么需要容器化,什么是微服务等这些基础内容,这些到处说的烂大街了。此类内容有兴趣可以看看微软系的介绍: 微服务体系架

    2024年02月02日
    浏览(42)
  • DevOps搭建(十六)-Jenkins+K8s部署详细步骤

    ​ 要想从Harbor仓库中拉取镜像,首先要往主机和从机的daemon.json文件中添加Harbor的地址信息 \\\"insecure-registries\\\":[\\\"192.168.88.125:80\\\"],别忘了80端口 添加完之后,重启下docker 要拉取镜像,需要Harbor登录进行拉取,到Kuboard控制台对应的命名空间找到 密文 菜单,点击 创建Secret 。 填写

    2024年01月16日
    浏览(46)
  • 【业务功能115】微服务-springcloud-springboot-Kubernetes-k8s集群-Kubesphere实现DevOps流水线-CI/CD-SonarQube- Jenkins

    dev 怎么开发 ops 怎么运维 参考项目链接:https://github.com/kubesphere/devops-maven-sample 持续集成是指软件个人的部分向软件整体部分交付,频繁进行集成以便更快地发现其中错误。 CI需要具备这些: 全面的自动化测试 这是实践持续集成持续部署的基础,同时,选择合适的自动化测

    2024年02月04日
    浏览(86)
  • DevOps基础设施配置之jenkins对接K8S

    我们在构建K8S基于Jenkins的devops流水线的时候,有一个很重要的步骤就是将Jenkins和K8S对接,这样才能充分运用Jenkins与K8S的特性【pod slave】完成流水线的运行,本文主要记录如何配置Jenkins与K8S集群的对接 提示:因为创建过程中需要使用token凭证,因此可以先参考 步骤1.2.4 先行

    2024年02月11日
    浏览(35)
  • 前端要了解的k8s、CI/CD、Devops概念

    简单的理解,k8s就是 docker容器集群的管理工具 。他将容器进行更多自动化的操作,自动创建、自动重启、自动扩容等,这个过程称为 容器编排 。 k8s 抽象了硬件资源 ,将N台物理机或云主机抽象成一个资源池,容器的调度交给K8S(例如CPU 不够用就调度到一台足够使用的机器

    2024年02月03日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包