全面的 Kubernetes 课程:掌握容器编排

KubernetesKubernetesBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本全面的 Kubernetes 课程旨在让你掌握使用 Kubernetes 平台有效部署、管理和扩展容器化应用程序所需的知识和技能。无论你是开发人员、DevOps 工程师还是 IT 专业人员,本课程都将让你深入了解 Kubernetes 架构、核心组件和高级功能,使你能够构建和维护强大、可扩展且安全的基于 Kubernetes 的系统。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/CoreConceptsGroup(["Core Concepts"]) kubernetes(("Kubernetes")) -.-> kubernetes/ClusterInformationGroup(["Cluster Information"]) kubernetes/CoreConceptsGroup -.-> kubernetes/architecture("Architecture") kubernetes/ClusterInformationGroup -.-> kubernetes/cluster_info("Cluster Info") subgraph Lab Skills kubernetes/architecture -.-> lab-391847{{"全面的 Kubernetes 课程:掌握容器编排"}} kubernetes/cluster_info -.-> lab-391847{{"全面的 Kubernetes 课程:掌握容器编排"}} end

Kubernetes 与容器化简介

什么是 Kubernetes?

Kubernetes 是一个开源的容器编排平台,用于自动化容器化应用程序的部署、扩展和管理。它最初由谷歌开发,现在由云原生计算基金会(Cloud Native Computing Foundation,CNCF)维护。

容器化与 Docker

容器化是一种将应用程序及其所有依赖项、库和配置打包并部署到一个称为容器的独立自包含单元中的方法。Docker 是最流行的容器化平台,提供用于构建、部署和管理容器的工具及运行时环境。

Kubernetes 与容器化的优势

  • 可扩展性:Kubernetes 可以根据需求自动扩展应用程序的规模,确保资源的高效利用。
  • 高可用性:Kubernetes 具备自我修复能力,能自动替换失败的容器并将它们重新调度到健康的节点上。
  • 可移植性:容器化应用程序可以在从本地开发到生产的不同环境中一致地进行部署。
  • 微服务架构:Kubernetes 支持采用微服务架构,即将应用程序分解为更小、独立的服务。
  • 成本优化:Kubernetes 可以优化资源利用,从而降低基础设施成本。

Kubernetes 的用例

  • Web 应用程序:Kubernetes 被广泛用于部署和管理 Web 应用程序,确保高可用性和可扩展性。
  • 微服务:Kubernetes 非常适合管理基于复杂分布式微服务的应用程序。
  • 机器学习与数据处理:Kubernetes 可用于部署和扩展机器学习模型及数据处理管道。
  • 物联网与边缘计算:Kubernetes 可用于在边缘(更靠近数据源)管理容器化应用程序。

开始使用 Kubernetes

要开始使用 Kubernetes,你需要设置一个 Kubernetes 集群,这可以在本地或云环境中完成。常见的选择包括 minikube(用于本地开发)、托管的 Kubernetes 服务(如 Amazon EKS、Google GKE 或 Azure AKS),或自行管理的 Kubernetes 集群。

Kubernetes 架构与核心组件

Kubernetes 架构

Kubernetes 采用主从架构,其中主节点管理整个集群,而工作节点运行容器化应用程序。Kubernetes 架构的关键组件如下:

graph LR Master -- 通信 --> Worker Master -- 控制平面 --> Worker subgraph 主节点 API 服务器 调度器 控制器管理器 etcd end subgraph 工作节点 kubelet kube-proxy 容器 end

Kubernetes 核心组件

API 服务器

API 服务器是 Kubernetes 集群的中央控制点。它公开 Kubernetes API,所有其他组件都通过该 API 与集群进行交互。

调度器

调度器负责根据资源需求、约束条件和策略将新容器放置到可用的工作节点上。

控制器管理器

控制器管理器是一组控制器的集合,用于管理集群状态,例如复制控制器,它确保运行所需数量的 Pod 副本。

etcd

etcd 是一个分布式键值存储,Kubernetes 用它来存储所有集群数据,包括配置信息、集群状态以及运行中容器的元数据。

kubelet

kubelet 是在每个工作节点上运行的主要“节点代理”。它负责与 API 服务器通信、执行 Pod 操作并报告节点状态。

kube-proxy

kube-proxy 是在每个工作节点上运行的网络代理,负责实现 Kubernetes 网络模型,包括负载均衡和服务发现。

Kubernetes 声明式配置

Kubernetes 使用声明式配置,即你定义应用程序的期望状态,Kubernetes 将努力维护该状态。这通过 Kubernetes 对象(如 Pod、Deployment、Service 等)来完成,这些对象在 YAML 或 JSON 文件中定义。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app
          image: my-app:v1
          ports:
            - containerPort: 80

部署和管理 Kubernetes 集群

Kubernetes 集群部署选项

根据你的需求和基础设施,有几种方法可以部署 Kubernetes 集群:

  1. 托管 Kubernetes 服务:像 AWS、谷歌和 Azure 这样的云提供商提供托管 Kubernetes 服务(EKS、GKE、AKS),它们为你处理控制平面和工作节点管理。
  2. 自行管理 Kubernetes:你可以使用 kubeadm、kops 或 Rancher 等工具在本地或云环境中设置和管理自己的 Kubernetes 集群。
  3. Minikube:Minikube 是一个轻量级的 Kubernetes 实现,它在虚拟机中运行单节点 Kubernetes 集群,适用于本地开发和测试。

使用 kubeadm 进行集群供应

kubeadm 是一个用于在本地或云端引导 Kubernetes 集群的流行工具。以下是一个如何使用 kubeadm 创建 Kubernetes 集群的示例:

## 在主节点上

## 在工作节点上
--discovery-token-ca-cert-hash sha256:<哈希值>

## 在主节点上配置 kubectl

使用 kubectl 进行集群管理

kubectl 是用于与 Kubernetes 集群交互的主要命令行工具。一些常见的 kubectl 命令包括:

命令 描述
kubectl get nodes 列出集群中的所有节点
kubectl get pods 列出集群中的所有 Pod
kubectl create -f my-deployment.yaml 从 YAML 文件创建新的 Kubernetes 对象
kubectl describe pod my-pod 描述特定 Pod 的详细信息
kubectl logs my-pod 查看特定 Pod 的日志
kubectl delete pod my-pod 删除特定的 Pod

集群升级与维护

Kubernetes 集群需要定期维护和升级,以确保其安全性和保持最新状态。这包括:

  • 升级 Kubernetes 版本
  • 更新容器运行时(例如 Docker)
  • 应用安全补丁和修复漏洞
  • 根据需要扩展或缩小集群规模

Kubernetes 提供了工具和策略,以在对运行中的应用程序造成最小停机时间和干扰的情况下执行这些任务。

在 Kubernetes 上部署和扩展应用程序

用于应用程序部署的 Kubernetes 对象

Kubernetes 提供了多个用于部署和管理应用程序的对象,包括:

  • Pod:Kubernetes 中的基本执行单元,代表一起运行的一个或多个容器。
  • Deployment:管理无状态应用程序生命周期的声明式方式,确保运行所需数量的副本。
  • StatefulSet:管理有状态应用程序(如数据库)的部署和扩展。
  • DaemonSet:确保特定的 Pod 在集群中的所有(或某些)节点上运行。
  • Job 和 CronJob:用于运行和管理批处理或定时任务。

使用 Kubernetes 部署应用程序

要在 Kubernetes 上部署应用程序,通常创建一个 Deployment 对象,并在 YAML 文件中定义容器镜像、资源需求和其他配置细节:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app
          image: my-app:v1
          ports:
            - containerPort: 80

然后可以使用 kubectl create -f my-deployment.yaml 创建 Deployment。

扩展应用程序

Kubernetes 提供了多种扩展应用程序的方法:

  1. 水平 Pod 自动缩放(Horizontal Pod Autoscaling,HPA):根据 CPU 或内存利用率自动缩放 Pod 副本的数量。
  2. 集群自动缩放(Cluster Autoscaling):根据资源需求自动向集群中添加或移除工作节点。
  3. 手动缩放:手动更新 Deployment 或 StatefulSet 对象中的 replicas 字段。
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 3
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        targetAverageUtilization: 50

滚动更新和回滚

Kubernetes 支持滚动更新,允许在不停机的情况下更新正在运行的应用程序的容器镜像或配置。如果更新引入问题,也可以轻松回滚到先前版本。

## 更新容器镜像
kubectl set image deployment/my-app my-app=my-app:v2

## 回滚到先前版本
kubectl rollout undo deployment/my-app

Kubernetes 网络与服务发现

Kubernetes 网络模型

Kubernetes 遵循特定的网络模型,以确保 Pod、服务与外部世界之间的通信。Kubernetes 网络模型的关键组件包括:

  1. Pod 网络:每个 Pod 都被分配一个唯一的 IP 地址,Pod 之间可以使用此 IP 地址相互通信。
  2. 服务网络:服务提供一个稳定的、负载均衡的端点,用于访问一组 Pod。
  3. 入口网络:入口是一个 Kubernetes 对象,它为集群内的服务提供外部访问,处理诸如负载均衡、SSL/TLS 终止和基于名称的虚拟主机等任务。
graph LR Client --> Ingress Ingress --> Service Service --> Pods Pods --> Pod-Network

服务类型

Kubernetes 支持不同类型的服务,以满足各种网络需求:

服务类型 描述
ClusterIP 在集群内部 IP 上暴露服务,使服务仅在集群内部可访问。
NodePort 在每个节点的 IP 上的静态端口暴露服务,使服务在集群外部可访问。
LoadBalancer 创建一个外部负载均衡器(例如在云提供商上),并为服务分配一个稳定的 IP 地址。
ExternalName 将服务映射到外部 DNS 名称,而不创建任何代理或负载均衡。

服务发现

Kubernetes 提供了两种主要的服务发现机制:

  1. 环境变量:当创建一个 Pod 时,Kubernetes 会自动注入包含有关其他服务信息的环境变量,例如服务名称、命名空间和 IP 地址。
  2. DNS:Kubernetes 有一个内部 DNS 服务器,它将服务名称解析为其相应的集群 IP 地址,允许 Pod 使用其 DNS 名称发现并与其他服务通信。
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 8080

然后,Pod 可以使用 DNS 名称 my-service.default.svc.cluster.local(其中 default 是命名空间)访问该服务。

Kubernetes 存储与持久卷

Kubernetes 存储概念

Kubernetes 提供了多种方式来管理容器化应用程序的存储:

  1. :卷是基于目录的存储,可以挂载到容器中,提供在容器生命周期之外持久存在的临时存储。
  2. 持久卷(PV):PV 是由管理员预配置的集群级存储资源,或者使用存储类动态预配置。
  3. 持久卷声明(PVC):PVC 是用户对存储资源的请求,然后绑定到合适的 PV。

持久卷和存储类

持久卷(PV)是可以静态或动态预配置的存储资源。存储类提供了一种定义不同类型存储(如 SSD 或 HDD)及其预配置参数的方法。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /data/my-pv
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
  fstype: ext4
  encrypted: "true"

持久卷声明

应用程序使用持久卷声明(PVC)来请求存储资源。Kubernetes 将根据请求的存储大小和访问模式自动将合适的 PV 绑定到 PVC。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: standard

卷和卷挂载

卷被挂载到容器中,允许应用程序读取和写入数据。Kubernetes 支持各种卷类型,包括 emptyDir、hostPath 和特定于云提供商的卷。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: my-app:v1
      volumeMounts:
        - name: data
          mountPath: /data
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: my-pvc

Kubernetes 监控、日志记录与故障排除

Kubernetes 监控

监控对于了解 Kubernetes 集群及其上运行的应用程序的健康状况和性能至关重要。Kubernetes 提供了多个内置监控工具,并与各种第三方监控解决方案集成,例如:

  1. 指标服务器(Metrics Server):一个轻量级、可扩展且高效的资源指标管道,为 Kubernetes 组件和用户提供容器和节点级别的指标。
  2. Prometheus:一个流行的开源监控和警报系统,可从 Kubernetes 组件和应用程序中采集和存储指标。
  3. Grafana:一个数据可视化和仪表板工具,可用于创建自定义仪表板来监控 Kubernetes 集群和应用程序。

Kubernetes 日志记录

Kubernetes 提供了多种管理容器和集群本身日志的方法:

  1. 容器日志:每个容器的标准输出(stdout)和标准错误(stderr)都会被捕获,可使用 kubectl logs 命令进行访问。
  2. 集群级日志记录:Kubernetes 可以配置为将日志转发到集中式日志记录解决方案,如 Elasticsearch、Fluentd 或 Splunk。
  3. 边车容器(Sidecar Containers):日志记录可由边车容器处理,该容器收集并将日志转发到日志后端。

Kubernetes 故障排除

当 Kubernetes 集群出现问题时,可以使用多种工具和技术进行故障排除:

  1. kubectl:用于与 Kubernetes API 交互并检查集群资源的主要命令行工具。
  2. Kubernetes 仪表板(Kubernetes Dashboard):用于管理和排除 Kubernetes 集群故障的基于 Web 的用户界面。
  3. Kubectl Describe 和 Logs:用于检查 Kubernetes 对象(如 Pod、服务和部署)的状态和日志的有用命令。
  4. Kubectl Exec:允许你在正在运行的容器内执行命令以进行进一步调查。
  5. Kubernetes 事件(Kubernetes Events):事件提供有关集群内正在发生的事情的信息,包括警告和错误消息。

通过结合这些工具和技术,你可以有效地诊断和解决 Kubernetes 环境中的问题。

Kubernetes 安全与访问控制

Kubernetes 认证与授权

Kubernetes 提供了多种认证和授权机制:

  1. 认证:Kubernetes 支持多种认证方法,包括客户端证书、承载令牌和基本认证。
  2. 授权:Kubernetes 使用基于角色的访问控制(RBAC)来授权用户、组或服务账户执行的操作。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
  - apiGroups: [""] ## "" 表示核心 API 组
    resources: ["pods"]
    verbs: ["get", "watch", "list"]

保护 Kubernetes API 服务器

Kubernetes API 服务器是集群的中央入口点,因此正确保护它至关重要:

  1. TLS 证书:API 服务器应配置为使用 TLS 证书进行安全通信。
  2. API 服务器标志:可以设置各种标志来控制对 API 服务器的访问,例如 --anonymous-auth--basic-auth-file
  3. 准入控制器:准入控制器是拦截对 Kubernetes API 服务器请求的插件,可以实施安全策略。

Pod 安全与网络策略

Kubernetes 提供了多种保护 Pod 和网络的方法:

  1. Pod 安全策略:Pod 安全策略允许你对 Pod 设置与安全相关的约束,例如以非根用户身份运行容器或限制特权容器的使用。
  2. 网络策略:网络策略允许你控制 Pod 组之间以及与其他网络端点之间的通信方式。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-external-access
spec:
  podSelector: {}
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector: {}

密钥管理

Kubernetes 密钥提供了一种存储和管理敏感信息(如密码、API 密钥和证书)的方法。密钥可以作为文件挂载或在 Pod 中作为环境变量公开。

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  username: YWRtaW4=
  password: MWYyZDFlMmU2N2Rm

高级 Kubernetes 概念与最佳实践

自定义资源定义(CRD)

Kubernetes 允许你通过定义自己的自定义资源定义(CRD)来扩展其功能。CRD 使你能够创建和管理自定义资源,这些资源可以像内置的 Kubernetes 资源一样被对待。

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: myresources.example.com
spec:
  group: example.com
  versions:
    - name: v1
      served: true
      storage: true
  scope: Namespaced
  names:
    plural: myresources
    singular: myresource
    kind: MyResource
    shortNames:
      - mr

操作员与操作员中心

操作员是一种打包、部署和管理 Kubernetes 应用程序的方式。它们通过自定义资源和控制器扩展 Kubernetes API,从而实现复杂应用程序管理的自动化。操作员中心是查找和共享 Kubernetes 操作员的中央存储库。

Helm 与 Helm 图表

Helm 是 Kubernetes 的包管理器,可简化应用程序的部署和管理。Helm 图表是预配置的 Kubernetes 清单文件,可以轻松地进行版本控制、共享和安装。

## 安装 Helm
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

## 搜索并安装 Helm 图表
helm search hub wordpress
helm install my-wordpress stable/wordpress

最佳实践

使用 Kubernetes 的一些最佳实践包括:

  1. 使用声明式配置:在 YAML 或 JSON 文件中定义你的 Kubernetes 资源,以确保一致性和可重复性。
  2. 实施主动监控:设置监控和警报,以便尽早检测和解决问题。
  3. 采用 GitOps 工作流程:将 Git 用作 Kubernetes 配置的唯一事实来源,并自动化部署。
  4. 利用资源请求和限制:为你的容器设置适当的资源请求和限制,以确保高效的资源利用。
  5. 实施 Pod 中断预算:使用 Pod 中断预算来控制在维护或扩展操作期间可中断的 Pod 数量。

通过遵循这些最佳实践,你可以构建和维护健壮、可扩展且可靠的基于 Kubernetes 的应用程序。

总结

在本 Kubernetes 课程中,你将学习 Kubernetes 和容器化的基础知识,探索 Kubernetes 架构和核心组件,并深入了解在 Kubernetes 集群上部署和管理应用程序。你还将发现高级 Kubernetes 概念,如自定义资源定义、操作员和 Helm 图表,以及监控、日志记录、安全等方面的最佳实践。完成本课程后,你将具备充分利用 Kubernetes 的强大功能来简化应用程序部署和管理流程的能力,确保高可用性、可扩展性和可靠性。