目录

Kubernetes 有状态应用部署

StatefulSet 控制器概述

示例

StatefulSet 控制器:独享存储


Kubernetes 有状态应用部署


• 无状态与有状态


• StatefulSet 控制器概述


• StatefulSet 控制器:网络标识


• StatefulSet 控制器:独享存储




Deployment控制器设计原则:管理的所有Pod一模一样,提供同一个服务,也不考虑在哪台Node 运行,可随意扩容和缩容。这种应用称为“无状态”,例如Web服务



在实际的场景中,并不能满足所有应用,尤其是分布式应用,会部署多个实例,这些实例之间往往有 依赖关系,例如主从关系、主备关系,这种应用称为“有状态”,例如MySQL主从、Etcd集群



这时候就需要有状态部署了,有状态部署有以下几个特点:


1、每个pod角色不同(不对等)



2、pod之间有连接关系



3、每个pod都有独立的存储



StatefulSet 控制器概述


StatefulSet控制器用于部署有状态应用,满足一些有状态应用的需求:


• Pod有序的部署、扩容、删除和停止


• Pod分配一个稳定的且唯一的网络标识


• Pod分配一个独享的存储



稳定的Pod网络标识:使用Headless Service(相比普通Service只是将spec.clusterIP定义为None)来


维护Pod网络身份,会为每个Pod分配一个数字编号并且按照编号顺序部署。


在StatefulSet添加serviceName: “nginx”字段指定使用这个Headless Service。


稳定主要体现在主机名和Pod A记录:


• 主机名:<statefulset名称>-<编号>


• Pod DNS A记录:<statefulset名称-编号>.<service-name> .<namespace>.svc.cluster.local


示例


创建一个statefulSet的yaml



vi statefulSet,yaml



apiVersion: apps/v1

kind: StatefulSet

metadata:

  name: web666

spec:

 serviceName: web666

  selector:

    matchLabels:

      app: web666

  replicas: 3

  template:

    metadata:

      labels:

        app: web666

    spec:

      containers:

      - name: nginx

        image: nginx



与deployment不同,statefulset在yaml就要指定service



创建无头service服务


vi web666


apiVersion: v1

kind: Service

metadata:

  name: web666

  namespace: default

spec:

 clusterIP: None

  ports:

  - port: 80

    protocol: TCP

    targetPort: 80

  selector:

    app: web666

  type: ClusterIP


他的clusterIP为None



执行service


kubectl apply -f web666.yaml



kubectl apply -f statefulSet.yaml




k8s 的StatefulSet是意思 k8s statefulset deployment_运维



创建一个测试pod


kubectl run bs --image=busybox:1.28.4 -- sleep 24h


使用


nslookup web666


可以看到,他与普通service不同,是为每一个pod起了一个单独的域名




k8s 的StatefulSet是意思 k8s statefulset deployment_容器_02


传统的service没有



k8s 的StatefulSet是意思 k8s statefulset deployment_k8s 的StatefulSet是意思_03



StatefulSet 控制器:独享存储



Pod独享存储:StatefulSet的存储卷使用VolumeClaimTemplate创建,称为卷申请模板,当StatefulSet


使用VolumeClaimTemplate创建一个PersistentVolume时,同样也会为每个Pod分配并创建一个编号的


PVC,每个PVC绑定对应的PV,从而保证每个Pod都拥有独立的存储。



k8s 的StatefulSet是意思 k8s statefulset deployment_运维_04