准备环境和工具

  • 一套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```bashFROM  jenkins/jnlp-slave:latestUSER 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/chartshelm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts helm repo update

查看配置的存储库:

helm repo listhelm search repo stable

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

删除存储库:

helm repo remove aliyun

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

$ helm install nfs-prov  --set nfs.server=192.168.137.22 --set nfs.path=/ifs/kubernetes  stable/nfs-client-provisioner #stable是仓库名称$ kubectl get scNAME         PROVISIONER                                     RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGEnfs-client   cluster.local/nfs-prov-nfs-client-provisioner   Delete          Immediate           true                   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: v1kind: PersistentVolumeClaimmetadata:  namespace: default  name: test-pvcspec:  #使用NFS动态供给  storageClassName: nfs-client  accessModes:    - ReadWriteOnce  resources:    requests:      storage: 10Gi

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

部署Jenkins

部署配置文件

---#PVC申请持久化存储资源,因为Jenkins的插件、项目信息要持久化保存apiVersion: v1kind: PersistentVolumeClaimmetadata:  namespace: jenkins  name: jenkins-pvcspec:  #使用NFS动态供给  storageClassName: nfs-client  accessModes:    - ReadWriteOnce  resources:    requests:      storage: 10Gi---#命名空间apiVersion: v1kind: Namespacemetadata:  name: jenkins#配置访问Jenkins所在集群的权限---apiVersion: v1kind: ServiceAccountmetadata:  labels:    k8s-app: jenkins  name: jenkins-admin  namespace: jenkins---apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRoleBindingmetadata:  name: jenkins-admin  namespace: jenkins  labels:    k8s-app: jenkinsroleRef:  apiGroup: rbac.authorization.k8s.io  kind: ClusterRole  name: cluster-adminsubjects:- kind: ServiceAccount  name: jenkins-admin  namespace: jenkins---apiVersion: apps/v1kind: Deploymentmetadata:  name: jenkins  namespace: jenkins  labels:    app: jenkinsspec:  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: ServiceapiVersion: v1metadata:  labels:    app: jenkins  name: jenkins-svc  namespace: jenkinsspec:  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/v1beta1kind: Ingressmetadata:  name: jenkins-ingress  namespace: jenkins   labels:    app: jenkinsspec:  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脚本更详细的解读,我会在后续再补充说明。

©著作权归作者所有:来自51CTO博客作者小强列兵的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. K8S 部署 prometheus和granfana
  2. Vivado一项全新项目功能——可配置的报告
  3. Hystrix 实战经验分享
  4. 3.18 部署具有嵌入式Platform Services Controller的vCenter
  5. 在Digilent Nexys Video板卡上实现HDMI I/O视频处理系统之软件配
  6. 点到点IPSec ***配置
  7. Vivado软件使用之"下载配置"流程
  8. Kibana 之 安装部署
  9. 5、小型企业无线网部署(案例1)从客户需求来分析、规划、部署

随机推荐

  1. c语言中strstr函数的用法是什么?
  2. c语言六种基本语句是什么
  3. c语言strcmp函数用法是什么?
  4. 学习c语言用什么软件
  5. c语言用什么函数来比较字符串大小?
  6. system()函数是什么
  7. c语言六种基本语句是哪些?
  8. c语言函数由哪两部分组成
  9. c语言在gcc中怎么运行程序?
  10. c语言的源程序不必通过编译就可以执行对