使用bci的五个理由(代码片段)

RancherbySUSE RancherbySUSE     2023-03-12     698

关键词:

现在,软件开发的范例是将容器化应用程序部署到 Pod 上,然后通过 Kubernetes 进行管理。Kubernetes 可以管理应用程序的部署、复制、HA、指标和其他功能,这样应用程序就可以专注于本职工作。

要将应用程序容器化,你需要使用镜像,而镜像通常是基于语言的(Golang、Python、Rust、.NET 等)。镜像提供商有很多,包括将镜像提交到镜像仓库的个人贡献者,以及企业级镜像提供商等。你也可以在开发中使用基于操作系统的镜像。

但在使用镜像过程中,我们往往会遇到一些问题。

软件工程问题

  • 安全性:如何确保使用的版本没有受到 CVE 或其他漏洞的影响?

  • 重新分发:需要部署应用程序,但是不了解底层主机、架构或编排技术。

  • 仓库和工具:有时我需要使用一些工具(Git、编译器、库等),但大多数镜像不提供可以获取这些工具和包的可靠仓库。

  • 可用性:开源贡献者和企业软件工程师都需要基于多种平台和架构(ARM、x86_64 等)制作软件。镜像不仅要适应架构,还要适用于不同语言规范。有没有可靠的镜像仓库可以作为获取最新镜像的单一参考点,以便维护镜像的标签历史?

  • 支持和生命周期:在大多数情况下,不受支持的镜像对于企业级软件来说是无效的,因此需要有供应商为用来创建或容器化应用程序的基础提供支持,ISV/IHV 需要更多支持。此外,镜像必须在生命周期内进行更新、修复安全漏洞和提高性能。

使用 BCI 解决这些问题

SUSE 发布了 BCI(Base Container Image),BCI 是专注于安全性、可用性、敏捷性和开发者体验的企业级容器镜像。BCI 不仅基于操作系统,还包括语言包、busybox、base 和 minimal。因此,BCI 是应对各类开发(包括社区项目和生产级应用程序)挑战的理想选择。

BCI 能帮助你解决以下问题:

安全

没有人愿意使用受 CVE 影响的软件来构建应用程序。作为开发人员,使用安全镜像可以确保开发的应用程序是可靠的。以下是一些例子:

Trivy 是一款镜像扫描软件,可用于检查漏洞。

➜  ~ trivy image registry.suse.com/bci/bci-base

2022-10-09T03:47:42.403+0200 INFO Need to update DB
2022-10-09T03:47:42.404+0200 INFO DB Repository: ghcr.io/aquasecurity/trivy-db
2022-10-09T03:47:42.404+0200 INFO Downloading DB...
34.35 MiB / 34.35 MiB [-------------------------------------------------------------------------------------------------------] 100.00% 23.13 MiB p/s 1.7s
2022-10-09T03:47:45.503+0200 INFO Vulnerability scanning is enabled
2022-10-09T03:47:45.503+0200 INFO Secret scanning is enabled
2022-10-09T03:47:45.503+0200 INFO If your scanning is slow, please try '--security-checks vuln' to disable secret scanning
2022-10-09T03:47:45.503+0200 INFO Please see also https://aquasecurity.github.io/trivy/v0.32/docs/secret/scanning/#recommendation for faster secret detection
2022-10-09T03:47:45.528+0200 INFO Detected OS: suse linux enterprise server
2022-10-09T03:47:45.528+0200 INFO Detecting SUSE vulnerabilities...
2022-10-09T03:47:45.528+0200 INFO Number of language-specific files: 0
registry.suse.com/bci/bci-base (suse linux enterprise server 15.4)
Total: 0 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0)

bci-micro、bci-minimal、buxybox 和 init 上的结果也是一样的。

➜  ~ trivy image registry.suse.com/bci/bci-micro

[…]
2022-10-09T03:55:17.952+0200 INFO Detecting SUSE vulnerabilities...
2022-10-09T03:55:17.953+0200 INFO Number of language-specific files: 0
registry.suse.com/bci/bci-micro (SUSE Linux enterprise server 15.4)

Total: 0 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0)

重新分发

对于 ISV/IHV 软件,应用程序必须进行更多的重新分发。这里有两个问题:

  • EULA 协议:

    根据 BCI EULA,重新分发应用程序唯一的限制是第三方软件或与订阅绑定的资源,例如,私有仓库的包或基于许可证的硬件提供商。使用这些镜像开发的应用程序都会被重新分发。

  • 软件:

    BCI 带有一个仓库,你可以根据需要将包添加到镜像中,这样能增加自定义镜像的灵活性,同时让应用程序可以重新分发(不需要添加外部依赖项)。

仓库和工具

永恒的讨论:在满足开发人员需求和尽量让镜像小而简单之间的平衡点是什么?

在涉及企业级镜像以及开发人员体验的时候,安全性是一个主要问题。BCI 使用每个镜像都可以访问的仓库来提供工具、编译器和其他软件,从而解决这个问题。有了 Zypper,开发人员可以根据应用程序的需求在镜像安装包上增加一层。

你不需要手动添加仓库、查找包、检查和解决依赖项,或者依赖外部软件和包源。

这些仓库可以免费使用,而且 SUSE 会维护自己的包。

可用性

BCI 支持多种架构,包括 AArch64、ppc64le、s390x 和 x86_64,因此,无论你创建的是哪种类型的应用程序(边缘、物联网、传感器、设备、网页、微服务等),都可以轻松地将基础镜像集中在 BCI 上。

BCI 还为使用特定语言编写的应用程序提供基于语言的镜像,包括 Golang、Python、Rust、.NET、OpenJDK、NodeJS 等。

支持和生命周期

SUSE 设计了 BCI,而镜像通过企业级、ISV 和 IHV 的订阅获得商业支持。支持矩阵涵盖了 BCI 和语言包的基础,你可以在 BCI 镜像仓库查看支持详情:https://registry.suse.com/

BCI 也是一个开源项目,你可以查看它的实际开发状态,了解它们是如何针对不同架构进行构建的,以及查看其他相关信息。

这些镜像使用了 Open Build Service (OBS),每个人都可以使用 OBS。

  • SLE 15 SP4 的 BCI 开发项目:https://build.opensuse.org/project/show/devel:BCI:SLE-15-SP4

  • SLE 15 SP3 的 BCI 开发项目:https://build.opensuse.org/project/show/devel:BCI:SLE-15-SP3

结 论

除了镜像组合之外,你还有很多其他选择。SUSE 提供了以安全为中心的产品,同时也注重开发人员的体验。

BCI 提供了一个灵活的容器镜像生态系统,而且尽可能地减少占用空间。此外,我们还提供了一种灵活扩展镜像的机制,让开发者可以专注于应用程序本身。

通过订阅,ISV 和 IHV 可以利用他们的应用程序,为应用程序使用的基础镜像提供 SUSE 企业级支持。

由于 BCI 可以在支持矩阵内在任何类型的主机中部署和使用,因此重新分发是没有问题的,任何人都可以在不受更多限制的情况下访问镜像,构建和重新分发应用程序。

包仓库可以为开发人员提供灵活性,不会增加任何类型的限制。SUSE 作为一家行业领先的可靠厂商,会维护这些软件包以及包和镜像的集成。

如需了解更多信息,请查看以下资源:

  • BCI 文档:https://documentation.suse.com/smart/linux/html/concept-bci-get-started/index.html

  • 常见问题:https://mp.weixin.qq.com/s/o34G4nXplVrWPLxUtdi1AQ

  • SUSE 容器镜像:https://registry.suse.com

你应该雇佣老程序员的五个理由

译者简介:ASCE1885,《Android高级进阶》和《Android高级进阶(源码剖析篇)》作者原文链接:https://joshondesign.com/2017/07/02/hire_old_programmer你应该雇佣老程序员,我没开玩笑!当然,年长的程序员不会像大学毕业... 查看详情

vuex的五个核心概念(代码片段)

...ation:提交更新数据的方法,必须是同步的(如果需要异步使用action)。action:Action提交的是mutation,而不是直接变更状态。Action可以包含任意异步操作。modules:模块化vuex,可以让每一个模块拥有自己的stat 查看详情

sqlipl中的五个检票口(2008-2016)(代码片段)

查看详情

bean的五个作用域(代码片段)

...起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。当开发者定义一个Bean的作用域为单例时,SpringIoC容器只会根据Bean定义来创建该Bean的唯一实例。这些唯一的实例会... 查看详情

头歌hbase(相关的五个实验)(代码片段)

...e的安装与基本操作HBase伪分布式环境搭建 HBase开发:使用Java操作HBase第1关:创建表第2关:添加数据第3关:获取数据第4关:删除表HBase开发:批量操作第1关:批量获取数据第2关:批量删除数据第3... 查看详情

solid:面向对象设计的五个基本原则(代码片段)

...首字母缩略字,指代了面向对象编程和面向对象设计的五个基本原则。当这些原则被一起应用时,能够使得一个程序员开发一个容易进行维护和扩展的系统变得更加可能。SOLID是以下五个单词的缩写: SingleResponsibility... 查看详情

ajaxxmlhttprequest().readystate的五个状态(0,1,2,3,4)(代码片段)

//第1步:创建异步请求对象xhrvarxhr=newXMLHttpRequest();//第2步:注册事件监听,xhr通过监听服务器返回结果时的状态值,判断此次返回的结果是否可用xhr.onreadystatechange=function()if(xhr.readyState==4&xhr.status==200)console.log(xhr.responseTest)//这 查看详情

form全局钩子中间件的五个方法form组件(代码片段)

1在定义的form类中写下面的方法:2#局部钩子clean_字段名称,3defclean_name(self):4value=self.cleaned_data[‘name‘]5if‘大壮‘invalue:6raiseValidationError(‘含有敏感词汇:大壮‘)7else:8returnvalue9101112#全局钩子13defclean(self):14value=self.cle 查看详情

vuex的五个核心属性(代码片段)

...模块化VuexStatestate即Vuex中的基本数据!单一状态树Vuex使用单一状态树,即用一个对象就包含了全部的状态数据。state作为构造器选项,定义了所有我们需要的基本状态参数。在Vue组件中获得Vuex属性我们可以通过Vue的Co... 查看详情

react属性,函数式组件以及hook(代码片段)

属性以及函数式组件,HookReact的五个属性PureComponentrefchildrendangerouslySetInnerHTMLkey的问题函数式组件Reacthooks什么是HookReactHooks的优势常用HookHook的使用规则总结:五个属性:PureComponent、ref、children、dangerouslySetInnerHTML、keyReact的五个属性P 查看详情

react属性,函数式组件以及hook(代码片段)

属性以及函数式组件,HookReact的五个属性PureComponentrefchildrendangerouslySetInnerHTMLkey的问题函数式组件Reacthooks什么是HookReactHooks的优势常用HookHook的使用规则总结:五个属性:PureComponent、ref、children、dangerouslySetInnerHTML、keyReact的五个属性P 查看详情

在大型应用中使用redux的五个技巧(代码片段)

...于客户要在我们的平台上管理或发布广告资源,在AppNexus使用Redux创建的很多用户界面都需要处理大量数据以及非常复杂的交互。在开发这些界面的过程中,我们发现了一些有用的规则和技巧以维持Redux易于管理。以下的几点讨论... 查看详情

vue中vuex的五个属性和基本用法(代码片段)

...ns:提交更新数据的方法,必须是同步的(如果需要异步使用action)。每个mutation都有一个字符串的事件类型(type)和一个回调函数(handler)。回调函数就是我们实际进行状态更改的地方,并且它会接受state作... 查看详情

点击一个ul的五个li元素,分别弹出他们的序号,怎么做?(代码片段)

方法1:for(vari=0;i<oLis.length;i++)oLis[i].onclick=(function(j)returnfunction()alert(j);)(i);这样的话,给每个li绑定onclick事件时,其实绑的是一个立即执行函数,这个立即执行函数的参数是i,因为它是立即执行的,循环时已经把i的值赋给了li的onclick事... 查看详情

node.js在复杂集成场景下占据统治地位的五个理由

...持。此外,在集成领域,厂商本身亦越来越多地使用着JS及其相关产品。通过这种自给自足的对接方式,外加巨大的JS技能掌握者基础,Node.js表现出独一无二的易用性特征。另外,Node.js采取运行时内编译的处 查看详情

掌握python中列表生成式的五个原因

1.引言在Python中我们往往使用列表生成式来代替for循环,本文通过引入实际例子,来阐述这背后的原因。闲话少说,我们直接开始吧!2.简洁性列表生成式允许我们在一行代码中创建一个列表并对其元素执行相应的操作,这往往... 查看详情

flowable五个引擎和组成引擎的服务(代码片段)

...的EngineConfiguration进行创建,在创建过程中对每个引擎使用的服务进 查看详情

qt事件处理(代码片段)

Qt事件处理Qt事件处理的五个层次Qt应用程序事件处理的五个层次,同时也是时间流程如下图所示:说明如下:sendEvent()会把event直接发送给QCoreApplication的notify(),postEvent()把event追加到事件队列中最终也要调用notify()。notify()把事件... 查看详情