linux12k8s -->09StatefluSet控制器
Posted FikL-09-19
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux12k8s -->09StatefluSet控制器相关的知识,希望对你有一定的参考价值。
一、StatefluSet控制器
1.介绍
Kubernetes中有很多的控制器,比如常用的ReplicaSet,Deployment,DaemonSet,StatefulSet等。以这四种为例,我们可以将它们分为两种,一种为有状态控制器,一种为无状态控制器,StatefulSet则为有状态控制器。
2.特点
# StatefluSet最主要的是用来部署有状态应用
# StatefulSet部署是有状态应用,拥有统一的网络,并且有启动顺序
查询规范:kubectl explain stetafulset.spec
StatefulSet拥有统一的网络,并且有启动顺序
通常用于管理b和部署有状态的服务,如:mysql,Redis,MongoDB等;也就是说,如果我们的应用如有以下的任何一个特点,就可以使用statefulset控制器来部署
- 有状态控制器通常有以下几个特点:
# 1、稳定、唯一的网络标识
唯一且不会发生变化,由 $(statefulset name)-(0-N)组成,N为一个无限大的正整数,从0开始
# 2、稳定、持久的存储
每个Pod都对应一个PVC,PVC的名称组成:( v o l u m e C l a i m T e m p l a t e s n a m e ) − (volumeClaimTemplates name)-(volumeClaimTemplatesname)−(pod name)-(0-N),N为一个无限大的正整数,从0开始
# 3、有序、优雅的部署和伸缩
严格按照从0到N的顺序创建,并且下一个Pod创建的前提是上一个Pod已经Running状态
每扩容一个pod前提是上一个Pod已经Running状态
每缩容一个pod前提是上一个Pod已经完全Delete
# 4、有序、优雅的删除和停止
严格按照从N到0的顺序删除,并且下一个Pod删除的前提是上一个Pod已经完全Delete
# 5、有序、自动的滚动更新
严格按照从N到1的顺序升级,并且下一个Pod升级的前提是上一个Pod已经Running状态
3.使用statefulset部署WordPress
1.使用StatefluSet部署nginx测试启动顺序
[root@k8s-m-01 ~]# kubectl explain StatefulSet #查看测试
#1.创建存放目录
[root@k8s-m-01 ~]# mkdir statefluset
[root@k8s-m-01 ~]# cd statefluset/
#2.创建配置清单
[root@k8s-m-01 statefluset]# vim test.yaml
apiVersion: v1
kind: Service
metadata:
name: statefulset-test
spec:
ports:
- name: http
port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: statefulset-test
spec: # StatefulSet控制器的spec里必须包含三个(serviceName、template、selector)
serviceName: statefulset-test
template: #模板
metadata: #元数据
labels: #标签
app: statefulset
spec:
containers:
- name: nginx
image: nginx
selector: #选择
matchExpressions: #模糊选择
- key: app #关键字app
operator: In #操作符 in是包含的意思
values:
- statefulset #指app标签中包含statefulset就可以(如果values这里包含多个值,它们之间是或的关系)
# - aaa
# - xxx
#3.部署
[root@k8s-m-01 statefluset]# kubectl apply -f test.yaml
service/statefulset-test unchanged
statefulset.apps/statefulset-test created
#4.测试扩容启动顺序
[root@k8s-m-01 statefluset]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
statefulset-test ClusterIP 10.111.107.0 <none> 80/TCP 22m
[root@k8s-m-01 statefluset]# kubectl edit statefulsets.apps #编辑扩容到3个
statefulset.apps/statefulset-test edited
spec:
podManagementPolicy: OrderedReady
replicas: 1 #修改这个
revisionHistoryLimit: 10
selector:
[root@k8s-m-01 statefluset]# kubectl get pods -o wide -w #监控可观察到是先创建statefulset-test-0,等statefulset-test-0 状态为running后再创建statefulset-test-1,以此类推....
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED
statefulset-test-0 1/1 Running 0 108s
statefulset-test-1 1/1 Running 0 31s
statefulset-test-2 0/1 ContainerCreating 0 8s
#5.测试缩容启动顺序
[root@k8s-m-01 statefluset]# kubectl edit statefulset #编辑缩容到1个
statefulset.apps/statefulset-test edited
[root@k8s-m-01 statefluset]# kubectl get pods -o wide -w #监控可得是先结束掉statefulset-test-4,等statefulset-test-4状态为 Terminating后,再结束掉statefulset-test-3,以此类推....
NAME READY STATUS RESTARTS AGE
deployment-5b89599fc6-v7xpv 1/1 Running 3 36h
statefulset-test-0 1/1 Running 0 3m1s
test-tag 1/1 Running 5 2d23h
test1 1/1 Running 5 2d19h
[root@k8s-m-01 statefluset]# kubectl get pods -o wide #查看所容后pod个数
NAME READY STATUS RESTARTS AGE
statefulset-test-0 1/1 Running 0 3m1s
2.使用StatefluSet部署word press
#1.创建配置清单
[root@k8s-m-01 wordpress]# vim wordpress.yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress-test
spec:
ports:
- name: http
port: 80
targetPort: 80
selector:
app: wordpress-test
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: wordpress-test
spec:
serviceName: wordpress-test
selector:
matchLabels:
app: wordpress-test
template:
metadata:
labels:
app: wordpress-test
spec:
containers:
- name: php
image: elaina0808/lnmp-php:v6
- name: nginx
image: elaina0808/lnmp-nginx:v9
#2.部署word press
[root@k8s-m-01 wordpress]# kubectl apply -f wordpress.yaml
#3.查看集群内部IP
[root@k8s-m-01 wordpress]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wordpress-test ClusterIP 10.96.102.98 <none> 80/TCP 15m
#4.内网访问
[root@k8s-m-01 wordpress]# curl 10.96.102.98
<!DOCTYPE html>
<html dir='ltr'>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width">
<title>WordPress › Error</title>
<style type="text/css">
html {
background: #f1f1f1;
}
#5.修改成nodeport生成外网IP
[root@k8s-m-01 wordpress]# kubectl edit svc wordpress-test
service/wordpress-test edited
【type:NodePort】#把原来的clusterIP改成nodeport
#6.查看分配的IP
[root@k8s-m-01 wordpress]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wordpress-test NodePort 10.96.102.98 <none> 80:31895/TCP 18m
#7.浏览器访问
192.168.12.11:31895
以上是关于linux12k8s -->09StatefluSet控制器的主要内容,如果未能解决你的问题,请参考以下文章
linux12k8s --> 12kubeadm部署高可用k8s