zoukankan      html  css  js  c++  java
  • K8S 部署 jenkins (一)

    这里 jenkins 使用的存储为 NFS

    安装 nfs 工具

    yum install nfs-common  nfs-utils -y 
    
    showmount -e 192.168.52.174
    # 运行结果
    Export list for 192.168.52.174:
    /nfs/jenkins *
    
    

    创建 nfs-client-provisioner deployment

    cat nfs-client-provisioner.yaml 
    
    kind: Deployment
    apiVersion: apps/v1
    metadata:
      name: nfs-client-provisioner
      namespace: kube-system
    spec:
      replicas: 1
      strategy:
        type: Recreate
      selector:
        matchLabels:
          app: nfs-client-provisioner
      template:
        metadata:
          labels:
            app: nfs-client-provisioner
        spec:
          serviceAccountName: nfs-client-provisioner
          containers:
            - name: nfs-client-provisioner
              image: quay.io/external_storage/nfs-client-provisioner:latest
              volumeMounts:
                - name: nfs-client-root
                  mountPath: /persistentvolumes
              env:
                - name: PROVISIONER_NAME
                  value: jenkinsnfs                  # 注意这里的值不能有下划线 _
                - name: NFS_SERVER
                  value: 192.168.52.174
                - name: NFS_PATH
                  value: /nfs/jenkins
          volumes:
            - name: nfs-client-root
              nfs:
                server: 192.168.52.174
                path: /nfs/jenkins
    
    ## 创建 RBAC 授权
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: nfs-client-provisioner
      # replace with namespace where provisioner is deployed
      namespace: kube-system
    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: nfs-client-provisioner-runner
    rules:
      - apiGroups: [""]
        resources: ["persistentvolumes"]
        verbs: ["get", "list", "watch", "create", "delete"]
      - apiGroups: [""]
        resources: ["persistentvolumeclaims"]
        verbs: ["get", "list", "watch", "update"]
      - apiGroups: ["storage.k8s.io"]
        resources: ["storageclasses"]
        verbs: ["get", "list", "watch"]
      - apiGroups: [""]
        resources: ["events"]
        verbs: ["create", "update", "patch"]
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: run-nfs-client-provisioner
    subjects:
      - kind: ServiceAccount
        name: nfs-client-provisioner
        # replace with namespace where provisioner is deployed
        namespace: kube-system
    roleRef:
      kind: ClusterRole
      name: nfs-client-provisioner-runner
      apiGroup: rbac.authorization.k8s.io
    ---
    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: leader-locking-nfs-client-provisioner
      # replace with namespace where provisioner is deployed
      namespace: kube-system
    rules:
      - apiGroups: [""]
        resources: ["endpoints"]
        verbs: ["get", "list", "watch", "create", "update", "patch"]
    ---
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: leader-locking-nfs-client-provisioner
      # replace with namespace where provisioner is deployed
      namespace: kube-system
    subjects:
      - kind: ServiceAccount
        name: nfs-client-provisioner
        # replace with namespace where provisioner is deployed
        namespace: kube-system
    roleRef:
      kind: Role
      name: leader-locking-nfs-client-provisioner
      apiGroup: rbac.authorization.k8s.io
    
    

    创建storageclass

    名称为 jenkinsnfs,并且 provisioner 需要与 deployment 中的 PROVISIONER_NAME对应,注意这个变量不能有下划线 _

    cat storageclass.yaml 
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: nfs
      namespace: kube-ops
    provisioner: jenkinsnfs
    parameters:
      archiveOnDelete: "true" # "false" 删除PVC时不会保留数据,"true"将保留PVC数据
    

    创建 jenkins-deployment.yaml

    cat jenkins-deployment.yaml
    # 创建一个新的 namespace kube-ops 
    apiVersion: v1
    kind: Namespace
    metadata:
      name: kube-ops
    --- 
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: jenkins-claim
      namespace: kube-ops
      annotations:
        volume.beta.kubernetes.io/storage-class: "nfs"
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
    
    # jenkins 对应的 RBAC
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: jenkins-admin
      namespace: kube-ops       
      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: kube-ops
    roleRef:
      kind: ClusterRole
      name: cluster-admin
      apiGroup: rbac.authorization.k8s.io
    
    # jenkins 对应的 svc
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: jenkins
      namespace: kube-ops
      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
    
    # jenkins Deployment
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: jenkins
      namespace: kube-ops
      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:lts-alpine
            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,设置该选项会影响 jenkins-slave 的启动
            volumeMounts:                        #设置要挂在的目录
            - name: data
              mountPath: /var/jenkins_home
          volumes:
          - name: data
            persistentVolumeClaim:
              claimName: jenkins-claim           #设置PVC
    

    获取 svc NodePort 的端口

    [root@k8s-master01 jenkins]# kubectl get svc
    NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                          AGE
    jenkins      NodePort    10.104.132.242   <none>        8080:32001/TCP,50000:32002/TCP   87m
    kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP                          7h12m
    

    浏览器访问 http://192.168.52.172:32001

    进入 nfs server 查看密码

    cat /nfs/default-jenkins-claim-pvc-6c4d944b-245e-440b-b566-3137c05855ad/secrets/initialAdminPassword 
    2537679f73a14acd834cf2ef0d77ce4f
    
  • 相关阅读:
    Java设计模式
    一个接口多个实现类的Spring注入方式
    Mybatis 中的<![CDATA[ ]]>浅析
    方法内调另一个方法(事务)的探讨
    insertSql语句中的trim标签的使用
    Mybatis-plus的两种分页插件的配置方式
    Mybatis-plus的使用
    spring的IOC,DI及案例详解
    MySQL多表关联数据同时删除
    @Validated和@Valid区别
  • 原文地址:https://www.cnblogs.com/klvchen/p/13235789.html
Copyright © 2011-2022 走看看