|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

 

 

posted on 2022-03-30 11:56  yanqi_vip  阅读(46)  评论(0)    收藏  举报

导航