首页 > 其他分享 >Kubesphere中DevOps流水线无法部署/部署失败

Kubesphere中DevOps流水线无法部署/部署失败

时间:2023-04-23 16:45:46浏览次数:43  
标签:java kubernetes deploy 部署 Kubesphere DevOps jenkins com microsoft

摘要

总算能让devops运行以后,流水线却卡在了deploy这一步。碰到了两个比较大的问题,一个是无法使用k8sp自带的kubeconfig认证去部署;一个是部署好了以后但是没有办法解析镜像名。

版本信息

k8s:v1.21.5
k8sp:v3.3.0

流水线概览

image

Q问题描述

pipeline 在deploy 的阶段总是报各种错。

Q1.使用k8sp自带kube认证产生报错

      stage('deploy fail') {
        agent none
        steps {
          withCredentials([kubeconfigContent(credentialsId : 'kubeconfigger' ,variable : 'KUBECONFIGGER' ,)]) {
            kubernetesDeploy(enableConfigSubstitution: true, deleteResource: false, kubeconfigId: 'kubeconfigger', configs: 'hospital-manage/deploy/**')
          }

        }
      }

报错内容如下:

Starting Kubernetes deployment
Loading configuration: /home/jenkins/agent/workspace/redp5lk5/rose/hospital-manage/deploy/deploy.yml
ERROR: ERROR: java.lang.RuntimeException: io.kubernetes.client.openapi.ApiException: 
hudson.remoting.ProxyException: java.lang.RuntimeException: io.kubernetes.client.openapi.ApiException: 
    at com.microsoft.jenkins.kubernetes.wrapper.ResourceManager.handleApiExceptionExceptNotFound(ResourceManager.java:180)
    at com.microsoft.jenkins.kubernetes.wrapper.V1ResourceManager$DeploymentUpdater.getCurrentResource(V1ResourceManager.java:213)
    at com.microsoft.jenkins.kubernetes.wrapper.V1ResourceManager$DeploymentUpdater.getCurrentResource(V1ResourceManager.java:201)
    at com.microsoft.jenkins.kubernetes.wrapper.ResourceManager$ResourceUpdater.createOrApply(ResourceManager.java:93)
    at com.microsoft.jenkins.kubernetes.wrapper.KubernetesClientWrapper.handleResource(KubernetesClientWrapper.java:289)
    at com.microsoft.jenkins.kubernetes.wrapper.KubernetesClientWrapper.apply(KubernetesClientWrapper.java:256)
    at com.microsoft.jenkins.kubernetes.command.DeploymentCommand$DeploymentTask.doCall(DeploymentCommand.java:172)
    at com.microsoft.jenkins.kubernetes.command.DeploymentCommand$DeploymentTask.call(DeploymentCommand.java:124)
    at com.microsoft.jenkins.kubernetes.command.DeploymentCommand$DeploymentTask.call(DeploymentCommand.java:106)
    at hudson.remoting.UserRequest.perform(UserRequest.java:211)
    at hudson.remoting.UserRequest.perform(UserRequest.java:54)
    at hudson.remoting.Request$2.run(Request.java:376)
    at hudson.remoting.InterceptingExecutorService.lambda$wrap$0(InterceptingExecutorService.java:78)
    at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at hudson.remoting.Engine$1.lambda$newThread$0(Engine.java:122)
    at java.base/java.lang.Thread.run(Unknown Source)
    Suppressed: hudson.remoting.Channel$CallSiteStackTrace: Remote call to JNLP4-connect connection from 10.233.81.183/10.233.81.183:49480
        at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1797)
        at hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:356)
        at hudson.remoting.Channel.call(Channel.java:1001)
        at hudson.FilePath.act(FilePath.java:1256)
        at com.microsoft.jenkins.kubernetes.command.DeploymentCommand.execute(DeploymentCommand.java:68)
        at com.microsoft.jenkins.kubernetes.command.DeploymentCommand.execute(DeploymentCommand.java:45)
        at com.microsoft.jenkins.azurecommons.command.CommandService.runCommand(CommandService.java:88)
        at com.microsoft.jenkins.azurecommons.command.CommandService.execute(CommandService.java:96)
        at com.microsoft.jenkins.azurecommons.command.CommandService.executeCommands(CommandService.java:75)
        at com.microsoft.jenkins.azurecommons.command.BaseCommandContext.executeCommands(BaseCommandContext.java:77)
        at com.microsoft.jenkins.kubernetes.KubernetesDeploy.perform(KubernetesDeploy.java:42)
        at com.microsoft.jenkins.azurecommons.command.SimpleBuildStepExecution.run(SimpleBuildStepExecution.java:54)
        at com.microsoft.jenkins.azurecommons.command.SimpleBuildStepExecution.run(SimpleBuildStepExecution.java:35)
        at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:47)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: hudson.remoting.ProxyException: io.kubernetes.client.openapi.ApiException: 
    at io.kubernetes.client.openapi.ApiClient.handleResponse(ApiClient.java:979)
    at io.kubernetes.client.openapi.ApiClient.execute(ApiClient.java:895)
    at io.kubernetes.client.openapi.apis.AppsV1Api.readNamespacedDeploymentWithHttpInfo(AppsV1Api.java:7299)
    at io.kubernetes.client.openapi.apis.AppsV1Api.readNamespacedDeployment(AppsV1Api.java:7275)
    at com.microsoft.jenkins.kubernetes.wrapper.V1ResourceManager$DeploymentUpdater.getCurrentResource(V1ResourceManager.java:210)
    ... 16 more
Api call failed with code 400, detailed message: {
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {
    
  },
  "status": "Failure",
  "message": "the export parameter, deprecated since v1.14, is no longer supported",
  "reason": "BadRequest",
  "code": 400
}
Kubernetes deployment ended with HasError

从message来看,已经不支持这个什么什么参数了。从与小伙伴的沟通看,以前的版本是可以用的。但是新版本不支持了。

解决方案

采用以下写法。
缺点:不支持图形化流水线编辑,点击编辑该凭证会闪退。

法1

需要在环境变量处声明 KUBECONFIG_CREDENTIAL_ID

    stage('deploy success') {
      agent none
      steps {
        container('maven') {
          withCredentials([kubeconfigFile(
                                           credentialsId: env.KUBECONFIG_CREDENTIAL_ID, variable: 'KUBECONFIG') ]) {
              sh 'envsubst < hospital-manage/deploy/deploy.yml | kubectl apply -f -'
            }

          }

        }
      }

法2

与法1没什么区别。主要区别就是shell中的命令。

    stage('deploy hospital-manage to dev') {
      agent none
      steps {
        container('maven') {
          withCredentials([kubeconfigFile(credentialsId: env.KUBECONFIG_CREDENTIAL_ID, variable: 'KUBECONFIG')]) {
            sh 'kubectl apply -f hospital-manage/deploy/**'
          }

        }

      }
    }

Q2:无法解析镜像名

在deploy.yml文件中,有关镜像名的描述如下所示:

spec:
  containers:
    - image: $DOCKERHUB_NAMESPACE/server-gateway:SNAPSHOT-$BUILD_NUMBER

但是却出现了如下结果

状态信息
初始化完成
状态:True
容器组就绪
状态:False
原因:ContainersNotReady
消息:containers with unready status: [app]
所有容器就绪
状态:False
原因:ContainersNotReady
消息:containers with unready status: [app]
容器组调度完成
状态:True
无法解析镜像名称

无法解析镜像名,我点进去这个pod的yml以后,才发现,流水线没能解析出这些变量。才导致了无法解析镜像名。

解决方案

治标不治本方案

直接把镜像写死

belchance/ruoyi:hospital-manage_SNAPSHOT-10

替换环境变量方案

https://kubesphere.io/forum/d/5309-deploy-to-kubernets
来源于社区网友,方法就是使用 envsubst,把环境yml文件里的环境变量改了。
注意替换的字符要在JenkinsFile的环境变量区声明,deploy.yml的位置要准确。

  agent none
  steps {
    container('nodejs') {
      sh 'envsubst \\'${REGISTRY},${ALIYUNHUB_NAMESPACE},${BUILD_NUMBER}\\' < deploy/deploy.yml > deploy/deploy2.yml'
      sh 'cat deploy/deploy2.yml'
    }
  }
}

envsubst用法介绍:

envsubst '$DOCKERHUB_NAME,$NUMBER' < deploy.yml 
envsubst '需要替换的环境变量' < target.file
command < file     将输入重定向到 file。

标签:java,kubernetes,deploy,部署,Kubesphere,DevOps,jenkins,com,microsoft
From: https://www.cnblogs.com/belchance/p/17346961.html

相关文章

  • xxl-job 安装部署
    下载源码https://github.com/xuxueli/xxl-job.git配置数据库执行源码下doc.db下的sql修改application.properties配置文件#修改为自己的数据库spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serv......
  • 云原生之部署wordpress博客及设置圣诞主题风格
    (云原生之部署wordpress博客及设置圣诞主题风格)一、前言1.本次实践目的1.使用docker部署wordpress网站2.配置圣诞主题风格2.wordpress介绍WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把WordPress当作一个......
  • tdengine安装部署
    1.下载最新版本https://docs.taosdata.com/get-started/package/#!官方网址,详细介绍都有2.centos7上解压文件tar-zxvfTDengine-server--Linux-x64.tar.gz3.安装进入解压后的目录,执行sudo./install.sh4.自定义日志,缓存,数据存储位置创建三个文件夹修改配置文件vim/et......
  • centos部署.net5项目
    开发环境是vs2019创建一个.netcore项目 测试一下运行 然后发布到文件夹 将文件夹弄到服务器上安装.NET运行时sudorpm-Uvhhttps://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpmsudoyuminstalldotnet-sdk-5.0dotnet--info启动网站......
  • Tailscale 基础教程:部署私有 DERP 中继服务器(转)
    Sealos 在云桌面中管理Kubernetes集群生命周期,运行分布式应用程序 走,看看去!上篇文章介绍了如何使用 Headscale 替代Tailscale官方的控制服务器,并接入各个平台的客户端。本文将会介绍如何让Tailscale使用自定义的DERPServers。可能很多人都不知道 DERP 是个啥玩意......
  • pytorch在有限的资源下部署大语言模型(以ChatGLM-6B为例)
    pytorch在有限的资源下部署大语言模型(以ChatGLM-6B为例)Part1知识准备在PyTorch中加载预训练的模型时,通常的工作流程是这样的:my_model = ModelClass(...)state_dict =torch.load(checkpoint_file)用简单的话来说,这些步骤是:用随机初始化的权重创建模型。从磁盘上加载模型权......
  • 阿里云1+X云计算开发与运维实战——在ECS中部署容器化应用Nginx
    1.1 实验概述开始实验后,系统自动创建一个Linux的ECS实例。根据实验步骤操作说明,安装Docker应用,熟悉Docker的基本指令,拉取容器化应用Nginx的镜像,部署Nginx应用,最后验证部署结果。1.2 实验目的熟悉Docker的安装和基本指令,熟悉部署Docker应用基本方法。1.3实验架构1.4实验准备实验......
  • 主从redis部署(docker)
    首先,我准备了两台linux,一台准备当作master,ip是192.168.241.128,另一台是当作slave,ip是192.168.241.129。1.安装redisdockerpullredis2.下载对应版本的redis.conf可以从github上下载。新建配置环境目录和持久化数据目录。mkdir-p/home/redis/datamkdir-p/home/redis/c......
  • 记录一次艰难的云服务器部署前后端项目springBoot+mybatis和vue(两天解决的前后端跨域
    前言大家好我是歌谣今天继续给大家带来后端java的学习最近刚学习完java的一个增删改查紧接着就是部署项目了代码准备工作前端:vue后端:springboot+mybatis数据库mysql部署后端项目打包找到maven-package-runmavenbuild云服务器上面建立文件mkdir/www/springBoot创建文件......
  • DevOps、SRE、平台工程的区别
    DevOps、SRE和平台工程的概念在不同时期出现,并由不同的个人和组织开发。DevOps作为一个概念是由PatrickDebois和AndrewShafer在2009年的敏捷会议上提出的。他们试图通过促进协作文化和在整个软件开发生命周期中共享责任来弥合软件开发和操作之间的差距。SRE,即站点可靠性工程,......