什么是Kubernetes
Kubernetes入门
简介
管理和运行这些容器,管理容器化的应用程序和服务
Pod是最小的kubernetes的最小调度单元 包括 主服务容器和 sidecar (日志收集、服务监控)
Kubernetes(简称K8s)是一个开源的容器编排平台,最初由Google开发,现已成为云原生计算基金会(CNCF)的毕业项目。它用于自动化部署、扩展和管理容器化应用程序。Kubernetes的设计目标是提供一个高度可扩展、自动化、自我修复的系统,以简化容器化应用的管理。
核心概念
-
Pod:
- Kubernetes中的最小部署单元,一个Pod可以包含一个或多个容器。
- 容器共享网络和存储资源。
Pod是Kubernetes中的基本构建块和最小的部署单元。每个Pod可以包含一个或多个容器,这些容器共享相同的网络和存储资源。Pod的设计理念是为了支持紧密耦合的容器组,使得它们能够协同工作,共享资源。
Pod的组成
- 容器:
- 每个Pod可以包含一个或多个容器。
- 容器是独立运行的应用进程,共享Pod的网络和存储资源。
- 共享网络:
- 每个Pod拥有一个唯一的IP地址。
- 容器之间可以通过
localhost进行通信,共享相同的端口空间。
- 共享存储:
- Pod可以定义共享的存储卷(Volumes),供所有容器使用。
- 支持多种存储类型,如本地存储、NFS、云存储等。
Pod的生命周期
Pod在Kubernetes中经历以下几个主要状态:
- Pending:
- Pod已经被创建,但尚未安排到节点上运行。
- Running:
- Pod已经被调度到一个节点上,并且至少有一个容器正在运行。
- 如果所有容器都失败,Pod将进入下一个状态。
- Succeeded:
- Pod中的所有容器都成功完成执行。
- Failed:
- Pod中的容器失败,并且没有重启策略可以应用。
- Unknown:
- Kubernetes无法获取到Pod的状态,可能由于与节点的连接丢失。
网络和存储共享机制
- 网络共享:
- 每个Pod分配一个唯一的IP地址,容器之间共享这个IP地址。
- 容器可以通过
localhost进行通信,共享相同的端口空间。
- 存储共享:
- Pod可以定义共享的存储卷,所有容器可以访问相同的存储路径。
- 支持多种存储类型,如
emptyDir、PersistentVolume、ConfigMap、Secret等。
资源管理
Kubernetes允许为Pod设置资源限制和请求,以确保应用的稳定性和性能。
- 资源请求(Requests):
- 为Pod分配的最小资源保证。
- 例如,设置CPU和内存的最低要求。
- 资源限制(Limits):
- 设置Pod可以使用的最大资源。
- 防止Pod占用过多资源,影响其他Pod的运行。
-
Service:
- 为Pod提供稳定的网络访问入口。
- 使用标签选择器(Label Selector)选择一组Pod,并为它们提供一个虚拟IP地址和DNS名称。
-
ReplicaSet:
- 确保在任意时刻都有指定数量的Pod副本在运行。
- 如果某个Pod失败,ReplicaSet会自动启动一个新的Pod。
ReplicaSet 是 Kubernetes 中用于确保指定数量 Pod 副本持续运行的关键组件。它的核心功能是通过自动创建和终止 Pod,来维持预设的副本数量,从而保证应用的高可用性和稳定性。
核心功能
- 副本数量控制:
- ReplicaSet 确保在任何时候都有指定数量的 Pod 副本在运行。例如,如果设置副本数为 3,ReplicaSet 会持续监控集群,保证至少有 3 个 Pod 在运行。
- 自动恢复:
- 如果某个 Pod 因为节点故障、容器崩溃等原因停止运行,ReplicaSet 会自动检测到这一情况,并启动一个新的 Pod 来填补空缺。
- 滚动更新:
- ReplicaSet 支持滚动更新(Rolling Update),允许逐步替换旧的 Pod,以更新应用程序的版本或配置。这样可以避免服务中断,确保应用的可用性。
- 标签选择器:
- ReplicaSet 通过标签选择器(Label Selector)来选择和管理特定的 Pod。这意味着它可以根据预设的标签,自动将符合条件的 Pod 纳入管理范围。
工作原理
ReplicaSet 的工作原理可以分为以下几个步骤:
- 定义副本数:
- 在 ReplicaSet 的配置文件中,指定需要维持的 Pod 副本数量。
- 监控 Pod 状态:
- ReplicaSet 持续监控集群中所有 Pod 的状态,包括它们是否在运行、是否健康等。
- 检测变化:
- 当检测到 Pod 的数量少于预设的副本数时,ReplicaSet 会启动新的 Pod,直到达到目标数量。
- 自动恢复:
- 如果某个 Pod 停止运行,ReplicaSet 会立即启动一个新的 Pod,确保副本数量保持不变。
- 滚动更新:
- 当需要更新 Pod 的配置或镜像时,ReplicaSet 可以逐步替换旧的 Pod,启动新的 Pod,从而实现平滑的更新过程。
-
Deployment:
- 用于管理Pod的滚动更新和回滚。
- 提供声明式的更新,确保应用的版本升级平滑进行。
-
Namespace:
- 用于将集群资源划分为多个虚拟集群,便于资源隔离和管理。
- 例如,可以创建开发、测试和生产环境的Namespace。
-
ConfigMap:
- 用于存储配置信息,避免将敏感信息或配置硬编码到容器镜像中。
- 配置信息可以在运行时注入到Pod中。
在 Kubernetes 中,ConfigMap 是一种用于存储应用程序配置信息的资源,它允许我们将配置信息从容器镜像中解耦出来,从而提高应用的灵活性和安全性。ConfigMap 可以存储键值对形式的数据,并且支持通过多种方式将这些数据注入到 Pod 中,包括环境变量、文件和命令行参数等。
核心概念
- 配置解耦:
- ConfigMap 的主要目的是避免将配置信息硬编码到容器镜像中。通过分离配置和代码,我们可以更轻松地管理和更新配置,而无需重新构建镜像。
- 动态更新:
- ConfigMap 支持动态更新,即在应用运行时更新配置信息。Kubernetes 会自动将新的配置信息注入到 Pod 中,从而实现无中断的配置更新。
- 多种注入方式:
- ConfigMap 提供了多种将配置信息注入到 Pod 中的方式,包括环境变量、文件和命令行参数。这使得我们可以根据应用程序的需求,选择最适合的注入方式。
- 版本控制:
- ConfigMap 支持版本控制,允许我们回滚到之前的配置版本。这在需要修复配置错误或恢复到已知稳定状态时非常有用。
-
Secret:
- 用于存储敏感信息,如密码、令牌等。
- 与ConfigMap类似,但存储内容是加密的。
-
Volume:
- 提供Pod的持久化存储,支持多种存储类型,如NFS、云存储等。
- 使得容器在重启后仍能访问相同的存储数据。
-
Horizontal Pod Autoscaler (HPA):
- 根据CPU使用率或其他自定义指标自动调整Pod的数量。
- 确保应用在高负载时能够自动扩展,低负载时能够缩减。
Horizontal Pod Autoscaler (HPA) 是 Kubernetes 中一个强大的自动扩展工具,用于根据应用的负载情况自动调整Pod的数量。HPA 的核心目标是确保应用在高负载时能够自动扩展,以满足需求,而在低负载时自动缩减,以节省资源。通过HPA,开发者可以实现应用的弹性扩展,提高系统的可用性和效率。
核心概念
- 自动扩展:
- HPA 通过监控Pod的资源使用情况(如CPU使用率)或其他自定义指标,自动调整Pod的数量,以适应负载的变化。
- 资源监控:
- HPA 需要实时监控Pod的资源使用情况,通常通过Kubernetes的Metrics Server或其他第三方监控工具实现。
- 扩展规则:
- HPA 根据预设的扩展规则(如CPU使用率的阈值)来决定是否需要增加或减少Pod的数量。
- 与ReplicaSet和Deployment的协同:
- HPA 通常与ReplicaSet或Deployment协同工作,通过调整ReplicaSet的副本数量来实现Pod的扩展或缩减。
工作原理
HPA 的工作原理可以分为以下几个步骤:
- 监控资源使用情况:
- HPA 持续监控目标Pod的资源使用情况,通常包括CPU使用率、内存使用率等。
- 评估负载情况:
- 根据监控数据,HPA 评估当前的负载情况,并与预设的扩展规则进行比较。
- 调整Pod数量:
- 如果当前负载超过了预设的阈值,HPA 会增加Pod的数量;反之,如果负载低于阈值,HPA 会减少Pod的数量。
- 与ReplicaSet或Deployment协同:
- HPA 通过调整ReplicaSet的副本数量,实现Pod的扩展或缩减。如果使用Deployment,HPA 会自动管理Deployment的副本数量。
-
DaemonSet:
- 确保每个节点运行一个特定的Pod。
- 常用于运行节点级别的守护进程,如日志收集、监控等。
-
Job:
- 用于运行一次性任务,任务完成后Pod会被终止。
- 支持并行任务的执行。
-
CronJob:
- 用于定期运行任务,类似于Linux的cron作业。
- 可以设置时间表来执行周期性的任务。
实例
假设我们想部署一个简单的Web应用,可以使用Kubernetes的Deployment、Service和ConfigMap来实现。
-
Deployment:
apiVersion: apps/v1 kind: Deployment metadata: name: web-deployment spec: replicas: 3 selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - name: web image: mywebapp:latest ports: - containerPort: 80 env: - name: CONFIG_PATH value: /etc/config这个Deployment会创建3个Pod,每个Pod运行一个Web应用容器,并从ConfigMap中读取配置。
-
Service:
apiVersion: v1 kind: Service metadata: name: web-service spec: selector: app: web ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer这个Service会为Web应用提供一个外部访问的入口,并将流量分发到后端的Pod。
-
ConfigMap:
apiVersion: v1 kind: ConfigMap metadata: name: web-config data: app.properties: | database.url=jdbc:mysql://db.example.com:3306/mydb database.username=user database.password=secret这个ConfigMap存储了Web应用的数据库配置信息,并被Deployment引用。
通过以上配置,Kubernetes会自动创建和管理Web应用的Pod、服务和配置,确保应用的高可用性和可扩展性。
总结
Kubernetes提供了丰富的功能和灵活的配置选项,能够满足各种复杂的应用场景。通过理解核心概念和实际操作,开发者可以高效地管理和扩展容器化应用。
以下是 Kubernetes 官方客户端 kubectl 的常用命令整理,涵盖基础操作、资源管理、调试监控等核心场景,引用自多个技术博客和官方文档:
kubectl 命令
一、基础操作
-
查看集群信息
kubectl cluster-info # 显示集群组件状态 [1]() kubectl get nodes -o wide # 查看节点列表及详细信息 [3]() -
资源对象管理
kubectl get pods # 查看所有 Pod [7](https://blog.csdn.net/qq_34631220/article/details/121514222) kubectl describe pod -
配置文件操作
kubectl apply -f deployment.yaml # 应用配置文件 [5]() kubectl diff -f service.yaml # 对比配置文件与集群状态差异 [1]()
二、资源管理
-
部署与服务
kubectl run nginx --image=nginx # 快速创建单实例 Pod [3](https://blog.csdn.net/stone_tomcate/article/details/104332622) kubectl expose deployment nginx --type=NodePort # 将 Deployment 暴露为 Service [7](https://blog.csdn.net/qq_34631220/article/details/121514222) kubectl scale deployment nginx --replicas=3 -
滚动更新与回滚
kubectl rollout status deployment/nginx # 查看更新状态 [4]() kubectl rollout undo deployment/nginx # 回滚到上一个版本 [8]() -
标签与注解
kubectl label pod nginx app=web # 添加标签 [4](https://blog.csdn.net/wuhuayangs/article/details/125841826) kubectl annotate pod nginx description="frontend service"
三、调试与监控
-
日志与执行命令
kubectl logs <pod-name> # 查看 Pod 日志 [1]() kubectl exec -it <pod-name> -- /bin/sh # 进入容器交互式终端 [7]() -
资源监控
kubectl top pod # 查看 Pod 的 CPU/内存使用情况 [1]() kubectl get hpa # 查看水平自动扩缩容策略 [1]() -
端口转发与文件传输
kubectl port-forward pod/nginx 8080:80 # 本地端口映射 [1](https://blog.csdn.net/a1010256340/article/details/141265735) kubectl cp ./local-file pod/nginx:/remote/path
四、集群管理
-
节点操作
kubectl cordon <node-name> # 标记节点不可调度 [1]() kubectl drain <node-name> # 安全驱逐节点上的 Pod [1]() -
证书与污点
kubectl taint nodes key=value:NoSchedule # 添加污点 [8](https://blog.csdn.net/anqixiang/article/details/114150945) kubectl certificate approve # 批准证书签名请求 [2](https://blog.csdn.net/weixin_45561510/article/details/112470723)
五、高级功能
-
自动补全与插件
source <(kubectl completion bash) # 配置命令自动补全 [6]() kubectl plugin list # 查看插件列表 [1]() -
版本与帮助
kubectl version # 查看客户端/服务端版本 [6](https://developer.aliyun.com/article/1525933) kubectl explain pods.spec
以上命令覆盖了 Kubernetes 日常运维的核心场景,更多细节可参考原文链接。如需完整命令列表或特定场景操作,建议结合官方文档 15 进一步学习。

浙公网安备 33010602011771号