1. Kubernetes 的核心概念
(1) Node(节点)
- 定义:Node 是 Kubernetes 集群中的工作机器,可以是物理机或虚拟机。
- 类型:
- Master Node:运行控制平面组件(如 API Server、Scheduler)。
- Worker Node:运行应用负载(如 Pod)。
- 关键组件:
- Kubelet:负责与 Master Node 通信,管理 Pod 和容器。
- Kube Proxy:负责网络代理和负载均衡。
- 容器运行时:负责运行容器(如 Docker、containerd)。
(2) Namespace(命名空间)
- 定义:Namespace 是 Kubernetes 中用于隔离资源的虚拟集群。
- 作用:
- 将资源分组,便于管理。
- 实现多租户环境下的资源隔离。
- 常见 Namespace:
default
:默认命名空间。kube-system
:Kubernetes 系统组件的命名空间。kube-public
:公共资源的命名空间。
(3) Label 和 Selector(标签和选择器)
- Label:
- 键值对,用于标识和分类资源(如 Pod、Service)。
- 示例:
app=web
,env=prod
。
- Selector:
- 用于根据 Label 选择资源。
- 示例:选择所有
app=web
的 Pod。
(4) Annotation(注解)
- 定义:Annotation 是附加到资源上的元数据,用于存储非标识性信息。
- 作用:
- 记录构建信息、版本号等。
- 配置工具或库的行为。
- 示例:
build-version: v1.2.3
。
2. Kubernetes 的核心资源
(1) Pod
- 定义:Kubernetes 的最小调度单元,包含一个或多个容器。
- 特点:
- 共享网络和存储资源。
- 生命周期短暂,通常由控制器(如 Deployment)管理。
(2) Deployment
- 定义:用于定义 Pod 的副本数和更新策略。
- 作用:
- 确保指定数量的 Pod 副本始终运行。
- 支持滚动更新和回滚。
- 示例:
apiVersion: apps/v1 kind: Deployment metadata:name: web-app spec:replicas: 3template:spec:containers:- name: webimage: nginx
(3) Service
- 定义:用于定义如何访问 Pod。
- 作用:
- 提供稳定的 IP 和 DNS 名称。
- 实现负载均衡和服务发现。
- 类型:
- ClusterIP:集群内部访问。
- NodePort:通过节点端口访问。
- LoadBalancer:通过云提供商的负载均衡器访问。
- 示例:
apiVersion: v1 kind: Service metadata:name: web-service spec:selector:app: webports:- protocol: TCPport: 80targetPort: 80
(4) ConfigMap 和 Secret
- ConfigMap:
- 用于存储配置数据(如环境变量、配置文件)。
- 示例:
apiVersion: v1 kind: ConfigMap metadata:name: app-config data:log-level: "info"
- Secret:
- 用于存储敏感数据(如密码、密钥)。
- 示例:
apiVersion: v1 kind: Secret metadata:name: db-secret data:username: YWRtaW4=password: MWYyZDFlMmU2N2Rm
3. Kubernetes 的核心功能
(1) 自动扩展
- Horizontal Pod Autoscaler (HPA):
- 根据 CPU 使用率或其他指标自动调整 Pod 的副本数。
- 示例:
apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata:name: web-app-hpa spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: web-appminReplicas: 1maxReplicas: 10metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 50
(2) 自我修复
- 功能:
- 自动重启失败的容器。
- 替换不可用的 Pod。
- 实现:
- 通过控制器(如 Deployment、StatefulSet)确保 Pod 的期望状态。
(3) 滚动更新和回滚
- 滚动更新:
- 逐步替换旧版本的 Pod,确保应用不中断。
- 回滚:
- 回滚到之前的版本。
- 示例:
kubectl set image deployment/web-app web=nginx:1.19 kubectl rollout undo deployment/web-app
4. Kubernetes 的常用命令
(1) 查看资源
- 查看 Pod:
kubectl get pods
- 查看 Deployment:
kubectl get deployments
(2) 创建资源
- 通过 YAML 文件创建:
kubectl apply -f deployment.yaml
(3) 删除资源
- 删除 Pod:
kubectl delete pod <pod-name>
(4) 查看日志
- 查看 Pod 日志:
kubectl logs <pod-name>
Pod定义,和容器的关系
- Pod 是 Kubernetes 中的最小部署单位,它封装了一个或多个容器,这些容器共享 存储、网络、生命周期。
- Pod 是对容器的抽象,它解决了单个容器无法满足的需求,比如 多个进程协作、共享存储、共享网络。
可以简单理解为:
Pod 是一个“容器组”,里面可以有 1 个或多个容器,但这些容器是相互依赖的,需要协作完成任务。
多个容器如何在同一个 Pod 里协作?
在同一个 Pod 里的容器,可以通过以下 三种方式协作:
1. 共享网络(Network)
- Pod 里的所有容器共享同一个 IP 地址(Pod IP)
- 容器之间可以用
localhost
直接通信 - 适用于:一个主应用 + 辅助应用(如 Nginx + PHP)
示例
# 在 Pod 里,两个容器可以这样通信:
curl http://localhost:8080
不需要跨 Pod 访问,容器间直接使用 localhost 访问
2. 共享存储(Storage)
- Pod 内的容器可以共享 Volume(存储卷),用于共享数据
- 适用于:日志收集、数据缓存、共享配置等
示例
apiVersion: v1
kind: Pod
metadata:name: shared-volume-pod
spec:volumes:- name: shared-storageemptyDir: {} # 共享存储containers:- name: appimage: my-appvolumeMounts:- mountPath: /dataname: shared-storage- name: sidecarimage: log-collectorvolumeMounts:- mountPath: /dataname: shared-storage
两个容器(app 和 log-collector)共享 /data
目录,可以用于日志处理。
3. Sidecar 模式(辅助容器)
- 在同一个 Pod 里运行一个 主容器 和一个 辅助容器(Sidecar)
- Sidecar 负责 日志处理、监控、数据同步等任务
- 适用于:日志收集、代理服务、自动更新等场景
示例:日志收集
apiVersion: v1
kind: Pod
metadata:name: sidecar-pod
spec:containers:- name: appimage: my-app- name: log-agentimage: fluentd
Fluentd(日志收集器)和业务容器一起运行,专门处理日志
总结
协作方式 | 作用 | 适用场景 |
---|---|---|
共享网络 | 容器之间可以用 localhost 直接通信 | 主应用 + 代理(如 Nginx + PHP) |
共享存储 | 共享 Volume 数据 | 日志收集、数据缓存 |
Sidecar 模式 | 辅助主容器 | 日志收集、自动更新 |
Pod 中多容器协作的实际示例
示例 1:Web 应用与日志收集
- 场景:
- 一个 Web 应用需要将日志发送到集中式日志系统。
- Pod 配置:
- 主容器:运行 Web 应用。
- Sidecar 容器:运行日志收集工具(如 Fluentd)。
- 协作方式:
- Web 应用容器将日志写入共享存储卷。
- Sidecar 容器从共享存储卷读取日志并发送到日志系统。
示例 2:数据预处理与应用
- 场景:
- 一个应用需要处理大量数据,但数据需要先进行预处理。
- Pod 配置:
- Init 容器:运行数据预处理工具。
- 主容器:运行应用。
- 协作方式:
- Init 容器从远程存储下载数据并进行预处理。
- 预处理完成后,主容器启动并使用处理后的数据。
示例 3:Web 应用与代理
- 场景:
- 一个 Web 应用需要通过代理访问外部服务。
- Pod 配置:
- 主容器:运行 Web 应用。
- Sidecar 容器:运行代理(如 Envoy)。
- 协作方式:
- Web 应用容器通过
localhost
访问代理容器。 - 代理容器负责将请求转发到外部服务。
- Web 应用容器通过
https://github.com/0voice