K8S笔记-Controller-StatefulSet(有状态)
myluzh 发布于 阅读:441 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