设为首页 收藏本站
查看: 777|回复: 0

[经验分享] 【Kubernetes】在K8s中创建StatefulSet

[复制链接]

尚未签到

发表于 2018-1-4 12:55:02 | 显示全部楼层 |阅读模式
在K8s中创建StatefulSet

遇到的问题:
  使用Deployment创建的Pod是无状态的,当挂在Volume之后,如果该Pod挂了,Replication Controller会再run一个来保证可用性,但是由于是无状态的,Pod挂了的时候与之前的Volume的关系就已经断开了,新起来的Pod无法找到之前的Pod。但是对于用户而言,他们对底层的Pod挂了没有感知,但是当Pod挂了之后就无法再使用之前挂载的磁盘了。

解决方案
  使用K8s v1.5版本推出的StatefulSet可以保留Pod的状态。

参考博客
  因为Kubernetes1.5版本发布也没过多久,国内的资料相当的少,除了tonybai等大牛博客上有一些StatefulSet的资料外,只能去外网上搜索了。通过在google上搜索StatefulSet的创建方式,最终发现了一篇英文博客,链接如下。对于这种新兴框架,还是要多去google啊。
  https://thenewstack.io/deploy-highly-available-wordpress-instance-statefulset-kubernetes-1-5/

如何创建
  在创建StatefulSet之前需要准备的东西,值得注意的是创建顺序非常关键,创建顺序如下:


  • 1、Volume
  • 2、Persistent Volume
  • 3、Persistent Volume Claim
  • 4、Service
  • 5、StatefulSet
  Volume可以有很多种类型,比如nfs、glusterfs等,我们这里使用的ceph RBD来创建。

创建Volume
  

sudo rbd create {volume_name} --size 1024 -m {ceph-monitor-ip} -k /etc/ceph/ceph.client.admin.keyring  
//禁止掉一些rdb的feature,否则挂载会失败
  
rbd feature disable volume101 exclusive-lock, object-map, fast-diff, deep-flatten
  

创建PersistentVolume
  创建pv.yaml,内容如下:
  

apiVersion: v1  
kind: PersistentVolume
  
metadata:
  name: {pv_name}
  labels:
  {label_key}:{label_value}
  
spec:
  capacity:
  storage: 1Gi
  accessModes:
  - ReadWriteOnce
  rbd:
  monitors:
  - {ceph-monitor-ip}
  pool: rbd
  image: {volume_name}
  user: admin
  secretRef:
  name: ceph-secret
  fsType: ext4
  readOnly: false
  persistentVolumeReclaimPolicy: Recycle
  

  使用
  

kubectl create -f pv.yaml  

  来创建PV。

创建PersistentVolumeClaim
  这一步非常非常的关键,因为如果创建的PVC的名称和StatefulSet中的名称没有对应上,那么StatefulSet中的Pod就肯定创建不成功,我在这一步被卡了一天之久,还好看到上面那篇外文博客,才发现PVC和StatefulSet中的命名的规律。接下来细说一下需要注意的地方。
  创建pvc.yaml如下:
  

apiVersion: v1  
kind: PersistentVolumeClaim
  
metadata:
  name: db-mysql-0
  
spec:
  accessModes:
  - ReadWriteOnce
  resources:
  requests:
  storage: 1Gi
  

  我们在这里创建了一个叫做db-mysql-0的PVC,这个名字是不是很奇怪,而且在这个yaml里并没有提到PV的名字,所以PV和PVC是怎么bound起来的呢?是通过labels标签下的key:value键值对来进行匹配的,我们在创建PV时指定了label的键值对,在PVC里通过selector可以指定label。
  然后再回到这个PVC的名称定义:db-mysql-0,为什么叫这样一个看似有规律的名字呢,这里需要看一下下一小节创建StatefulSet中的yaml,首先我们看到StatefulSet的name叫mysql,设置的replicas为2个,volumeMounts和volumeClaimTemplates的name必须相同,为db,所以StatefulSet创建的第一个Pod的name应该为mysql-0,第二个为mysql-1。这里StatefulSet中的Pod与PVC之间的绑定关系是通过名称来匹配的,即:
  

PVC_name === volumeClaimTemplates_name + "-" + pod_name  

  所以这个问题就有点意思了,我们要先创建PVC,但是PVC的名称实际上是由StatefulSet来确定的。我真的是不知道K8S设计者咋想的·····而且官方文档里创建StatefulSet的例子是直接给了个yaml文件,并没有告诉说要先创建什么再创建什么。

创建Service 和 StatefulSet
  在上一步中我们已经创建了名为db-mysql-0的PVC了,接下来创建一个service和statefulset,service的名称可以随意取,但是statefulset的名称已经定死了,为mysql,并且statefulset中的volumeClaimTemplates_name必须为db,volumeMounts_name也必须为db。只有这样,statefulset中的pod才能通过命名来匹配到PVC,否则会创建失败。
  statefulset.yaml
  

apiVersion: v1  
kind: Service
  
metadata:
  name: mysql-service
  labels:
  app: mysql
  
spec:
  ports:
  - port: 80
  name: my-port
  clusterIP: None
  selector:
  app: mysql
  
---
  
apiVersion: apps/v1beta1
  
kind: StatefulSet
  
metadata:
  name: mysql
  
spec:
  serviceName: "mysql-service"
  replicas: 2
  template:
  metadata:
  labels:
  app: mysql
  spec:
  terminationGracePeriodSeconds: 10
  containers:
  - name: mysqlpod
  image: mysql:latest
  ports:
  - containerPort: 80
  name: my-port
  volumeMounts:
  - name: db
  mountPath: /var/lib/mysql
  volumeClaimTemplates:
  - metadata:
  name: db
  spec:
  accessModes: [ "ReadWriteOnce" ]
  resources:
  requests:
  storage: 1Gi
  

  运行以下命令:
  

kubectl create -f statefulset.yaml  

  就可以创建statefulset了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-431502-1-1.html 上篇帖子: Kubernetes ServiceAccount的配置 下篇帖子: Kubernetes-Host网络模式应用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表