怎样在 Vultr Kubernetes Engine 上安装 Jenkins

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

  1. 首先,创建 Jenkins 命名空间:

    # kubectl create namespace jenkins-namespace
    

    输出。

    namespace/jenkins-namespace created
    
  2. 接下来,创建一个 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
    
  3. 将上述配置应用于 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
    
  4. 创建卷配置文件。

    # 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 正确定义工作节点名称,以便在特定节点中进行调度。

  5. 使用以下命令在 Kubernetes 集群上创建持久卷 kubectl 命令。

    # kubectl create -f volume.yaml
    

    输出。

    storageclass.storage.k8s.io/jenkins-storage created
    
    persistentvolume/jenkins-pv-volume created
    
    persistentvolumeclaim/jenkins-pv-claim created
    
  6. 创建一个 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 部署并打开端口 808050000 接受来自 Jenkins 工作人员的连接。

    • 将持久卷挂载到 /var/jenkins_home 存放 Jenkins 数据的目录。

    • 定义 liveness probes 检查容器的健康状态。

    • 定义 readiness probes 知道容器何时可以开始接受流量。

  7. 将上述部署应用到 Kubernetes 集群。

    # kubectl apply -f deployment.yaml
    

    输出。

    deployment.apps/jenkins created
    

    等待一段时间以拉取 Jenkins 镜像并让 Jenkins pod 运行。

  8. 验证 Jenkins pod 的状态。

    # kubectl get deployments -n jenkins-namespace
    

    输出。

    NAME      READY   UP-TO-DATE   AVAILABLE   AGE
    
    jenkins   1/1     1            1           94s
    
  9. 获取有关 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 部署。

  1. 首先,创建一个 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
    
  2. 接下来,将服务配置部署到 Jenkins 部署中。

    # kubectl apply -f service.yaml
    

    输出。

    service/jenkins-service created
    
  3. 验证 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 界面。

  1. 首先,使用 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
    
  2. 接下来,打开您的 Web 浏览器并使用 URL 访问 Jenkins https://node-external-ip:32000. 系统将要求您提供初始管理员密码。

  3. 使用以下命令获取 Jenkins pod 详细信息。

    # kubectl get pods --namespace=jenkins-namespace
    

    输出。

    NAME                      READY   STATUS    RESTARTS   AGE
    
    jenkins-7b95fb694-5xqnp   1/1     Running   0          20m
    
  4. 检查 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
    
    
    
    *************************************************************
    
  5. 从上面的输出中复制密码并在 Jenkins 初始管理员密码屏幕上输入它以继续 Jenkins 安装。

结论

本指南向您展示怎样在 Vultr Kubernetes Engine 上安装和配置 Jenkins。 Jenkins 是 CI/CD 管道的核心组件。 它可以帮助您执行非常复杂的操作并提高生产率。 有关更多信息,请查看官方 Jenkins 文档.

文章标题 名称(可选) 电子邮件(可选) 描述

发送建议

注:本教程在Vultr VPS上测试通过,如需部署请前往Vultr.com