【问题标题】:Deploy microservice (spring boot app) on Openshift via Jenkins pipeline通过 Jenkins 管道在 Openshift 上部署微服务(spring boot 应用程序)
【发布时间】:2021-10-20 02:56:38
【问题描述】:

我需要通过 jenkins 在 openshift 中部署一个 Spring Boot 应用程序(docker image),为此我正在执行以下步骤,

  1. 我使用 jenkins pipeline 'freestyle' 模板创建了 spring boot 应用的 docker 镜像 -
  2. 将该 docker 映像推送到“Artifactory”注册表中

以上两个步骤已完成并正常工作,但我正在努力通过 jenkins 管道将该 docker 映像(在 Artifactory 注册表中)部署到 openshift 服务器, 这似乎是一个常见的要求,但我没有找到任何好的文档,非常感谢任何帮助。

【问题讨论】:

  • 这个问题可能更适合DevOps
  • 我上次使用 openshift 是 3.x 版本,它有图像流。我还使用了 openshift 客户端工具“oc”来更新部署。
  • @DmitriyTarasevich 你已经通过 jenkins 管道部署了吗?
  • 是的,jenkins 已部署到 openshift 并配置为在 openshift 中运行管道。所以我在 jenkinsfile 中使用了 oc。
  • 在我的情况下,我需要使用未部署在 openshift 中的 Jenkins,它是在外部配置的。

标签: docker jenkins microservices openshift devops


【解决方案1】:

根据您的承诺水平和所需的自动化 DevOps 集成水平,有一些解决方案:

  1. 快速而肮脏的解决方案 - 如果您将oc 命令行工具插入到您的 Jenkins 代理\从属设备中(通常最好在机器或虚拟机上运行),您可以创建一个环境变量来保存应用程序名称,并且只要当您使用oc new-app 或类似名称创建它时,您可以执行oc import-image,后跟ImageStream 名称,它会检查docker repo 标记以了解版本哈希的更改(如果哈希更改,它将更新它)。检查here 进行基本令牌注入,以避免通过 git 泄露密码。

示例 Jenkinsfile sn-p:

pipeline {
    agent { 'jenkins_slave_vm' }
    environment {
        SERVICE='myapp'
    }

    stages {
        stage('build&push') {
            steps {
                sh "docker build -t myrepo/${SERVICE}:latest -f Dockerfile.production ."
                sh "docker push myrepo/${SERVICE}:latest"
            }
        }
        stage('deploy') {
            steps {
                sh "oc login --token=${OC_IMAGE_UPDATE_TOKEN}"
                sh "oc import-image ${SERVICE}"
            }
        }
    }
}
  1. 更强大的企业解决方案 - 使用 Jenkins 的 k8s\openshift 插件(不同的插件),通用 k8s 插件用于启动具有所需环境的 pod(如前端应用程序的节点),在结束时恢复使用,运行构建阶段,同时使用 openshift BuildConfig 对象构建 docker\container 映像,并基于 Dockerfile 配置、S2I 或使用 pipeline 方法由 openshift 完全管理的行为(尽管更复杂且平台投入很大与其他两个相比),here's 是对 openshift 4.6 的最新解释,尽管自 3.x 版以来也存在。这种方法可以实现更具声明性、可重复性和长期一致的构建策略,并且是我们当前组织目前正在使用的一种方法,用于节省资源和保持容器的兴起最初带来的一致性。

pipeline examples

  1. 中途 - 使用来自 SCM 平台的 webhook 触发 openshift 构建(可以查看 here)。消除了 Jenkins 的一些依赖(并且个人未经测试),但如果您真的无法使用其他选项,这可能是最后一根稻草。

【讨论】:

  • 嗨,Noam,感谢您的回答和链接,似乎链接 docs.openshift.com/container-platform/4.6/builds/… 无效,请更新有效链接。
  • 哇!首先openshift DNS记录不起作用,当我搜索文档并尝试来自Google的不同链接时,它们都不起作用,也许稍后再试一次?
  • 刚刚检查过,现在可以了!
  • 是的,链接现在可以使用,谢谢
【解决方案2】:

不幸的是,我没有可以扩展您这边的代码 sn-p 来为您提供复制粘贴解决方案,但是,使用 Jenkins 部署到 Kubernetes 的最简单方法与其他 CI/ CD 工具也一样,只需在管道中执行 kubeactl apply

为此,您的存储库中应该有一个名为 k8s(或类似名称)的文件夹,其中包含部署过程所需的所有文件:

stackoverflow-repo
├── docker
│   └── Dockerfile
├── Jenkinsfile
├── k8s
│   ├── configmap.yaml
│   └── deployment.yaml
└── src
    └── main
        ├── java
        ├── main.java
        └── resources
            └── app.properties

出于安全原因,create a ServiceAccount or User in Kubernetes and assign it roles that are necessary for deployment (i.e. updating, patching and creating Services, Deployments and so on) using RBAC 是合适的。

也可以选择使用Kubernetes plugin for Jenkins,但是,它使用起来更复杂,并且会导致供应商锁定,我会尽量避免,特别是因为 Jenkins 在某种程度上处于灭绝的道路上(与其他CI/CD 工具更简单、更快速、更高效)。

请记住,许多现代 Kubernetes 架构 deploy via ArgoCD

这是首选的原因是因为它使用了一种称为GitOps 的方法,并且可以轻松地与任何 CI/CD 工具结合使用,从而更容易切换,因为 ArgoCD 正在执行实际部署。此外,它还提供了一个漂亮的 UI,为不习惯每天使用 Kubernetes 的人们提供清晰易懂的信息。

说了这么多,这完全取决于你想走什么路,但请记住,在你的 Jenkinsfile 中一个简单的kubectl apply -f k8s/ 将完全完成你想要的,只需要你在某个地方放置一个kubeconfig file正在运行的管道可以访问它(您可以通过执行类似kubectl --kubeconfig /path/to/kubeconfig apply -f k8s/ 的操作来指定路径)。

【讨论】:

  • 在openshift中部署docker镜像真的需要kubernete吗?
猜你喜欢
  • 2021-05-14
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 2020-07-11
  • 2015-12-15
相关资源
最近更新 更多