• 如何在 Kubernetes 集群上设置 Jenkins – 初学者指南


     

    在 Kubernetes 集群上托管 Jenkins 有利于基于 Kubernetes 的部署和基于动态容器的可扩展 Jenkins 代理。

    在本指南中,我解释了在Kubernetes 集群上设置 Jenkins 的分步过程。

    在 Kubernetes 集群上设置 Jenkins

    为了在 Kubernetes 上设置Jenkins集群,我们将执行以下操作。

    1. 创建命名空间
    2. 创建具有 Kubernetes 管理员权限的服务帐户。
    3. 在 Pod 重启时为持久 Jenkins 数据创建本地持久卷。
    4. 创建部署 YAML 并部署它。
    5. 创建一个服务 YAML 并部署它。
    6. 在节点端口上访问 Jenkins 应用程序。

    注意:本教程不使用本地持久卷,因为这是一个通用指南。要为 Jenkins 数据使用持久卷,您需要创建相关云或本地数据中心的卷并对其进行配置。

    Jenkins Kubernetes 清单文件

    本博客中使用的所有 Jenkins Kubernetes 清单文件都托管在 Github 上。如果您在从博客复制清单时遇到问题,请克隆存储库。

    git clone https://github.com/scriptcamp/kubernetes-jenkins

    使用 Github 文件作为参考,并按照下一节中的步骤进行操作

    Kubernetes Jenkins 部署

    这是我们将要做什么的高级视图。

     

    让我们开始在 Kubernetes 上部署 Jenkins。

    第 1 步:为 Jenkins 创建一个命名空间。最好将所有devops 工具分类为与其他应用程序分开的命名空间。

    kubectl create namespace devops-tools

    第 2 步:创建一个serviceAccount.yaml文件并复制以下管理员服务帐户清单。

    1. ---
    2. apiVersion: rbac.authorization.k8s.io/v1
    3. kind: ClusterRole
    4. metadata:
    5. name: jenkins-admin
    6. rules:
    7. - apiGroups: [""]
    8. resources: ["*"]
    9. verbs: ["*"]
    10. ---
    11. apiVersion: v1
    12. kind: ServiceAccount
    13. metadata:
    14. name: jenkins-admin
    15. namespace: devops-tools
    16. ---
    17. apiVersion: rbac.authorization.k8s.io/v1
    18. kind: ClusterRoleBinding
    19. metadata:
    20. name: jenkins-admin
    21. roleRef:
    22. apiGroup: rbac.authorization.k8s.io
    23. kind: ClusterRole
    24. name: jenkins-admin
    25. subjects:
    26. - kind: ServiceAccount
    27. name: jenkins-admin
    28. namespace: devops-tools

    serviceAccount.yaml创建一个jenkins-adminclusterRole、jenkins-admin ServiceAccount并将其绑定clusterRole到服务帐户。

    集群角色拥有管理集群组件的jenkins-admin所有权限。您还可以通过指定单个资源操作来限制访问。

    现在使用 kubectl 创建服务帐户。

    kubectl apply -f serviceAccount.yaml

    第 3 步:创建volume.yaml 并复制以下持久卷清单。

    1. kind: StorageClass
    2. apiVersion: storage.k8s.io/v1
    3. metadata:
    4. name: local-storage
    5. provisioner: kubernetes.io/no-provisioner
    6. volumeBindingMode: WaitForFirstConsumer
    7. ---
    8. apiVersion: v1
    9. kind: PersistentVolume
    10. metadata:
    11. name: jenkins-pv-volume
    12. labels:
    13. type: local
    14. spec:
    15. storageClassName: local-storage
    16. claimRef:
    17. name: jenkins-pv-claim
    18. namespace: devops-tools
    19. capacity:
    20. storage: 10Gi
    21. accessModes:
    22. - ReadWriteOnce
    23. local:
    24. path: /mnt
    25. nodeAffinity:
    26. required:
    27. nodeSelectorTerms:
    28. - matchExpressions:
    29. - key: kubernetes.io/hostname
    30. operator: In
    31. values:
    32. - worker-node01
    33. ---
    34. apiVersion: v1
    35. kind: PersistentVolumeClaim
    36. metadata:
    37. name: jenkins-pv-claim
    38. namespace: devops-tools
    39. spec:
    40. storageClassName: local-storage
    41. accessModes:
    42. - ReadWriteOnce
    43. resources:
    44. requests:
    45. storage: 3Gi

    重要提示:替换worker-node01为任何一个集群工作程序节点主机名。

    您可以使用 kubectl 获取工作程序节点主机名。

    kubectl get nodes

     

    对于卷,我使用local存储类来进行演示。意思是,它在locationPersistentVolume下的特定节点中创建一个卷。/mnt

    由于local存储类需要节点选择器,因此您需要正确指定工作节点名称,以便 Jenkins pod 在特定节点中进行调度。

    如果 pod 被删除或重新启动,数据将保留在节点卷中。但是,如果节点被删除,您将丢失所有数据。

    理想情况下,您应该使用具有云提供商或集群管理员提供的可用存储类的持久卷来持久化节点故障数据。

    让我们使用 kubectl 创建卷

    kubectl create -f volume.yaml

    第 2 步:创建一个名为的部署文件deployment.yaml并复制以下部署清单。

    在这里,我们使用来自 Docker 中心的最新Jenkins LT docker 镜像。

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. name: jenkins
    5. namespace: devops-tools
    6. spec:
    7. replicas: 1
    8. selector:
    9. matchLabels:
    10. app: jenkins-server
    11. template:
    12. metadata:
    13. labels:
    14. app: jenkins-server
    15. spec:
    16. securityContext:
    17. fsGroup: 1000
    18. runAsUser: 1000
    19. serviceAccountName: jenkins-admin
    20. containers:
    21. - name: jenkins
    22. image: jenkins/jenkins:lts
    23. resources:
    24. limits:
    25. memory: "2Gi"
    26. cpu: "1000m"
    27. requests:
    28. memory: "500Mi"
    29. cpu: "500m"
    30. ports:
    31. - name: httpport
    32. containerPort: 8080
    33. - name: jnlpport
    34. containerPort: 50000
    35. livenessProbe:
    36. httpGet:
    37. path: "/login"
    38. port: 8080
    39. initialDelaySeconds: 90
    40. periodSeconds: 10
    41. timeoutSeconds: 5
    42. failureThreshold: 5
    43. readinessProbe:
    44. httpGet:
    45. path: "/login"
    46. port: 8080
    47. initialDelaySeconds: 60
    48. periodSeconds: 10
    49. timeoutSeconds: 5
    50. failureThreshold: 3
    51. volumeMounts:
    52. - name: jenkins-data
    53. mountPath: /var/jenkins_home
    54. volumes:
    55. - name: jenkins-data
    56. persistentVolumeClaim:
    57. claimName: jenkins-pv-claim

    在这个 Jenkins Kubernetes 部署中,我们使用了以下内容。

    1. securityContext让 Jenkins pod 能够写入本地持久卷。
    2. 活力和准备度探测。
    3. 基于保存 Jenkins 数据路径的本地存储类的本地持久卷/var/jenkins_home

    注意:部署文件使用本地存储类持久卷来存储 Jenkins 数据。

    如果你不想要本地存储持久化卷,可以将部署中的卷定义替换为主机目录,如下所示。

    1. volumes:
    2. - name: jenkins-data
    3. emptyDir: {}

    使用 kubectl 创建部署。

    kubectl apply -f deployment.yaml

    检查部署状态。

    kubectl get deployments -n devops-tools

    现在,您可以使用以下命令获取部署详细信息。

    kubectl  describe deployments --namespace=devops-tools

    此外,您可以从 kubernetes 仪表板获取详细信息,如下所示。

     

    使用 Kubernetes 服务访问 Jenkins

    我们已经创建了一个部署。但是,外界无法访问它。为了从外部访问 Jenkins 部署,我们应该创建一个服务并将其映射到部署。

    第 1 步:创建service.yaml并复制以下服务清单。

    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. name: jenkins-service
    5. namespace: devops-tools
    6. annotations:
    7. prometheus.io/scrape: 'true'
    8. prometheus.io/path: /
    9. prometheus.io/port: '8080'
    10. spec:
    11. selector:
    12. app: jenkins-server
    13. type: NodePort
    14. ports:
    15. - port: 8080
    16. targetPort: 8080
    17. nodePort: 32000

    注意:在这里,我们使用的类型NodePort将在端口 32000 上的所有 kubernetes 节点 IP 上公开 Jenkins。如果您有入口设置,则可以创建入口规则来访问 Jenkins。此外,如果您在 AWS、Google 或 Azure 云上运行集群,您可以将 Jenkins 服务公开为负载均衡器。

    使用 kubectl 创建 Jenkins 服务。

    kubectl apply -f service.yaml

    现在,如果您浏览到 port 上的任何一个节点 IP 32000,您将能够访问 Jenkins 仪表板。

    http://:32000

    当您第一次访问仪表板时,Jenkins 会询问初始管理员密码。

    您可以从 Kubernetes 仪表板或 CLI 的 pod 日志中获取它。您可以使用以下 CLI 命令获取 pod 详细信息。

    kubectl get pods --namespace=devops-tools

    使用 pod 名称,您可以获得如下所示的日志。将 pod 名称替换为您的 pod 名称。

    kubectl logs jenkins-deployment-2539456353-j00w5 --namespace=jenkins

    密码可以在日志末尾找到,如下所示。

    或者,您可以运行 exec 命令直接从位置获取密码,如下所示。

    kubectl exec -it jenkins-559d8cd85c-cfcgk cat  /var/jenkins_home/secrets/initialAdminPassword -n devops-tools

    输入密码后,您可以继续安装建议的插件并创建管理员用户。所有这些步骤都可以从 Jenkins 仪表板中一目了然。

    结论

    当您在 Kubernetes 上托管 Jenkins 用于生产工作负载时,您需要考虑设置一个高可用的持久卷,以避免在 pod 或节点删除期间丢失数据。

    在 Kubernetes 环境中随时可能发生 pod 或节点删除。它可能是修补活动或缩减活动。

    希望这个分步指南可以帮助您学习和理解在 Kubernetes 集群上设置 Jenkins 服务器所涉及的组件。

  • 相关阅读:
    难的不是今年,自学软件测试1个半月,上岸拿5个offer
    .Net Core 配置文件读取 - IOptions、IOptionsMonitor、IOptionsSnapshot
    xbox下载游戏速度一直为0b/s怎么办?
    数据分析从0到1----Matplotlib篇
    ctf-pikachu-CSRF
    入行多年软件测试总结的经验
    【会议资源】2022年第三届自动化科学与工程国际会议(JCASE 2022)
    互联网医院系统开发中的移动端应用设计
    OpenCV C++ Look Up Table(查找表)
    MySQL高级10-InnoDB引擎存储架构
  • 原文地址:https://blog.csdn.net/qq_20173195/article/details/127087531