有状态服务的概念
既然名叫有状态,那么就与之相对,会有我们很熟悉的无状态。无状态的概念,就是只负责运算,不负责任何数据的存储,这样就能很轻松地做到水平扩展。
之前写的关于无状态的例子
那么,有状态的概念又是什么呢,简单来说,就是会有数据的存储,需要持久化。
k8s的petset
简单来说,pod是用来跑无状态服务,petset就是跑有状态服务。
1.3之前k8s大多是用于无状态的web应用,但是我们实际业务却有很多有状态的服务,对于谷歌来说,绝对不会放弃这一块的机会,所以petset就应运而生。
那么,作为有状态服务的基石,petset需要具备哪些特征呢:
- 有唯一的编号
- 在网络上有个不会改变的标识,k8s是通过域名实现的。pod,则是名字后面还有随机数,所以需要有service来做转发
- 每个有状态服务,都需要有自己的卷,这样就能保证数据可靠存储
petset的典型场景
MySQL
Zookeeper
Cassandra
redis
小试验
1 | # A headless service to create DNS records |
提示1
2
3
4
5
6
7
8
9
10
11
12$ ./kubectl describe pvc www-web-0
Name: www-web-0
Namespace: default
Status: Pending
Volume:
Labels: app=nginx
Capacity:
Access Modes:
Events:
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
5m 10s 22 {persistentvolume-controller } Warning ProvisioningFailed No provisioner plugin found for the claim!
这是因为需要设置Persistent Volume Provisioning
方法是在controller manager的启动参数加上--enable-hostpath-provisioner=true
,然后重启controller,再create就OK了。
redis
https://github.com/kubernetes/kubernetes/tree/master/test/e2e/testing-manifests/petset/redis
service.yml
1 | # A headless service to create DNS records |
petset.yml
1 | apiVersion: apps/v1alpha1 |
参考
本博客欢迎转发,但请保留原作者信息
github:codejuan
博客地址:http://blog.decbug.com/