|NO.Z.00140|——————————|CloudNative|——|KuberNetes&资源调度.V10|——|statefulset.v02|创建|
一、定义一个StatefulSet资源
### --- 创建一个StatefulSet.yaml资源文件
~~~ 创建StatefulSet资源文件
[root@k8s-master01 ~]# vim nginx-sts.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None #clusterIP设置为None,这个service创建之后他不会有一个clusterIP;但是我们也能解析到它,也可以通过无头service访问到这个Pod上。我们也可以给这个clusterIP设置IP地址;这个不是强要求的。推荐是使用无头service,既然可以使用无头service可以访问了,那么我们为什么还要给他设置一个clusterIP呢?造成一种资源浪费。
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet #首先我们启动了一个StatefulSet
metadata:
name: web
spec:
serviceName: "nginx" #StatefulSet必须要配置一个servicename,这个字段一定要指向一个已经存在的service,所以我们要定义一个service
replicas: 2 #这个StatefulSet的副本数是2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15.2 #使用的镜像是nginx:1.15.2
ports:
- containerPort: 80
name: web
二、StatefulSet参数配置说明
### --- StatefulSet参数配置说明
~~~ # 此示例没有添加存储配置,后面的章节会单独讲解存储相关的知识点
~~~ # kind: Service定义了一个名字为Nginx的Headless Service,
~~~ 创建的Service格式为nginx-0.nginx.default.svc.cluster.local,其他的类似,
~~~ 因为没有指定Namespace(命名空间),所以默认部署在default。
~~~ kind: StatefulSet定义了一个名字为web的StatefulSet,replicas表示部署Pod的副本数,本实例为2。
~~~ 在StatefulSet中必须设置Pod选择器(.spec.selector)
~~~ # 用来匹配其标签(.spec.template.metadata.labels)。
~~~ 在1.8版本之前,如果未配置该字段(.spec.selector),将被设置为默认值,
~~~ 在1.8版本之后,如果未指定匹配Pod Selector,则会导致StatefulSet创建错误。
~~~ # 当StatefulSet控制器创建Pod时,
~~~ 它会添加一个标签statefulset.kubernetes.io/pod-name,
~~~ 该标签的值为Pod的名称,用于匹配Service。
三、 创建StatefulSet
### --- 创建StatefulSet
[root@k8s-master01 ~]# kubectl create -f nginx-sts.yaml # -n namespace_name
service/nginx created
statefulset.apps/web created
### --- 查看创建的StatefulSet
[root@k8s-master01 ~]# kubectl get po //可以看到它的两个Pod已经起来了
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 17s
web-1 1/1 Running 0 10s
### --- 查看创建的StatefulSet对应的service
[root@k8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9d
nginx ClusterIP None <none> 80/TCP 5m19s // 可以看到这个service是没有IP的,说明这个就是无头service
### --- 将StatefulSet扩容副本设置为3
[root@k8s-master01 ~]# kubectl scale --replicas=3 sts web
statefulset.apps/web scaled
### --- 查看更新后pod的数量
[root@k8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 7m4s
web-1 1/1 Running 0 6m57s
web-2 1/1 Running 0 13s // 可以看到启动了一个新的,这个是web-2,无论你启动多少个,他都是从0开始往下排的。所以说这个StatefulSet给我们方便的地方。
四、解析无头service;是否正常解析pod
### --- 启动一个busybox容器
~~~ 解析无头service;启动一个busybox
[root@k8s-master01 ~]# cat<<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- name: busybox
image: busybox:1.28
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
restartPolicy: Always
EOF
pod/busybox created
### --- 查看启动的busybox.pod
[root@k8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 0 31s // busybox已经启动
五、验证StatefulSet是否可以使用
### --- 测试StatefulSet;看一下他给的这个标识符是否可以使用。
[root@k8s-master01 ~]# kubectl exec -ti busybox -- sh
/ # ls
bin dev etc home proc root sys tmp usr var
/ # nslookup web-0.nginx
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: web-0.nginx
Address 1: 172.25.244.213 web-0.nginx.default.svc.cluster.local //它可以解析到地址是谁
/ # exit
### --- 查看创建的pod
~~~ 它会直接把地址解析到Pod的IP上。不通过service去访问,
~~~ 而是通过service去访问,这样就少了一层代理,少一层代理它的性能就会变得更高,
~~~ 所以说我们没有必要加一个clusterIP;当然加上clusterIP访问的也是这个pod的地址
[root@k8s-master01 ~]# kubectl get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
busybox 1/1 Running 0 4m17s 172.18.195.7 k8s-master03 <none> <none>
web-0 1/1 Running 0 12m 172.25.244.213 k8s-master01 <none> <none>
### --- 测试这个pod
~~~ 那么我们有了这个固定的service之后是否可以做一些操作了。
~~~ 假设我们启动了一个Redis的StatefulSet,名称就叫Redis,它的service就叫做redis-svc
~~~ 那么我们是可以通过Redis-0.redis-svc ————> master节点,剩下的就是它的node节点。
~~~ 那么我们就可以动态的生成它的配置文件。
~~~ 使用StatefulSet去创建一些有状态的应用。服务发现的集群。
[root@k8s-master01 ~]# kubectl exec -ti busybox -- sh
/ # ping web-0.nginx
PING web-0.nginx (172.25.244.213): 56 data bytes
64 bytes from 172.25.244.213: seq=0 ttl=62 time=52.019 ms
64 bytes from 172.25.244.213: seq=1 ttl=62 time=0.531 ms
/ # wget web-0.nginx
Connecting to web-0.nginx (172.25.244.213:80)
index.html 100% |*************************************************************************************************************************************| 612 0:00:00 ETA
/ # cat index.html
<h1>Welcome to nginx!</h1>
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
浙公网安备 33010602011771号