java系统找不到指定文件怎么解决
508
2022-09-07
Kubernetes K8S之资源控制器StatefulSets详解
Kubernetes的资源控制器StatefulSet详解与示例
主机配置规划
服务器名称(hostname) | 系统版本 | 配置 | 内网IP | 外网IP(模拟) |
k8s-master | CentOS7.7 | 2C/4G/20G | 172.16.1.110 | 10.0.0.110 |
k8s-node01 | CentOS7.7 | 2C/4G/20G | 172.16.1.111 | 10.0.0.111 |
k8s-node02 | CentOS7.7 | 2C/4G/20G | 172.16.1.112 | 10.0.0.112 |
什么是控制器
kubernetes中内建了很多controller(控制器),这些相当于一个状态机,用来控制pod的具体状态和行为。
部分控制器类型如下:
ReplicationController 和 ReplicaSetDeploymentDaemonSetStatefulSetJob/CronJobHorizontalPodAutoscaler
StatefulSet
StatefulSet 是用来管理有状态应用的工作负载 API 对象。
StatefulSet 中的 Pod 拥有一个具有黏性的、独一无二的身份标识。这个标识基于 StatefulSet 控制器分配给每个 Pod 的唯一顺序索引。Pod 的名称的形式为
【使用场景】StatefulSets 对于需要满足以下一个或多个需求的应用程序很有价值:
稳定的、唯一的网络标识符,即Pod重新调度后其PodName和HostName不变【当然IP是会变的】稳定的、持久的存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC实现有序的、优雅的部署和缩放有序的、自动的滚动更新
如上面,稳定意味着 Pod 调度或重调度的整个过程是有持久性的。
如果应用程序不需要任何稳定的标识符或有序的部署、删除或伸缩,则应该使用由一组无状态的副本控制器提供的工作负载来部署应用程序,比如使用 Deployment 或者 ReplicaSet 可能更适用于无状态应用部署需要。
限制
给定 Pod 的存储必须由 PersistentVolume 驱动 基于所请求的 storage class 来提供,或者由管理员预先提供。删除或者收缩 StatefulSet 并不会删除它关联的存储卷。这样做是为了保证数据安全,它通常比自动清除 StatefulSet 所有相关的资源更有价值。StatefulSet 当前需要 headless 服务 来负责 Pod 的网络标识。你需要负责创建此服务。当删除 StatefulSets 时,StatefulSet 不提供任何终止 Pod 的保证。为了实现 StatefulSet 中的 Pod 可以有序和优雅的终止,可以在删除之前将 StatefulSet 缩放为 0。在默认 Pod 管理策略(OrderedReady) 时使用滚动更新,可能进入需要人工干预才能修复的损坏状态。
有序索引
对于具有 N 个副本的 StatefulSet,StatefulSet 中的每个 Pod 将被分配一个整数序号,从 0 到 N-1,该序号在 StatefulSet 上是唯一的。
StatefulSet 中的每个 Pod 根据 StatefulSet 中的名称和 Pod 的序号来派生出它的主机名。组合主机名的格式为$(StatefulSet 名称)-$(序号)。
部署和扩缩保证
对于包含 N 个 副本的 StatefulSet,当部署 Pod 时,它们是依次创建的,顺序为 0~(N-1)。当删除 Pod 时,它们是逆序终止的,顺序为 (N-1)~0。在将缩放操作应用到 Pod 之前,它前面的所有 Pod 必须是 Running 和 Ready 状态。在 Pod 终止之前,所有的继任者必须完全关闭。
StatefulSet 不应将 pod.Spec.TerminationGracePeriodSeconds 设置为 0。这种做法是不安全的,要强烈阻止。
部署顺序
在下面的 nginx 示例被创建后,会按照 web-0、web-1、web-2 的顺序部署三个 Pod。在 web-0 进入 Running 和 Ready 状态前不会部署 web-1。在 web-1 进入 Running 和 Ready 状态前不会部署 web-2。
如果 web-1 已经处于 Running 和 Ready 状态,而 web-2 尚未部署,在此期间发生了 web-0 运行失败,那么 web-2 将不会被部署,要等到 web-0 部署完成并进入 Running 和 Ready 状态后,才会部署 web-2。
收缩顺序
如果想将示例中的 StatefulSet 收缩为 replicas=1,首先被终止的是 web-2。在 web-2 没有被完全停止和删除前,web-1 不会被终止。当 web-2 已被终止和删除;但web-1 尚未被终止,如果在此期间发生 web-0 运行失败,那么就不会终止 web-1,必须等到 web-0 进入 Running 和 Ready 状态后才会终止 web-1。
StatefulSet示例
说明:本次示例不涉及存储,StatefulSet的存储示例会在「Kubernetes K8S之存储PV-PVC详解」文章中演示。
yaml文件
1 [root@k8s-master controller]# pwd 2 /root/k8s_practice/controller 3 [root@k8s-master controller]# cat statefulset.yaml 4 apiVersion: v1 5 kind: Service 6 metadata: 7 name: nginx 8 labels: 9 app: nginx10 spec:11 ports:12 - port: 8013 name: clusterIP: None15 selector:16 app: nginx17 ---18 apiVersion: apps/v119 kind: StatefulSet20 metadata:21 name: web22 spec:23 selector:24 matchLabels:25 app: nginx # has to match .spec.template.metadata.labels26 serviceName: "nginx"27 replicas: 3 # by default is 128 template:29 metadata:30 labels:31 app: nginx # has to match .spec.selector.matchLabels32 spec:33 terminationGracePeriodSeconds: 10 # 默认30秒34 containers:35 - name: nginx36 image: registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.1737 ports:38 - containerPort: 8039 name: [root@k8s-master controller]# kubectl apply -f statefulset.yaml 2 service/nginx created 3 statefulset.apps/web created 4 [root@k8s-master controller]# kubectl get service -o wide 5 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR 6 kubernetes ClusterIP 10.96.0.1
由上可见,StatefulSet 中的pod是有序的。有N个副本,那么序列号为0~(N-1)。
查看StatefulSet相关的域名信息
启动一个pod
1 [root@k8s-master test]# pwd 2 /root/k8s_practice/test 3 [root@k8s-master test]# cat myapp_demo.yaml 4 apiVersion: v1 5 kind: Pod 6 metadata: 7 name: myapp-demo 8 namespace: default 9 labels:10 k8s-app: myapp11 spec:12 containers:13 - name: myapp14 image: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v115 imagePullPolicy: IfNotPresent16 ports:17 - name: containerPort: 8019 protocol: TCP20 [root@k8s-master test]# 21 [root@k8s-master test]# kubectl apply -f myapp_demo.yaml22 pod/myapp-demo created23 [root@k8s-master test]# 24 [root@k8s-master test]# kubectl get pod -o wide | grep 'myapp'25 myapp-demo 1/1 Running 0 3m24s 10.244.2.101 k8s-node02
进入pod并查看StatefulSet域名信息
1 # 进入一个k8s管理的myapp镜像容器。 2 [root@k8s-master test]# kubectl exec -it myapp-demo sh 3 / # nslookup 10.244.2.95 4 nslookup: can't resolve '(null)': Name does not resolve 5 6 Name: 10.244.2.95 7 Address 1: 10.244.2.95 web-0.nginx.default.svc.cluster.local 8 / # 9 / # 10 / # nslookup 10.244.3.10311 nslookup: can't resolve '(null)': Name does not resolve12 13 Name: 10.244.3.10314 Address 1: 10.244.3.103 web-1.nginx.default.svc.cluster.local15 / # 16 / # 17 / # nslookup 10.244.3.10418 nslookup: can't resolve '(null)': Name does not resolve19 20 Name: 10.244.3.10421 Address 1: 10.244.3.104 web-2.nginx.default.svc.cluster.local22 / # 23 / # 24 ##### nginx.default.svc.cluster.local 为service的域名信息25 / # nslookup nginx.default.svc.cluster.local26 nslookup: can't resolve '(null)': Name does not resolve27 28 Name: nginx.default.svc.cluster.local29 Address 1: 10.244.3.104 web-2.nginx.default.svc.cluster.local30 Address 2: 10.244.3.103 web-1.nginx.default.svc.cluster.local31 Address 3: 10.244.2.95 web-0.nginx.default.svc.cluster.local
StatefulSet网络标识与PVC
有上文可得如下信息:
1、匹配StatefulSet的Pod name(网络标识)的模式为:$(statefulset名称)-$(序号),比如StatefulSet名称为web,副本数为3。则为:web-0、web-1、web-2
2、StatefulSet为每个Pod副本创建了一个DNS域名,这个域名的格式为:$(podname).(headless service name),也就意味着服务之间是通过Pod域名来通信而非Pod IP。当Pod所在Node发生故障时,Pod会被漂移到其他Node上,Pod IP会发生改变,但Pod域名不会变化
3、StatefulSet使用Headless服务来控制Pod的域名,这个Headless服务域名的为:$(service name).$(namespace).svc.cluster.local,其中 cluster.local 指定的集群的域名
4、根据volumeClaimTemplates,为每个Pod创建一个PVC,PVC的命令规则为:$(volumeClaimTemplates name)-$(pod name),比如volumeClaimTemplates为name为web-0、web-1、web-2;那么创建出来的PVC为:www-web-0、www-web-1、www-web-2
5、删除Pod不会删除对应的PVC,手动删除PVC将自动释放PV。
完毕!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~