Myluzh Blog

Strive to become a dream architect.

K8S笔记-Controller-StatefulSet(有状态)

发布时间: 2023-9-13 文章作者: myluzh 分类名称: Kubernetes


0x01 无状态和有状态区别

1.无状态
 *认为Pod都是一样的
 *没有顺序要求
 *不用考虑在哪个node运行
 *可以随意进行伸缩扩展
2.有状态
 *上面无状态的因素都需要考虑到
 *让每个pod独立的,保持pod启动顺序和唯一性
 *唯一的网络标识符,持久存储

 *有序的(比如mysql主从)


StatefulSet是用于管理有状态应用的控制器,它为每个Pod分配唯一的标识符,并按照一定规则生成唯一的FQDN(Fully Qualified Domain Name)。这使得有状态应用能够更好地适应动态的集群环境。

而Deployment则是用于管理无状态应用的控制器,它不保证每个Pod的标识符和FQDN的唯一性,也不保证Pod的启动顺序。


0x02 部署有状态应用

StatefulSet yaml文件如下,注意:ClusterIP为none(无头service)

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  serviceName: nginx-svc
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
  volumeClaimTemplates: []
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  type: ClusterIP
  clusterIP: None
  selector:
    app: nginx
  ports:
  - name: http
    port: 80
    targetPort: 80



deployment与statefulset区别:有身份的(唯一标识的),根据主机名+按照一定规则生成域名

格式:主机名称.service名称.名称空间.svc.cluster.local

例如:nginx-0.nginx-svc.default.svc.cluster.local


# 查看pod,有三个pod每个都是唯一的名称
[root@master statefulset]# kubectl get pod
NAME                        READY   STATUS    RESTARTS   AGE
nginx-0                     1/1     Running   0          2m52s
nginx-1                     1/1     Running   0          2m35s
nginx-2                     1/1     Running   0          2m19s
# 查看无头svc,可以看到ClusterIP为None
[root@master statefulset]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
nginx-svc    ClusterIP   None         <none>        80/TCP         5m6s




标签: k8s StatefulSet

发表评论