Jenkins Pipeline 流水线部署 Kubernetes 应用
使用 kubeadm 来创建一个单 master 节点的 kubernets 集群
kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.20.11
查看节点状态和 pod 都已经正常
kubectl get pod -ANAMESPACE NAME READY STATUS RESTARTS AGEkube-system coredns-f9fd979d6-9t6qp 1/1 Running 0 89skube-system coredns-f9fd979d6-hntm8 1/1 Running 0 89skube-system etcd-jenkins 1/1 Running 0 106skube-system kube-apiserver-jenkins 1/1 Running 0 106skube-system kube-controller-manager-jenkins 1/1 Running 0 106skube-system kube-proxy-8pzkz 1/1 Running 0 89skube-system kube-scheduler-jenkins 1/1 Running 0 89s
去除 master 节点上的污点,允许其他的 pod 调度在 master 节点上,不然后面 Jenkins 所创建的 pod 将无法调度在该节点上。
kubectl taint nodes $(hostname) node-role.kubernetes.io/master:NoSchedule-
Jenkins master
建议使用docker-compose来部署。运行在kubernetes集群集群中也没什么毛病,但是将Jenkins master独立于kubernetes集群部署比较方便.
docker-compose.yaml:version: '3.6'services: jenkins: image: jenkins/jenkins:2.263.4-lts-slim container_name: jenkins restart: always volumes: - ./jenkins_home:/var/jenkins_home network_mode: host user: root environment: - JAVA_OPTS=-Duser.timezone=Asia/Shanghai
使用docker-compose up来启动,成功启动后会提示,日志输出的密钥就是admin用户的默认密码,使用它来第一次登录 Jenkins。
登录上去之后,建议选择 “选择插件” 来安装,尽可能少地安装插件,按需安装即可。在Jenkins的插件管理那里安装上kubernetes插件。
接下来开始配置Jenkin与kubernetes
配置 kubernets 的地方是在 系统管理 > 节点管理 > Configure Clouds。点击 Add a new cloud,来添加一个 kubernetes 集群。
在 Jenkins 的凭据那里添加上 kubeconfig 文件,凭据的类型选择为 Secret file,然后将上面使用 kubeadm 部署生成的 kubeconfig 上传到这里。
点击连接测试,如果提示 Connected to Kubernetes v1.19.8 就说明已经成功连接上了 kubernetes 集群。
Jenkinsfile
流水线 Jenkinsfile,下面是一个简单的任务,用于构建 webp-server-go 项目的 docker 镜像。
// Kubernetes pod template to run.def JOB_NAME = "${env.JOB_NAME}"def BUILD_NUMBER = "${env.BUILD_NUMBER}"def POD_NAME = "jenkins-${JOB_NAME}-${BUILD_NUMBER}"podTemplate(# 这里定义 pod 模版){ node(POD_NAME) { container(JOB_NAME) { stage("Build image") { sh """#!/bin/bash git clone https://github.com/webp-sh/webp_server_go build cd /build docker build -t webps:0.3.2-rc.1 . """ } } }}
pod 模版如下,将模板的内容复制粘贴到上面的 Jenkinsfile 中。在容器中构建镜像,使用 dind 的方案:将 pod 所在宿主机的 docker sock 文件挂载到 pod 的容器内,pod 容器内只要安装好 docker-cli 工具就可以像宿主机那样直接使用 docker 了。
podTemplate( cloud: "kubernetes", namespace: "default", name: POD_NAME, label: POD_NAME, yaml: """apiVersion: v1kind: Podspec: containers: - name: ${JOB_NAME} image: "debian:buster-docker" imagePullPolicy: IfNotPresent tty: true volumeMounts: - name: dockersock mountPath: var/run/docker.sock - name: jnlp args: ["\$(JENKINS_SECRET)", "\$(JENKINS_NAME)"] image: "jenkins/inbound-agent:4.3-4-alpine" imagePullPolicy: IfNotPresent volumes: - name: dockersock hostPath: path: /var/run/docker.sock""",)
构建 debian:buster-docker 镜像,使用它来在 pod 的容器内构建 docker 镜像,使用的 Dockerfile 如下:
FROM debian:busterRUN apt update \ && apt install -y --no-install-recommends \ vim \ curl \ git \ make \ ca-certificates \ gnupg \ && rm -rf /var/lib/apt/lists/*RUN curl -fsSL "https://download.docker.com/linux/debian/gpg" | apt-key add -qq - >/dev/null \ && echo "deb [arch=amd64] https://download.docker.com/linux/debian buster stable" > /etc/apt/sources.list.d/docker.list \ && apt update -qq \ && apt-get install -y -qq --no-install-recommends docker-ce-cli \ && rm -rf /var/lib/apt/lists/*
定义好 jenkinsfile 文件并且构建好 pod 模板中的镜像后,接下来开始使用它来创建流水线任务。
流水线
在 Jenkins 上新建一个任务,选择任务的类型为 流水线
将定义好的 Jenkinsfile 内容复制粘贴到流水线定义 Pipeline script 中并点击保存。在新建好的 Job 页面点击 立即构建 来运行流水线任务。
在 kubernetes 集群的机器上使用 kubectl 命令查看 pod 是否正常 Running
kubectl get podNAME READY STATUS RESTARTS AGEjenkins-webps-9-bs78x-5x204 2/2 Running 0 66s
更多精彩干货分享
点击下方名片关注
IT那活儿