云原生之深入解析如何使用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 nodes
	Writing configuration
	Starting control-plane
	Installing CNI
	Installing 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)
   }

   @GetMapping
   fun findAll(): List<Person> = repository.findAll()

   @PostMapping
   fun add(@RequestBody person: Person): Person = repository.save(person)

   @PutMapping
   fun 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 命令。

猜你喜欢

转载自blog.csdn.net/Forever_wj/article/details/132195234