在 Google Kubernetes Engine 上设置 Jenkins

本教程介绍如何在 GKE 上设置 Jenkins 以帮助编排您的软件交付流水线。

目标

  • 使用 GKE 创建 Kubernetes 集群。
  • 使用 Helm 安装 Jenkins。
  • 连接到 Jenkins。

费用

本教程使用 Google Cloud 的收费组件,包括:

  • Compute Engine
  • Google Kubernetes Engine
  • Cloud Build

您可使用价格计算器,根据您的预计使用情况来估算费用。Google Cloud 新用户可能有资格申请免费试用

准备工作

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册新帐号

  2. 在 Cloud Console 的项目选择器页面上,选择或创建 Cloud 项目。

    转到项目选择器页面

  3. 确保您的 Google Cloud 项目已启用结算功能。 了解如何确认您的项目已启用结算功能

  4. 启用 Compute Engine, GKE, and Cloud Build API。

    启用 API

准备环境

首先,准备部署环境。

  1. 激活 Cloud Shell。Cloud Shell 让您能够使用 Cloud Console 中的命令行,并且还包含进行 Google Cloud 开发所需的 Cloud SDK 及其他工具。Cloud Shell 可能需要几分钟才能完成预配。

    激活 Cloud Shell

    完成此过程后,您将看到以下输出:

        Welcome to Cloud Shell! For help, visit https://cloud.google.com/cloud-shell/help.
        
  2. 将默认 Compute Engine 地区设置为 us-east1-d

        gcloud config set compute/zone us-east1-d
        
  3. 克隆示例代码或下载 zip 文件

        git clone https://github.com/GoogleCloudPlatform/continuous-deployment-on-kubernetes.git
        

    Git 代码库包含要用于部署 Jenkins 的 Kubernetes 清单。如需了解这些清单及其设置,请参阅为 GKE 配置 Jenkins

  4. 导航到示例代码目录:

        cd continuous-deployment-on-kubernetes
        

创建 Kubernetes 集群

您可以使用 GKE 来创建和管理 Kubernetes 集群。

  1. 使用 GKE 预配 Kubernetes 集群。此步骤可能需要几分钟才能完成。

        gcloud container clusters create jenkins-cd \
          --machine-type n1-standard-2 --num-nodes 2 \
          --scopes "https://www.googleapis.com/auth/source.read_write,cloud-platform" \
          --cluster-version 1.12
        

    新增范围使 Jenkins 能够访问 Cloud Source Repositories 和 Container Registry。

  2. 确认您的集群正在运行。

        gcloud container clusters list
        

    STATUS 列中查找 RUNNING

        NAME        LOCATION    MASTER_VERSION  MASTER_IP    MACHINE_TYPE   NODE_VERSION  NUM_NODES  STATUS
        jenkins-cd  us-east1-d  1.12.8-gke.10     35.231.8.57  n1-standard-2  1.12.8-gke.3   2          RUNNING
        
  3. 确认您可以连接到集群。

        kubectl cluster-info
        

    如果能够成功连接到集群,则会显示 Kubernetes 组件网址。

        Kubernetes master is running at https://130.211.178.38
        GLBCDefaultBackend is running at https://130.211.178.38/api/v1/proxy/namespaces/kube-system/services/default-http-backend
        Heapster is running at https://130.211.178.38/api/v1/proxy/namespaces/kube-system/services/heapster
        KubeDNS is running at https://130.211.178.38/api/v1/proxy/namespaces/kube-system/services/kube-dns
        kubernetes-dashboard is running at https://130.211.178.38/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard
        

安装 Helm

使用 Helm 通过代码库部署 Jenkins。

  1. 下载并安装 Helm 二进制文件:

        wget https://storage.googleapis.com/kubernetes-helm/helm-v2.14.1-linux-amd64.tar.gz
        
  2. 将文件解压缩到本地系统:

        tar zxfv helm-v2.14.1-linux-amd64.tar.gz
        cp linux-amd64/helm .
        
  3. 将自己作为集群管理员添加到集群的 RBAC 中,以便能在集群中授予 Jenkins 权限:

        kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin \
                --user=$(gcloud config get-value account)
        
  4. 在集群中向 Helm 的服务器端 Tiller 授予 cluster-admin 角色:

        kubectl create serviceaccount tiller --namespace kube-system
        kubectl create clusterrolebinding tiller-admin-binding --clusterrole=cluster-admin \
            --serviceaccount=kube-system:tiller
        
  5. 初始化 Helm。这可确保 Tiller 正确安装到您的集群中。

        ./helm init --service-account=tiller
        ./helm repo update
        
  6. 通过运行以下命令验证 Helm 是否正确安装:

        ./helm version
        

    您将看到客户端和服务器版本均显示为 v2.14.1

        Client: &version.Version{SemVer:"v2.14.1", GitCommit:"5270352a09c7e8b6e8c9593002a73535276507c0", GitTreeState:"clean"}
        Server: &version.Version{SemVer:"v2.14.1", GitCommit:"5270352a09c7e8b6e8c9593002a73535276507c0", GitTreeState:"clean"}
        

安装 Jenkins

您将使用自定义值文件来配置 Jenkins 安装。如需详细了解配置,请查看 jenkins/values.yaml 文件。

  1. 使用 Helm CLI 通过您的配置集来部署图表:

        ./helm install -n cd stable/jenkins -f jenkins/values.yaml --version 1.2.2 --wait
        

    如需详细了解如何配置 Jenkins 安装,请参阅 Jenkins 图表的文档页面

  2. 该命令完成后,确保 Jenkins pod 变为 Running 状态且容器处于 READY 状态:

        kubectl get pods
        

    您将在 READY 列中看到 1/1,在 STATUS 列中看到 Running。Jenkins 可能需要几分钟才能完成初始化。

        NAME                          READY     STATUS    RESTARTS   AGE
        cd-jenkins-7c786475dd-vbhg4   1/1       Running   0          1m
        
  3. 通过 Cloud Shell 设置转发到 Jenkins 界面的端口:

        export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/component=jenkins-master" -l "app.kubernetes.io/instance=cd" -o jsonpath="{.items[0].metadata.name}")
        kubectl port-forward $POD_NAME 8080:8080 >> /dev/null &
        
  4. 检查是否已正确创建 Jenkins 服务。

        kubectl get svc
        

    输出示例:

        NAME               CLUSTER-IP     EXTERNAL-IP   PORT(S)     AGE
        cd-jenkins         10.35.249.67   <none>        8080/TCP    3h
        cd-jenkins-agent   10.35.248.1    <none>        50000/TCP   3h
        kubernetes         10.35.240.1    <none>        443/TCP     9h
        

Jenkins 安装项要使用 Kubernetes 插件来创建构建器代理。当 Jenkins 主实例需要运行构建项时,系统将根据需要自动启动这些代理。操作完成后,它们将自动终止且其资源将重新添加到集群的资源池。

连接到 Jenkins

  1. 检索 Jenkins Helm 图表自动创建的管理员密码:

        printf $(kubectl get secret cd-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo
        
  2. 如需打开 Jenkins 用户界面,请点击 Cloud Shell 中的网页预览,然后点击在端口 8080 上预览 (Preview on port 8080)。

    port8080

  3. 点击窗口右上角的登录。在用户字段中输入 admin,在 密码字段中输入上一步中的密码值。

  4. 点击登录按钮。

您现即可访问 Jenkins 以及由 GKE 托管的 Kubernetes 集群。如需更进一步使用此解决方案,您可以在持续交付流水线中使用这些组件。

清理

完成本教程后,请清理在 GCP 上创建的资源,避免日后再为这些资源付费。

删除项目

若要避免产生费用,最简单的方法是删除您为本教程创建的项目。

如需删除项目,请执行以下操作:

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”页面

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

删除磁盘

  1. 在 Cloud Console 中,转到“磁盘”页面。

    转到“磁盘”页面

  2. 点击 您的 jenkins-home 磁盘的复选框。
  3. 点击删除 以删除磁盘。

删除实例

如需删除 Compute Engine 实例,请执行以下操作:

  1. 在 Cloud Console 中,转到虚拟机实例页面。

    转到“虚拟机实例”页面

  2. 点击您要删除的实例。
  3. 点击删除 以删除实例。

后续步骤