Quantcast
Channel: 容器云计算,Devops,DBA,网络安全。
Viewing all articles
Browse latest Browse all 780

基于Kubernetes部署Jenkins动态构建环境

$
0
0


基于Kubernetes部署Jenkins动态构建环境


准备环境和工具

  • 一套K8s环境,这里我的演示环境是基于v1.18.16版本,关于如何部署可以参考我这篇文章


    https://blog.51cto.com/4073279/2671639

  • 一台NFS服务器,并配置好访问权限


    我的本地测试环境的NFS地址是: 192.168.137.22

    $ cat /etc/exports
    /ifs/kubernetes *(insecure,rw,sync,no_root_squash,fsid=0)
    $ chmod 777 -R /ifs/kubernetes/
  • (非必选)镜像仓库,可以是自建的也可以是公共的仓库,如果是生产用最好是内部自建一套,推荐使用Harbor搭建

  • Helm是采用v3.4.2 版本,放到master节点就可以了

  • (非必选,如果你不想通过Ingress访问可以不用配置)部署Ingress


    部署文件下载连接:


    链接:https://share.weiyun.com/IgtuI4xK 密码:tqm9uf

    $ helm version 
    version.BuildInfo{Version:"v3.4.2", GitCommit:"23dd3af5e19a02d4f4baa5b2f242645a1a3af629",
     GitTreeState:"clean", GoVersion:"go1.14.13"}
  • $ which helm 
    /usr/local/bin/helm
## 准备镜像
一共用到了两个镜像,一个是官方的Jenkins Master镜像`jenkins/jenkins:lts-alpine`,
一个是基于官方的Slave镜像`jenkins/jnlp-slave:latest`再重新打包的Slave镜像。

Slave镜像Dockerfile
```bash
FROM  jenkins/jnlp-slave:latest
USER root
#配置时区文件,容器启动之后能正确获取到东八区时区信息
RUN echo "/usr/share/zoneinfo/Asia/Shanghai" > /etc/timezone \
    && echo "$LANG UTF-8" > /etc/locale.gen \
    && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 
ENTRYPOINT ["jenkins-slave"]
 

配置Storageclass

这里我采用Helm来部署,一方面Helm部署非常方便,另一方面,我偷懒了。

1.1 准备NFS服务器并配置

$ yum -y install nfs-utils
$ mkdir -p /ifs/kubernetes/
$ chmod 777 /ifs/kubernetes/
$ cat /etc/exports
/ifs/kubernetes *(insecure,rw,sync,no_root_squash,fsid=0)
$ systemctl enable nfs-server 
$ systemctl start nfs-server
 

1.2 当前K8s集群的所有工作节点部署NFS套件

$ yum -y install nfs-utils
$ showmount -e 192.168.137.22 #检查是否NFS部署配置是否正常
$ mount -t nfs 192.168.137.22:/ifs/kubernetes/ /mnt #检查是否能正常挂载
$ cd /mnt && touch abc.txt #检查是否能正常读写
 

1.3 配置国内Chart仓库

  • 微软仓库(http://mirror.azure.cn/kubernetes/charts/)这个仓库强烈推荐,基本上官网有的chart这里都有。

  • 阿里云仓库(https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts )

  • 官方仓库(https://hub.kubeapps.com/charts/incubator)官方chart仓库,国内有点不好使。

添加存储库:

helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts 
helm repo update
 

查看配置的存储库:

helm repo list
helm search repo stable
 

一直在stable存储库中安装charts,你可以配置其他存储库。

删除存储库:

helm repo remove aliyun
 

1.4 当前K8s集群部署NFS动态供给类(Helm部署)

                  39m
 

这里要注意,不是所有仓库都有nfs-client-provisioner chart包,我这里用的是 https://charts.helm.sh/stable 配置的名称为stable仓库

$ helm repo list 
NAME            URL                                       
stable          https://charts.helm.sh/stable
 

1.5 测试是否生效

测试案例

$ cat test-pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  namespace: default
  name: test-pvc
spec:
  #使用NFS动态供给
  storageClassName: nfs-client
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
 

执行完之后,效果如下图所示,pvc能自动绑定pv就说明部署成功了



部署Jenkins

部署配置文件

---
#PVC申请持久化存储资源,因为Jenkins的插件、项目信息要持久化保存
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  namespace: jenkins
  name: jenkins-pvc
spec:
  #使用NFS动态供给
  storageClassName: nfs-client
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

---
#命名空间
apiVersion: v1
kind: Namespace
metadata:
  name: jenkins
#配置访问Jenkins所在集群的权限
---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: jenkins
  name: jenkins-admin
  namespace: jenkins

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: jenkins-admin
  namespace: jenkins
  labels:
    k8s-app: jenkins
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: jenkins-admin
  namespace: jenkins
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
  namespace: jenkins
  labels:
    app: jenkins
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      volumes:
        - name: jenkins-pv-storage
          persistentVolumeClaim:
            claimName: jenkins-pvc
      serviceAccount: "jenkins-admin"
      containers:
      - name: jenkins
        image: jenkins/jenkins:lts-alpine
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - name: jenkins-pv-storage
          mountPath: /var/jenkins_home
        ports:
        - containerPort: 8080 
          name: web
        - containerPort: 50000
          name: agent
---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: jenkins
  name: jenkins-svc
  namespace: jenkins
spec:
  type: ClusterIP
  ports:
    - port: 8080
      name: web
      protocol: TCP
      targetPort: 8080
    - port: 50000
      name: agent
      protocol: TCP
      targetPort: 50000
  selector:
    app: jenkins
---

---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: jenkins-ingress
  namespace: jenkins 
  labels:
    app: jenkins
spec:
  rules:
    - host: "jenkins.lxq.com" #这个域名记得要映射成你所在woker节点的IP,如果不用Ingress也可以,自行再配置下Service Type为了NodePort就可以了,并去掉这块配置
      http:
        paths:
          - path: /
            backend:
              serviceName: jenkins-svc
              servicePort: 8080
 

执行应用部署kubectl apply jenkins-deploy.yaml

当jenkins pods 处在running状态之后,就可以访问了


访问地址: http://jenkins.lxq.com/, 初步访问需要安装相关插件,按照默认的安装就可以了,插件安装完成所需时间受限于你所在的网络环境。

配置Jenkins访问Kubernetes

1 安装Kubernetes插件

登录 Jenkins Master 页面,点击 “系统管理” —> “管理插件” —> “可选插件” —> “Kubernetes plugin” 勾选安装



如果下载慢的话,可以将Jenkins的插件源改成国内地址,具体如何修改,请Google相关文档。

2 配置访问Kubernetes集群

登录 Jenkins Master 页面,点击 “系统管理” —> “系统配置” —> “Cloud”



新增一个K8s集群配置



连接测试成功之后,会提示如下信息



最后保存退出就可以了!

测试构建项目

新增一个Pipeline构建测试项目,注意要选流水线项目



在流水线部分新增任务定义



//定义参数

def label = "mypod-${UUID.randomUUID().toString()}"

//代理定义
podTemplate(label: label, cloud: 'kubernetes',
containers: [
        containerTemplate(name: 'jnlp',
        ttyEnabled: true,
        image: "10.2.7.40/base/jenkins-slave:latest", alwaysPullImage:true),
    ]) {
    node(label) {

        container('jnlp') {
            stage('Jenkins 动态构建') {
               sh 'echo hello world!'
            }
        }  
    }
}
 

说明:


cloud: 'kubernetes' -- 连接的集群名称


image: "10.2.7.40/base/jenkins-slave:latest" -- Jenkins Slave镜像名称


container('jnlp') -- 生成的agent容器


如图,动态构建可以正常工作



关于Pipeline脚本更详细的解读,我会在后续再补充说明。





Viewing all articles
Browse latest Browse all 780

Trending Articles


Vimeo 10.7.1 by Vimeo.com, Inc.


UPDATE SC IDOL: TWO BECOME ONE


KASAMBAHAY BILL IN THE HOUSE


Girasoles para colorear


Presence Quotes – Positive Quotes


EASY COME, EASY GO


Love with Heart Breaking Quotes


Re:Mutton Pies (lleechef)


Ka longiing longsem kaba skhem bad kaba khlain ka pynlong kein ia ka...


Vimeo 10.7.0 by Vimeo.com, Inc.


FORECLOSURE OF REAL ESTATE MORTGAGE


FORTUITOUS EVENT


Pokemon para colorear


Sapos para colorear


Smile Quotes


Letting Go Quotes


Love Song lyrics that marks your Heart


RE: Mutton Pies (frankie241)


Hato lada ym dei namar ka jingpyrshah jong U JJM Nichols Roy (Bah Joy) ngin...


Long Distance Relationship Tagalog Love Quotes