Jenkins 是用于项目开发、部署和自动化的开源持续集成 (CI) 和持续交付 (CD) 服务器。 软件开发人员使用它来构建、测试和部署他们的软件。 它是用 Java 编写的,提供了数百个插件来自动测试和更改更大的代码库。
本指南向您展示怎样在 Vultr Kubernetes Engine 上设置 Jenkins,它比独立的基于服务器的部署有很多好处。 基于 Kubernetes 的部署是一种非常经济高效的解决方案,还可以减少开发所需的时间。
先决条件
部署 Vultr Ubuntu 20.04 实例以用作管理工作站。
在 Vultr 部署一个 Kubernetes 集群,至少有三个或更多节点,2GB RAM 和 2 个 CPU。
安装 kubectl 在 Vultr Ubuntu 管理工作站上。
您将从管理工作站执行本指南中的其余步骤。
验证 Kubernetes 集群
在开始之前,使用以下命令验证 Vultr Kubernetes 集群:
kubectl cluster-info
您将在以下输出中看到集群信息:
Kubernetes control plane is running at https://e4737bcd-3971-4624-b896-0181aae56bae.vultr-k8s.com:6443
CoreDNS is running at https://e4737bcd-3971-4624-b896-0181aae56bae.vultr-k8s.com:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
要检查所有集群节点的活动状态,请运行以下命令:
kubectl get nodes
您应该看到所有节点都处于就绪状态:
NAME STATUS ROLES AGE VERSION
jenkins-cluster-136e69da18fb Ready <none> 3m21s v1.25.4
jenkins-cluster-97b1dd155b22 Ready <none> 3m21s v1.25.4
jenkins-cluster-a329dcb28ac7 Ready <none> 3m21s v1.25.4
在 Kubernetes 上安装 Jenkins
首先,创建 Jenkins 命名空间:
# kubectl create namespace jenkins-namespace
输出。
namespace/jenkins-namespace created
接下来,创建一个
serviceAccount.yaml
文件。# nano serviceAccount.yaml
添加以下配置以创建名为的服务帐户
jenkins-account
并绑定clusterRole
到服务帐户。--- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: jenkins-account rules: - apiGroups: [""] resources: ["*"] verbs: ["*"] --- apiVersion: v1 kind: ServiceAccount metadata: name: jenkins-account namespace: jenkins-namespace --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: jenkins-account roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: jenkins-account subjects: - kind: ServiceAccount name: jenkins-account namespace: jenkins-namespace
将上述配置应用于 Kubernetes 集群。
# kubectl apply -f serviceAccount.yaml
输出。
clusterrole.rbac.authorization.k8s.io/jenkins-account created serviceaccount/jenkins-account created clusterrolebinding.rbac.authorization.k8s.io/jenkins-account created
创建卷配置文件。
# nano volume.yaml
为持久卷添加以下配置。
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: jenkins-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer --- apiVersion: v1 kind: PersistentVolume metadata: name: jenkins-pv-volume labels: type: local spec: storageClassName: jenkins-storage claimRef: name: jenkins-pv-claim namespace: jenkins-namespace capacity: storage: 10Gi accessModes: - ReadWriteOnce local: path: /opt nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - jenkins-cluster-136e69da18fb --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: jenkins-pv-claim namespace: jenkins-namespace spec: storageClassName: jenkins-storage accessModes: - ReadWriteOnce resources: requests: storage: 3Gi
笔记: 更换
jenkins-cluster-136e69da18fb
与您的任何集群节点。如果您需要知道工作节点的主机名,请运行以下命令。
# kubectl get nodes
上面的配置将创建一个
PersistentVolume
集群节点内的卷/opt
目录。 您还需要为 Jenkins pod 正确定义工作节点名称,以便在特定节点中进行调度。使用以下命令在 Kubernetes 集群上创建持久卷
kubectl
命令。# kubectl create -f volume.yaml
输出。
storageclass.storage.k8s.io/jenkins-storage created persistentvolume/jenkins-pv-volume created persistentvolumeclaim/jenkins-pv-claim created
创建一个
deployment.yaml
文件。# nano deployment.yaml
添加以下清单配置。
apiVersion: apps/v1 kind: Deployment metadata: name: jenkins namespace: jenkins-namespace spec: replicas: 1 selector: matchLabels: app: jenkins-server template: metadata: labels: app: jenkins-server spec: securityContext: fsGroup: 1000 runAsUser: 1000 serviceAccountName: jenkins-account containers: - name: jenkins image: jenkins/jenkins:lts resources: limits: memory: "2Gi" cpu: "1000m" requests: memory: "500Mi" cpu: "500m" ports: - name: httpport containerPort: 8080 - name: jnlpport containerPort: 50000 livenessProbe: httpGet: path: "/login" port: 8080 initialDelaySeconds: 90 periodSeconds: 10 timeoutSeconds: 5 failureThreshold: 5 readinessProbe: httpGet: path: "/login" port: 8080 initialDelaySeconds: 60 periodSeconds: 10 timeoutSeconds: 5 failureThreshold: 3 volumeMounts: - name: jenkins-data mountPath: /var/jenkins_home volumes: - name: jenkins-data persistentVolumeClaim: claimName: jenkins-pv-claim
上面的配置文件将:
使用最新的 Jenkins 映像创建 Jenkins 部署并打开端口
8080
和50000
接受来自 Jenkins 工作人员的连接。将持久卷挂载到
/var/jenkins_home
存放 Jenkins 数据的目录。定义
liveness probes
检查容器的健康状态。定义
readiness probes
知道容器何时可以开始接受流量。
将上述部署应用到 Kubernetes 集群。
# kubectl apply -f deployment.yaml
输出。
deployment.apps/jenkins created
等待一段时间以拉取 Jenkins 镜像并让 Jenkins pod 运行。
验证 Jenkins pod 的状态。
# kubectl get deployments -n jenkins-namespace
输出。
NAME READY UP-TO-DATE AVAILABLE AGE jenkins 1/1 1 1 94s
获取有关 Jenkins 部署的详细信息。
# kubectl describe deployments --namespace=jenkins-namespace
输出。
Name: jenkins Namespace: jenkins-namespace CreationTimestamp: Tue, 22 Nov 2022 21:03:42 +0530 Labels: <none> Annotations: deployment.kubernetes.io/revision: 1 Selector: app=jenkins-server Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=jenkins-server Service Account: jenkins-account Containers: jenkins: Image: jenkins/jenkins:lts Ports: 8080/TCP, 50000/TCP Host Ports: 0/TCP, 0/TCP Limits: cpu: 1 memory: 2Gi Requests: cpu: 500m memory: 500Mi Liveness: http-get https://:8080/login delay=90s timeout=5s period=10s #success=1 #failure=5 Readiness: http-get https://:8080/login delay=60s timeout=5s period=10s #success=1 #failure=3 Environment: <none> Mounts: /var/jenkins_home from jenkins-data (rw) Volumes: jenkins-data: Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) ClaimName: jenkins-pv-claim ReadOnly: false Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets: <none> NewReplicaSet: jenkins-7b95fb694 (1/1 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 19m deployment-controller Scaled up replica set jenkins-7b95fb694 to 1
创建用于外部访问的 Kubernetes 服务
至此,Jenkins 已成功部署并运行在 Kubernetes 集群上。 但是,您无法从远程计算机访问 Jenkins。 在这种情况下,您需要创建一个服务并将其绑定到 Jenkins 部署。
首先,创建一个
service.yaml
使用以下命令创建文件:# nano service.yaml
添加如下配置暴露端口
8080
Jenkins pod 到端口32000
.apiVersion: v1 kind: Service metadata: name: jenkins-service namespace: jenkins-namespace annotations: prometheus.io/scrape: 'true' prometheus.io/path: / prometheus.io/port: '8080' spec: selector: app: jenkins-server type: NodePort ports: - port: 8080 targetPort: 8080 nodePort: 32000
接下来,将服务配置部署到 Jenkins 部署中。
# kubectl apply -f service.yaml
输出。
service/jenkins-service created
验证 Jenkins 服务的状态。
# kubectl get services --namespace jenkins-namespace
输出。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE jenkins-service NodePort 10.103.86.99 <none> 8080:32000/TCP 6s
访问 Jenkins Web 界面
至此,Jenkins 安装完毕,监听 32000 端口对外访问。 现在,您需要检索集群节点的 IP 地址以访问 Jenkins Web 界面。
首先,使用
kubectl
命令。# kubectl get nodes -o wide
您将在以下输出中获得所有节点的外部 IP。
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL- VERSION CONTAINER-RUNTIME jenkins-cluster-7e8eba45f3a6 Ready <none> 23m v1.25.4 10.46.96.6 65.20.79.223 Debian GNU/Linux 10 (buster) 4.19.0-22-amd64 containerd://1.6.9 jenkins-cluster-a45a12e27a63 Ready <none> 23m v1.25.4 10.46.96.5 65.20.79.2 Debian GNU/Linux 10 (buster) 4.19.0-22-amd64 containerd://1.6.9 jenkins-cluster-cfacc64361f5 Ready <none> 23m v1.25.4 10.46.96.4 65.20.74.173 Debian GNU/Linux 10 (buster) 4.19.0-22-amd64 containerd://1.6.9
接下来,打开您的 Web 浏览器并使用 URL 访问 Jenkins
https://node-external-ip:32000
. 系统将要求您提供初始管理员密码。使用以下命令获取 Jenkins pod 详细信息。
# kubectl get pods --namespace=jenkins-namespace
输出。
NAME READY STATUS RESTARTS AGE jenkins-7b95fb694-5xqnp 1/1 Running 0 20m
检查 Jenkins pod 日志以检索 Jenkins 管理员密码。
# kubectl logs jenkins-7b95fb694-5xqnp --namespace=jenkins-namespace
输出。
************************************************************* Jenkins initial setup is required. An admin user has been created and a password generated. Please use the following password to proceed to installation: a1f057cba5f6440f863b6e5a57d880fa This may also be found at: /var/jenkins_home/secrets/initialAdminPassword *************************************************************
从上面的输出中复制密码并在 Jenkins 初始管理员密码屏幕上输入它以继续 Jenkins 安装。
结论
本指南向您展示怎样在 Vultr Kubernetes Engine 上安装和配置 Jenkins。 Jenkins 是 CI/CD 管道的核心组件。 它可以帮助您执行非常复杂的操作并提高生产率。 有关更多信息,请查看官方 Jenkins 文档.
文章标题 名称(可选) 电子邮件(可选) 描述
发送建议
注:本教程在Vultr VPS上测试通过,如需部署请前往Vultr.com