k8s之控制器详解

发布于:2025-07-31 ⋅ 阅读:(21) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到