云原生之深入解析如何使用Devtron简化K8S应用开发

一、NeuVector 简介

① 什么是 NeuVector ?

  • NeuVector 是业界首个端到端的开源容器安全平台,唯一为容器化工作负载提供企业级零信任安全的解决方案。NeuVector 是业界领先的安全和合规解决方案,已被全球知名企业广泛采用;其代码库的开源不仅使 NeuVector 成为开源社区的首选技术,还为受严格监管的客户(包括政企、金融)提供了更可靠的保证。
  • NeuVector 开源容器镜像可以安装在任何 Kubernetes 集群上,支持包括红帽 OpenShift、VMWare Tanzu、Google GKE、Amazon EKS、Microsoft Azure AKS 等在内的众多企业级容器管理平台。
  • NeuVector 将驱动 SUSE 旗舰 Kubernetes 管理平台:SUSE Rancher 的容器安全创新,此举将有助于推动 Kubernetes 安全领域的重大生态系统革新,此前这一领域通常由闭源的专有解决方案主导。

在这里插入图片描述

② 功能特性

  • NeuVector 提供强大的端到端容器安全平台。这包括对容器、Pod 和主机的端到端漏洞扫描和完整的运行时保护,包括:
    • CI/CD 漏洞管理和准入控制,使用 Jenkins 插件扫描镜像、扫描注册表并强制实施准入控制规则以将其部署到生产环境中;
    • 违规保护,发现行为并创建基于白名单的策略来检测违反正常行为的行为;
    • 威胁检测,检测容器上的常见应用程序攻击,例如 DDoS 和 DNS 攻击;
    • DLP 和 WAF 传感器,检查网络流量以防止敏感数据丢失,并检测常见的 OWASP Top10 WAF 攻击;
    • 运行时漏洞扫描,扫描注册表、镜像和正在运行的容器编排平台和主机以查找常见 (CVE) 以及特定于应用程序的漏洞;
    • 合规与审计,自动运行 Docker Bench 测试和 Kubernetes CIS Benchmarks- -
    • 端点/主机安全,检测权限升级,监控主机和容器内的进程和文件活动,并监控容器文件系统的可疑活动;
    • 多集群管理。从单个控制台监控和管理多个 Kubernetes 集群。
  • NeuVector 的其他特性包括隔离容器和通过 SYSLOG 和 webhooks 导出日志的能力,为调查启动数据包捕获,以及与 OpenShift RBACs、 LDAP、 Microsoft AD 和 SSO 与 SAML 的集成。
  • 需要注意的是,隔离意味着所有网络通信都被阻塞,容器将保持并继续运行——只是没有任何网络连接。Kubernetes 不会启动一个容器来替换隔离的容器,因为 api-server 仍然能够到达容器。

③ 全生命周期安全

  • 构建:镜像构建扫描,避免生成有隐患的镜像;
  • 部署:通过准入控制策略机制,避免有隐患的镜像和不符合策略要求的容器部署到环境;
  • 运行:四层/七层防火墙避免外部攻击和数据窃取;
  • 运行:东西向网络动态微隔离,避免内部攻击扩展,WAF 防火墙避免外部攻击;
  • 运行:容器内病毒、木马、破解器防护;
  • 主机、Runtime、 K8S 级别安全基线扫描,合规性评估。

④ 优势

  • 开放性:100% 开源,无需担心供应商锁定;
  • 灵活性:灵活部署各类 Kubernetes 发行版,Rancher、Openshift、EKS、 GKE、ACK、 TKE。
  • 可靠性:7 年迭代,成熟稳定产品;
  • 专业性:专业支持服务,保障业务安全可靠持续运行。

⑤ 部署模式

  • NeuVector 运行时容器安全方案包括四种类型安全容器:Controllers,Enforcers,Managers,Scanners。其能够部署为一个 Allinone 的特殊容器,也能即将个功能组合在一个容器总,当然也可以在虚拟机或单个操作系统的裸机上面部署。

在这里插入图片描述

  • NeuVector 提供操作系统/Runtime/K8s/容器应用三个层面安全业务进行保护:

在这里插入图片描述

二、在 K8S 上安装 Devtron

  • 在 K8S 上安装 Devtron,有两种安装选项:带 CI/CD 模块或不带它。本文不会构建 CI/CD 流程,但是这个模块中包含了一些重要功能。
  • 首先,添加 Devtron Helm 存储库:
$ helm repo add devtron https://helm.devtron.ai
  • 然后,执行以下 Helm 命令:
$ helm install devtron devtron/devtron-operator \--create-namespace --namespace devtroncd \--set installer.modules={cicd}

三、使用 Kind 创建第二个 K8S 集群

  • 为了在本地机器上准备多集群环境,将使用 Kind,通过执行以下命令来创建第二个 K8S 集群 c1:
https://kind.sigs.k8s.io/
$ kind create cluster --name c1
  • 第二个集群的上下文是:kind-c1,创建 Kind 集群后,它将成为默认上下文:
Creating cluster "c1" ...Ensuring node image (kindest/node:v1.25.2)Preparing nodesWriting configurationStarting control-planeInstalling CNIInstalling StorageClass
Set kubectl context to "kind-c1"
You can now use your cluster with:
kubectl cluster-info --context kind-c1
  • 现在的目标是将新创建的 Kind 集群添加为 Devtron 的托管集群,一个 Devtron 实例可以管理多个 K8S 集群。当然,默认情况下,它只管理一个本地集群,在将 Kind 集群添加到 Devtron 仪表板之前,应该首先在该集群上配置权限。以下脚本将生成一个 bearer token 用于身份验证,以便 Devtron 能够与目标集群通信:
$ curl -O https://raw.githubusercontent.com/devtron-labs/utilities/main/kubeconfig-exporter/kubernetes_export_sa.sh && bash kubernetes_export_sa.sh cd-user devtroncd https://raw.githubusercontent.com/devtron-labs/utilities/main/kubeconfig-exporter/clusterrole.yaml
  • bearer token 打印在该命令的输出中,复制它:
All done! Test with:
KUBECONF IG=tmp/k8s- cd-user- -devtroncd- conf-7821. conf kubectl get pods
you should not have any permissions by default - you have just created the authentication part
You will need to create RBAC permissions
SERVER URL := https://127.0.0.1:63241
------------------------------------
BEARER TOKEN := eyJhbGc iOiJSUzI1NiIsImtpZCI6IjlMZ0dqUkU4Z1R6MHpYdnNBVWVWeUdyb1ZldFBkbjJlLWt1ZE52UV9NdzAifQ. eyJhdWQiOlsiaHRØcHM6Ly9rdwJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN8ZXIujoxNjY1Njc1MTkxLCJpYXQi0jE2NjN1ImlzcyI6Imh8dHBz0i8va3viZXuX0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2Ui0iJkZXZ0cm9uY2QiLCJzZXJ2aWNlYWNjb3VudCI6eyJuYW1lIjoiY2QtdXNlciIsInVpZCI6ImJiZmNjZTdhLWUxMTEtNDZlNi1iNzRiLTAxZTc20DQ5ZGM50SJ9fSwi bmJmIjoxNjY1NjcxNTkxLCJzdWI iOiJz eXN0ZW06c2Vydm1 jZWF jY291bnQ6ZGV2dHJvbmNkOmNkLXVzZXIifQ.p_ 9oJFTDjYgzlDIrp0YVCP_ IAMjbGfKks Es7jgpP84mLØ- -WUWBht4zLBxc3xNFflvwJYa4.UØMkRkF4Yq9VojeIKjuAUDmFfT4CDNlfI32WvCuQFVvCboEv0_139biA6T51X0Yyl1dvsLHw2_w8TumgiuKPD63lV6ZaIewNpHu7f6bb7xa4Hp1xqPu_rBLbr7iTSkbHzQGKula9WiJRY3AhYcg0p3h0YKDEh1HpeV9g_HvMFpr0aZR98f8J_OGXiWYWWuRrUlFbYL0S5fele6B7FcUby0uRVXlvRw8GQdnhKaiyna4owgCvBIEH4AYE0XR_ -j8RQ-FttYdg
  • 还必须提供目标集群的 master API 的 URL,由于在 Kind 上运行 K8S,需要获取包含 Kind 的 Docker 容器的内部地址。为了获得它,需要运行以下命令:
$ docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' c1-control-plane
  • 这是 Kind 集群的 IP 地址:
~ % docker inspect -f 'f(range . Ne tworkSettings . Ne tworks)il. IPAddress)llfend))' c1-control-plane
172.19.0.2
  • 现在拥有了在 Devtron 仪表板中添加新托管集群所需的所有数据。为此,导航到 Global Configuration 部分,然后选择 Clusters and Environments 项并单击 Add cluster 按钮,需要填写 Kind 集群 URL 和之前生成的 bearer token:

在这里插入图片描述

  • 如果一切正常,可以在托管集群列表中看到第二个集群。现在还需要根据下面显示的消息在 Kind 上安装 Devtron 代理:

在这里插入图片描述

四、创建环境

  • 定义三个环境,在 Devtron 环境中分配给集群,在本地集群(local)上创建一个环境,和另外两个 Kind 集群(remote-dev, remote-devqa),每个环境都有一个目标命名空间。为了简化,命名空间的名称与环境名称相同,当然也可以设置任何想要的名称:

在这里插入图片描述

  • 切换到 Clusters 视图:

在这里插入图片描述

  • 可以看到,现在有两个集群连接到 Devtron:

在这里插入图片描述

  • 可以看一下每个集群的详细信息,在这里可以看到 kind-c1 集群的详细视图:

在这里插入图片描述

五、添加自定义 Helm 存储库

  • Devtron 最重要的功能之一是对 Helm 图表的支持。默认情况下,Devtron 中有几个可用的 Helm 存储库,包括 bitnami 或 elastic,也可以添加自定义存储库,在这里使用 Helm 存储库,其中包含用于部署 Spring Boot 应用程序的图表,图表名称是 spring-boot-api-app,最新版本是 0.3.2:

在这里插入图片描述

  • 为了在 Devtron 中添加自定义存储库,需要再次进入 Global Configurations 部分,然后转到 Chart repositories 菜单项,然后单击 Add repository 按钮。如下所示,添加一个新存储库 piomin:

在这里插入图片描述

  • 创建存储库后,可以转到 Chart Store 部分以验证新图表是否可用:

在这里插入图片描述

六、使用 Devtron 部署 Spring Boot 应用程序

  • 现在可以进行实践中最重要的部分:应用程序部署,本文示例 Spring Boot 应用程序可以到Kotlin编写的示例spring引导应用程序下载,这是一个用 Kotlin 编写的简单 REST 应用程序,它公开了一些用于添加和返回人员的 HTTP 端点,并使用内存存储,这是 Spring @RestController:
@RestController
@RequestMapping("/persons")
class PersonController(val repository: PersonRepository) {val log: Logger = LoggerFactory.getLogger(PersonController::class.java)@GetMapping("/{id}")fun findById(@PathVariable id: Int): Person? {log.info("findById({})", id)return repository.findById(id)}@GetMapping("/age/{age}")fun findByAge(@PathVariable age: Int): List<Person> {log.info("findByAge({})", age)return repository.findByAge(age)}@GetMappingfun findAll(): List<Person> = repository.findAll()@PostMappingfun add(@RequestBody person: Person): Person = repository.save(person)@PutMappingfun update(@RequestBody person: Person): Person = repository.update(person)@DeleteMapping("/{id}")fun remove(@PathVariable id: Int): Boolean = repository.removeById(id)}
  • 假设正在开发最新版本,想将其部署在 K8S 上以执行一些开发测试,第一步将在本地构建应用程序并使用 Jib Maven 插件将镜像推送到容器注册表,这是所需的配置:
<plugin><groupId>com.google.cloud.tools</groupId><artifactId>jib-maven-plugin</artifactId><version>3.3.0</version><configuration><to><image>piomin/sample-spring-kotlin-microservice</image><tags><tag>1.1</tag></tags></to><container><user>999</user></container></configuration>
</plugin>
  • 让使用以下命令构建镜像并将其推送到容器注册表:
$ mvn clean compile jib:build -Pjib,tomcat
  • 除了 YAML 模板,Helm 存储库还包含一个用于values.yaml 验证的 JSON schema,多亏了该 schema ,将能够利用 Devtron GUI 从图表创建应用程序,那么它是如何工作的呢?
  • 单击自定义图表后,将被重定向到包含详细信息的页面,最新版本的图表是0.3.2. 只需单击部署按钮。在下一页上,需要提供应用程序的配置,目标环境是存在于主集群上的 local,多亏 Devtron 对 Helm values.schema.json 的支持,使得使用 GUI 表单定义所有值。例如,可以增加更改镜像的值到最新的 1.1:

在这里插入图片描述

  • 部署应用程序后,可以验证其状态:

在这里插入图片描述

  • 再进行一些测试调用,示例 Spring Boot 公开了 Swagger UI,因此可以轻松发送 HTTP 请求。要与运行在 K8S 上的应用程序交互,应该为服务启用端口转发 kubectl port-forward svc/sample-spring-boot-api 8080:8080。执行该命令后,可以通过 http://localhost:8080/swagger-ui.html 访问地址 Swagger UI:

在这里插入图片描述

  • Devtron 允许查看 pod 日志,还可以用 grep,如下展示了与测试调用相关的日志:

在这里插入图片描述

七、将应用部署到远程集群

  • 现在将示例 Spring Boot 应用程序部署到远程集群,为了实现这一点,可以转到与以前相同的页面,但不要选择本地环境,而是选择 remote-dev,它与 kind-c1 集群相关联:

在这里插入图片描述

  • 现在,有两个相同的应用程序在两个不同的集群上运行,可以对在 Kind 集群上运行的应用程序和本地集群执行相同的操作,例如验证其状态或检查日志:

在这里插入图片描述

八、部署应用组

  • 假设要部署连接到数据库的应用程序,那么可以使用名为 Chart Group 的 Devtron 功能一步完成。使用该功能,可以将 Spring Boot 的 Helm 图表和 Postgres 的图表放在同一个逻辑组中。然后,可以将整个组部署到目标环境中,要创建图表组,请转到 Chart Store 菜单,然后单击 Create Group 按钮,应该设置组的名称并选择将包含的图表。这里来说,就是 bitnami/postgresql 图表和自定义 Helm 图表:

在这里插入图片描述

  • 创建组后,将在 Chart Store 主页面上看到它,只需单击它即可部署应用程序:

在这里插入图片描述

  • 单击带有图表组的磁贴后,将被预测到部署页面:

在这里插入图片描述

  • 单击 Deploy to… 按钮后,Devtron 会将重定向到下一页,因此可以为该组的所有成员图表设置目标项目和环境,将它们从集群部署到 kind-c1 集群的 remote-devqa 命名空间中,其中的镜像,可以填写 Docker 帐户中的:piomin/person:1.1。
  • 默认情况下,它会尝试连接到 postgres 主机上的数据库,唯一需要注入应用容器的是 postgresql Secret(由 Bitnami Helm 图表生成)中 postgres 用户密码,要注入该 Secret 中的环境变量,请在自定义 Spring Boot 图表中使用 extraEnvVarsSecret 参数。最后,通过单击 Deploy 按钮在 remove-devqa 命名空间中部署 Spring Boot 和 Postgres:

在这里插入图片描述

  • 本次实践中已部署应用程序的最终列表:

在这里插入图片描述

九、总结

  • 借助 Devtron,可以使用 Helm 图表轻松地支持跨多个 K8S 集群部署应用程序。
  • Devtron 简化了 K8S 的开发,可以通过图表组功能部署所有需要的应用程序。
  • 可以使用 GUI 仪表板管理和监控应用程序。
  • 可以在仪表板中执行所有操作,而无需自己传递任何 YAML 清单或执行 kubectl 命令。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/60264.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

适用HarmonyOS 3.1版本及以上的应用及服务开发工具 DevEco Studio 3.1.1 Release 安装

文章目录 安装步骤1.下载安装包2.安装成功后&#xff0c;初次运行studio2.1 配置node与ohpm的环境2.2安装sdk2.3等待安装结束 3.创建项目3.1 点击Create Project3.2 选择一个空项目3.3 项目配置3.4 Finish、等待依赖下载完毕3.5 项目创建完成 tip 提示4.配置运行环境4.1 真机运…

爬虫015_python异常_页面结构介绍_爬虫概念介绍---python工作笔记034

来看python中的异常 可以看到不做异常处理因为没有这个文件所以报错了 来看一下异常的写法

Idea 反编译jar包

实际项目中&#xff0c;有时候会需要更改jar包源码来达到业务需求&#xff0c;本文章将介绍一下如何通过Idea来进行jar反编译 1、Idea安装decompiler插件 2、找到decompiler插件文件夹 decompiler插件文件夹路径为&#xff1a;idea安装路径/plugins/java-decompiler/lib 3、…

正则表达式的使用

1、正则表达式-教程 正则表达式&#xff1a;文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a到z之间的字母&#xff09;和特殊字符&#xff08;称为元字符&#xff09;。 正则表达式使用单个字符串来描述&#xff0c;匹配一系列匹配某个句法规则的字符串。 2、…

【uniapp】一文读懂app端安装包升级

一、前言 首先&#xff0c;在app端开发上线的过程中&#xff0c;会面临一个问题&#xff0c;就是关于app端的版本升级的问题。如果不做相关处理来引导用户的话&#xff0c;那么app就会出现版本没有更新出现的各种问题&#xff0c;我们常见的有在线升级和去指定地址下载安装两种…

计算机网络—IP

这里写目录标题 IP的基本认识网络层与数据链路层有什么关系IP地址基础知识IP 地址的分类什么是A、B、C类地址广播地址用来做什么什么是D、E类广播多播地址用于什么IP分类的优点IP分类的缺点 无分类地址CIDR如何划分网络号和主机号怎么进性子网划分 公有 IP 地址与私有 IP 地址公…

修改el-select样式;修改element-plus的下拉框el-select样式

修改el-select样式 .select_box{// 默认placeholder:deep .el-input__inner::placeholder {font-size: 14px;font-weight: 500;color: #3E534F;}// 默认框状态样式更改:deep .el-input__wrapper {height: 42px;background-color: rgba(0,0,0,0)!important;box-shadow: 0 0 0 …

获取Spring中bean工具类

获取Spring中bean工具类 工具类 package com.geekmice.springbootselfexercise.utils;import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org…

Flink源码之JobManager启动流程

从启动命令flink-daemon.sh中可以看出StandaloneSession入口类为org.apache.flink.runtime.entrypoint.StandaloneSessionClusterEntrypoint, 从该类的main方法会进入ClusterEntrypoint::runCluster中, 该方法中会创建出主要服务和组件。 StandaloneSessionClusterEntrypoint:…

【cs61b】学习笔记day2

历史文章目录 【cs61b】学习笔记day1 文章目录 历史文章目录List两个小问题bits声明一个变量引用类型方框和指针表示法数组的实例化链表 SLList List 两个小问题 思考下面两个代码分别输出什么 Walrus a new Walrus(1000, 8.3); Walrus b; b a; b.weight 5; System.out.…

博客项目(Spring Boot)

1.需求分析 注册功能&#xff08;添加用户操纵&#xff09;登录功能&#xff08;查询操作)我的文章列表页&#xff08;查询我的文章|文章修改|文章详情|文章删除&#xff09;博客编辑页&#xff08;添加文章操作&#xff09;所有人博客列表&#xff08;带分页功能&#xff09;…