Kubernetes简介以及如何使用YAML配置?

 Kubernetes 提供的极大简单性,这部分归功于 Kubernetes 资源模型 (KRM)。

KRM资源模型描述了一种以清晰易懂的格式创建配置文件的机制:

  • 允许使用代码指定所需的系统状态。
  • 通用声明性元数据的概念是 KRM 的重要组成部分。

因此,KRM 通常表示为 YAML,建立了 Kubernetes 中的所有内容都可以提炼为 YAML 的核心概念。

Kubernetes 和 YAML
与用于云原生应用程序的 21 世纪 Linux 内核版本相比,Kubernetes 代表了我们管理现代 IT 系统并与之交互的方式的重大转变。这一比较强调了 Kubernetes 和 Linux 之间的相似之处,强调它们访问和更改系统信息的共同能力,尽管通过不同的机制。

Linux 中的 /proc 目录提供对内核和大量系统数据的访问。检查这些虚拟文件流允许用户调查和检索有关系统的信息。同样,API 是 Kubernetes 中系统内部运作的门户。该API公开了整个Kubernetes集群的信息,并允许用户查询和控制Kubernetes资源。

至关重要的是,这种可访问性是由 Linux 和 Kubernetes 中的可访问格式提供的。它是 Linux 中的虚拟文件流和 Kubernetes 中的 YAML 文件。YAML 文件提供了一种结构化且人类可读的方法来定义配置和预期状态。

此方法简化了系统管理、配置和监控任务:

  • 人性化: YAML 文件易于人们访问且易于使用,这使其成为配置的绝佳选择。
  • 多功能性和表现力: YAML 的多功能性使其能够表达广泛的配置和数据结构,从而允许广泛的用例。
  • 易于设置和操作:设置和操作都很简单,最大限度地缩短了 Kubernetes 和相关系统新手的学习曲线。
  • 跨语言兼容性: YAML 可以轻松地从一种编程语言翻译为另一种编程语言,从而促进互操作性。
  • 一致的数据模型: YAML 文件遵循一致的数据模型,简化了通用工具和解析器的构建。
  • 一次性处理: YAML 文件可以一次性处理,从而提高人力和机器效率。
  • 使用简单:它们减少了在命令行上键入复杂命令的需要,从而使与系统的通信变得更加容易。
  • 版本控制: YAML 文件可以添加到源代码控制系统中以启用版本控制和更改跟踪。
  • 适应性: YAML 描述复杂数据结构的能力使其适合构建命令行无法实现的复杂设置。
  • DevSecOps 和协作性质:出于几个令人信服的原因,使用 YAML 确保实施的相同类型和一致性至关重要,特别是在 DevSecOps 和现代 IT 运营的协作性质的背景下:
  • 清晰度和可读性:由于 YAML 是结构化的,因此配置清晰易读。当每个人都遵循相同的类型和结构时,所有团队成员都可以更轻松地理解和使用配置,而不受部门或职能的影响。这种清晰度可以提高理解和沟通。

现实生活中的例子
想象一下在您办公室的典型一天,不同的团队一起工作以保持公司的应用程序和系统顺利运行。您有开发团队、运营团队和安全团队,每个团队都有自己独特的职责。

有一天,出现了一个令开发和运营团队头疼的问题。他们花了好几个小时绞尽脑汁,试图找出为什么应用程序在一种环境中运行完美,但在另一种环境中却惨败,尽管一切看起来都一样。

当他们遇到障碍时,沮丧感油然而生。他们决定联系安全团队,希望他们能提供一些见解。毕竟,他们听说他们使用的第三方解决方案可能是罪魁祸首。

令所有人惊讶的是,安全团队深入研究后发现,第三方解决方案在容器中运行的应用程序进程中引入了一些隐藏元素。这些隐藏的元素阻碍了开发和运营团队认为的正常行为。

现在,这就是令人沮丧的地方。安全团队访问了其他人没有访问过的某些界面和信息。他们需要专业知识和独特的途径才能发现这个问题。
但这种情况提出了一个重要问题:您是否应该始终需要针对任何与基础设施相关的问题进行安全检查?如果每个相关人员(无论是开发人员、运营人员还是安全人员)都能看到并了解基础设施中发生的情况,这不是更好吗?

想象一下一个所有团队都可以平等访问相同信息和工具的工作场所。当出现问题时,团队无缝协作以快速识别和解决问题。在这里,每个人都对系统的安全性、可靠性和性能共同承担责任。

在这样的环境中,问题可以更快地得到解决,每个人都感到有权贡献自己的专业知识,并且安全性不是看门人,而是流程的一个组成部分。这种协作方法可以使操作更加顺畅,并确保您的系统安全并符合行业法规。

最终,它是为了创建一个工作场所,让每个人都拥有成功所需的工具和知识,并且透明度和团队合作是解决挑战的关键。

如何使用YAML
在 Kubernetes 中,首选的配置语言是 YAML(YAML 不是标记语言)。它用于定义和配置各种 Kubernetes 资源和应用程序。YAML 以其简单和人类可读的风格,成为定义和维护 Kubernetes 集群中资源的不错选择。在 Kubernetes 中,YAML 的使用方法如下:

资源定义:在 Kubernetes 中,YAML 主要用于定义资源的理想状态。每个资源都有自己的 YAML 配置文件,如 pod、服务、部署、配置映射和机密。

apiVersion: v1  
kind: Pod  
metadata:  
  name: my-pod  
Spec:  
  containers:  
  - name: nginx-container  
    image: nginx:latest  

此示例中的 YAML 文件定义了一个名为 "my-pod "的 pod,其中有一个运行最新版本 Nginx 映像的容器。

Labels & Metadata:
Metadata(如name名称、label标签和annotation注释)是资源定义的重要组成部分。

  • annotation注释用于保存非标识性信息,
  • label标签是键值对,可提供有关资源的更多信息。

apiVersion: v1  
kind: Pod  
metadata:  
  name: my-pod  
  labels:  
    app: my-app  
  annotations:  
    description: This is my pod.  
spec:  
  containers:  
  - name: nginx-container  
    image: nginx:latest  

本例中的 pod 有label标签("app: my-app")和带有说明的annotation注释。

apiVersion: v1  
kind: Pod  
metadata:  
  name: my-pod  
spec:  
  containers:  
  - name: nginx-container  
    image: nginx:latest  
    ports:  
    - containerPort: 80  
  volumes:  
  - name: data-volume  
    hostPath:  
      path: /data  

YAML 文件定义了一个包含 Nginx 容器和卷挂载的 pod。

Services 和 Networking:
YAML 文件用于定义 Kubernetes 服务和网络配置,如服务类型(ClusterIP、NodePort、LoadBalancer)、端口和选择器。

apiVersion: v1  
kind: Service  
metadata:  
  name: my-service  
spec:  
  selector:  
    app: my-app  
  ports:  
  - protocol: TCP  
    port: 80  
    targetPort: 80  

此 YAML 文件定义了一项服务,可将流量路由到标有 "app: my-app "的 pod。

Deployments和Controllers:
YAML 文件用于定义更高级别的控制器,如部署、状态集和 DaemonSets。这些控制器负责管理 pod 的生命周期和扩展。

apiVersion: apps/v1  
kind: Deployment  
metadata:  
  name: my-deployment  
spec:  
  replicas: 3  
  selector:  
    matchLabels:  
      app: my-app  
  template:  
    metadata:  
      labels:  
        app: my-app  
    spec:  
      containers:  
      - name: nginx-container  
        image: nginx:latest  

该 YAML 文件定义了一个部署,可确保运行 Nginx 的 pod 有三个副本。

配置文件:
Kubernetes 还使用 YAML 配置文件来设置集群范围内的配置,包括身份验证、授权和网络策略。

apiVersion: v1  
kind: ConfigMap  
metadata:  
  name: my-config  
data:  
  key1: value1  
  key2: value2  

该 YAML 文件定义了一个 ConfigMap,其中包含可用于配置设置的键值对。

Helm 图表
Helm 是 Kubernetes 的软件包管理器,它使用 YAML 文件来定义封装 Kubernetes 应用程序的 Helm 图表。Helm 图表包括模板、值文件和元数据,全部用 YAML 定义。

apiVersion: v1  
kind: Service  
metadata:  
  name: {{ .Release.Name }}-web  
spec:  
  selector:  
    app: {{ .Chart.Name }}  
  ports:  
    - port: 80  
      targetPort: 8080  

这是 Kubernetes 服务的 Helm 图表模板示例。

YAML 是定义和配置 Kubernetes 资源的标准语言。它用于定义资源规范,包括元数据、配置、服务、控制器等。Kubernetes 会解释这些 YAML 文件,以创建、更新或删除资源,从而与 YAML 配置中指定的所需状态相匹配。了解如何编写和管理 YAML 文件是有效使用 Kubernetes 的基础。