• 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相关文案!!!

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 高精度乘法
    Java实现 蓝桥杯VIP 算法提高 高精度乘法
    Java实现 蓝桥杯VIP 算法提高 高精度乘法
    Java实现 蓝桥杯VIP 算法提高 高精度乘法
    Java实现 蓝桥杯VIP 算法提高 高精度乘法
    Java实现 蓝桥杯VIP 算法提高 现代诗如蚯蚓
    Java实现 蓝桥杯VIP 算法提高 现代诗如蚯蚓
    Java实现 蓝桥杯VIP 算法提高 现代诗如蚯蚓
    Java实现 蓝桥杯VIP 算法提高 现代诗如蚯蚓
    ddd
  • 原文地址:https://www.cnblogs.com/keep-live/p/11532414.html
Copyright © 2020-2023  润新知