目录
一:replication controller和replicaset
一:replication controller和replicaset
1:replication controller
RC(replication controller,复制控制器)
数量维持在指定数值上
RC用来确保Pod副本数达到期望值,这样可以确保一个或多个同类Pod总是可用的。
replication controller的使用示例。
#编写RC文件
vim replicationcontroller-nginx.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 3
selector:
app: nginx
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
#创建RC
kubectl apply -f replicationcontroller-nginx.yaml
#查看节点运行状态
kubectl get pod
kubectl get rc
#删除一个pod并立即查看pod状态
kubectl delete -f replicationcontroller-nginx.yaml
2:标签与标签选择器
(1)标签
在 Kubernetes 中,标签(Labels)是附加到资源(如 Pod、Node、Service 等)上的键值对,用于组织、标识和选择资源。标签不提供唯一性,同一标签可以被添加到多个资源上。
示例标签:
app: web-server
env: production
tier: frontend
(2)标签选择器
标签选择器(Label Selectors)是 Kubernetes 中用于过滤和选择资源的表达式。通过标签选择器,可以基于标签的键值对来筛选符合条件的资源。
标签选择器类型:
等式 - based 选择器:使用
=
、==
(相等)或!=
(不相等)。app=web-server env!=development
集合 - based 选择器:使用
in
、notin
或exists
。tier in (frontend, backend) env notin (test, staging)
(3)标签与标签选择器举例
- 基于等式的标签选择器
selector:
app: nginx
- 基于集合的标签选择器
matchExpressions:
- {key: tier, operator: In, values: [frontend]}
3:replicaset
ReplicaSet(复制集,RS)是支持基于集合的标签选择器的下一代Replication Controller,它主要用于Deployment协调创建、删除和更新Pod,和Replication Controller唯一的区别是,ReplicaSet支持基于集合的标签选择器。
replicaset的使用示例。
#编写RS文件
vim replicaset-example.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
labels:
app: guestbook
tier: frontend
spec:
# modify replicas according to your case
replicas: 3
selector:
matchLabels:
tier: frontend
matchExpressions:
- {key: tier, operator: In, values: [frontend]}
template:
metadata:
labels:
app: guestbook
tier: frontend
spec:
containers:
- name: php-redis
image: nginx:1.7.9
resources:
requests:
cpu: 100m
memory: 100Mi
env:
- name: GET_HOSTS_FROM
value: dns
# If your cluster config does not include a dns service, then to
# instead access environment variables to find service host
# info, comment out the 'value: dns' line above, and uncomment the
# line below.
# value: env
ports:
- containerPort: 80
#创建RS
kubectl apply -f replicaset-example.yaml
#查看节点运行状态
kubectl get pod
#删除一个pod并立即查看pod状态
kubectl delete -f replicaset-example.yaml
二:无状态应用管理Deployment
1:什么是无状态
在云计算和微服务架构中,"无状态" 指应用不保存客户端会话数据或请求间的上下文信息。每次请求都被视为独立事件,服务器不会记录之前的交互状态。无状态应用的实例可以独立运行,无需共享状态信息。
2:无状态服务特点
- 独立性:每个请求都能被任意实例处理,无需依赖其他实例
- 可扩展性:易于水平扩展,通过增加实例数量提升处理能力
- 高可用性:单个实例故障不影响整体服务,可快速替换
- 简化部署:无需考虑状态同步,部署和管理更简单
3:无状态服务的应用场景
- Web 前端服务:如静态网站、API 网关
- 批处理作业:数据处理任务,无需保存中间状态
- 微服务架构:多数微服务设计为无状态,便于独立扩展
- 负载均衡场景:请求可随机分发到任意实例
4:Deployment的使用示例。
(1)创建Deployment
下面是一个部署 Nginx 的示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
执行命令创建:
kubectl apply -f nginx-deployment.yaml
(2)更新Deployment
将 Nginx 版本更新到 1.16.1:
kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1
或直接编辑配置文件后重新应用:
kubectl edit deployment/nginx-deployment
(3)回滚Deployment
#查看更新历史:
kubectl rollout history deployment/nginx-deployment
#回滚到上一个版本:
kubectl rollout undo deployment/nginx-deployment
#回滚到指定版本:
kubectl rollout undo deployment/nginx-deployment --to-revision=2
(4)扩容Deployment
#将副本数增加到 5:
kubectl scale deployment/nginx-deployment --replicas=5
#通过编辑配置文件:
spec:
replicas: 5
(5)删除Deployment
kubectl delete deployment nginx-deployment
三:有状态应用管理statefulset
1:什么是有状态
在容器编排领域,"有状态" 指应用需要维护特定的状态信息,这些状态信息与其生命周期密切相关,例如:
- 唯一的网络标识(如固定的主机名或 IP 地址)
- 持久化存储(如数据库文件、配置数据)
- 有序的启动 / 停止顺序
- 与其他组件的特定关联关系
与无状态应用(如 Web 服务器集群)不同,有状态应用的每个实例都是不可互换的,需要单独管理其状态。
2:有状态服务特点
- 稳定的网络标识:每个 Pod 都有固定的标识符(如
web-0
,web-1
),不受重启或迁移影响。- 持久化存储:通过 PersistentVolumeClaim (PVC) 绑定持久卷,确保数据不随 Pod 销毁而丢失。
- 有序部署与扩展:Pod 按顺序创建(从 0 开始递增),且前一个 Pod 就绪后才创建下一个。
- 有序收缩与删除:Pod 按逆序终止(从最大序号开始),确保数据一致性。
- 滚动更新:支持按序更新 Pod,可配置更新策略(如并行或顺序)。
3:有状态服务的应用场景
- 数据库集群:如 MySQL、MongoDB、Elasticsearch,需要固定网络标识和持久化存储。
- 消息队列:如 Kafka、RabbitMQ,依赖有序节点和数据持久化。
- 分布式系统:如 ZooKeeper、etcd,需要稳定的成员关系和状态存储。
- 文件系统:如 NFS、Ceph,需要固定的存储提供者。
- 任何需要保持会话状态的应用:如用户会话管理、购物车系统等。
4:statefulset的使用示例。
(1)创建statefulset
以下是一个简单的 Nginx StatefulSet 示例,包含固定域名和持久化存储:
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None # Headless Service,用于稳定的网络标识
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx" # 指定关联的 Headless Service
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates: # 持久化存储声明模板
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
创建命令:
kubectl apply -f statefulset.yaml
(2)扩容statefulset
#将 replicas 从 3 增加到 5:
kubectl scale statefulset web --replicas=5
#直接编辑 StatefulSet:
kubectl edit statefulset web
(3)缩容statefulset
#将 replicas 从 5 减少到 2:
kubectl scale statefulset web --replicas=2
(4)非级联删除statefulset
#仅删除 StatefulSet 控制器,保留 Pod 和 PVC:
kubectl delete statefulset web --cascade=orphan
#此时:
Pods 不会被删除,继续运行
PVC 和 PV 保持不变,数据不会丢失
重新创建同名 StatefulSet 时,会接管现有 Pod
(5)级联删除statefulset
#删除 StatefulSet 及其管理的 Pods,但保留 PVC:
kubectl delete statefulset web
#彻底删除 StatefulSet、Pods 和 PVC:
kubectl delete statefulset web --cascade=foreground
kubectl delete pvc -l app=nginx # 删除关联的 PVC
四:守护进程集DaemonSet
1:什么是DaemonSet
DaemonSet 是 Kubernetes 中的一种控制器,其核心功能是确保集群中每个(或指定)节点上都运行一个 Pod 副本。当节点加入集群时,DaemonSet 会自动在该节点上部署 Pod;当节点从集群中移除时,Pod 也会被相应删除。这种特性使其适用于需要在每个节点上运行系统级服务的场景,例如:
- 节点监控代理(如 Prometheus Node Exporter)
- 日志收集代理(如 Fluentd)
- 网络插件(如 Calico Node)
- 存储驱动程序(如 Ceph 客户端)
DaemonSet 的典型特点包括:
- 节点一致性:确保 Pod 在节点上均匀分布,无需手动管理每个节点的部署。
- 自动适配节点变化:动态响应集群节点的添加或删除。
- 无副本数量控制:副本数由节点数量决定,而非手动指定。
2:DaemonSet的使用示例。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
namespace: monitoring
spec:
selector:
matchLabels:
app: node-exporter
template:
metadata:
labels:
app: node-exporter
spec:
containers:
- name: node-exporter
image: prom/node-exporter:v1.6.1
ports:
- containerPort: 9100
securityContext:
privileged: true # 允许访问节点硬件信息
volumeMounts:
- name: proc
mountPath: /host/proc
- name: sys
mountPath: /host/sys
volumes:
- name: proc
hostPath:
path: /proc
- name: sys
hostPath:
path: /sys
tolerations:
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
nodeSelector:
kubernetes.io/os: linux # 仅在Linux节点部署
关键配置说明:
- selector:定义 Pod 的标签选择器,用于匹配模板中的标签。
- volumes/volumeMounts:通过
hostPath
挂载节点的/proc
和/sys
目录,使 Pod 能访问节点硬件信息。- tolerations:设置容忍度以允许在 Master 节点部署(默认情况下 DaemonSet 不会在 Master 节点运行)。
- nodeSelector:指定仅在 Linux 节点上部署 Pod。
五:CronJob
CronJob 是 Kubernetes 中用于管理周期性任务的控制器,类似 Linux 系统中的 crontab,支持按时间计划创建 Job(一次性任务)。典型应用场景包括:
- 定时备份数据库
- 周期性数据统计与报表生成
- 定时清理临时文件
- 批量任务调度(如每日凌晨同步数据)
1:CronJob的使用示例。
apiVersion: batch/v1
kind: CronJob
metadata:
name: mysql-backup
namespace: default
spec:
schedule: "0 2 * * *" # 每天凌晨2点执行
jobTemplate:
spec:
template:
spec:
containers:
- name: mysql-backup
image: mysql:8.0
env:
- name: MYSQL_HOST
value: "mysql-service"
- name: MYSQL_USER
value: "backup-user"
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secrets
key: password
- name: BACKUP_DIR
value: "/backups"
command: ["/bin/sh", "-c"]
args:
- |
mkdir -p $(BACKUP_DIR)
mysqldump -h $(MYSQL_HOST) -u $(MYSQL_USER) -p$(MYSQL_PASSWORD) mydatabase > $(BACKUP_DIR)/db_backup_$(date +\%Y\%m\%d).sql
tar -czf $(BACKUP_DIR)/backup_$(date +\%Y\%m\%d).tar.gz $(BACKUP_DIR)/db_backup_$(date +\%Y\%m\%d).sql
# 此处可添加上传备份到云存储的命令
volumes:
- name: backup-volume
persistentVolumeClaim:
claimName: backup-pvc
restartPolicy: OnFailure
successfulJobsHistoryLimit: 3 # 保留最近3次成功任务记录
failedJobsHistoryLimit: 1 # 保留最近1次失败任务记录
关键配置说明:
- schedule:使用 crontab 格式定义执行时间,
"0 2 * * *"
表示每天凌晨 2 点。- env:通过环境变量传递数据库连接信息,密码从 Secret 中获取以保证安全。
- command/args:定义备份脚本,使用
mysqldump
导出数据库并打包压缩。- volumes:通过 PersistentVolumeClaim 持久化存储备份文件,避免 Pod 重启后数据丢失。
- restartPolicy:设置为
OnFailure
,仅在任务失败时重启容器。- historyLimit:控制历史任务记录数量,避免占用过多资源。