池偏一 | 博客 DEDICATED OPERATION AND MAINTENANCE DEVELOPMENT.
登录
X
X
  • jenkins 部署
  • 安装部署jenkins


    参考:https://www.qikqiak.com/k8s-book/docs/36.Jenkins%20Slave.html


    一. 创建提供给jenkins使用的pvc

    cd external-storage-master/ceph/cephfs/example
    kubectl create ns kube-ops # 创建namespace
    vim jenkins-pvc.yaml
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
    name: jenkins-pvc
    namespace: kube-ops
    spec:
    storageClassName: cephfs
    accessModes:
    - ReadWriteMany
    resources:
    requests:
    storage: 1Gi
    kubectl create -f jenkins-pvc.yaml


    二. 部署jenkins

    21. 创建Jenkins deployment 文件

    mkdir BUSINESS/jenkins
    vim jenkins.yaml
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: jenkins
    namespace: kube-ops
    spec: 
    selector:
     matchLabels:
     app: jenkins
    template:
     metadata:
     labels:
     app: jenkins
     spec:
     terminationGracePeriodSeconds: 10
     serviceAccount: jenkins
     containers:
     - name: jenkins
     image: jenkins/jenkins:lts
     imagePullPolicy: IfNotPresent
     ports:
     - containerPort: 8080
     name: web
     protocol: TCP
     - containerPort: 50000
     name: agent
     protocol: TCP
     resources:
     limits:
     cpu: 1000m
     memory: 1Gi
     requests:
     cpu: 500m
     memory: 512Mi
     livenessProbe:
     httpGet:
     path: /login
     port: 8080
     initialDelaySeconds: 60
     timeoutSeconds: 5
     failureThreshold: 12
     readinessProbe:
     httpGet:
     path: /login
     port: 8080
     initialDelaySeconds: 60
     timeoutSeconds: 5
     failureThreshold: 12
     volumeMounts:
     - name: jenkinshome
     subPath: jenkins
     mountPath: /var/jenkins_home
     securityContext:
     fsGroup: 1000
     volumes:
     - name: jenkinshome
     persistentVolumeClaim:
     claimName: jenkins-pvc
    ---
    apiVersion: v1
    kind: Service
    metadata:
    name: jenkins
    namespace: kube-ops
    labels:
     app: jenkins
    spec:
    selector:
     app: jenkins
    type: NodePort
    ports:
    - name: web
     port: 8080
     targetPort: web
    - name: agent
     port: 50000
     targetPort: agent


    2.2 创建rbac权限

    vim rbac.yaml 
    apiVersion: v1
    kind: ServiceAccount
    metadata:
    name: jenkins
    namespace: kube-ops
    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
    name: jenkins
    rules:
    - apiGroups: ["extensions", "apps"]
    resources: ["deployments"]
    verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
    - apiGroups: [""]
    resources: ["services"]
    verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
    - apiGroups: [""]
    resources: ["pods"]
    verbs: ["create","delete","get","list","patch","update","watch"]
    - apiGroups: [""]
    resources: ["pods/exec"]
    verbs: ["create","delete","get","list","patch","update","watch"]
    - apiGroups: [""]
    resources: ["pods/log"]
    verbs: ["get","list","watch"]
    - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["get"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRoleBinding
    metadata:
    name: jenkins
    namespace: kube-ops
    roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: ClusterRole
    name: jenkins
    subjects:
    - kind: ServiceAccount
    name: jenkins
    namespace: kube-ops



    2.3 部署rbac 相应资源对象

    kubectl create -f rbac.yaml


    2.4 部署jenkins deploy

    kubectl create -f jenkins.yaml

    部署完成后会看到启动失败

    kubectl describe pod -n kube-ops jenkins-XXXXX 可看到此时挂载目录时权限不对

    image.png

    image.png

    vim nginx-test.yaml # 创建一个测试容器,可通过exec 进入修改挂载目录权限即可
    apiVersion: v1
    kind: Pod
    metadata:
    name: nginx-test-pod
    namespace: kube-ops
    labels:
    name: nginx-test-pod
    spec:
    containers:
    - name: nginx-test-pod
    image: nginx
    ports:
    - name: web
    containerPort: 80
    volumeMounts:
    - name: cephfs
    mountPath: /usr/share/nginx/html
    volumes:
    - name: cephfs
    persistentVolumeClaim:
    claimName: jenkins-pvc

    image.png

    修改完成后再看jenkins pod 恢复正常

    image.png


    三. 配置traefik web 代理

    3.1 配置traefik ui

    cd /etc/kubeasz/manifests/ingress/traefik
    kubectl create -f traefik-ingress.yaml
    vim traefik-ui.ing.yaml 配置traefik ui 对应访问的servername 
    ---
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: traefik-web-ui
      namespace: kube-system
    spec:
      rules:
      - host: traefik-ui-test.ztgame.com
        http:
          paths:
          - path: /
            backend:
              serviceName: traefik-ingress-service
              servicePort: 8080
    kubectl create -f traefik-ui.ing.yaml

    image.png

    3.2 配置jenkins web代理

    vim jenkins-ui.yaml
    ---
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: traefik-jenkins-ui
      namespace: kube-ops
    spec:
      rules:
      - host: jenkins-ui-test.ztgame.com
        http:
          paths:
          - path: /
            backend:
              serviceName: jenkins
              servicePort: 8080
    kubectl create -f jenkins-ui.yaml

    image.png

    初始化密码可在日志中查看:

    kubectl logs -n kube-ops jenkins-7b75cf79c-nhkkt

    image.png


    jenkins web 页面下载插件时需要将源换成国内源,或者配置代理访问
    https://updates.jenkins.io/update-center.json #换成下面的
    https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json


    image.png


  • posted @ 2021-05-24 by 池偏一 阅读(49) 评论(0)
  • 配置动态jenkins slave
  • 1.安装插件

        Manage Jenkins -> Manage Plugins -> Available -> Kubernetes

    image.png

    2. 安装完毕后,点击 Manage Jenkins —> Configure System —> (拖到最下方)Add a new cloud —> 选择 Kubernetes,然后填写 Kubernetes 和 Jenkins 配置信息。 kubernetes plugin config1

    注意 namespace,我们这里填 kube-ops,然后点击Test Connection,如果出现 Connection test successful 的提示信息证明 Jenkins 已经可以和 Kubernetes 系统正常通信了,然后下方的 Jenkins URL 地址:http://jenkins2.kube-ops.svc.cluster.local:8080,这里的格式为:服务名.namespace.svc.cluster.local:8080,根据上面创建的jenkins 的服务名填写,我这里是之前创建的名为jenkins,如果是用上面我们创建的就应该是jenkins2

    另外需要注意,如果这里 Test Connection 失败的话,很有可能是权限问题,这里就需要把我们创建的 jenkins 的 serviceAccount 对应的 secret 添加到这里的 Credentials 里面。

    第3步. 配置 Pod Template,其实就是配置 Jenkins Slave 运行的 Pod 模板,命名空间我们同样是用 kube-ops,Labels 这里也非常重要,对于后面执行 Job 的时候需要用到该值,然后我们这里使用的是 cnych/jenkins:jnlp 这个镜像,这个镜像是在官方的 jnlp 镜像基础上定制的,加入了 kubectl 等一些实用的工具。 kubernetes plugin config2

    注意:由于新版本的 Kubernetes 插件变化较多,如果你使用的 Jenkins 版本在 2.176.x 版本以上,注意将上面的镜像替换成cnych/jenkins:jnlp6,否则使用会报错,配置如下图所示:


    kubernetes slave image config
    kubernetes slave image config


    另外需要注意我们这里需要在下面挂载两个主机目录,一个是/var/run/docker.sock,该文件是用于 Pod 中的容器能够共享宿主机的 Docker,这就是大家说的 docker in docker 的方式,Docker 二进制文件我们已经打包到上面的镜像中了,另外一个目录下/root/.kube目录,我们将这个目录挂载到容器的/root/.kube目录下面这是为了让我们能够在 Pod 的容器中能够使用 kubectl 工具来访问我们的 Kubernetes 集群,方便我们后面在 Slave Pod 部署 Kubernetes 应用。 kubernetes plugin config3

    另外还有几个参数需要注意,如下图中的Time in minutes to retain slave when idle,这个参数表示的意思是当处于空闲状态的时候保留 Slave Pod 多长时间,这个参数最好我们保存默认就行了,如果你设置过大的话,Job 任务执行完成后,对应的 Slave Pod 就不会立即被销毁删除。 kubernetes plugin config4

    另外一些同学在配置了后运行 Slave Pod 的时候出现了权限问题,因为 Jenkins Slave Pod 中没有配置权限,所以需要配置上 ServiceAccount,在 Slave Pod 配置的地方点击下面的高级,添加上对应的 ServiceAccount 即可: kubernetes plugin config5

    还有一些同学在配置完成后发现启动 Jenkins Slave Pod 的时候,出现 Slave Pod 连接不上,然后尝试100次连接之后销毁 Pod,然后会再创建一个 Slave Pod 继续尝试连接,无限循环,类似于下面的信息: 

    如果出现这种情况的话就需要将 Slave Pod 中的运行命令和参数两个值给清空掉 

    到这里我们的 Kubernetes Plugin 插件就算配置完成了。

    测试

    Kubernetes 插件的配置工作完成了,接下来我们就来添加一个 Job 任务,看是否能够在 Slave Pod 中执行,任务执行完成后看 Pod 是否会被销毁。

    在 Jenkins 首页点击create new jobs,创建一个测试的任务,输入任务名称,然后我们选择 Freestyle project 类型的任务: jenkins demo

    注意在下面的 Label Expression 这里要填入haimaxy-jnlp,就是前面我们配置的 Slave Pod 中的 Label,这两个地方必须保持一致 config

    然后往下拉,在 Build 区域选择Execute shell Build

    然后输入我们测试命令

    echo "测试 Kubernetes 动态生成 jenkins slave"
    echo "==============docker in docker==========="
    docker info
    
    echo "=============kubectl============="
    kubectl get pods

    最后点击保存 command

    现在我们直接在页面点击做成的 Build now 触发构建即可,然后观察 Kubernetes 集群中 Pod 的变化

    image.png

    image.png

  • posted @ 2021-05-26 by 池偏一 阅读(70) 评论(0)
© 2017 池偏一 | 赣ICP备 17014207号