• 在K8S中安装jenkins


    以 NFS 为存储卷的示例,将在 NFS 存储卷上创建 Jenkins 目录,然后创建 NFS 类型的 PV、PVC。

    1、NFS 存储卷创建 Jenkins 目录

    进入 NFS Server 服务器,然后再其存储目录下创建 Jenkins 目录,并且确保目录对其它用户有读写权限。

    $ mkdir /nfs/data/jenkins
    

    2、创建 Jenkins 用于存储的 PV、PVC

    创建 Kubernetes 的 PV、PVC 资源,其中 PV 用于与 NFS 关联,需要设置 NFS Server 服务器地址和挂载的路径,修改占用空间大小。而 PVC 则是与应用关联,方便应用与 NFS 绑定挂载,下面是 PV、PVC 的资源对象 yaml 文件。

    jenkins-storage.yaml

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: jenkins
      labels:
        app: jenkins
    spec:
      capacity:          
        storage: 50Gi
      accessModes:       
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain  
      mountOptions:         #NFS挂载选项
        - hard
        - nfsvers=4.1    
      nfs:                  #NFS设置
        path: /nfs/data/jenkins   # 根据上一步的地址来定
        server: 192.168.2.11   # 根据nfs server ip实际来设置
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: jenkins
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 50Gi     #存储空间大小
      selector:
        matchLabels:
          app: jenkins
    

    将 PV 与 PVC 部署到 Kubernetes 中:

    • -n:指定 namespace
    $ kubectl apply -f jenkins-storage.yaml -n public
    

    3、创建 ServiceAccount & ClusterRoleBinding

    Kubernetes 集群一般情况下都默认开启了 RBAC 权限,所以需要创建一个角色和服务账户,设置角色拥有一定权限,然后将角色与 ServiceAccount 绑定,最后将 ServiceAccount 与 Jenkins 绑定,这样来赋予 Jenkins 一定的权限,使其能够执行一些需要权限才能进行的操作。这里为了方便,将 cluster-admin 绑定到 ServiceAccount 来保证 Jenkins 拥有足够的权限。

    • 注意: 请修改下面的 Namespace 参数,改成部署的 Jenkins 所在的 Namespace。

    jenkins-rbac.yaml

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: jenkins-admin       #ServiceAccount名
      namespace: mydlqcloud     #指定namespace,一定要修改成你自己的namespace
      labels:
        name: jenkins
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: jenkins-admin
      labels:
        name: jenkins
    subjects:
      - kind: ServiceAccount
        name: jenkins-admin
        namespace: mydlqcloud
    roleRef:
      kind: ClusterRole
      name: cluster-admin
      apiGroup: rbac.authorization.k8s.io
    

    将 Jenkins 的 RBAC 部署到 Kubernetes 中:

    • -n:指定 namespace
    $ kubectl apply -f jenkins-rbac.yaml -n public
    

    4、创建 Service & Deployment

    在 Kubernetes 中部署服务需要部署文件,这里部署 Jenkins 需要创建 Service 与 Deployment 对象,其中两个对象需要做一些配置,如下:

    • Service:Service 暴露两个接口 808050000,其中 8080 是 Jenkins API 和 UI 的端口,而 50000 则是供代理使用的端口。
    • Deployment: Deployment 中,需要设置容器安全策略为 runAsUser: 0 赋予容器以 Root 权限运行,并且暴露 808050000 两个端口与 Service 对应,而且还要注意的是,还要设置上之前创建的服务账户 “jenkins-admin”。

    jenkins-deployment.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: jenkins
      labels:
        app: jenkins
    spec:
      type: NodePort
      ports:
      - name: http
        port: 8080                      #服务端口
        targetPort: 8080
        nodePort: 32001                 #NodePort方式暴露 Jenkins 端口
      - name: jnlp
        port: 50000                     #代理端口
        targetPort: 50000
        nodePort: 32002
      selector:
        app: jenkins
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: jenkins
      labels:
        app: jenkins
    spec:
      selector:
        matchLabels:
          app: jenkins
      replicas: 1
      template:
        metadata:
          labels:
            app: jenkins
        spec:
          serviceAccountName: jenkins-admin
          containers:
          - name: jenkins
            image: jenkins/jenkins:2.204.6
            securityContext:                     
              runAsUser: 0                      #设置以ROOT用户运行容器
              privileged: true                  #拥有特权
            ports:
            - name: http
              containerPort: 8080
            - name: jnlp
              containerPort: 50000
            resources:
              limits:
                memory: 2Gi
                cpu: "2000m"
              requests:
                memory: 2Gi
                cpu: "2000m"
            env:
            - name: LIMITS_MEMORY
              valueFrom:
                resourceFieldRef:
                  resource: limits.memory
                  divisor: 1Mi
            - name: "JAVA_OPTS"                 #设置变量,指定时区和 jenkins slave 执行者设置
              value: " 
                       -Xmx$(LIMITS_MEMORY)m 
                       -XshowSettings:vm 
                       -Dhudson.slaves.NodeProvisioner.initialDelay=0
                       -Dhudson.slaves.NodeProvisioner.MARGIN=50
                       -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85
                       -Duser.timezone=Asia/Shanghai
                     "    
            - name: "JENKINS_OPTS"
              value: "--prefix=/jenkins"         #设置路径前缀加上 Jenkins
            volumeMounts:                        #设置要挂在的目录
            - name: data
              mountPath: /var/jenkins_home
          volumes:
          - name: data
            persistentVolumeClaim:
              claimName: jenkins                 #设置PVC
    

    参数说明:

    • JAVA_OPTS: JVM 参数设置
    • JENKINS_OPTS: Jenkins 参数设置
    • 其它参数: 默认情况下,Jenkins 生成代理是保守的。例如,如果队列中有两个构建,它不会立即生成两个执行器。它将生成一个执行器,并等待某个时间释放第一个执行器,然后再决定生成第二个执行器。Jenkins 确保它生成的每个执行器都得到了最大限度的利用。如果你想覆盖这个行为,并生成一个执行器为每个构建队列立即不等待,所以在 Jenkins 启动时候添加这些参数:
    -Dhudson.slaves.NodeProvisioner.initialDelay=0
    -Dhudson.slaves.NodeProvisioner.MARGIN=50
    -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85
    

    有了上面的部署文件后,再将 Jenkins 部署到 Kuberntes 中:

    • -n:指定应用启动的 namespace
    $ kubectl create -f jenkins-deployment.yaml -n mydlqcloud
    

    5、获取 Jenkins 生成的 Token

    在安装 Jenkins 时候,它默认生成一段随机字符串在控制台日志中,用于安装时验证。这里需要获取它输出在控制台中的日志信息,来获取 Token 字符串。

    查看 Jenkins Pod 启动日志

    • -n:指定应用启动的 namespace
    $ kubectl logs $(kubectl get pods -n mydlqcloud | awk '{print $1}' | grep jenkins) -n mydlqcloud
    

    在日志中可以看到,默认给的token为:

    *************************************************************
    Jenkins initial setup is required. An admin user has been created and a password generated.
    Please use the following password to proceed to installation:
    
    96b19967a2aa4e7ab7d2ea5c6f55db8d
    
    This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
    *************************************************************
    

    6、启动 Jenkins 进行初始化

    输入 Kubernetes 集群地址和 Jenkins Service 设置的 NodePort 端口号,访问 Jenkins UI 界面进行初始化,按以下步骤执行:

    进入Jenkins

    输入 Kubernetes 集群地址和上面设置的 Nodeport 方式的端口号 32001,然后输入上面获取的 Token 字符串。例如,本人 Kubernetes 集群 IP 为 192.168.2.11 ,所以就可以访问地址 http://192.168.2.11:32001/jenkins 进入 Jenkins 初始化界面。

  • 相关阅读:
    最近迷上用dvd字幕学习英语
    原始套接字
    c语言socket编程
    inet_aton和inet_network和inet_addr三者比较
    用man来查找c函数库
    ubuntu的系统日志配置文件的位置
    复制文件
    vim复制粘贴解密(转)
    vim的自动补齐功能
    两个数据结构ip和tcphdr
  • 原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/13092210.html
Copyright © 2020-2023  润新知