解锁 Kubernetes 部署的优势

KubernetesKubernetesBeginner
立即练习

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

简介

Kubernetes 已成为领先的容器编排平台,使组织能够简化应用程序的部署、扩展和管理。本全面教程将引导你了解 Kubernetes 的基础知识、其架构,以及使用这项强大技术部署和管理应用程序的过程。在本教程结束时,你将理解“使用 Kubernetes 进行部署的意义何在”,并能够为你的云原生基础设施解锁 Kubernetes 部署的优势。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/CoreConceptsGroup(["Core Concepts"]) kubernetes(("Kubernetes")) -.-> kubernetes/ClusterInformationGroup(["Cluster Information"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/ConfigurationandVersioningGroup(["Configuration and Versioning"]) kubernetes/CoreConceptsGroup -.-> kubernetes/architecture("Architecture") kubernetes/ClusterInformationGroup -.-> kubernetes/cluster_info("Cluster Info") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/logs("Logs") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/config("Config") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/version("Version") subgraph Lab Skills kubernetes/architecture -.-> lab-392850{{"解锁 Kubernetes 部署的优势"}} kubernetes/cluster_info -.-> lab-392850{{"解锁 Kubernetes 部署的优势"}} kubernetes/describe -.-> lab-392850{{"解锁 Kubernetes 部署的优势"}} kubernetes/logs -.-> lab-392850{{"解锁 Kubernetes 部署的优势"}} kubernetes/config -.-> lab-392850{{"解锁 Kubernetes 部署的优势"}} kubernetes/version -.-> lab-392850{{"解锁 Kubernetes 部署的优势"}} end

Kubernetes 基础

什么是 Kubernetes?

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

Kubernetes 中的关键概念

  • Pod:Kubernetes 中最小的可部署单元,代表一个或多个共享资源的容器。
  • 节点:运行 Kubernetes 集群的物理机或虚拟机。
  • 部署:描述应用程序期望状态的声明式配置。
  • 服务:定义一组逻辑 Pod 以及访问它们的策略的抽象。
  • :Pod 的持久存储,与容器生命周期解耦。

安装和配置 Kubernetes

要开始使用 Kubernetes,你可以按以下步骤操作:

  1. 在本地机器上安装 Kubernetes 发行版,如 minikube 或 kind:
## 在 Ubuntu 22.04 上安装 minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
  1. 启动 Kubernetes 集群:
minikube start
  1. 通过检查集群状态来验证安装:
kubectl get nodes

与 Kubernetes API 交互

Kubernetes 提供了一个强大的 API,允许你与集群进行交互并管理应用程序。你可以使用 kubectl 命令行工具与 Kubernetes API 进行交互:

## 列出默认命名空间中的所有 Pod
kubectl get pods

## 创建一个新的部署
kubectl create deployment nginx --image=nginx

## 将部署暴露为服务
kubectl expose deployment nginx --port=80 --type=LoadBalancer

理解 Kubernetes 清单

Kubernetes 使用称为清单的 YAML 文件来定义应用程序的期望状态。这是一个简单的 Nginx 部署清单示例:

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

此清单创建一个包含三个 Nginx 容器副本的部署。

Kubernetes 架构与组件

Kubernetes 架构

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

graph TD subgraph Master Node API-Server Scheduler Controller-Manager etcd end subgraph Worker Node Kubelet Container-Runtime Kube-Proxy end API-Server --> Scheduler API-Server --> Controller-Manager API-Server --> etcd Kubelet --> Container-Runtime Kubelet --> Kube-Proxy

Kubernetes 组件

  1. API 服务器:Kubernetes 集群的中央控制平面,负责处理和验证 API 请求。
  2. 调度器:负责根据资源可用性和约束条件将 Pod 分配到合适的节点。
  3. 控制器管理器:管理调节 Kubernetes 集群状态的核心控制循环。
  4. etcd:一个分布式键值存储,保存 Kubernetes 集群的关键数据。
  5. Kubelet:在每个节点上运行的代理,负责管理 Pod 的生命周期并向 API 服务器报告其状态。
  6. Kube-Proxy:管理每个节点上的网络规则,实现 Pod 与外部世界之间的通信。
  7. 容器运行时:负责在节点上运行和管理容器的软件,如 Docker 或 containerd。

Kubernetes 控制平面和工作节点

Kubernetes 控制平面负责管理集群的整体状态,而工作节点运行容器化应用程序。控制平面组件,如 API 服务器、调度器和控制器管理器,运行在主节点上,而工作节点运行 Kubelet、Kube-Proxy 和容器运行时。

要部署 Kubernetes 集群,你可以使用托管服务,如谷歌 Kubernetes 引擎(Google Kubernetes Engine,GKE)或亚马逊弹性 Kubernetes 服务(Amazon Elastic Kubernetes Service,EKS),或者你可以使用 kubeadm 或 Kops 等工具设置一个自我管理的集群。

使用 Kubernetes 部署和管理应用程序

部署应用程序

Kubernetes 提供了多种部署应用程序的方式,包括:

  1. 部署:管理无状态应用程序生命周期的声明式方式。
  2. 有状态集:管理有状态应用程序(如数据库)的部署和扩展。
  3. 守护进程集:确保特定的 Pod 在集群中的所有(或某些)节点上运行。
  4. 作业和定时作业:运行一次性或定时任务。

这是一个部署清单的示例:

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

管理应用程序

Kubernetes 提供了多种工具和命令来管理应用程序的生命周期:

  • kubectl apply:创建或更新资源
  • kubectl get:列出资源
  • kubectl describe:显示有关资源的详细信息
  • kubectl delete:删除资源
  • kubectl logs:查看容器的日志
  • kubectl exec:在容器中执行命令

例如,要将 Nginx 部署扩展到 5 个副本:

kubectl scale deployment nginx-deployment --replicas=5

更新应用程序

Kubernetes 支持滚动更新,这使你能够以最少的停机时间更新应用程序。你可以更新容器镜像或部署清单中的任何其他配置并应用更改:

kubectl apply -f nginx-deployment.yaml

然后,Kubernetes 将逐步推出新版本,确保应用程序在更新过程中保持可用。

回滚

如果更新引入了问题,你可以使用 kubectl rollout 命令轻松回滚到应用程序的上一个版本:

kubectl rollout undo deployment nginx-deployment

这将把部署恢复到上一个稳定版本。

Kubernetes 中的扩展与高可用性

扩展应用程序

Kubernetes 提供了多种扩展应用程序的机制:

  1. 水平 Pod 自动缩放(Horizontal Pod Autoscaling,HPA):根据观察到的 CPU 利用率或其他自定义指标自动缩放 Pod 的数量。
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deployment
  minReplicas: 3
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        targetAverageUtilization: 50
  1. 集群自动缩放器(Cluster Autoscaler):根据 Pod 的资源需求自动添加或删除节点来扩展 Kubernetes 集群。

高可用性

Kubernetes 提供了多项功能来确保应用程序的高可用性:

  1. 复制与自我修复:Kubernetes 部署和副本集确保始终运行所需数量的 Pod,自动替换任何失败的 Pod。

  2. 负载均衡:Kubernetes 服务提供负载均衡和服务发现,在可用的 Pod 之间分配流量。

  3. 多可用区和多区域部署:你可以跨多个可用区或区域部署应用程序以提高弹性。

graph TD subgraph Kubernetes 集群 subgraph 节点 1 Pod1 --> 服务 end subgraph 节点 2 Pod2 --> 服务 end subgraph 节点 3 Pod3 --> 服务 end 服务 --> 互联网 end
  1. 持久卷和有状态集:对于有状态应用程序,Kubernetes 提供持久卷和有状态集以确保数据持久性和高可用性。

通过利用这些功能,你可以在 Kubernetes 之上构建高度可扩展和高可用的应用程序。

Kubernetes 中的网络与服务发现

Kubernetes 网络模型

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

  1. Pod 到 Pod 的网络:每个 Pod 都被分配一个唯一的 IP 地址,Pods 可以使用这些 IP 地址直接相互通信。
  2. 服务网络:Kubernetes 服务为一组 Pod 提供稳定的网络端点,实现负载均衡和服务发现。
  3. 入口网络:入口资源允许你将 HTTP 和 HTTPS 路由从集群外部暴露到集群内部的服务。

服务类型

Kubernetes 提供了不同的服务类型,以满足不同的网络需求:

  1. ClusterIP:在集群内部 IP 地址上暴露服务,使其仅在集群内部可访问。
  2. NodePort:在每个节点的 IP 地址上以静态端口号暴露服务。
  3. LoadBalancer:配置特定于云提供商的负载均衡器,并为服务分配一个稳定的 IP 地址。
  4. ExternalName:通过返回带有该名称的 CNAME 记录,将服务映射到 externalName 字段的内容。
graph TD subgraph Kubernetes 集群 subgraph 节点 1 Pod1 --> ClusterIP end subgraph 节点 2 Pod2 --> ClusterIP end ClusterIP --> NodePort NodePort --> LoadBalancer LoadBalancer --> 互联网 end

服务发现

Kubernetes 提供了多种服务发现机制,使 Pod 能够找到并与其他服务进行通信:

  1. 环境变量:创建 Pod 时,Kubernetes 会自动注入包含其他服务信息的环境变量。
  2. DNS:Kubernetes 有一个内部 DNS 服务器,将服务名称解析为其相应的 IP 地址。
  3. 入口:入口资源提供了一种将 HTTP 和 HTTPS 路由从集群外部暴露到集群内部服务的方法。

通过了解 Kubernetes 网络模型和服务发现机制,你可以在 Kubernetes 之上构建高度可扩展和有弹性的应用程序。

Kubernetes 中的持久存储与卷

持久卷

Kubernetes 使用持久卷(Persistent Volumes,PVs)为有状态应用程序提供持久存储。PV 独立于 Pod 的生命周期,管理员可以动态配置或预先创建。PV 可以使用各种存储后端,如本地磁盘、网络附属存储(Network - Attached Storage,NAS)或云存储服务。

持久卷声明

持久卷声明(Persistent Volume Claims,PVCs)是 Pod 请求存储资源的方式。Pod 可以使用 PVC 挂载存储卷,这些存储卷由底层的 PV 提供支持。Kubernetes 会自动将 PVC 与可用的 PV 进行匹配,或者在需要时动态配置新的 PV。

以下是一个 PVC 以及使用该 PVC 的 Pod 的示例:

## 持久卷声明
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my - pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

## 使用该 PVC 的 Pod
apiVersion: v1
kind: Pod
metadata:
  name: my - pod
spec:
  containers:
  - name: my - container
    image: nginx
    volumeMounts:
    - name: my - volume
      mountPath: /data
  volumes:
  - name: my - volume
    persistentVolumeClaim:
      claimName: my - pvc

存储类

Kubernetes 使用存储类来为管理员提供定义不同类型存储的方法。存储类可用于根据 PVC 的存储需求动态配置新的 PV。

## 存储类
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: my - storage - class
provisioner: kubernetes.io/gce - pd
parameters:
  type: pd - standard
  fstype: ext4
  zone: us - central1 - a

通过使用持久卷、持久卷声明和存储类,你可以确保有状态应用程序在 Kubernetes 集群中能够访问持久且可靠的存储。

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

Kubernetes 中的监控

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

  1. 指标服务器(Metrics Server):一个可扩展、高效的容器资源指标源,可通过 Kubernetes API 访问。
  2. Prometheus:一个流行的开源监控和警报系统,可从 Kubernetes 组件和应用程序中采集和存储指标。
  3. Grafana:一个数据可视化和仪表板工具,可用于创建用于 Kubernetes 监控的自定义仪表板。
graph TD subgraph Kubernetes 集群 指标服务器 Prometheus --> 指标服务器 Grafana --> Prometheus end 互联网 --> Grafana

Kubernetes 中的日志记录

Kubernetes 通过使用容器日志提供了一个集中式日志记录解决方案。Pod 将其日志写入标准输出(stdout)和标准错误(stderr),可使用 kubectl logs 命令进行访问。此外,你可以将 Kubernetes 与各种日志聚合解决方案集成,例如:

  1. Elasticsearch、Fluentd 和 Kibana(EFK):一个流行的用于日志聚合和可视化的开源堆栈。
  2. Loki:一个旨在经济高效且易于操作的日志聚合系统。

Kubernetes 中的故障排除

当你的 Kubernetes 集群或应用程序出现问题时,你可以使用以下工具和技术进行故障排除:

  1. kubectl:Kubernetes 命令行工具提供了广泛的命令,用于检查和调试你的集群及应用程序。
  2. Kubernetes 仪表板(Kubernetes Dashboard):一个基于 Web 的用户界面,用于管理和排除 Kubernetes 集群故障。
  3. Kubectl debug:一个插件,允许你在运行的 Pod 上下文中运行调试容器。
  4. Kubernetes 事件(Kubernetes Events):事件提供有关集群内部正在发生的事情的信息,包括采取某些操作的原因(例如,为什么一个 Pod 从节点中被驱逐)。

通过利用 Kubernetes 提供的监控、日志记录和故障排除工具及技术,你可以确保在该平台上运行的应用程序的健康和可靠性。

在 Kubernetes 中保障安全与控制访问

认证与授权

Kubernetes 提供了多种用于对用户和工作负载进行认证和授权的机制:

  1. 认证:Kubernetes 支持多种认证方法,包括客户端证书、承载令牌和 HTTP 基本认证。
  2. 授权:Kubernetes 使用基于角色的访问控制(Role - Based Access Control,RBAC)来对集群内的操作进行授权。RBAC 策略定义了哪些用户或用户组可以对资源执行特定操作。
graph TD subgraph Kubernetes 集群 API 服务器 --> 认证 API 服务器 --> 授权 end 用户 --> API 服务器 服务账户 --> API 服务器

保障 Kubernetes 组件安全

为保障你的 Kubernetes 集群安全,你应考虑以下最佳实践:

  1. 保障 API 服务器安全:确保 API 服务器仅通过安全连接(HTTPS)访问,并制定适当的认证和授权策略。
  2. 保障 Kubelet 安全:将 Kubelet 配置为仅接受来自授权源(如 API 服务器)的请求。
  3. 保障 etcd 安全:对存储在 etcd 中的数据进行加密,并确保 etcd 仅可由 API 服务器访问。
  4. 保障容器镜像安全:使用可信的容器镜像,并确保对其进行漏洞扫描。

网络策略

Kubernetes 网络策略允许你控制 Pod 之间的流量流向,提供一种保障应用程序网络通信安全的方法。网络策略可用于根据标签、端口和协议限制入站和出站流量。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: web - policy
spec:
  podSelector:
    matchLabels:
      app: web
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: frontend
      ports:
        - port: 80

通过实施这些安全措施,你可以确保你的 Kubernetes 集群以及在其上运行的应用程序是安全的,并且仅对授权用户和工作负载可访问。

总结

Kubernetes 彻底改变了组织在云中部署和管理应用程序的方式。通过利用 Kubernetes,你可以获得可扩展、可靠且高效的应用程序管理所带来的好处,使你的云原生基础设施蓬勃发展。本教程通过涵盖 Kubernetes 基础、架构、部署策略以及诸如扩展、网络、存储和安全等高级概念,探讨了“使用 Kubernetes 进行部署的意义何在”。有了这些知识,你现在可以自信地利用 Kubernetes 的力量来简化你的应用程序部署和管理,在你的云原生生态系统中推动创新并取得成功。