–背景

当对于无状态应用时我们可以随意扩容删除

但对于有状态应用时我们就不能随意,因为他要依赖我们本地的文件和网络等

那么我们有状态应用就需要实现在容器的删除建立中,文件网络时不变的

  • Headless Service

    用于定义网络标志(DNS domain)

    服务名 ==> 域名 ==> ip

  • volumeClaimTemplate

    将某些依赖挂载到这个卷上,实现持久化存储

如何创建一个sts#

  • cd /home/echin
    mkdir sts
    cd sts/
    touch web.yaml
    vim web.yaml
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46

    * `````
    apiVersion: apps/v1 # 指定使用的 Kubernetes API 版本
    kind: StatefulSet # 资源类型为 StatefulSet,用于管理有状态应用的 Pod 副本

    metadata:
    name: web # StatefulSet 的名称

    spec: # StatefulSet 的规格定义
    serviceName: "nginx" # 服务名称,StatefulSet 中的 Pod 将通过这个服务名进行网络通信
    replicas: 2 # 期望运行的 Pod 副本数量

    selector: # 选择器,用于匹配 StatefulSet 管理的 Pod
    matchLabels:
    app: web # 选择器匹配的标签

    template: # Pod 模板,定义了 Pod 的规格和运行的容器
    metadata:
    labels:
    app: web # Pod 模板的标签,用于与选择器匹配

    spec: # Pod 模板的规格定义
    containers: # Pod 中的容器列表
    - name: nginx # 容器名称
    image: nginx:latest # 容器使用的镜像
    ports: # 容器暴露的端口列表
    - containerPort: 80 # 容器内部暴露的端口号
    name: web # 端口名称
    volumeMounts: # 容器的卷挂载点
    - name: www # 挂载的卷名称
    mountPath: /usr/share/nginx/html # 卷挂载到容器内的路径

    volumeClaimTemplates: # 卷声明模板列表,用于动态创建持久化存储
    - metadata: # 卷声明模板的元数据
    name: www # 卷声明模板的名称
    spec: # 卷声明模板的规格定义
    accessModes: [ "ReadWriteOnce" ] # 卷的访问模式,这里指定为可读写
    resources: # 卷的资源请求
    requests: # 资源的请求量
    storage: 1Gi # 请求的存储容量为 1 吉字节
    `````

    * ````bash
    # 查看
    kubectl get sts
    kubectl describe sts web-0

扩容/缩容#

1
kubectl scale sts web --replicas=2

灰度发布/金丝雀发布#

将应用上线把上线风险降到最低

虽然滚动更新可以偷偷摸摸地把所有东西都更新完

但是如果新版本是有问题的,就会产生很大的风险

而灰度发布就是对少部分的服务器进行更新,如果这些服务器没问题,再使用滚动更新到所有服务器

利用配置中的 partition 字段:

如果总共有5个Pod,updateStrategy:partition=3,那么只会更新序号大于等于3的pod

通过不断缩小partition的数字来扩大更新的数量

1
kubectl edit sts web-0

onDelete#

配置中修改成:

1
2
updateStrategy:
type: onDelete # 原来是RollingUpdate

就会变成只有我删除时才会更新的操作

1
2
3
kubectl edit po web-0 

kubectl describe po web-0 # 会发现编辑后无用
1
2
3
4
5
kubectl delete po web-0

kubectl get po web-0 # 会发现web-0 没有被删除

kubectl describe po web-0 # 会发现wewb-0的数据更新了

作用:可以实现复制体中的单独一个两个更新,如果我想更新其中一个,我只要删除某一个Pod就行

级联删除和非级联删除#

  • 级联删除

    当你删除 StatefulSet 时,默认情况下会触发级联删除,这意味着 StatefulSet 管理的所有 Pods 也会被自动删除。这是删除 StatefulSet 的默认行为。

    命令

    1
    kubectl delete statefulset web

这个命令会删除名为 websts 以及所有由他管理的pods

  • 非级联删除

    如果你希望删除 StatefulSet 但保留与之关联的 Pods,你可以使用 --cascade=false--delete-dependents=false 标志。请注意,--cascade 标志在某些版本的 kubectl 中可能不可用或已被替换为 --delete-dependents

    命令

    1
    2
    3
    kubectl delete statefulset web --cascade=false
    # 或者
    kubectl delete statefulset web --delete-dependents=false

    这个命令会删除 StatefulSet,但不会删除它管理的 Pods。Pods 将继续存在,但将成为 “孤儿”(即没有 StatefulSet 控制器管理它们)。

  • 删除 Service

    删除 Service 资源时,通常不会影响与之关联的 Pods。Service 负责定义访问 Pods 的网络接口,但并不直接管理 Pods 的生命周期。

    命令

    1
    kubectl delete service nginx

    这个命令会删除名为 nginx 的 Service。如果这个 Service 被用来暴露 StatefulSet 中的 Pods,删除 Service 将停止外部对这些 Pods 的访问,但不会影响 Pods 本身。