21. 什么是 ReplicaSet,说明它的主要用途。
ReplicaSet是k8s中的一个控制器,他用于保证任何时候,都有指定数量的Pod副本在运行,他是RC的升级版,支持更灵活的Pod选择器(基于集合的标签选择)
主要用途:
1.确保Pod的高可用性:通过维护一组稳定的Pod副本,即使某些Pod失败或被删除,RS也会自动创建新的Pod来维持期望的副本数。
2.水平拓展:可以通过台哦正replicas字段来手动扩展或伸缩Pod的数量。
3.与Deployment配合使用:RS通常不直接使用,而是作为Deployment的底层机制,由Deploymen管理RS以实现滚动更新和回滚功能。(每个版本都是不同的一个RS,通过控制不同版本的RS的POD的数量实现滚动更新)
22. Deployment 控制器是如何工作的,举例说明其常见用途。
Deployment 是 Kubernetes 中用于管理无状态应用的控制器,它通过管理 ReplicaSet 来实现 Pod 的声明式更新、回滚和扩缩容。
工作原理:
-
声明期望状态:用户通过 YAML 文件定义 Deployment 的期望状态(如副本数、Pod 模板、更新策略等)。
-
创建 ReplicaSet:Deployment 创建一个 ReplicaSet,并由 ReplicaSet 创建和管理 Pod。
-
滚动更新:
-
当 Pod 模板(如镜像版本)更新时,Deployment 会创建一个新的 ReplicaSet,并逐步将 Pod 从旧 ReplicaSet 迁移到新 ReplicaSet。
-
支持多种更新策略(如
RollingUpdate
或Recreate
)。
-
-
回滚 :如果更新后出现问题,可以回滚到之前的版本(通过
kubectl rollout undo
)。
常见用途:
-
部署微服务:例如部署一个 Web 服务,指定镜像和副本数:
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
-
滚动更新:更新镜像版本时,Deployment 会逐步替换旧 Pod。
-
蓝绿部署或金丝雀发布:结合多个 Deployment 和 Service 实现。
23. 解释 DaemonSet,列举其使用场景
DaemonSet 是 Kubernetes 中确保所有(或部分)节点上运行一个 Pod 副本的控制器。适用于需要在每个节点上运行一个实例的守护进程。
特点:
-
每个节点自动运行一个 Pod。
-
新节点加入集群时,DaemonSet 会自动在新节点上创建 Pod。
-
节点被移除时,对应的 Pod 会被回收。
使用场景:
-
集群日志收集:如 Fluentd 或 Filebeat,在每个节点上收集日志并发送到中央存储。
-
监控代理:如 Prometheus 的 Node Exporter,在每个节点上收集监控数据。
-
网络插件:如 Calico 或 Flannel,在每个节点上运行网络代理。
-
存储守护进程:如 Ceph 或 GlusterFS 的客户端。
示例:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
spec:
selector:
matchLabels:
name: fluentd
template:
metadata:
labels:
name: fluentd
spec:
containers:
- name: fluentd
image: fluentd:latest
24. 什么是 StatefulSet,其主要作用是什么?
StatefulSet 是 Kubernetes 中用于管理有状态应用的控制器,为 Pod 提供稳定的标识符(如持久化存储、网络标识和有序部署/扩展)。
主要作用:
-
稳定的网络标识:
-
每个 Pod 有固定的主机名(如
<statefulset-name>-<ordinal-index>
)和 DNS 记录。 -
通过 Headless Service 提供唯一的 DNS 解析。
-
-
持久化存储:
-
每个 Pod 可以绑定一个或多个 PersistentVolume,即使 Pod 被重新调度,存储也会保留。
-
使用
volumeClaimTemplates
动态创建 PVC。
-
-
有序部署和扩展:
-
Pod 按顺序创建/删除(从 0 到 N-1),适合主从架构的应用(如 MySQL 主从)。
-
缩容时按逆序终止(从 N-1 到 0)。
-
适用场景:
-
数据库集群:如 MySQL、PostgreSQL 或 MongoDB 的主从复制。
-
消息队列:如 Kafka 或 RabbitMQ,需要持久化存储和稳定网络标识。
-
分布式存储系统:如 Elasticsearch 或 Zookeeper。
示例:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
与 Deployment 的区别:
-
StatefulSet 适用于有状态应用,Deployment 适用于无状态应用。
-
StatefulSet 提供稳定的存储和网络标识,Deployment 不保证。