zoukankan      html  css  js  c++  java
  • Helm部署和体验jenkins

    如何快速且简单的部署

    通过helm可以快速且简单的部署多种应用,关于helm的安装和使用请参考

    环境信息

    本次实战的环境信息如下:

    1. kubernetes集群:三台CentOS7.7服务器
    2. kubernetes版本:1.15.3
    3. helm版本:2.16.1
    4. jenkins版本:

    准备工作

    除了提前准备好kubernetes环境,还需要做好以下准备工作:

    • 准备好helm,您可以参考《》
    • 准备好NFS服务,这样就算jenkins的pod被销毁重建,也不会丢失数据,NFS服务的搭建,您可以参考《》
      准备完成后可以开始实战了

    本次实战的namespace

    本次实战使用名为helm-jenkins的namespace,执行以下命令创建:

    kubectl create namespace helm-jenkins
    

    创建PV

    为了后面的jenkins服务顺利启动,需要预先部署好pv:

    • 新建名为pv-helm-jenkins.yaml的文件,内容如下:
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: helm-jenkins
      namespace: helm-jenkins
    spec:
      capacity:
        storage: 10Gi
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Recycle
      nfs:
        path: /usr/local/work/test/002
        server: 192.168.133.142
    
    • 执行命令kubectl create -f pv-helm-jenkins.yaml,创建pv
    • 查看pv是否已经就绪:
    [root@node1 helm-jenkins]# kubectl get pv
    NAME           CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM        STORAGECLASS   REASON   AGE
    helm-jenkins   10Gi       RWO            Recycle          Available                                        5s
                             14h
    

    helm安装jenkins

    • 确保helm2.16.1版本安装完毕,并且可以正常工作:
    [root@node1 helm-jenkins]# helm version
    Client: &version.Version{SemVer:"v2.16.1", GitCommit:"bbdfe5e7803a12bbdf97e94cd847859890cf4050", GitTreeState:"clean"}
    Server: &version.Version{SemVer:"v2.16.1", GitCommit:"bbdfe5e7803a12bbdf97e94cd847859890cf4050", GitTreeState:"clean"}
    
    • 确保以下的helm repo准备好(如果没有可以通过helm repo add添加):
    [root@node1 helm-jenkins]# helm repo list
    NAME   	URL                                                   
    stable 	https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
    
    • 执行以下命令,即可创建jenkins的deployment、service等资源:
    helm install --namespace helm-jenkins --name my-jenkins stable/jenkins
    
    • 执行完毕后,控制台输出以下内容:
    NOTES:
    1. Get your 'admin' user password by running:
      printf $(kubectl get secret --namespace helm-jenkins my-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo
    2. Get the Jenkins URL to visit by running these commands in the same shell:
      NOTE: It may take a few minutes for the LoadBalancer IP to be available.
            You can watch the status of by running 'kubectl get svc --namespace helm-jenkins -w my-jenkins'
      export SERVICE_IP=$(kubectl get svc --namespace helm-jenkins my-jenkins --template "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}")
      echo http://$SERVICE_IP:8080/login
    
    3. Login with the password from step 1 and the username: admin
    

    上述内容的第一条给出了重要提示:获取admin账号密码的方法,执行命令即可:

    printf $(kubectl get secret --namespace helm-jenkins my-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo
    

    如下图红框所示,我这里得到了admin密码为Eq6WxHvJ2V:

    • 检查服务,发现helm-jenkins这个namespace下有两个服务:my-jenkins和my-jenkins-agent,前者就是jenkins网站,后者用来接收执行任务的jenkins实例的注册:
    [root@node1 helm-jenkins]# kubectl get svc -n helm-jenkins
    NAME               TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
    my-jenkins         LoadBalancer   10.233.10.35   <pending>     8080:31763/TCP   31m
    my-jenkins-agent   ClusterIP      10.233.35.20   <none>        50000/TCP        31m
    
    • my-jenkins这个服务的类型是LoadBalancer,8080端口被映射到宿主机的31763,因此,使用kubernetes集群中一台宿主机的IP,再加上31763端口即可通过浏览器访问,如下图:
    • 至此,jenkins安装已完成,接下来要做必要的设置

    设置kubernetes插件

    为了让jenkins在以下模式工作,还需要设置kubernetes插件

    • 点击下图红框中的"Manage Jenkins",进入设置页面
    • 由于很多插件版本较久,页面上会有升级提示,这里暂时用不到,因此直接点击下图红框中的"Configure System"
    • 点击下图红框1中的"Test Connection”按钮,您会见到红框2中的错误信息:
    • 产生上述错误的原因,是由于jenkins容器没有权限访问kubernetes的api server导致的,为了解决此问题,要先搞清楚容器的身份,我们知道容器在kubernetes环境中都有自己的serviceaccount,执行命令kubectl get serviceaccount -n helm-jenkins查看当前namespace下的serviceaccount:
    [root@node1 helm-jenkins]# kubectl get serviceaccount -n helm-jenkins
    NAME      SECRETS   AGE
    default   1         3h55m
    

    可见jenkins容器的serviceaccount是default

    • 知道了容器的serviceaccount,上述问题就好解决了,我们用RBAC将访问api server所需权限绑定给default即可,这里为了省事儿就不将权限一一列出了,接下来直接给default最高权限(生产环境千万别这么做,必须按需分配);
    • 新建名为rbac-helm-jenkins-default.yaml的文件,内容如下:
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: rbac-helm-jenkins-default
      namespace: helm-jenkins
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-admin
    subjects:
    - kind: ServiceAccount
      name: default
      namespace: helm-jenkins
    
    • 执行命令kubectl create -f rbac-helm-jenkins-default.yaml使得RBAC生效
    • 再次回到之前的页面点击"Test Connection"按钮,如下图,提示"Connection successful":
    • 接下来设置Pod模板参数,如下图,namepsace要设置为helm-jenkins,另外要记下来Labels的值my-jenkins-jenkins-slave,后面会用到
    • 点击底部的"Save"按钮,使设置生效:
    • 设置完毕,接下来创建任务体验一下kubernetes上的jenkins功能

    体验Freestyle project

    • 创建一个Freestyle project,如下图:
    • 如下图,表单中Label Expression的值是前面记下来的my-jenkins-jenkins-slave
    • 如下图,本次任务的具体内容很简单,执行一段shell,输出"Hello World!":
    • 点击底部的"Save"按钮保存
    • 点击下图红框中的"Build Now",即可开始构建
    • 此时去控制台执行命令kubectl get pods -n helm-jenkins查看pod,会发现有新的pod出现,如下所示,这是执行jenkins任务的pod:
    [root@node1 helm-jenkins]# kubectl get pods -n helm-jenkins
    NAME                          READY   STATUS              RESTARTS   AGE
    default-66vcq                 0/1     ContainerCreating   0          1s
    my-jenkins-74bcdfc566-jbw28   1/1     Running             0          5h5m
    
    • 返回jenkins页面,可见任务已经执行完毕:

    https://github.com/zq2599/blog_demos

  • 相关阅读:
    php 3des加密 兼容JAVA 多么痛的领悟呀
    主机序和网络序
    不用递归实现无限分类数据的树形格式化
    python学习笔记之open函数的用法
    据说是百度面试题(1)
    YII+DWZ三级城市联动挂件
    wpf 报错: 在 AddNew 或 EditItem 事务过程中不允许“DeferRefresh”。
    MVVM了解
    纪念2015年上半年
    c# 委托与事件
  • 原文地址:https://www.cnblogs.com/bolingcavalry/p/13734165.html
Copyright © 2011-2022 走看看