Kubernetes 支持
最后更新时间:2024 年 05 月
SnapDevelop 的 Kubernetes 支持旨在简化 Kubernetes 管理。它提供了一个新的、方便的 UI,使您在 IDE 内部更容易开发、调试和部署 Kubernetes 应用程序。
通过阅读本文,您将了解 SnapDevelop 中的 Kubernetes 功能,以及如何使用 SnapDevelop 的 Kubernetes 支持执行 Kubernetes 最常见的操作,以及如何将项目部署和发布到 Kubernetes 集群中。
关于 Kubernetes
Kubernetes,也称为 K8s,是一个用于自动部署、扩展和管理容器化应用程序的开源系统。
它将构成应用程序的容器组合成逻辑单元,以便于管理和服务发现。 Kubernetes 源自 Google 15 年生产环境的运维经验,同时凝聚了社区的最佳创意和实践。
有关 Kubernetes 的更多信息,请访问以下链接:什么是 Kubernetes?
前提条件
安装组件
在安装 SnapDevelop 时,请您确保 Docker 开发 和 Kubernetes 开发 组件被选中安装。
安装 Docker 和 Kubernetes 环境
为了能够使用 SnapDevelop 的 Kubernetes 功能,需要访问 Kubernetes 集群。可以使用 Docker Desktop 创建本地单节点 Kubernetes 集群(仅用于测试)。请点击 此链接 了解更多信息。
本教程将主要围绕 工作负载 部分创建的部署。而对于 使用 Kubernetes 运行项目 部分,将结合一个示例项目进行介绍。
Kubernetes 资源管理器
SnapDevelop 提供了 Kubernetes 资源管理器 工具,让您可以在 SnapDevelop IDE 中管理 Kubernetes 集群的资源(包括部署、Ingress、Secret、配置映射等)。当 Kubernetes 资源管理器 和 容器资源管理器 结合使用时,您可以在SnapDevelop IDE 中将项目直接部署到 Kubernetes 集群中。
打开 Kubernetes 资源管理器
要打开 Kubernetes 资源管理器,请选择菜单 视图 > Kubernetes 资源管理器。
Kubernetes 资源管理器 将在 IDE 的侧边栏中打开。
连接到集群
如果您正在运行本地集群(使用minikube、Docker Desktop 等),该集群将自动显示在 Kubernetes 资源管理器 中。
要将外部集群添加到 Kubernetes 资源管理器,请单击 创建集群连接 图标:
创建集群连接 窗口将显示。
- 名称 -- 集群的名称。该名称只是资源管理器中集群的显示名称。
- 服务器 -- 连接的集群的协议、 IP、和端口。
- 证书颁发机构数据 -- (仅限 HTTPS) 用于签署客户端证书的证书颁发机构 (CA) 证书的数据。
- 认证类型 -- 选择是使用 X.509 客户端证书(X509ClientCerts)进行身份验证还是使用不记名令牌(Token)。
- 客户端证书数据 -- (仅限 X.509 客户端证书身份验证) 由 CA 签名的客户端证书的 PEM 数据。
- 客户端密钥数据 -- (仅限 X.509 客户端证书身份验证) 客户端私钥的 PEM 数据。
- 令牌 -- (仅限令牌身份验证) 有效的服务帐户令牌。
查看集群
成功连接集群以后,您可以通过右键菜单查看集群的信息。右键点击集群,然后选择 查看。
将打开集群的详细信息视图。该视图有 5 个选项卡:
- 节点 -- 显示集群里每个服务器节点的信息和运行状态,以及提供查看 YAML 描述、打开终端窗口(通过命令操作服务器)及暂停\恢复调度的功能。
- 存储 -- 显示持久卷的信息。持久卷按照存储类型显示。您可以根据持久卷的状态或者命名空间来查找。您还可以查看 YAML 描述以及删除持久卷。
- 访问控制 -- 显示集群角色绑定和集群角色。您还可以查看 YAML 描述以及删除角色绑定和角色。
- 自定义资源 -- 显示自定义资源的信息。您还可以查看 YAML 描述以及删除自定义资源。
- 事件 -- 显示集群相关的事件。您可以查看事件执行返回的信息。
安装 Helm 包
安装 Helm 包 功能旨在简化并快速部署应用服务到 Kubernetes 集群中。您无需安装 Helm CLI 客户端或学习使用 Helm 命令。
您只需将 Kubernetes 集群内部运行应用程序、工具或服务所需的所有资源定义整合成 Helm 包(也叫 chart),并准备好专门的配置文件(例如:values.yaml)用于相应部署。关于 Helm 的更多信息,请参考 https://helm.sh/zh/docs/ 。
然后右键点击集群,选择 安装 Helm 包。
在 Helm 包安装窗口中,指定以下信息,然后点击 确认。
- Helm 包路径 -- 将要被安装的 chart 的所在路径。
- Release 实例名 -- 将要部署生成的 release 对象名字。
- 命名空间 -- 将要部署到的集群的命名空间。
- Values 文件 -- chart 的可配置选项。该文件中的配置将覆盖 chart 的默认配置。
安装完成后,您将在 Kubernetes 资源管理器 的 应用 > Helm Releases 节点下面看到一个新的 release 实例名。要查看和删除一个 release 实例,请参考 应用。
应用 YAML 内容
成功连接集群以后,您可以通过执行 YAML 内容来操作集群,比如创建或编辑工作负载、服务等。
右键点击集群,然后选择 应用 YAML 内容。
在 YAML 编辑器中输入 YAML 内容,或者打开一个或多个 YAML 文件。然后点击 应用。
设置为当前上下文
成功连接多个集群以后,如果想使用命令操作不同集群,可以使用 设置为当前上下文 功能快速切换到不同集群,例如:想要在 appeoncluster2 集群上使用命令,可以右键点击 appeoncluster2 集群,然后选择 设置为当前上下文,即可在 appeoncluster2 集群上使用命令,无需手动输入命令切换到该集群。
被设置为当前上下文的集群会显示一个绿色小圆点图标。
命名空间(Namespace)
Kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群。 这些虚拟集群被称为命名空间。 在一些文档里命名空间也称为名字空间。
命名空间适用于存在很多跨多个团队或项目的用户的场景。对于只有几到几十个用户的集群,根本不需要创建或考虑命名空间。当需要命名空间提供的功能时,请开始使用它们。命名空间为名称提供了一个范围。资源的名称需要在命名空间内是唯一的,但不能跨命名空间。 命名空间不能相互嵌套,每个 Kubernetes 资源只能在一个命名空间中。命名空间是在多个用户之间划分集群资源的一种方法(通过 资源配额)。不必使用多个命名空间来分隔仅仅轻微不同的资源,例如同一软件的不同版本: 应该使用 标签 来区分同一命名空间中的不同资源。
命名空间是 Kubernetes 资源管理器 中的第一级对象(集群对象的子对象),图标为。默认情况下,Kubernetes 会创建四个初始命名空间,如下图所示。
每个命名空间都以相同的方式对其资源进行分组,下面小节中将详细描述。
创建命名空间
要创建新的命名空间,请右键单击集群节点并选择 创建命名空间:
输入命名空间的名称后单击 确认。
右键单击集群节点并选择 刷新。新建的命名空间将在列表中显示出来。
删除命名空间
要删除一个命名空间,请右键单击该命名空间,然后选择 删除。
工作负载(Workloads)
工作负载是在 Kubernetes 上运行的应用程序。SnapDevelop 的 Kubernetes 资源管理器 支持以下两种类型的工作负载:
Deployment
Deployment 很适合用来管理集群上的无状态应用,Deployment 中的所有 Pod 都是相互等价的,并且在需要的时候被换掉。您可以定义 Deployment 来创建新的 ReplicaSet,或者删除现有的 Deployment 并将其所有资源用于新的 Deployment。有关Deployment的更多信息,请查看 此链接。
StatefulSet
StatefulSet 让你能够运行一个或者多个以某种方式跟踪应用状态的 Pods。 例如,如果你的负载会将数据作持久存储,你可以运行一个 StatefulSet,将每个 Pod 与某个 PersistentVolume 对应起来。你在 StatefulSet 中各个 Pod 内运行的代码可以将数据复制到同一 StatefulSet 中的其它 Pod 中以提高整体的服务可靠性。
和 Deployment 类似, StatefulSet 管理基于相同容器规约的一组 Pod。但和 Deployment 不同的是, StatefulSet 为它们的每个 Pod 维护了一个有粘性的 ID。这些 Pod 是基于相同的规约来创建的, 但是不能相互替换:无论怎么调度,每个 Pod 都有一个永久不变的 ID。所以 StatefulSet 可以用来管理一组 Pod 的部署和扩展,并保证这些 Pod 的顺序和唯一性。
如果希望使用存储卷为工作负载提供持久存储,可以使用 StatefulSet 作为解决方案的一部分。 尽管 StatefulSet 中的单个 Pod 仍可能出现故障, 但持久的 Pod 标识符使得将现有卷与替换已失败 Pod 的新 Pod 相匹配变得更加容易。
有关有StatefulSet 的更多信息,请查看 此链接。
当 Deployment 的 Pod 被销毁时,一个新的 Pod 将创建,尽管它具有新的身份(网络 ID、存储、Pod 名称)。它是无状态的。但是如果一个 StatefulSet Pod 被销毁的话,一个新的 Pod 将创建并获得想要的状态,它的身份将被保留。
工作负载(Workloads)显示在 Kubernetes 资源管理器 的 工作负载 节点下,Deployment 类型的工作负载图标为 ,StatefulSets 类型的工作负载图标为
。
创建工作负载
要创建一个工作负载,请右键单击 工作负载 节点并选择 添加部署 (Deployment )或 添加有状态副本集 (StatefulSets )。在此示例中,将创建一个部署(Deployment)。
请查看 Deployments 和 StatefulSets 的相应文档以获取更多信息。
这将打开创建部署窗口:
基本设置:
- 部署名称 -- 部署的名称。
- 副本数 -- 部署将尝试维护多少个 Pod 副本(实例)。
- 调度节点 -- 托管调度程序的节点。
- 注解 -- 附加到 Pod 的附加信息。通常用于跟其他工具进行信息传达。
- 标签 -- 用于标识此部署创建的 Pod。
容器组设置:
- 容器名 -- 容器的名称。
- 镜像 -- 容器将拉取的镜像。
- 镜像拉取策略 -- Pod 的镜像拉取策略。请参阅下面的更多细节。
- 容器端口 -- 将要暴露的容器端口。
- 环境变量 -- 将要传递给容器的环境变量。
- 命令 -- 将要传递给容器的命令。
- 参数 -- 应用程序入口点的参数。将跟随命令一起传递到容器。
- 卷 -- 将挂载在容器上的卷。请参阅下面的更多细节。
- 存活探针 -- 将被查询以了解容器是否处于良好状态的容器端点。如果此请求失败,容器将重新启动。
- 就绪探针 -- 将被查询以了解容器是否准备好接收请求的容器端点。在此端点返回成功之前,它不会接收客户端的请求。
- 所需资源 -- 指定此 Pod 工作所需的最小资源量。请参阅下面的更多细节。
- 资源限制 -- 指定允许此 Pod 拥有的最大资源量。如果超过此值:对于 CPU,进程被限制;对于内存,容器被终止。请参阅下面的更多细节。
- 指标伸缩 -- 在特定 CPU 和内存条件下自动扩展部署。
镜像拉取策略
创建容器时要遵循的策略:
- IfNotPresent -- 当在本地缓存中找不到请求的镜像时,将搜索配置的注册表。
- 总是 -- 即使本地缓存中存在副本,仍然从注册表中检索镜像。
- 从不 -- 不管本地注册表中是否存在镜像,也不会搜索注册表。如果镜像不在缓存中,容器创建将失败。
本地存储
将被挂载到容器中的资源。点击 添加,可以添加以下类型的资源:
- 临时目录:容器启动时为空的目录,可以在 Pod 中的所有容器之间共享(可能使用不同的挂载点),并且在 Pod 被删除时将被永久删除。
- 主机路径:将一个目录从托管 Pod(挂载源)的节点映射到容器(容器路径)。
- 密钥:将 Secret 作为文件挂载到容器中。详细信息,请参阅 Secret。
- 配置项:与密钥类似,将 ConfigMap 作为文件挂载到容器中。详细信息,请参阅 ConfigMaps。
- 卷声明:将卷声明挂载到容器中。详细信息,请参阅 PersistentVolumeClaims。
所需资源
指定 Pod 所需的最小资源量。 Pod 将会被调度到有这些可用资源的节点上。如果没有节点有可用的资源,则 Pod 将不可用,直到有可用的资源。容器可以自由地使用或过度使用其请求的资源。
资源限制
指定特定容器可以使用的最大资源量。 Kubernetes 会限制容器的进程以使其服从 CPU 限制,但如果该进程试图超过内存限制,则该进程将被终止。
查看工作负载
可以右键单击一个工作负载然后选择 查看 来访问该工作负载的详细信息。
这将打开工作负载详细信息视图:
此视图有 3 个选项卡:
- 概况 -- 显示该工作负载的基本信息。
- 事件 -- 显示与该工作负载相关的事件。
- YAML -- 呈现该工作负载的 YAML 描述。
编辑工作负载
可以右键单击一个工作负载然后选择 编辑 来编辑该工作负载的信息:
这将打开该工作负载的编辑视图,它类似于创建工作负载时的视图。有关详细信息,请参阅创建工作负载部分。完成编辑后,单击 保存 按钮。
重新启动工作负载
对工作负载的某些更改不会立即反映在 Pod 上(例如更改镜像版本)。对于这些情况,可以选择重新启动工作负载。这将启动所有 Pod 的替换序列,同时确保在整个过程中至少有一个 Pod 可用(即没有停机时间)。如果在重新部署期间发生错误,更改将被回滚。
要重新启动一个工作负载,请右键单击该工作负载,然后选择 重新启动。
Pod 中的更改将在资源管理器中可见。如下图所示:
删除工作负载
可以右键单击一个工作负载然后选择 删除 来删除该工作负载:
请注意,部署及其 Pod 将被删除,但依赖这些 Pod 的服务不会被删除。
Pod
Pod 是 Kubernetes 中创建和管理的、最小的可部署的计算单元。
Pod 是一组(一个或多个)容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。有关 Pod 的更多信息,请访问 此链接。
在 SnapDevelop 的 Kubernetes 资源管理器 中,您不能直接创建 Pod。相反,它们总是由工作负载对象生成。 Pod 显示在它们所属的工作负载节点下面:
查看 Pod
与工作负载一样,您可以通过右键单击一个 Pod 然后选择 查看 来查看该 Pod 的信息。
Pod 的详细信息视图包含以下选项卡:
- 概况 -- 显示该 Pod 的基本信息,包括网络详细信息、状态和它正在运行的容器。
- 日志 -- 显示其容器的日志。
- 文件 -- 显示其容器的文件系统。
- 事件 -- 显示捕获的任何事件。
- YAML -- 呈现 Pod 的 YAML 描述。
将终端嵌入 Pod
要将终端嵌入到某个 Pod 的默认容器中,请右键单击该 Pod,然后选择 打开终端窗口:
这会在指定的 Pod 的容器内部中打开一个终端窗口,并显示在底部面板上:
删除 Pod
要删除一个 Pod,请右键单击该 Pod,然后选择 删除:
以这种方式删除 Pod 将会导致另一个 Pod 被创建来替换它。这是部署控制器的工作。确保部署配置中指定的副本数不变。
暴露服务
当您右键单击一个工作负载或 Pod 时,您还可以选择 暴露服务 来将该工作负载或 Pod 作为一个服务创建出来。详细信息,请参考下一小节:服务。
网络(Network)
服务(Service)
服务是一种将运行在一组 Pod 上的应用程序公开为网络服务的抽象方法。
使用 Kubernetes 您无需修改应用程序即可使用不熟悉的服务发现机制。 Kubernetes 为 Pod 提供自己的 IP 地址,并为一组 Pod 提供相同的 DNS 名, 并且可以在它们之间进行负载均衡。更多信息,请点击 此链接。
在 SnapDevelop 的 Kubernetes 资源管理器 中,服务(Service)显示在的 网络 > 服务 节点下面。
创建服务
服务必须从工作负载或 Pod 中创建。
要从工作负载或 Pod 中创建一个服务,请右键单击某个工作负载或 Pod 节点,然后选择 暴露服务。
服务的配置窗口将打开:
- 服务名称:服务的名称。
- 服务类型
- 内部:该服务仅在集群内部可见。
- 外部:该服务将可供集群外部访问。有两种类型:
- LoadBalancer:通过使用集群的云提供商将服务暴露在外部。
- NodePort:通过在每个节点上使用静态端口来公开服务。
- 开启无头服务:(仅限内部)无头服务没有被分配 IP,它们用于在不使用代理的情况下发现 Pod 的 IP。
- 端口映射:定义服务和容器之间的端口映射。
- 名称:端口的名称。端口也可以按名称引用。
- 节点端口:将暴露的节点端口。默认情况下只允许 30000-32767 之间的值。如果此字段为空,它将被随机赋值。
- 服务端口:服务可用的端口。
- 容器端口:请求的服务端口将被转发到的容器端口。
- 负载均衡器 IP:(仅限 LoadBalancer)用于 LoadBalancer 的 IP(如果云提供商支持的话)。
查看服务
要查看一个服务,请右键单击该服务然后选择 查看:
这将打开服务详细信息视图。此视图由 3 个选项卡组成:
- 概况 -- 显示服务的基本信息。
- 事件 -- 显示与服务相关的事件。
- YAML -- 呈现服务的 YAML 描述。
编辑服务
要编辑一个服务,请右键单击该服务,然后选择 编辑。将显示一个类似于创建服务的对话框。
删除服务
要删除一个服务,请右键单击该服务,然后选择 删除。
入口(Ingress)
Ingress 将来自集群外部的 HTTP 和 HTTPS 路由暴露给集群内的服务。流量路由由 Ingress 资源上定义的规则控制。
Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。Ingress 控制器负责实现 Ingress,通常使用负载均衡器,但它也可以配置边缘路由器或其他前端来帮助处理流量。
您必须有一个 Ingress 控制器才能满足 Ingress。仅创建 Ingress 资源没有任何效果。
有关 Kubernetes Ingress 资源的更多信息,请点击 此链接。
在 SnapDevelop 的 Kubernetes 资源管理器 中,Ingress 显示在 网络 > 入口 节点下面。
添加入口
要添加一个入口,请右键单击 入口 文件夹,然后选择 添加:
这将打开入口配置窗口:
- 入口类型:当前版本只支持 nginx。
- 名称:入口资源的名称。
- 默认后端:如果开启,需指定服务名称和端口。与 路由规则 的 域名 和 路径映射 匹配的对 Ingress 的 HTTP(和 HTTPS )请求将发送到列出的后端。通常在 Ingress 控制器中会配置开启默认后端,以服务于无法与 路径映射 匹配的请求。
- 路由规则:定义服务和 URL 之间的映射。
- 域名:将被监听的域名。
- HTTPS:是否需要 HTTPS 连接。如果启用,则需要选择一个密钥。
- 路径映射:定义 URI 和 Kubernetes 服务之间的映射。
- 注解:附加到资源的附加元数据。在这种情况下,需要使用注解
kubernetes.io/ingress.class=nginx
才能使得入口与nginx-ingress
一起工作。 - 标签:标识此入口资源的标签。
点击 高级设置 可以配置后端协议、请求正文大小限制、重定向目标、是否使用正则表达式、是否开启粘性会话、是否开启 Canary 等设置。
完成设置后,单击 保存。将创建入口资源,但可能需要一些时间(取决于云提供商本身)才能可用。
查看入口
要查看一个入口,请右键单击该入口,然后选择 查看:
这将打开入口详细信息视图。此视图由 3 个选项卡组成:
- 概况 -- 显示入口的基本信息。
- 事件 -- 显示与入口相关的事件。
- YAML -- 呈现入口的 YAML 描述。
编辑入口
要编辑一个入口,请右键单击该入口,然后选择 编辑:
删除入口
要删除一个入口,请右键单击该入口,然后选择 删除:
配置中心
本节将介绍通过环境变量、命令行参数或卷将数据传递给 Pod 的两种方法:密钥(Secrets)和配置映射(ConfigMap)。
密钥(Secrets)
Secret 是一个包含少量敏感数据(例如密码、令牌或密钥)的对象。此类信息可能会被放入 Pod 规范或容器镜像中。使用 Secret 意味着您不需要在应用程序代码中包含机密数据。
因为 Secret 可以独立于使用它们的 Pod 创建,所以在创建、查看和编辑 Pod 的工作流程中暴露 Secret(及其数据)的风险较小。 Kubernetes 和在集群中运行的应用程序还可以对 Secrets 采取额外的预防措施,例如避免将机密数据写入非易失性存储。
Secret 与 ConfigMap 类似,但 Secret 专门用于保存机密数据。
请注意,默认情况下,Kubernetes Secret 未加密地存储在 API 服务器的底层数据存储 (etcd) 中。任何拥有 API 访问权限的人都可以检索或修改 Secret,任何有权访问 etcd 的人也可以。此外,任何有权在命名空间中创建 Pod 的人都可以使用该访问权限来读取该命名空间中的任何 Secret;这包括间接访问,例如创建部署(Deployment)的能力。
有关 Secrets 的更多信息,请访问 此链接。
在 SnapDevelop 的 Kubernetes 资源管理器 中, Secrets 显示在 配置中心 > 密钥 节点下。
创建密钥
要创建一个密钥,请右键单击 密钥 节点,然后选择 添加:
这将打开密钥编辑器:
- 密钥名称 -- 密钥的名称。在密钥被引用时所使用的名称。
- 密钥类型 -- 提供两种密钥类型:Opaque(用户定义的任意数据)或 TLS(主要用于 Ingress 资源终结 TLS 链接的证书和密钥)。
- 字符串数据 -- (仅限 Opaque )一对包含敏感数据的键值。
- TLS Crt -- (仅限 TLS )用于终结 TLS 链接的可信证书,必须是 PEM 编码。
- TLS 密钥 -- (仅限 TLS )用于终结 TLS 链接的密钥,必须是 PEM 编码。
查看密钥
要查看一个密钥,请右键单击该密钥,然后选择 查看:
这将打开密钥详细信息视图。此视图由两个选项卡组成:
- 概况 -- 显示密钥的基本信息。由于默认情况下密钥是加密的,因此 SnapDevelop 提供了工具来显示解码的数据。
- YAML -- 呈现密钥的 YAML 描述。
编辑密钥
要编辑一个密钥,请右键单击该密钥,然后选择 编辑:
删除密钥
要删除一个密钥,请右键单击该密钥,然后选择 删除:
配置映射(ConfigMap)
ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。与 Secret 一样,Pod 可以将 ConfigMaps 用作环境变量、命令行参数或卷中的配置文件。
ConfigMap 允许您将环境配置与容器镜像分离,以便您的应用程序易于移植。
请注意,ConfigMap 不提供保密或加密功能。如果您要存储的数据是机密的,请使用 Secret 而不是 ConfigMap,或者使用其他(第三方)工具来保护您的数据的私密性。
有关 ConfigMap 的更多信息,请点击 此链接。
在 SnapDevelop 的 Kubernetes 资源管理器 中,ConfigMap 显示在 配置中心 > 配置项 节点下。
创建配置映射
要创建一个配置映射,请右键单击 配置项 节点然后选择 添加。
这将打开创建配置映射对话框:
- 配置项名 -- 配置映射的名称。这是配置映射被引用时所使用的名称。
- 字符串数据 -- 定义配置映射的一对键值。
查看配置映射
要查看一个配置映射,请右键单击该配置映射,然后选择 查看:
这将打开配置映射详细信息视图。此视图由两个选项卡组成:
- 概况 -- 显示配置映射的基本信息。
- YAML -- 呈现配置映射的 YAML 描述。
编辑配置映射
要编辑一个配置映射,请右键单击该配置映射,然后选择 编辑:
删除配置映射
要删除一个配置映射,请右键单击该配置映射,然后选择 删除:
请务必记住,不要使用配置映射来存储敏感数据。要存储凭据、令牌等信息,应使用密钥。
存储
卷声明(PersistentVolumeClaim)
卷声明(PersistentVolumeClaim,PVC)表达的是用户对存储的请求。概念上与 Pod 类似。 Pod 会耗用节点资源,而 PVC 会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存);同样 PVC 也可以请求特定的大小和访问模式。
有关 PersitentVolumeClaim 和 Kubernetes 持久存储的更多信息,请点击 此链接。
在 SnapDevelop 的 Kubernetes 资源管理器 中,PersistentVolumeClaim 显示在 存储 > 卷声明 节点下。
创建卷声明
要创建一个卷声明,请右键单击 卷声明 节点,然后选择 添加。
这将打开创建卷声明对话框:
- 名称 -- 卷声明的名称。这是卷声明被引用时所使用的名称。
- 请求容量 -- 向供应商请求的卷的容量。
- 访问模式 -- 向供应商请求的访问模式。有4种存储访问模式:
- ReadWriteOnce:卷一次只能由一个节点写入/读取。
- ReadOnlyOnce:该卷一次只能被一个节点读取。
- ReadWriteOncePod:该卷一次只能写入/读取一个 Pod。
- ReadWriteMany:该卷可以同时写入/读取多个节点。
- 持久卷 -- 要使用的配置类型。目前仅支持动态供应(即按需创建卷)。
- 存储类 -- 将提供存储的存储类。存储类由集群管理员配置。
查看卷声明
要查看一个卷声明,请右键单击该卷声明,然后选择 查看:
这将打开卷声明详细信息窗口。此视图有 3 个选项卡:
- 概况 -- 显示卷声明的基本信息。
- YAML -- 呈现卷声明的 YAML 描述。
- 事件 -- 显示与卷声明相关的事件。
编辑卷声明
要编辑一个卷声明,请右键单击该卷声明,然后选择 编辑:
删除卷声明
要删除一个卷声明,请右键单击该卷声明,然后选择 删除:
访问控制
服务帐号(Service Accounts)
服务帐号是 Pod 用来执行对 Kubernetes API 的请求的特殊帐户。每个命名空间至少有一个服务帐号:default
,它拥有所有权限,可以在集群中做任何事情。但是,这是一种不好的做法,另外建议将 Pod 与服务帐号相关联,从而为其提供其功能所需的最低权限。
有关 Kubernetes 中的服务帐号和身份验证的更多信息,请点击 此链接。
在 SnapDevelop 的 Kubernetes 资源管理器 中,服务账号(Service Accounts)显示在 访问控制 > 服务帐户 节点下。
编辑服务帐号
要编辑一个服务帐号,请右键单击该服务帐号,然后选择 编辑:
这将在 YAML 编辑器中打开服务帐号:
角色(Roles)
角色包含表示一组权限的规则。角色总是在特定的命名空间内设置权限;创建角色时,必须指定它所属的命名空间。
有关角色的更多信息,请点击 此链接。
在 Kubernetes 资源管理器 中,角色(Roles)显示在 访问控制 > 角色 节点下。
编辑角色
要编辑一个角色,请右键单击该角色,然后选择 编辑:
这将在 YAML 编辑器中打开角色:
角色绑定(RoleBindings)
角色绑定将角色中定义的权限授予一个用户或一组用户。它包含一个主题列表(用户、组或服务帐户),以及对被授予角色的引用。 角色绑定授予特定命名空间内的权限。
有关角色绑定的更多信息,请访问 此链接。
在 Kubernetes 资源管理器 中,角色绑定(RoleBindings)显示在 访问控制 > 角色绑定 节点下。
编辑角色绑定
要编辑一个角色绑定,请右键单击该角色绑定,然后选择 编辑:
这将在 YAML 编辑器中打开角色绑定:
自定义资源(CustomResource)
自定义资源是 Kubernetes API 的扩展。本小节将讨论何时向 Kubernetes 集群添加自定义资源以及何时使用独立服务。它描述了添加自定义资源的两种方法以及如何在它们之间进行选择。
资源是 Kubernetes API 中的一个端点,用于存储某种 API 对象的集合;例如,内置的 Pods 资源包含 Pod 对象的集合。
自定义资源是 Kubernetes API 的扩展,在默认 Kubernetes 安装中不一定可用。它表示对特定 Kubernetes 安装的自定义。但是,现在许多核心 Kubernetes 功能都是使用自定义资源构建的,这使得 Kubernetes 更加模块化。
有关 Kubernetes 自定义资源的更多信息,请访问 此链接。
在 SnapDevelop 的 Kubernetes 资源管理器 中,自定义资源(CustomResource)显示在 自定义资源 节点下:
自定义资源先按类型分组,再按命名空间分组。
编辑自定义资源定义
要编辑一个自定义资源定义,请右键单击该自定义资源定义,然后选择 编辑。
这将在 YAML 编辑器中打开自定义资源定义:
编辑自定义资源对象
要编辑一个自定义资源对象,请右键单击该对象,然后选择 编辑:
这将在 YAML 编辑器中打开自定义资源对象:
删除自定义资源对象
要删除一个自定义资源对象,请右键单击该自定义资源对象,然后选择 删除。
应用
Helm 帮助您管理 Kubernetes 应用程序;Helm Charts 帮助您定义、安装和升级甚至是最复杂的 Kubernetes 应用程序。
要阅读有关 Helm 和 Charts 的更多信息,请访问 此链接。
在 SnapDevelop 的 Kubernetes 资源管理器 中,通过 Helm 安装的应用程序(称之为Helm Release)显示在 应用 > Helm Releases 节点下。
查看应用程序
要查看一个通过 Helm 安装的应用程序,请右键单击该应用程序,然后选择 查看:
这将显示应用的详细视图。此视图有 3 个选项卡:
- 概况 -- 显示应用程序的基本信息。
- Values -- Helm 包的部署配置信息。当前版本暂不支持修改。
- YAML -- 呈现 Helm Release 创建的资源的 YAML 描述。
删除应用程序
删除应用程序也会删除它安装的所有资源。
要删除一个通过 Helm 安装的应用程序,请右键单击该应用程序,然后选择 删除:
将项目发布到 Kubernetes
首先创建一个 ASP.NET Core Web API 项目,该项目将在以下示例中使用。
创建项目
选择菜单 文件 > 新建 > 新建项目,然后选择 ASP.NET Core Web API 项目类型,并点击 下一步。
将其命名为 SampleAPI 并单击 下一步。
使用默认设置,然后单击 创建。
添加 Kubernetes 支持
要将 Kubernetes 支持添加到项目中,请右键单击该项目,然后选择 添加 > Kubernetes 支持。
在弹出的对话框中选择(或创建)一个集群并单击 确认:
项目中将添加以下文件夹和文件:charts 文件夹(包含项目的 Helm Chart 定义)和 Dockerfile 文件。
如果要自定义 Kubernetes 部署,请编辑 charts > sampleapi > templates 目录中的文件:
完成后,您可以单击运行按钮在 Kubernetes 上运行项目。
该项目将被编译并部署到集群,并且服务将被创建:
由于项目(以及调试器)还将被构建成 Docker 镜像并推送至注册表,您可能还需要指定 Docker 容器引擎(请参考下一小节),或者在本地安装 Docker Desktop。
添加 Kubernetes Compose 容器编排
SnapDevelop 支持两种容器编排器:Kubernetes Compose 和 Docker Compose。本教程讨论 Kubernetes Compose。关于 Docker Compose 的使用说明,请参考 添加 Docker Compose 容器编排。
容器编排是一种部署由多个容器组成的应用程序的机制,声明有哪些容器以及它们之间如何交互。然后容器编排器确保被请求的容器已启动,当其中一个容器失败时,它会尝试重新启动容器(如果策略允许的话)。
当解决方案中包含有多个项目,需要部署到容器时,建议使用容器编排来同时部署多个项目。
假设我们有一个由两个项目组成的解决方案。您可以选择为每个项目添加 Kubernetes 支持(即,按照前面描述的方法向每个项目添加 Kubernetes 支持,每个项目中将添加 charts 文件夹和 Dockerfile 文件)。
或者将两个项目添加到容器编排。您需要对两个项目逐个进行操作。
请右键单击第一个项目并选择 添加 > 容器编排支持。
在 容器编排 下拉列表中选择 Kubernetes Compose,然后单击 确认。
指定集群信息(包括:集群源、集群上下文、命名空间)和镜像信息(包括:容器引擎、和存储仓库)。然后单击 确认。
解决方案中将新增一个 kubernetes-compose 的项目。
kubernetes-compose 项目包括 .dockerignore、kubernetes-compose.override.yml、kubernetes-compose.yml 和 launchSettings.kcproj.json 文件。
- .dockerignore 设置了哪些文件和目录(不必要的大文件或敏感文件和目录)不发送到守护进程(daemon)。
- kubernetes-compose.override.yml 定义了容器的参数例如环境、URL、端口等。
- kubernetes-compose.yml 定义了要创建的容器和服务。
- launchSettings.kcproj.json 定义了容器编排和集群的相关参数。
您可以通过右键单击 kubernetes-compose 项目节点并选择 卸载项目 来删除 Kubernetes 容器编排支持。
kubernetes-compose.yml 是 Kubernetes Compose的描述文件,下面是一个示例。目前它只包含一个容器(因为我们目前只对第一个项目添加了 容器编排支持)。
要添加第二个容器,请对第二个项目重复前面的步骤。之后,kubernetes-compose.yaml 文件将更新如下。
如果您的解决方案中还有其他的项目,请重复前面的步骤逐个将项目添加到容器编排。
使用 Kubernetes 运行项目
确保运行配置设置为 Kubernetes,或者从下拉菜单中选择 Kubernetes。单击运行按钮将在 Kubernetes 集群上编译并运行项目。
Kubernetes 调试设置
Kubernetes 的调试设置位于项目属性的 调试 选项卡中。可以在 Kubernetes 按钮下拉菜单中选择 SampleAPI 属性 或者右键单击项目然后选择 属性,然后在属性窗口中选择 调试 选项卡。
项目的 调试 选项卡将显示如下。关于该选项卡的详细说明,请参考 调试。
如果选择 Kubernetes,您还可以设置:
- 启动浏览器 -- 项目运行时是否打开浏览器运行指定地址。
- Kubernetes 设置 -- 项目将被部署到的集群。
点击 修改 按钮可以更改 Kubernetes 的相关设置,例如:
- 集群源 -- 当前版本只支持 Kubernetes。
- 集群上下文 -- 连接和部署项目的集群。可以选择 新建 创建一个新集群。
- 命名空间 -- 项目对象所在的命名空间。可以选择 新建 创建一个新命名空间。
- 容器引擎 -- 将用来构建镜像的 Docker 引擎的位置。如果是 localhost,请确保本地已安装 Docker Desktop。可以选择 新建连接 连接到另一个容器引擎。
- 推送到仓库 -- 构建的镜像将被推送到的存储仓库。可以选择 新建连接 连接到另一个仓库。
通过终端窗口
您也可以安装 Kubectl 工具后,在终端窗口(例如 Windows PowerShell、Windows Command)中使用 Kubernetes 相关命令来发布和运行项目。例如:您可以在 Kubernetes 资源管理器 中右键单击某个 Pod,然后选择 打开终端窗口。
这将在该 Pod 的容器内部打开一个 PowerShell 终端窗口。您可以直接输入命令操作对应的 Pod 容器。
调试
要在 Kubernetes 集群上调试项目,请查阅 在 Docker 或 Kubernetes 环境中调试项目。
发布到 Kubernetes
要将项目发布到 Kubernetes 集群,请右键单击该项目,然后选择 发布。
在 发布 窗口选择 Kubernetes 集群 并单击 下一步。
选择 Helm 客户端作为发布工具,然后选择 下一步。
指定镜像信息(包括:容器引擎、镜像、和存储仓库)以及集群信息(包括:Helm 包路径、集群源、集群上下文、命名空间),点击 下一步。
填写应用和部署设置的信息,点击 下一步。
如需稍后验证项目是否发布成功,建议这里将 服务类型 设置为 外部 (这将生成外部 URL,使得服务可供集群外部访问)。
查看发布配置并单击 发布。
输出 面板中将显示发布过程。
如果发布成功,发布向导将显示以下消息。
应用的详细信息页面也将自动打开。
发布完成后,在 Kubernetes 资源管理器 中连接到集群可以看到以下新增或更新节点。
如需在外部验证该服务,请右键点击该服务,然后选择 查看,获取该服务的外部 URL。(如该外部 URL 不存在,请右键点击该服务然后选择 编辑,将 服务类型 设置为 外部。这将生成该服务的外部 URL)。
然后在浏览器中输入该 URL 以及对应的 API 接口名,如下所示。
参考
使用 Minikube 和 Katacoda 创建 Kubernetes 集群
使用 Docker Desktop 创建本地 Kubernetes 集群