zoukankan      html  css  js  c++  java
  • kubernetes部署jenkins(Docker in Docker)及认证

    引言

    Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。
    本文将Jenkins的master与slave置于Pod中,部署在namespace:jenkins下,jenkins slave 构建时,启动slave运行代码克隆,项目构建,镜像构建,上传仓库等一系列命令。构成完成以后删除pod。也就是Docker In Docker
    可直接使用本文提供的编排文件构建Jenkins,有通过helm管理kubernetes组件的,可使用本文提供的char。
    ️搭建不是关键,关键是趟坑。

    一、Jenkins搭建

    1. helm安装

    请查看作者之前的文章《kubernetes搭建Harbor无坑及多中心Harbor仓库同步》中helm搭建部分

    2. Jenkins搭建

    git clone https://github.com/yuenandi/Jenkins.git
    这是作者从https://github.com/helm/charts.git单独拿出的,由于国内helm的Jenkins资源版本过低,没有选择使用,便clone了1.6版本。整个git项目过大,很容易clone失败,也浪费了一些时间找办法轻量的下载,为了给小伙伴提供些方便,直接用我git的就好。
    git for jenkins
    直接通过helm安装Jenkins

    kubectl create -f jenkins-pv.yaml
    helm install . --debug  --namespace jenkins --name jenkins
    


    运行helm生成jenkins.yaml,生成后删除jenkins.yaml中无用的部分(不知道有没有更聪明的办法用来生成编排文件)

    helm install . --debug --dry-run -n jenkins --namespace jenkins --name jenkins |sed 'w jenkins.yaml'
    
    kubectl create -f jenkins-pv.yaml
    kubectl create -f jenkins.yaml
    

    查看service/LoadBalancer的NodePort,kubectl get svc -n jenkins,也可以设置helm的value.yaml,创建ingress来访问,很简单就不阐述了
    svc
    访问http://masterIp:43563如图:
    jenkins

    3. kubernetes插件设置

    Manage Jenkins ->Configure System->Cloud->kubernetes
    jenkins kubernetes

    3.1. 非kubernetes部署jenkins,通过以下认证(通过本文搭建直接查看3.2. 部分):

    1. Kubernetes 地址:

    • 如果Jenkins Master部署在Kubernetes之外,则输入Kubernetes Master API Server URL,可运行kubectl cluster-info获得Kubernetes Master API Server URL
    • 本文是部署在Kubernetes上,则输入Kubernetes域名方式,格式https://..svc. ,比如https://kubernetes.default.svc.cluster.local,或短名称https://kubernetes.default
      Kubernetes 服务证书 key:将kubernetes的ca.crt的内容填写到jenkins kubernetes的Kubernetes server certificate key栏中。
      ️本文Jenkins Master运行在Kubernetes上可跳过此步
      生成ca.crt文件,若知道kubernetes的ca.crt位置,不用创建
      在Kubernetes Master上,cd ~/.kube/config,运行以下命令生成Kubernetes server certificate key,并保存在ca.crt文件中:
      echo "<certificate-authority-data>" | base64 -d > ca.crt

    2. 凭据:生成cert.pfx上传到jenkins

    ️本文Jenkins Master运行在Kubernetes上可跳过此步

    • 生成Kubernetes Client P12 Certificate File
      在Kubernetes Master上,cd~/.kube/config
    # 复制client-certificate-data的内容,运行以下命令生成client.crt
    echo "<client-certificate-data>" | base64 -d > client.crt]
    # 复制client-key-data的内容,运行以下命令生成client.key
    echo "<client-key-data>" | base64 -d > client.key
    # 根据前面步骤生成的ca.crt, client.crt和client.key来生成PKCS12格式的cert.pfx
    # 以下命令运行时,需要输入4位以上的密码
    openssl pkcs12 -export -out cert.pfx -inkey client.key -in client.crt -certfile ca.crt
    

    将生成的Kubernetes Client P12 Certificate Filecert.pfx复制到Jenkins Master服务器上,比如复制到/var/lib/jenkins/kubernetes_cert/cert.pfx

    • 在Jenkins上配置Kubernetes Credential
    1. 在Jenkins上增加一个Credential,选择类型为Certificate
    2. 选择“From a PKCS#12 file on Jenkins master”,输入上面生成的cert.pfx文件在Jenkins Master服务器上的路径,比如/var/lib/jenkins/kubernetes_cert/cert.pfx。
    3. 输入生成cert.pfx文件时输入的密码
    4. 输入一个有意义的ID,比如kubernetes-cluster
    5. 输入有意义的Description

    3.2. 安装本文kubernetes部署jenkins,通过以下认证

    ️若之后环境的Pod就在jenkins本环境,不用给予cluster-admin的权限

    #授予serviceaccount 权限,Jenkins对kube-apiserver 其他namespace的权限认证
    kubectl create clusterrolebinding jenkins --clusterrole cluster-admin --serviceaccount=jenkins:jenkins
    

    3.3. jenkins地址设置

    由于不是同一namespace下通过域名访问

    • Jenkins 地址:http://jenkins.jenkins.svc.cluster.local:8080
    • Jenkins 通道:jenkins-agent.jenkins.svc.cluster.local:50000

    3.3. 设置kubernetes Pod Template

    EnvVars
    环境变量 卷
    最后apply,save

    4. Freestykle project

    ️简单测试以下,后续发pipeline的使用,从git->jenkins->kuberbetes流水线可先查看Kubernetes+Gitlab+Jenkins构建镜像并创建Pod 还是很详细的。

    4.1. 创建slave

    Freestykle project
    others
    Execute shell
    save or apply

    4.2. 启动slave

    ️如果报错查看4.3.
    start
    项目创建成功
    jenkins slave
    slave的Pod
    Pod
    slave的日志
    slave log
    jenkins的日志
    jenkins log

    ️jnlp-slave会将项目代码进行拷贝、打包镜像、上传仓库等等一系列任务,我们可以通过命令定制(本文没有进行任何操作),任务结束后,pod删除,主机消失,在console output 会看到执行结果:
    Console Output
    Console Output
    可以看到我们之前输出命令也打印了出来

    4.3. 我遇到的报错处理

    jnlp-slave pod创建失败,会一直重新创建,查看pod日志,发现是连接不上jenkins,jenkins日志如下:
    jenkins  log

    • 抛 java.nio.channels.ClosedChannelException 异常的原因是 Jenkins Slave Pod 在 Jenkins Job 运行时突然挂掉,然后 Master Pod 无法和 Slave Pod 进行通信。那么解决方法就是找到 Slave Pod 经常挂掉的原因,经排查是 Slave Pod 的资源限制不合理,配置的 CPU 和内存太小,导致 Pod 在运行是很容易超出资源限制,然后被 k8s Kill 掉。️也可能是域名或认证没有配置好,具体需要看jnlp-slave和jenkins的日志
    • 解决方法
      打开 Jenkins 设置 Slave Pod 模版的资源限制:
      Jenkins->系统管理->系统设置->云->镜像->Kubernetes Pod Template->Container Template->高级,然后根据实际情况调整 CPU 和内存需求。

    文中没有提及的问题,可评论笔者
    !!!手码不易,对您有帮助的话,给个赞呦,且有更多k8s相关文案!!!

  • 相关阅读:
    hdu 5444 Elven Postman 二叉树
    tensorflow2.x模型保存问题
    【NVIDIA】Win10 + CUDA10 + cuDNN 安装教程(转载)和遇到的坑
    windows下 为不同虚拟环境配置不同的cuda
    多线程
    socket编程
    引用类型和值类型
    记录报错
    github下载慢问题
    LabelImg的安装出现No module named 'libs.resources'错误
  • 原文地址:https://www.cnblogs.com/keep-live/p/11532414.html
Copyright © 2011-2022 走看看