k8s-无状态应用和有状态应用
k8s-无状态应用和有状态应用
- 一、无状态应用
- 二、有状态应用
- 总结
一、无状态应用
Stateless Application
(1)是指该服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一个请求响应的结果是完全一致的
(2)多个实例可以共享相同的持久化数据。例如:nginx实例,tomcat实例等
(3)相关的k8s资源有:ReplicaSet、ReplicationController、Deployment等,由于是无状态服务,所以这些控制器创建的pod序号都是随机值。并且在缩容的时候并不会明确缩容某一个pod,而是随机的,因为所有实例得到的返回值都是一样,所以缩容任何一个pod都可以
- 随便访问那个pod都会得到一样的结果
- pod的序号是随机的
- 缩容的时候是随机进行的,删除或者增加,顺序是随机的
一个简单的 nginx 部署(无状态)
[root@k8s-1 pod]# cat nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginxcompany: sc
spec:replicas: 10selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestports:- containerPort: 80
[root@k8s-1 pod]# kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-deployment created
[root@k8s-1 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-8d545c96d-6khpw 0/1 ContainerCreating 0 5s
nginx-deployment-8d545c96d-6tkm4 0/1 ContainerCreating 0 5s
nginx-deployment-8d545c96d-8n5mq 0/1 ContainerCreating 0 5s
nginx-deployment-8d545c96d-94g4f 0/1 ContainerCreating 0 5s
nginx-deployment-8d545c96d-96f7p 0/1 ContainerCreating 0 5s
nginx-deployment-8d545c96d-k487j 0/1 ContainerCreating 0 5s
nginx-deployment-8d545c96d-mzqsg 0/1 ContainerCreating 0 5s
nginx-deployment-8d545c96d-qg9bb 0/1 ContainerCreating 0 5s
nginx-deployment-8d545c96d-rxppb 0/1 ContainerCreating 0 5s
nginx-deployment-8d545c96d-tq28d 0/1 ContainerCreating 0 5s
观察以上启动的pod的名字是随机的,没有按照顺序产生:
无状态的业务: web
1.不需要保存数据
2.pod产生的顺序是随机的
3.缩容的时候是随机进行的,删除或者增加,顺序是随机的
二、有状态应用
Stateful Application
有状态服务 可以说是 需要数据存储功能的服务、或者指多线程类型的服务,队列等。(mysql数据库、kafka、zookeeper等)
特点:
- 实例按顺序进行创建、更新或销毁,不是随机的
- pod的编号是有顺序的
- 每个实例都需要有自己独立的持久化存储
简单的 StatefulSet 部署
[root@k8s-1 pod]# cat mysql.yaml
apiVersion: v1
kind: Service
metadata:name: mysql-svclabels:app: mysql
spec:ports:- port: 3306targetPort: 3306nodePort: 30036type: NodePortselector:app: mysql
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql-db
spec:selector:matchLabels:app: mysql # 必须匹配 .spec.template.metadata.labelsserviceName: "mysql-svc"replicas: 3 # 默认值是 1minReadySeconds: 3 # 默认值是 0template:metadata:labels:app: mysql # 必须匹配 .spec.selector.matchLabelsspec:terminationGracePeriodSeconds: 5containers:- name: mysqlimage: mysql:latestimagePullPolicy: IfNotPresentenv:- name: MYSQL_ROOT_PASSWORDvalue: "sc@123456"ports:- containerPort: 3306name: mysql-port
[root@k8s-1 pod]# kubectl apply -f mysql.yaml
service/mysql-svc created
statefulset.apps/mysql-db created
[root@k8s-1 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mysql-db-0 1/1 Running 0 15s
mysql-db-1 1/1 Running 0 9s
mysql-db-2 1/1 Running 0 3s[root@k8s-1 pod]# kubectl delete -f mysql.yaml
service "mysql-svc" deleted
statefulset.apps "mysql-db" deleted
[root@k8s-1 ~]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
mysql-db-2 1/1 Terminating 0 66s
mysql-db-1 1/1 Terminating 0 75s
mysql-db-0 1/1 Terminating 0 81s
总结
- 无状态应用适合不需要持久化数据、实例可随意替换的场景,部署和扩展更简单
- 有状态应用适合依赖持久化数据或稳定身份的场景,需要严格的实例管理和存储保障