Kubernetes 生态:包管理与未来展望
1. Kubernetes 包管理器 Helm 详解
Helm 作为 Kubernetes 的包管理器,能让 Kubernetes 管理由多个相互依赖的 Kubernetes 资源组成的复杂软件,其作用类似于操作系统的包管理器。
1.1 依赖文件与 Helm 命令
依赖文件中包含
name
、
version
和
repository
字段,分别代表所需图表的名称、版本和图表仓库的完整 URL。使用
helm repo
可将仓库添加到本地。
有了依赖文件后,可运行
helm dep up
命令,它会根据依赖文件将指定的图表下载到
charts
子目录中,示例如下:
$ helm dep up foo-chart
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "local" chart repository
...Successfully got an update from the "stable" chart repository
...Successfully got an update from the "example" chart repository
...Successfully got an update from the "another" chart repository
Update Complete. Happy Helming!
Saving 2 charts
Downloading Foo from repo http://example.com/charts
Downloading Bar from repo http://another.example.com/charts
Helm 在依赖更新期间检索到的依赖图表会以图表存档的形式存储在
charts/
目录中,例如:
charts/
foo-1.2.3.tgz
bar-4.5.6.tgz
使用
requirements.yaml
管理图表及其依赖是最佳实践,有助于明确记录依赖关系、在团队中共享以及支持自动化管道。
1.2 requirements.yaml 中的特殊字段
requirements.yaml
文件中的每个条目可能包含可选字段
tags
和
condition
,用于动态控制图表的加载:
-
condition
:该字段包含一个或多个 YAML 路径(用逗号分隔)。如果此路径存在于顶级父级的值中并解析为布尔值,则图表将根据该布尔值启用或禁用。只评估列表中找到的第一个有效路径,如果没有路径存在,则该条件无效。
-
tags
:该字段是一个 YAML 标签列表,用于关联此图表。在顶级父级的值中,可以通过指定标签和布尔值来启用或禁用所有带有标签的图表。
以下是
requirements.yaml
和
values.yaml
的示例,展示了如何使用条件和标签来启用和禁用依赖项的安装:
# parentchart/requirements.yaml
dependencies:
- name: subchart1
repository: http://localhost:10191
version: 0.1.0
condition: subchart1.enabled, global.subchart1.enabled
tags:
- front-end
- subchart1
- name: subchart2
repository: http://localhost:10191
version: 0.1.0
condition: subchart2.enabled,global.subchart2.enabled
tags:
- back-end
- subchart2
# parentchart/values.yaml
subchart1:
enabled: true
tags:
front-end: false
back-end: true
安装图表时,也可以从命令行设置标签和条件值,它们将优先于
values.yaml
文件:
helm install --set subchart2.enabled=false
标签和条件的解析规则如下:
- 条件(在值中设置时)始终覆盖标签。找到的第一个条件路径生效,该图表的后续条件将被忽略。
- 如果图表的任何标签为
true
,则启用该图表。
- 标签和条件值必须在顶级父级的值中设置。
-
values
中的
tags
键必须是顶级键,不支持全局和嵌套标签。
1.3 使用模板和值
重要的应用程序需要根据具体用例进行配置和调整。Helm 图表是使用 Go 模板语言填充占位符的模板,支持 Sprig 库中的额外函数和其他一些专用函数。模板文件存储在图表的
templates/
子目录中,Helm 会使用模板引擎渲染该目录中的所有文件并应用提供的值文件。
以下是
artifactory
图表的服务模板文件示例:
kind: Service
apiVersion: v1
kind: Service
metadata:
name: {{ template "artifactory.fullname" . }}
labels:
app: {{ template "artifactory.name" . }}
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
component: "{{ .Values.artifactory.name }}"
heritage: {{ .Release.Service }}
release: {{ .Release.Name }}
{{- if .Values.artifactory.service.annotations }}
annotations:
{{ toYaml .Values.artifactory.service.annotations | indent 4 }}
{{- end }}
spec:
type: {{ .Values.artifactory.service.type }}
ports:
- port: {{ .Values.artifactory.externalPort }}
targetPort: {{ .Values.artifactory.internalPort }}
protocol: TCP
name: {{ .Release.Name }}
selector:
app: {{ template "artifactory.name" . }}
component: "{{ .Values.artifactory.name }}"
release: {{ .Release.Name }}
Helm 允许在模板文件中使用丰富而复杂的语法,通过内置的 Go 模板函数、Sprig 函数和管道。以下是一个利用这些功能的示例模板:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
greeting: "Hello World"
drink: {{ .Values.favorite.drink | repeat 3 | quote }}
food: {{ .Values.favorite.food | upper | quote }}
如果值文件包含以下部分:
favorite:
drink: coffee
food: pizza
则生成的图表如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: cool-app-configmap
data:
greeting: "Hello World"
drink: "coffeecoffeecoffee"
food: "PIZZA"
1.4 嵌入预定义值
Helm 提供了一些预定义值,可在模板中使用,例如
Release.Name
、
Release.Service
、
Chart.Name
和
Chart.Version
等。其他预定义值包括:
-
Release.Time
-
Release.Namespace
-
Release.IsUpgrade
-
Release.IsInstall
-
Release.Revision
-
Chart
-
Files
-
Capabilities
Chart
是
Chart.yaml
的内容,
Files
和
Capabilities
预定义值是类似映射的对象,可通过各种函数访问。需要注意的是,
Chart.yaml
中的未知字段会被模板引擎忽略,不能用于将任意结构化数据传递给模板。
1.5 从文件提供值
可以提供自己的 YAML 值文件在安装命令期间覆盖默认值,例如:
helm install --values=custom-values.yaml gitlab-ce
值文件可以为顶级图表以及该图表的
charts/
目录中包含的任何图表声明值。顶级图表可以访问其依赖图表的值,但反之则不行。此外,还有一个全局值可供所有图表访问。
2. Kubernetes 的未来展望
Kubernetes 作为一个大型开源项目,其未来发展涉及多个方面,包括路线图、竞争态势、社区动力等。
2.1 路线图与即将发布的版本
Kubernetes 有较为规律的发布周期。截至 2018 年 4 月,当前版本是 1.10,下一个版本 1.11 已完成 33%。以下是 1.11 版本的部分工作示例:
- 更新到 Go 1.10.1 并将默认 etcd 服务器更新到 3.2
- 支持外部认证提供程序
- 将 kublet 标志迁移到 kublet.config.k8s.io
- 添加对 Azure 标准负载均衡器和公共 IP 的支持
- 添加
kubectl api-resources
命令
次要版本每 3 个月发布一次,补丁版本用于修复漏洞和问题,直到下一个次要版本发布。以下是最近三个版本的发布日期:
| 版本 | 发布日期 |
| ---- | ---- |
| 1.10.0 | 2018 年 3 月 26 日 |
| 1.9.6 | 2018 年 3 月 21 日 |
| 1.9.0 | 2017 年 12 月 15 日 |
| 1.8.5 | 2017 年 12 月 7 日 |
| 1.8.0 | 2017 年 9 月 28 日 |
| 1.7.7 | 2017 年 9 月 28 日 |
查看 1.10 版本的主要主题如下:
- Node
- Network
- Storage
- Windows
- OpenStack
- API machinery
- Auth
- Azure
- CLI
Kubernetes 的大部分开发工作在多个工作组中进行,未来版本的规划主要在这些特殊兴趣小组(SIGs)和工作组中完成。SIGs 会定期开会讨论。
2.2 竞争态势
在容器编排领域,Kubernetes 面临着多种竞争,但目前已取得明显优势。
- Docker Swarm :Docker 推出的 Docker Swarm 产品,其优点是作为 Docker 安装的一部分,使用标准 Docker API,学习曲线较浅。但在功能和成熟度方面远落后于 Kubernetes,且 Docker 在高质量工程和安全方面声誉不佳。尽管 Docker 采取了一些改进措施,但 Docker Swarm 可能最终仅用于小型原型开发。
- Mesos/Mesosphere :Mesosphere 基于开源的 Apache Mesos 开发了 DC/OS 产品,技术成熟,但缺乏 Kubernetes 的资源和动力。在 DC/OS 1.11 中,提供了 Kubernetes 即服务,表明 Mesosphere 选择加入 Kubernetes 生态。
- 云平台 :
- AWS :Kubernetes 可以通过官方的 Kubernetes Kops 项目在 AWS 上良好运行,但 Kops 不是官方 AWS 解决方案。过去,AWS 内置的容器编排解决方案 ECS 更受欢迎,但现在 AWS 全力投入 Kubernetes,正在发布 Elastic Kubernetes Service (EKS)。预计 ECS 最终将成为遗留服务。
- Azure :Azure 提供 Azure 容器服务,用户可以选择使用 Kubernetes、Docker Swarm 或 DC/OS。随着 Kubernetes 在功能、成熟度和影响力方面的提升,预计它将成为 Azure 上的首选编排选项。
- Alibaba Cloud :曾经基于 Docker Swarm 提供容器管理服务,现在已加入 Kubernetes 支持者行列,有多个资源可用于在阿里云上部署和管理 Kubernetes 集群。
2.3 Kubernetes 的社区动力
Kubernetes 拥有强大的社区支持,具有巨大的发展动力。
-
社区
:Kubernetes 是第一个从云原生计算基金会(CNCF)毕业的项目。
-
GitHub
:在 GitHub 上开发,是顶级项目之一,在星标数上处于前 0.01%,活跃度排名第一。过去一年,Kubernetes 变得更加模块化,许多组件现在单独开发。
-
贡献者和提交数
:一年前,Kubernetes 有大约 1100 名贡献者和 34000 次提交,现在已激增至超过 1600 名贡献者和 63000 次提交。
综上所述,Kubernetes 在包管理和未来发展方面都展现出强大的实力和潜力,在容器编排领域占据着重要地位。
Kubernetes 生态:包管理与未来展望
3. 教育与培训的重要性
容器编排是一个新兴且快速发展的领域,很多人对其了解并不深入,因此教育和培训在 Kubernetes 的未来发展中扮演着至关重要的角色。随着 Kubernetes 在企业中的广泛应用,越来越多的组织和开发者需要掌握相关技能来进行容器编排和管理。
目前,市场上已经出现了许多针对 Kubernetes 的培训课程和学习资源,包括在线教程、书籍、培训视频等。这些资源可以帮助初学者快速入门,了解 Kubernetes 的基本概念和操作方法。同时,一些专业的培训机构也提供了深入的培训课程,帮助开发者掌握更高级的技能,如 Helm 包管理、Kubernetes 集群的优化和扩展等。
以下是学习 Kubernetes 的一般步骤:
1.
学习基础知识
:了解容器、容器编排的基本概念,以及 Kubernetes 的核心组件和功能。
2.
实践操作
:通过搭建本地测试环境,进行一些简单的 Kubernetes 操作,如部署应用、管理服务等。
3.
深入学习
:学习 Helm 等工具的使用,掌握 Kubernetes 的高级特性和配置方法。
4.
参与社区
:加入 Kubernetes 社区,参与讨论和交流,了解最新的技术动态和发展趋势。
4. 模块化与外部插件
Kubernetes 的模块化设计是其未来发展的重要方向之一。模块化使得 Kubernetes 更加灵活和可扩展,开发者可以根据自己的需求选择合适的组件和插件。
4.1 模块化的优势
- 易于开发和维护 :各个模块可以独立开发和测试,降低了开发和维护的难度。
- 可扩展性 :可以根据需要添加或替换模块,满足不同的应用场景。
- 灵活性 :用户可以根据自己的需求选择合适的组件,构建定制化的 Kubernetes 环境。
4.2 外部插件
Kubernetes 支持外部插件,这些插件可以扩展 Kubernetes 的功能。例如,认证插件可以提供不同的认证方式,存储插件可以支持不同的存储系统。
以下是一个简单的 mermaid 流程图,展示了 Kubernetes 模块化和插件的关系:
graph LR
A[Kubernetes核心] --> B[模块1]
A --> C[模块2]
A --> D[模块3]
B --> E[插件1]
C --> F[插件2]
D --> G[插件3]
5. 服务网格与无服务器框架
服务网格和无服务器框架是 Kubernetes 未来发展的另外两个重要方向。
5.1 服务网格
服务网格是一种用于管理微服务之间通信的基础设施层。它可以提供流量管理、安全、可观测性等功能,帮助开发者更好地管理和监控微服务。
Kubernetes 与服务网格的结合可以为微服务架构提供更强大的支持。例如,Istio 是一个流行的服务网格,它可以与 Kubernetes 集成,提供流量管理、策略执行和可观测性等功能。
以下是服务网格的主要功能:
-
流量管理
:控制微服务之间的流量,实现负载均衡、熔断、重试等功能。
-
安全
:提供身份验证、授权和加密等安全机制,保护微服务之间的通信。
-
可观测性
:收集和分析微服务之间的通信数据,提供监控和日志等功能。
5.2 无服务器框架
无服务器框架允许开发者在不管理服务器基础设施的情况下运行应用程序。Kubernetes 可以与无服务器框架集成,提供更高效的资源利用和更灵活的部署方式。
例如,Knative 是一个基于 Kubernetes 的无服务器框架,它可以让开发者在 Kubernetes 上轻松部署和管理无服务器应用。
以下是无服务器框架的优势:
-
降低成本
:无需管理服务器基础设施,降低了运营成本。
-
提高效率
:可以根据实际需求自动扩展和收缩资源,提高资源利用率。
-
简化开发
:开发者可以专注于业务逻辑的开发,无需关心服务器的管理和维护。
6. 总结
Kubernetes 在容器编排领域已经取得了巨大的成功,并且在未来有着广阔的发展前景。通过 Helm 等包管理工具,Kubernetes 可以更好地管理复杂的应用程序。同时,其模块化设计、服务网格和无服务器框架等特性也为其未来的发展提供了更多的可能性。
在竞争方面,虽然 Kubernetes 面临着一些挑战,但已经在市场上占据了主导地位。随着社区的不断发展和壮大,Kubernetes 的功能和性能将不断提升,为企业和开发者提供更强大的支持。
未来,教育和培训将在 Kubernetes 的推广和应用中发挥重要作用。同时,模块化、服务网格和无服务器框架等技术的发展也将进一步推动 Kubernetes 的创新和发展。
总之,Kubernetes 作为容器编排的领导者,将继续在云计算和容器技术领域发挥重要作用,为企业和开发者带来更多的价值。
超级会员免费看
53

被折叠的 条评论
为什么被折叠?



