简介
Kubernetes 已成为领先的容器编排平台,使组织能够简化应用程序的部署、扩展和管理。本全面教程将引导你了解 Kubernetes 的基础知识、其架构,以及使用这项强大技术部署和管理应用程序的过程。在本教程结束时,你将理解“使用 Kubernetes 进行部署的意义何在”,并能够为你的云原生基础设施解锁 Kubernetes 部署的优势。
Kubernetes 基础
什么是 Kubernetes?
Kubernetes 是一个开源的容器编排平台,用于自动化容器化应用程序的部署、扩展和管理。它最初由谷歌设计,现在由云原生计算基金会(Cloud Native Computing Foundation,CNCF)维护。
Kubernetes 中的关键概念
- Pod:Kubernetes 中最小的可部署单元,代表一个或多个共享资源的容器。
- 节点:运行 Kubernetes 集群的物理机或虚拟机。
- 部署:描述应用程序期望状态的声明式配置。
- 服务:定义一组逻辑 Pod 以及访问它们的策略的抽象。
- 卷:Pod 的持久存储,与容器生命周期解耦。
安装和配置 Kubernetes
要开始使用 Kubernetes,你可以按以下步骤操作:
- 在本地机器上安装 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
- 启动 Kubernetes 集群:
minikube start
- 通过检查集群状态来验证安装:
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 组件
- API 服务器:Kubernetes 集群的中央控制平面,负责处理和验证 API 请求。
- 调度器:负责根据资源可用性和约束条件将 Pod 分配到合适的节点。
- 控制器管理器:管理调节 Kubernetes 集群状态的核心控制循环。
- etcd:一个分布式键值存储,保存 Kubernetes 集群的关键数据。
- Kubelet:在每个节点上运行的代理,负责管理 Pod 的生命周期并向 API 服务器报告其状态。
- Kube-Proxy:管理每个节点上的网络规则,实现 Pod 与外部世界之间的通信。
- 容器运行时:负责在节点上运行和管理容器的软件,如 Docker 或 containerd。
Kubernetes 控制平面和工作节点
Kubernetes 控制平面负责管理集群的整体状态,而工作节点运行容器化应用程序。控制平面组件,如 API 服务器、调度器和控制器管理器,运行在主节点上,而工作节点运行 Kubelet、Kube-Proxy 和容器运行时。
要部署 Kubernetes 集群,你可以使用托管服务,如谷歌 Kubernetes 引擎(Google Kubernetes Engine,GKE)或亚马逊弹性 Kubernetes 服务(Amazon Elastic Kubernetes Service,EKS),或者你可以使用 kubeadm 或 Kops 等工具设置一个自我管理的集群。
使用 Kubernetes 部署和管理应用程序
部署应用程序
Kubernetes 提供了多种部署应用程序的方式,包括:
- 部署:管理无状态应用程序生命周期的声明式方式。
- 有状态集:管理有状态应用程序(如数据库)的部署和扩展。
- 守护进程集:确保特定的 Pod 在集群中的所有(或某些)节点上运行。
- 作业和定时作业:运行一次性或定时任务。
这是一个部署清单的示例:
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 提供了多种扩展应用程序的机制:
- 水平 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
- 集群自动缩放器(Cluster Autoscaler):根据 Pod 的资源需求自动添加或删除节点来扩展 Kubernetes 集群。
高可用性
Kubernetes 提供了多项功能来确保应用程序的高可用性:
复制与自我修复:Kubernetes 部署和副本集确保始终运行所需数量的 Pod,自动替换任何失败的 Pod。
负载均衡:Kubernetes 服务提供负载均衡和服务发现,在可用的 Pod 之间分配流量。
多可用区和多区域部署:你可以跨多个可用区或区域部署应用程序以提高弹性。
graph TD
subgraph Kubernetes 集群
subgraph 节点 1
Pod1 --> 服务
end
subgraph 节点 2
Pod2 --> 服务
end
subgraph 节点 3
Pod3 --> 服务
end
服务 --> 互联网
end
- 持久卷和有状态集:对于有状态应用程序,Kubernetes 提供持久卷和有状态集以确保数据持久性和高可用性。
通过利用这些功能,你可以在 Kubernetes 之上构建高度可扩展和高可用的应用程序。
Kubernetes 中的网络与服务发现
Kubernetes 网络模型
Kubernetes 遵循特定的网络模型,以确保 Pod、服务与外部世界之间的通信。Kubernetes 网络模型的关键方面包括:
- Pod 到 Pod 的网络:每个 Pod 都被分配一个唯一的 IP 地址,Pods 可以使用这些 IP 地址直接相互通信。
- 服务网络:Kubernetes 服务为一组 Pod 提供稳定的网络端点,实现负载均衡和服务发现。
- 入口网络:入口资源允许你将 HTTP 和 HTTPS 路由从集群外部暴露到集群内部的服务。
服务类型
Kubernetes 提供了不同的服务类型,以满足不同的网络需求:
- ClusterIP:在集群内部 IP 地址上暴露服务,使其仅在集群内部可访问。
- NodePort:在每个节点的 IP 地址上以静态端口号暴露服务。
- LoadBalancer:配置特定于云提供商的负载均衡器,并为服务分配一个稳定的 IP 地址。
- 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 能够找到并与其他服务进行通信:
- 环境变量:创建 Pod 时,Kubernetes 会自动注入包含其他服务信息的环境变量。
- DNS:Kubernetes 有一个内部 DNS 服务器,将服务名称解析为其相应的 IP 地址。
- 入口:入口资源提供了一种将 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 提供了多个内置监控工具,并与各种第三方监控解决方案集成:
- 指标服务器(Metrics Server):一个可扩展、高效的容器资源指标源,可通过 Kubernetes API 访问。
- Prometheus:一个流行的开源监控和警报系统,可从 Kubernetes 组件和应用程序中采集和存储指标。
- Grafana:一个数据可视化和仪表板工具,可用于创建用于 Kubernetes 监控的自定义仪表板。
graph TD
subgraph Kubernetes 集群
指标服务器
Prometheus --> 指标服务器
Grafana --> Prometheus
end
互联网 --> Grafana
Kubernetes 中的日志记录
Kubernetes 通过使用容器日志提供了一个集中式日志记录解决方案。Pod 将其日志写入标准输出(stdout)和标准错误(stderr),可使用 kubectl logs 命令进行访问。此外,你可以将 Kubernetes 与各种日志聚合解决方案集成,例如:
- Elasticsearch、Fluentd 和 Kibana(EFK):一个流行的用于日志聚合和可视化的开源堆栈。
- Loki:一个旨在经济高效且易于操作的日志聚合系统。
Kubernetes 中的故障排除
当你的 Kubernetes 集群或应用程序出现问题时,你可以使用以下工具和技术进行故障排除:
- kubectl:Kubernetes 命令行工具提供了广泛的命令,用于检查和调试你的集群及应用程序。
- Kubernetes 仪表板(Kubernetes Dashboard):一个基于 Web 的用户界面,用于管理和排除 Kubernetes 集群故障。
- Kubectl debug:一个插件,允许你在运行的 Pod 上下文中运行调试容器。
- Kubernetes 事件(Kubernetes Events):事件提供有关集群内部正在发生的事情的信息,包括采取某些操作的原因(例如,为什么一个 Pod 从节点中被驱逐)。
通过利用 Kubernetes 提供的监控、日志记录和故障排除工具及技术,你可以确保在该平台上运行的应用程序的健康和可靠性。
在 Kubernetes 中保障安全与控制访问
认证与授权
Kubernetes 提供了多种用于对用户和工作负载进行认证和授权的机制:
- 认证:Kubernetes 支持多种认证方法,包括客户端证书、承载令牌和 HTTP 基本认证。
- 授权:Kubernetes 使用基于角色的访问控制(Role - Based Access Control,RBAC)来对集群内的操作进行授权。RBAC 策略定义了哪些用户或用户组可以对资源执行特定操作。
graph TD
subgraph Kubernetes 集群
API 服务器 --> 认证
API 服务器 --> 授权
end
用户 --> API 服务器
服务账户 --> API 服务器
保障 Kubernetes 组件安全
为保障你的 Kubernetes 集群安全,你应考虑以下最佳实践:
- 保障 API 服务器安全:确保 API 服务器仅通过安全连接(HTTPS)访问,并制定适当的认证和授权策略。
- 保障 Kubelet 安全:将 Kubelet 配置为仅接受来自授权源(如 API 服务器)的请求。
- 保障 etcd 安全:对存储在 etcd 中的数据进行加密,并确保 etcd 仅可由 API 服务器访问。
- 保障容器镜像安全:使用可信的容器镜像,并确保对其进行漏洞扫描。
网络策略
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 的力量来简化你的应用程序部署和管理,在你的云原生生态系统中推动创新并取得成功。


