一、什么是 Kubernetes?
Kubernetes(简称 K8s)是一个开源的容器编排平台,旨在自动化应用程序的部署、扩展和管理。最初由 Google 开发,Kubernetes 是为了解决大规模、分布式的容器化应用管理问题而设计的。它通过提供一个统一的平台来管理容器应用的生命周期,使得开发者和运维人员能够更加高效地进行应用部署、弹性伸缩、服务发现、负载均衡等操作。
在容器化应用的背景下,Kubernetes 为现代云原生架构提供了强大的管理能力,已经成为许多企业生产环境中的标准平台。
Kubernetes 的核心组件
Kubernetes 主要由两部分组成:控制平面(Control Plane) 和 工作节点(Node)。
1. 控制平面(Control Plane)
控制平面负责集群的管理和调度,主要组件包括:
- API Server:是 Kubernetes 集群的入口,所有对集群的操作都会通过它进行。
- Controller Manager:负责管理集群的控制逻辑,如节点、Pod 的生命周期管理,自动修复等。
- Scheduler:负责将待调度的 Pod 分配到合适的工作节点。
- etcd:分布式键值存储,保存了 Kubernetes 集群的所有配置数据和状态。
2. 工作节点(Node)
工作节点是 Kubernetes 中实际运行容器化应用的地方,每个节点上运行着多个重要组件:
- Kubelet:负责管理本地节点上的容器,确保容器的生命周期与集群期望状态一致。
- Kube Proxy:实现网络代理和负载均衡,保证服务间的稳定通信。
- 容器运行时:如 Docker 或 containerd,用于容器的创建和运行。
Kubernetes 架构图
下面是 Kubernetes 的架构图,展示了控制平面(Control Plane)和工作节点(Node)之间的关系:
graph TD;
A[API Server] -->|与控制平面通信| B[Controller Manager];
A -->|与控制平面通信| C[Scheduler];
A -->|存储集群状态| D[etcd];
E[Kubelet] -->|与控制平面通信| A;
F[Kube Proxy] -->|与网络通信| E;
G[Container Runtime] -->|容器运行| E;
B -->|管理节点和Pod生命周期| E;
C -->|调度Pod| E;
D -->|持久化数据| A;
subgraph Control_Plane [Control Plane]
A;
B;
C;
D;
end
subgraph Node [Node]
E;
F;
G;
end
Kubernetes 控制平面和工作节点的协作
控制平面和工作节点之间的协作是 Kubernetes 的关键。以下是一个简单的流程图,展示了控制平面如何通过 API Server 与工作节点通信,如何调度 Pod 到节点,并通过 Kubelet 和 Kube Proxy 管理 Pod 的运行状态和网络。
graph TD;
A[API Server] -->|调度 Pod 到节点| D[工作节点];
D --> E[Kubelet];
D --> F[Kube Proxy];
E --> G[Pod];
F --> G;
这个图简洁地展示了控制平面如何通过 API Server 与工作节点通信,如何调度 Pod 到节点,并通过 Kubelet 和 Kube Proxy 管理 Pod 的运行状态和网络。 在这个架构图中,API Server 是 Kubernetes 的核心,负责与控制平面和工作节点之间进行通信。Controller Manager 负责管理集群状态,Scheduler 负责调度 Pod 到合适的节点,而 etcd 则存储集群的所有数据。
二、Kubernetes 核心概念
了解 Kubernetes 的核心概念是掌握它的基础。以下是 Kubernetes 中的一些关键概念:
1. Pod
Pod 是 Kubernetes 中最小的部署单位,一个 Pod 可以包含一个或多个容器,多个容器共享同一个网络命名空间和存储卷。Pod 代表的是部署在集群中的一组容器,通常一个 Pod 中的容器会共同处理某个业务逻辑或服务。可以理解为一个Spring Boot微服务。
2. Deployment
Deployment 是用来管理应用程序部署的控制器。它通过定义 Pod 的副本数、更新策略等来保证系统的高可用性。通过 Deployment 可以轻松实现滚动更新和回滚操作。
3. Service
Service 是 Kubernetes 中为 Pod 提供稳定网络访问的资源。由于 Pod 是动态创建和销毁的,它们的 IP 地址可能会发生变化,因此 Service 提供了一个稳定的入口,确保即使 Pod 的 IP 地址变化,客户端仍能稳定访问。
4. Namespace
Namespace 是 Kubernetes 用于资源隔离的机制,它允许在同一个集群中创建多个虚拟集群。每个 Namespace 内的资源相互独立,互不干扰。它非常适用于多租户环境或者资源的组织管理。
5. Persistent Volume (PV) 和 Persistent Volume Claim (PVC)
Kubernetes 提供了持久化存储的能力,PV 是集群中的存储资源,而 PVC 是用户请求存储资源的方式。PVC 绑定到 PV 上,确保应用可以使用持久化存储。
Kubernetes 安装与配置
1. 安装 Kubernetes 集群
在学习 Kubernetes 的过程中,首先需要安装一个集群。常见的 Kubernetes 安装方式有以下几种:
- Minikube:Minikube 是一个用于在本地快速启动单机 Kubernetes 集群的工具,适合开发和学习使用。
- kubeadm:kubeadm 是一个更为正式的 Kubernetes 安装工具,适用于在生产环境中搭建多节点集群。
- K3s:K3s 是一个轻量级的 Kubernetes 版本,适合用于资源受限的环境,比如物联网设备。
使用 Minikube 安装 Kubernetes
对于初学者,Minikube 是最简单的安装方式。它会在你的本地创建一个虚拟机,并启动一个单节点的 Kubernetes 集群。
-
安装 Minikube
- 下载 Minikube 安装包,并根据操作系统进行安装。
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube -
启动 Minikube
启动一个本地的 Kubernetes 集群:
minikube start这将创建并启动一个虚拟机,并在其中部署 Kubernetes。
-
验证 Kubernetes 集群
使用 kubectl 命令验证集群是否正常运行:
kubectl get nodes如果集群正常运行,你将看到一个名为
minikube的节点。
2. 使用 kubectl 操作 Kubernetes 集群
kubectl 是 Kubernetes 的命令行工具,它提供了对集群资源的管理和调度能力。
-
查看集群中的节点:
kubectl get nodes -
查看 Pod:
kubectl get pods -
创建 Pod:
创建一个简单的 Pod:
kubectl run nginx --image=nginx这将启动一个 Nginx 容器,并将其运行在 Pod 中。
Kubernetes Pod 生命周期
Pod 在 Kubernetes 中的生命周期是动态的,它会经历多个状态。以下是 Pod 生命周期的流程图:
graph LR;
A[Pod 被创建] --> B[Pod 初始化];
B --> C[Pod 运行中];
C --> D[Pod 完成任务];
D --> E[Pod 被终止];
E --> F[Pod 被销毁];
C --> G[Pod 出现故障];
G --> H[Pod 重启];
H --> C;
在 Kubernetes 中,Pod 会经历从创建到销毁的一系列状态。Pod 也可能出现故障并重新启动,确保服务的高可用性。
Pod 与 Service 交互流程
Pod 和 Service 之间的交互是 Kubernetes 中网络功能的核心。以下是一个简单的流程图,展示了客户端如何通过 Service 访问 Pod:
sequenceDiagram
participant Client
participant Service
participant Pod
Client->>Service: 发起请求
Service->>Pod: 将请求路由到目标 Pod
Pod->>Service: 返回响应
Service->>Client: 返回响应给客户端
客户端请求通过 Service 路由到相应的 Pod,而 Pod 返回响应之后,服务再将响应返回给客户端。这种方式保证了服务的稳定访问。
三、基本操作与管理
1. Pod 管理
什么是 Pod?
在 Kubernetes 中,Pod 是最小的调度单位。它是由一个或多个容器组成的集合,这些容器共享存储和网络,并且在同一个节点上运行。Pod 中的容器相互配合,共享一个网络命名空间,因此它们能够通过 localhost 互相通信。
创建和删除 Pod
创建 Pod:
可以通过 kubectl run 或者 YAML 文件来创建 Pod。以下是通过 YAML 创建 Pod 的示例:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
使用以下命令创建 Pod:
kubectl apply -f pod.yaml
删除 Pod:
kubectl delete pod mypod
查看 Pod 状态、日志、执行命令
- 查看 Pod 状态:
kubectl get pods
- 查看 Pod 的详细信息:
kubectl describe pod mypod
- 查看 Pod 日志:
kubectl logs mypod
- 在 Pod 中执行命令(kubectl exec):
kubectl exec -it mypod -- /bin/bash
Pod 限制和资源请求
在 Kubernetes 中,可以为 Pod 设置资源请求和限制,确保容器能够获得适量的资源,同时防止单个容器占用过多资源。
- 资源请求(Resource Requests):定义容器启动时所需的最低资源量。
- 资源限制(Resource Limits):定义容器可使用的最大资源量。
例如,设置 CPU 和内存的请求和限制:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
2. Deployment 管理
什么是 Deployment?
Deployment 是一种 Kubernetes 控制器,旨在管理一组 Pod 的声明式更新。通过 Deployment,你可以轻松进行应用的滚动更新、回滚等操作。Deployment 主要用于管理 无状态(Stateless)应用。
创建、更新和删除 Deployment
- 创建 Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
使用以下命令创建 Deployment:
kubectl apply -f deployment.yaml
- 更新 Deployment:
更新 Deployment 的镜像版本:
kubectl set image deployment/my-deployment nginx=nginx:latest
- 删除 Deployment:
kubectl delete deployment my-deployment
配置滚动更新、回滚
- 滚动更新:
Kubernetes 会在更新应用时逐步替换旧的 Pod,确保在更新过程中始终有一定数量的 Pod 在运行。例如,更新镜像版本时,Deployment 会逐步替换旧的 Pod。
kubectl set image deployment/my-deployment nginx=nginx:v2
- 回滚:
如果更新导致应用出现问题,可以回滚到之前的版本:
kubectl rollout undo deployment/my-deployment
多副本和高可用配置
通过设置 replicas 参数,可以让 Deployment 管理多个副本(Pods),从而实现高可用性。
spec:
replicas: 3 # 设置副本数量
Kubernetes 会确保始终保持指定数量的副本,如果某个 Pod 出现故障,Kubernetes 会自动重新调度新的 Pod 来替换它。
3. Service 管理
什么是 Service?
Service 是 Kubernetes 中用于暴露一组 Pod 的资源。它为 Pod 提供了一个稳定的虚拟 IP 地址和 DNS 名称,使得 Pod 即使被删除或重新调度,外部访问仍然可以通过 Service 进行。
创建 ClusterIP、NodePort、LoadBalancer 类型的 Service
- ClusterIP(默认类型): 仅在集群内部可访问。适用于集群内部的服务之间的通信。比如,一个后端服务需要访问数据库或者多个微服务之间的相互调用,可以使用 ClusterIP。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 8080
type: ClusterIP
- NodePort: 在每个节点的某个端口上开放服务,使服务可以通过这个特定的端口从集群外部访问。NodePort 是在每个 Kubernetes 节点上分配一个端口(通常是 30000-32767 的范围)。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 8080
nodePort: 30001
type: NodePort
- LoadBalancer: 在云环境中,LoadBalancer 类型会为每个 Service 创建一个云提供商的负载均衡器(如 AWS 的 ELB、GCP 的 GCLB 等)。它将请求直接转发到 Service(通常是 ClusterIP),并将负载均衡器暴露给外部用户。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 8080
type: LoadBalancer
使用 Ingress 进行 HTTP 路由和负载均衡
Ingress 是 Kubernetes 中用于管理 HTTP 和 HTTPS 路由的资源。通过 Ingress,你可以根据请求的 URL 或主机名将流量路由到不同的服务。Ingress的实现方式有很多,比如Nginx/HAProxy等。
示例 Ingress 配置:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
Ingress 控制器会根据 host 和 path 路由流量。
下面是Ingress和service一级pod的逻辑关系图。
graph TD
Ingress -->|Routes to| Service
Service -->|Forwards to| Pod1
Service -->|Forwards to| Pod2
Service -->|Forwards to| Pod3
subgraph Kubernetes Cluster
Service
Pod1
Pod2
Pod3
end
Ingress["Ingress"]
Service["Service"]
Pod1["Pod 1"]
Pod2["Pod 2"]
Pod3["Pod 3"]
总结
本文详细介绍了 Kubernetes 中的一些基本操作,包括 Pod、Deployment、Service。掌握这些基本概念和操作将帮助你高效管理 Kubernetes 集群中的应用。希望这篇博客能够为你提供有价值的信息。如果有任何问题,欢迎随时讨论!