1.deployment:适用于无状态服务
1.功能
(1)创建高可用pod
(2)滚动升级/回滚
(3)平滑扩容和缩容
2.操作命令
(1)回滚
# 回滚到上一个版本
kubectl rollout undo deployment/my-app
# 回滚到特定版本(先查看历史)
kubectl rollout history deployment/my-app
kubectl rollout undo deployment/my-app --to-revision=2
(2)平滑扩容和缩容
手动扩缩容
# 扩容到 5 个副本
kubectl scale deployment/my-app --replicas=5
# 缩容到 2 个副本
kubectl scale deployment/my-app --replicas=2
自动扩缩容(HPA)
# 创建 HPA(CPU 使用率超过 50% 时扩容,最多 10 个 Pod)
kubectl autoscale deployment/my-app --min=2 --max=10 --cpu-percent=50
3.滚动升级/回滚图解(先创建出新的,然后用新的逐步替换出旧的)
、
4.滚动升级/回滚示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-httpd # Deployment 名称
labels:
app: httpd # 标签(用于 Service 选择器匹配)
spec:
replicas: 3 # Pod 副本数(高可用)
revisionHistoryLimit: 5 # 保留的历史版本数(用于回滚)
strategy:
type: RollingUpdate # 滚动升级策略
rollingUpdate:
maxSurge: 1 # 升级时最多临时超出的 Pod 数量
maxUnavailable: 0 # 升级时允许不可用的 Pod 数量(0 表示全量可用)
selector:
matchLabels:
app: httpd # 匹配 Pod 的标签(必须与 template 一致)
template:
metadata:
labels:
app: httpd # Pod 标签(Service 通过此选择器关联)
spec:
affinity: # 反亲和性:将 Pod 分散到不同节点
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: httpd
topologyKey: kubernetes.io/hostname
containers:
- name: httpd
image: httpd:alpine # 容器镜像
ports:
- containerPort: 80 # 容器监听的端口(targetPort)
resources:
requests:
cpu: "100m" # 最小资源请求(HPA 自动扩缩容依据)
memory: "128Mi"
limits:
cpu: "200m" # 资源上限
memory: "256Mi"
livenessProbe: # 健康检查
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 10
5.hpa扩缩容示例
五.HPA弹性控制器:监控控制器,实现集群的自动扩缩容
设置控制器:
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: mydeploy
spec:
replicas: 1
selector:
matchLabels:
app: deploy-httpd
template:
metadata:
labels:
app: deploy-httpd
spec:
containers:
- name: web
image: myos:httpd
resources: # 为该资源设置配额
requests: # HPA 控制器会根据配额使用情况伸缩集群
cpu: 300m # CPU 配额
---
kind: Service #负载均衡
apiVersion: v1
metadata:
name: websvc
spec:
type: ClusterIP
clusterIP: 10.245.1.80
selector:
app: deploy-httpd
ports:
- protocol: TCP
port: 80
targetPort: 80
HPA 控制器:
---
kind: HorizontalPodAutoscaler
apiVersion: autoscaling/v2
metadata:
name: myhpa
spec:
behavior: # 窗口稳定期,这个期间的资源变化
scaleDown:
stabilizationWindowSeconds: 60
scaleTargetRef: # 指定控制器
kind: Deployment
apiVersion: apps/v1
name: mydeploy
minReplicas: 1 # 副本数量
maxReplicas: 3
metrics: # 扩缩容设置
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50 #百分比,节点超过设置的cpu资源的百分之50,则扩容节点,平均资源小于值,缩容
2.statefulset:有状态的服务,(redis,mysql等)
通过headless无头服务,暴露每个pod的唯一dns地址
访问方式 :redis-0.redis-service.default.svc.cluster.local(0个-服务名.----)
(1) Headless Service 配置
# service-headless.yaml
apiVersion: v1
kind: Service
metadata:
name: redis-service # 名称需与 StatefulSet 的 serviceName 一致
spec:
clusterIP: None # Headless Service 的关键配置
selector:
app: redis # 匹配 StatefulSet 的 Pod 标签
ports:
- protocol: TCP
port: 6379 # Service 端口,集群内部的访问端口,nodeport集群外部的访问端口
targetPort: 6379 # Pod 端口,用于service,后端服务的端口
(2) StatefulSet 配置
# statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
serviceName: "redis-service" # 必须与 Headless Service 名称一致
replicas: 3
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:alpine
ports:
- containerPort: 6379 容器里面的端口
volumeClaimTemplates: # 每个 Pod 独立存储
- metadata:
name: data
spec:
storageClassName: "ssd"
resources:
requests:
storage: 10Gi
3.daemonset:守护进程,保证每个node上都运行一个容器(Prometheus日志,elk监控等)
# DaemonSet 示例:Fluentd 日志收集
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
spec:
selector:
matchLabels:
name: fluentd
template:
metadata:
labels:
name: fluentd
spec:
containers:
- name: fluentd
image: fluent/fluentd
volumeMounts:
- name: varlog
mountPath: /var/log
volumes:
- name: varlog
hostPath:
path: /var/log
4.job和cronjob:定时任务的pod,数据备份,定时器清理等(执行完后pod销毁)
5.HPA弹性控制器:自动扩缩容
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy # 此名称必须与HPA中的scaleTargetRef.name一致
spec:
replicas: 3
template:
spec:
containers:
- name: nginx
image: nginx
resources:
requests:
cpu: "100m"
# HPA
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deploy # 必须与集群中Deployment名称一致
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50 # CPU使用率目标50%
behavior: # 扩缩容行为控制(Kubernetes 1.18+)
scaleDown: # 缩容配置
stabilizationWindowSeconds: 300 # 缩容冷却时间5分钟(默认300秒)
policies:
- type: Percent # 按百分比缩容
value: 10 # 每次最多缩容10%的Pod
periodSeconds: 60 # 每60秒评估一次
- type: Pods # 按固定数量缩容(与Percent二选一)
value: 1 # 每次最多缩容1个Pod
scaleUp: # 扩容配置
stabilizationWindowSeconds: 60 # 扩容冷却时间1分钟(默认0秒)
policies:
- type: Percent
value: 100 # 允许瞬间扩容100%的Pod(紧急情况下)
periodSeconds: 15
- type: Pods
value: 4 # 每次最多扩容4个Pod