kubernetes——部署有状态的多副本应用

有状态应用要求管理者配置文件中列出所有其它的集群成员和他们的ip地址。

StatefulSet

有状态的应用中每一个实例都是不可替代的个体,都拥有稳定的名字和状态

如果使用StatefulSet,当有一个pod挂掉后,这个实例需要在别的节点上重建,但是新的实例必须与被替换的实例拥有相同的名称、网络标识和状态。

因为有状态的服务会根据先前的访问做一些不同的处理,所以,我们要将所有的有状态的pod做headless service。当调用时,会返回每个pod的ip。

创建StatefulSet控制器管理的pod

我们首先创建数据卷

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-a
spec:
  capacity:
    storage: 2Mi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: standard
  hostPath:
    path: /tmp
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-b
spec:
  capacity:
    storage: 2Mi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: standard
  hostPath:
    path: /tmp

创建两个数据卷之后,再创建SatefulSet管理的pod

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: first-state
spec:
  selector:
    matchLabels:
      app: myapp
  serviceName: first-state
  replicas: 2
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: luksa/kubia-pet
        ports:
        - containerPort: 8080
          name: web
        volumeMounts:
        - name: data
          mountPath: /var/data
          readOnly: false
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 2Mi

创建pod

kubectl create -f statetest.yaml

查看状态

#查看数据卷的状态
kubectl get pv

kubernetes——部署有状态的多副本应用

#查看数据卷声明的状态
kubectl get pvc

kubernetes——部署有状态的多副本应用
如果此时删除一个pod

kubectl delete po first-state-0

kubernetes——部署有状态的多副本应用
你会发现,会自动新创建一个pod,新创建的pod和之前删除的pod名称相同。

上一篇:打包 python 程序,变成一个可执行文件


下一篇:【k8s】通过命令行删除字段