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 副本始终运行。
- 支持滚动更新和回滚。
-
示例 :
yamlapiVersion: apps/v1 kind: Deployment metadata: name: web-app spec: replicas: 3 template: spec: containers: - name: web image: nginx
(3) Service
-
定义:用于定义如何访问 Pod。
-
作用 :
- 提供稳定的 IP 和 DNS 名称。
- 实现负载均衡和服务发现。
-
类型 :
- ClusterIP:集群内部访问。
- NodePort:通过节点端口访问。
- LoadBalancer:通过云提供商的负载均衡器访问。
-
示例 :
yamlapiVersion: v1 kind: Service metadata: name: web-service spec: selector: app: web ports: - protocol: TCP port: 80 targetPort: 80
(4) ConfigMap 和 Secret
-
ConfigMap :
-
用于存储配置数据(如环境变量、配置文件)。
-
示例:
yamlapiVersion: v1 kind: ConfigMap metadata: name: app-config data: log-level: "info"
-
-
Secret :
-
用于存储敏感数据(如密码、密钥)。
-
示例:
yamlapiVersion: v1 kind: Secret metadata: name: db-secret data: username: YWRtaW4= password: MWYyZDFlMmU2N2Rm
-
3. Kubernetes 的核心功能
(1) 自动扩展
-
Horizontal Pod Autoscaler (HPA) :
- 根据 CPU 使用率或其他指标自动调整 Pod 的副本数。
-
示例 :
yamlapiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: web-app-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: web-app minReplicas: 1 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50
(2) 自我修复
- 功能 :
- 自动重启失败的容器。
- 替换不可用的 Pod。
- 实现 :
- 通过控制器(如 Deployment、StatefulSet)确保 Pod 的期望状态。
(3) 滚动更新和回滚
-
滚动更新 :
- 逐步替换旧版本的 Pod,确保应用不中断。
-
回滚 :
- 回滚到之前的版本。
-
示例 :
bashkubectl set image deployment/web-app web=nginx:1.19 kubectl rollout undo deployment/web-app
4. Kubernetes 的常用命令
(1) 查看资源
-
查看 Pod:
bashkubectl get pods
-
查看 Deployment:
bashkubectl get deployments
(2) 创建资源
-
通过 YAML 文件创建:
bashkubectl apply -f deployment.yaml
(3) 删除资源
-
删除 Pod:
bashkubectl delete pod <pod-name>
(4) 查看日志
-
查看 Pod 日志:
bashkubectl logs <pod-name>
Pod定义,和容器的关系
- Pod 是 Kubernetes 中的最小部署单位 ,它封装了一个或多个容器 ,这些容器共享 存储、网络、生命周期。
- Pod 是对容器的抽象 ,它解决了单个容器无法满足的需求,比如 多个进程协作、共享存储、共享网络。
可以简单理解为:
Pod 是一个"容器组" ,里面可以有 1 个或多个容器 ,但这些容器是相互依赖的,需要协作完成任务。
多个容器如何在同一个 Pod 里协作?
在同一个 Pod 里的容器,可以通过以下 三种方式协作:
1. 共享网络(Network)
- Pod 里的所有容器共享同一个 IP 地址(Pod IP)
- 容器之间可以用
localhost
直接通信 - 适用于:一个主应用 + 辅助应用(如 Nginx + PHP)
示例
shell
# 在 Pod 里,两个容器可以这样通信:
curl http://localhost:8080
不需要跨 Pod 访问,容器间直接使用 localhost 访问
2. 共享存储(Storage)
- Pod 内的容器可以共享 Volume(存储卷),用于共享数据
- 适用于:日志收集、数据缓存、共享配置等
示例
yaml
apiVersion: v1
kind: Pod
metadata:
name: shared-volume-pod
spec:
volumes:
- name: shared-storage
emptyDir: {} # 共享存储
containers:
- name: app
image: my-app
volumeMounts:
- mountPath: /data
name: shared-storage
- name: sidecar
image: log-collector
volumeMounts:
- mountPath: /data
name: shared-storage
两个容器(app 和 log-collector)共享 /data
目录,可以用于日志处理。
3. Sidecar 模式(辅助容器)
- 在同一个 Pod 里运行一个 主容器 和一个 辅助容器(Sidecar)
- Sidecar 负责 日志处理、监控、数据同步等任务
- 适用于:日志收集、代理服务、自动更新等场景
示例:日志收集
yaml
apiVersion: v1
kind: Pod
metadata:
name: sidecar-pod
spec:
containers:
- name: app
image: my-app
- name: log-agent
image: 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 应用容器通过