16.kubernetes基于Longhorn部署有状态(StatefulSet)应用

StatefulSet

StatefulSet 是用来管理有状态应用的工作负载 API 对象。

StatefulSet 用来管理某 Pod 集合的部署和扩缩, 并为这些 Pod 提供持久存储和持久标识符。

Deployment 类似(13.Kubernetes应用部署完整流程:从Dockerfile到Ingress发布完整流程), StatefulSet 管理基于相同容器规约的一组 Pod。但和 Deployment 不同的是, StatefulSet 为它们的每个 Pod 维护了一个有粘性的 ID。这些 Pod 是基于相同的规约来创建的, 但是不能相互替换:无论怎么调度,每个 Pod 都有一个永久不变的 ID。

如果希望使用存储卷为工作负载提供持久存储,可以使用 StatefulSet 作为解决方案的一部分。 尽管 StatefulSet 中的单个 Pod 仍可能出现故障, 但持久的 Pod 标识符使得将现有卷与替换已失败 Pod 的新 Pod 相匹配变得更加容易。

这里我将演示使用 Longhorn 做为 StatefulSet 应用的持久化存储

初始化 StatefulSet 应用

[root@docker ~]# cat nginx-pvc.yaml 
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      restartPolicy: Always
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: registry.cn-beijing.aliyuncs.com/kube-mirrors/nginx:stable-alpine
        livenessProbe:
          exec:
            command:
              - ls
              - /usr/share/nginx/html/lost+found
          initialDelaySeconds: 5
          periodSeconds: 5
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "longhorn"
      resources:
        requests:
          storage: 1Gi

---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  selector:
    app: nginx
---

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ingressClassName: nginx
  rules:
    - host: nginx.example.io
      http:
        paths:
          - pathType: Prefix
            path: "/"
            backend:
              service:
                name: nginx
                port:
                  number: 80


[root@docker ~]# kubectl get pvc
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
www-web-0   Bound    pvc-591d3c01-8898-4952-b598-0530503f4bcf   1Gi        RWO            longhorn       <unset>                 54s
www-web-1   Bound    pvc-9c03f4f7-0ec4-485f-b959-45844724f68a   1Gi        RWO            longhorn       <unset>                 36s
www-web-2   Bound    pvc-2cdd5e78-00c4-45a6-94e3-260e8aafc580   1Gi        RWO            longhorn       <unset>                 18s

[root@docker ~]# kubectl get po
NAME                    READY   STATUS    RESTARTS        AGE
web-0                   1/1     Running   0               56s
web-1                   1/1     Running   0               38s
web-2                   1/1     Running   0               19s

# 向每个POD中写入唯一的数据
[root@docker ~]# for i in 0 1 2; do kubectl exec web-$i -- sh -c 'echo "$(hostname)" > /usr/share/nginx/html/index.html'; done
# 每个POD返回的都是一个唯一的字符串
[root@docker ~]# for i in 0 1 2; do kubectl exec -i -t "web-$i" -- curl http://localhost/; done
web-0
web-1
web-2

在这里插入图片描述

扩容/缩容 StatefulSet

# 将 statefulset 缩容到2个POD,web-2 POD将会被删除,但相关联的PVC、PV并不会删除
[root@docker ~]# kubectl scale statefulset --replicas 2 web
statefulset.apps/web scaled
[root@docker ~]# kubectl get po
NAME                    READY   STATUS    RESTARTS      AGE
web-0                   1/1     Running   0             32m
web-1                   1/1     Running   0             32m
[root@docker yaml]# for i in {0..10}; do curl -H "Host: nginx.example.io" 192.168.36.128; done
web-0
web-0
web-1
web-0
web-1
web-1
web-1
web-1
web-1
web-0
web-1

# 将 statefulset 扩容到3个POD
[root@docker ~]# kubectl scale statefulset --replicas 3 web
statefulset.apps/web scaled
[root@docker ~]# kubectl get po
NAME                    READY   STATUS              RESTARTS      AGE
kuard-b8496fc59-2zzwh   1/1     Running             1 (41m ago)   23h
kuard-b8496fc59-9p8lm   1/1     Running             1 (41m ago)   23h
kuard-b8496fc59-lfsxz   1/1     Running             1 (41m ago)   23h
web-0                   1/1     Running             0             33m
web-1                   1/1     Running             0             32m
web-2                   0/1     ContainerCreating   0             4s

[root@docker ~]# kubectl get po
NAME                    READY   STATUS    RESTARTS      AGE
kuard-b8496fc59-2zzwh   1/1     Running   1 (42m ago)   23h
kuard-b8496fc59-9p8lm   1/1     Running   1 (42m ago)   23h
kuard-b8496fc59-lfsxz   1/1     Running   1 (42m ago)   23h
web-0                   1/1     Running   0             33m
web-1                   1/1     Running   0             33m
web-2                   1/1     Running   0             26s

# 此时 web-2 上线,任然能返回web-2
[root@docker ~]# for i in {0..10}; do curl -H "Host: nginx.example.io" 192.168.36.128; done
web-2
web-2
web-0
web-1
web-1
web-2
web-1
web-0
web-0
web-0
web-0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodingDemo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值