k8s-statefulSet学习
本文是关于k8s-资源调度-statefulSet的学习,主要为解决有状态服务的部署。
k8s
资源调度-StatefulSet
1)statefulSet
专门用来部署有状态服务,一般带有数据存储功能的服务为有状态服务。
2)主要解决使网络有稳定标识,稳定的持久化存储,有序部署,有序扩展,有序收缩,有序删除的问题。
1.statefulSet
配置文件
1)创建一个名为web.yaml
的statefulSet
配置文件,由于本文是为了学习statefulSet
的基本操作,所以本配置文件未带pvc
持久卷,其具体配置内容如下所示:
---
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet #StatefulSet类型的资源
metadata:
name: web # statefulset的名字
spec:
serviceName: "nginx" # 使用那个service来管理dns
replicas: 2 # 创建的副本数量
selector: # 选择器的设置
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports: # 容器内部要暴漏的端口
- containerPort: 80 # 具体暴露的端口号
name: web # 该端口配置的名字
2.statefulSet
的创建
1)当配置文件完成后,使用以下命令进行对statefulSet
的创建。
#我这里配置的文件名是web.yaml
kubectl create -f web.yaml
2)对于本文的配置文件来讲,当创建完成后,会出现一个service
的创建成功(即nginx
的创建成功),和statefulSet
的创建成功,可以使用以下命令进行查看。
# 查看当前所有statefulSet的状态
kubectl get sts
# 查看当前所有service的状态
kubectl get svc
3)进行pod
的查看,由于配置文件中的副本数量设置的为2,所以可以发现有2个名为web
的nginx
已经运行了。可通过以下命令安装busybox
对这2个web
进行测试。具体结果如下图所示。
# 安装busybox
kubectl run -it --image busybox:1.28.4 dns-test /bin/sh
# 分别对2个web进行ping操作,看在外部是否可以进行访问
ping web-0.nginx
ping web-0.nginx
4)在busybox
中可以看到pod
的映射关系,如下图所示。首先了解一下statefulSet
中的每个pod
的DNS
的映射格式为
statefulName-{0,1,2,3...n-1} . serviceName . namespace . svc . cluster . local
。
serviceName
为Headless Service
的名字。0..N-1
为Pod
所在的序号,从0
开始到N-1
。statefulSetName
为StatefulSet
的名字。namespace
为服务所在的namespace
,Headless Servic
和StatefulSet
必须在相同的namespace
。.cluster.local
为Cluster Domain
(本地集群域名)。
3.statefulSet
扩容缩容
1)使用以下命令可以进行对statefulSet
进行扩容和缩容。
# 将名为web的statefulSet扩容到5个
kubectl scale sts web --replicas=5
# 将名为web的statefulSet扩容到2个
kubectl scale sts web --replicas=2
4.statefulSet
更新
1)镜像更新,使用以下命令可以对statefulSet
进行更新。然后通过查看statefulSet
的详细信息,可以观察到statefulSet
在进行更新时是有序的,会呈现倒叙进行更新,即先更新web-1
,然后再更新web-0
,具体如下如图所示。
# 对名为web的statefulSet进行更新,将其内部的nginx版本更新为1.9.1
kubectl patch sts web --type='json' -p='[{"op":"replace","path":"/spec/template/spec/containers/0/image",
"value":"nginx:1.9.1"}]'
# 更新后查看statefulSet的详细信息
kubectl describe sts web
5.灰度发布
由于在statefulSet
中,其更新的是有序的,所以就提出了灰度发布的方法。其主要的思想就是将风险降到最低,假设现在有5个服务,先更新其中2个,当发布后在一定时间内没有出现意外状况时,再手动更新其他的3个服务。
1)先修改statefulSet
的配置文件,将nginx
的版本修改为1.7.9,然后再将partition
修改为3(表示将3和3以后的进行更新)。
# 修改配置文件
kubectl edit sts web
2)然后再通过查看pod
中的web-3
和web-4
会发现,这2个pod
的nginx
版本已经更新成功了,但是其他3个任然是之前的版本。
3)当经过一段时候后,如果发现web-3
和web-4
没有发现异常,则可以继续修改partition
,将其修改为0(表示更新所有的节点)。然后通过观察,所有的节点都会更新成功。通过下图,可以发现statefulSet
的更新是有序进行的,先更新3-4,再更新0-2。
6.级联删除与非级联删除
由于statefulSet
并不像deployment
,对于deployment
只要将depolyment
删除,其下面的rs
和pod
都会自动删除。但是statefulSet
因为它部署的一般都是有状态服务,所以提供了2种删除方式。
1)级联删除,使用级联删除时,会将statefulSet
,pod
,svc
同时删除,如果带有持久卷,也会被删除,当然本文中未涉及持久卷。
kubectl delete sts web
2)非级联删除
# 当设置了以下配置后,就可以对statefulSet,pod,svc,pvc 分别进行选择性的删除了
kubectl delete sts web --cascade=false
更多推荐
所有评论(0)