k8s之StatefulSet有状态部署

目录

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记录:
• 主机名:-<编号>
• Pod DNS A记录:. ..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有状态部署_第1张图片
创建一个测试pod
kubectl run bs --image=busybox:1.28.4 -- sleep 24h
使用
nslookup web666
可以看到,他与普通service不同,是为每一个pod起了一个单独的域名
k8s之StatefulSet有状态部署_第2张图片
传统的service没有

StatefulSet 控制器:独享存储

Pod独享存储:StatefulSet的存储卷使用VolumeClaimTemplate创建,称为卷申请模板,当StatefulSet
使用VolumeClaimTemplate创建一个PersistentVolume时,同样也会为每个Pod分配并创建一个编号的
PVC,每个PVC绑定对应的PV,从而保证每个Pod都拥有独立的存储。
k8s之StatefulSet有状态部署_第3张图片

你可能感兴趣的:(k8s之负载控制器,kubernetes,运维,运维开发,容器,集成学习)