k8s——statefulset
statefulset基础模版
[root@master statefulset]# cat web.yaml
---
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 #该端口配置的名字
// 先不写下面的,因为涉及到别的知识点
volumeMounts: # 加载数据卷
- name: www #指定加载哪个数据卷
mountPath: /usr/share/nginx/html # 加载到容器中的哪个目录
volumeClaimTemplates: # 数据卷模版
- metadata: # 数据卷描述
name: www # 数据卷的名称
annotations: # 数据卷的注解
volume.alpha.kubernetes,io.storage-class: anything
spec: # 数据卷的规约
accessModes: [ "ReadWriteOnce" ] # 访问模式
resources:
requests:
storage: 1Gi # 需要1G 的存储资源
[root@master statefulset]#
[root@master statefulset]# kubectl create -f web.yaml
service/nginx created
statefulset.apps/web created
[root@master statefulset]# kubectl get sts
NAME READY AGE
web 0/2 5s
[root@master statefulset]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d18h
nginx ClusterIP None <none> 80/TCP 8s
[root@master statefulset]# kubectl get pvc //注释掉之后这个是没有的
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
www-web-0 Pending 11s
//修改后
[root@master statefulset]# kubectl create -f web.yaml
service/nginx created
statefulset.apps/web created
[root@master statefulset]# kubectl get sts
NAME READY AGE
web 2/2 9s
[root@master statefulset]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d19h
nginx ClusterIP None <none> 80/TCP 15s
[root@master statefulset]#
# 有一个疑问,k8s集群内部`kubectl get po`并没有这么多pod
[root@master ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
my-pod 1/1 Running 3 (4m8s ago) 5d18h
nginx-demo 1/1 Running 4 (4m8s ago) 5d23h
nginx-po 1/1 Running 4 (4m8s ago) 5d22h
web-0 1/1 Running 2 (4m8s ago) 20h
web-1 1/1 Running 2 (4m8s ago) 20h
[root@master ~]#
# python 中列出pod ,列出的是所有的pod 等价于kubectl get -A po
[root@master ~]# kubectl get -A po
NAMESPACE NAME READY STATUS RESTARTS AGE
default my-pod 1/1 Running 3 (3m12s ago) 5d18h
default nginx-demo 1/1 Running 4 (3m12s ago) 5d23h
default nginx-po 1/1 Running 4 (3m12s ago) 5d22h
default web-0 1/1 Running 2 (3m12s ago) 20h
default web-1 1/1 Running 2 (3m12s ago) 20h
kube-flannel kube-flannel-ds-bkvjm 1/1 Running 4 (3m12s ago) 5d23h
kube-flannel kube-flannel-ds-hg6bh 1/1 Running 5 (3m56s ago) 6d14h
kube-system coredns-66f779496c-c5rmz 1/1 Running 4 (3m56s ago) 6d15h
kube-system coredns-66f779496c-jswxz 1/1 Running 4 (3m56s ago) 6d15h
kube-system etcd-master 1/1 Running 4 (3m56s ago) 6d15h
kube-system kube-apiserver-master 1/1 Running 4 (3m56s ago) 6d15h
kube-system kube-controller-manager-master 1/1 Running 5 (3m56s ago) 6d15h
kube-system kube-proxy-jr5m5 1/1 Running 4 (3m56s ago) 6d15h
kube-system kube-proxy-tcpzh 1/1 Running 4 (3m12s ago) 5d23h
kube-system kube-scheduler-master 1/1 Running 5 (3m57s ago) 6d15h
tigera-operator tigera-operator-55585899bf-s28bt 1/1 Running 8 (3m19s ago) 6d14h
拉取指定镜像测试
[root@master statefulset]# kubectl run -it --image busybox:1.28.4 dns-test /bin/sh
If you don't see a command prompt, try pressing enter.
/ # ping web-0.nginx
PING web-0.nginx (10.244.1.45): 56 data bytes
64 bytes from 10.244.1.45: seq=0 ttl=64 time=0.048 ms
64 bytes from 10.244.1.45: seq=1 ttl=64 time=0.054 ms
^C
--- web-0.nginx ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.048/0.051/0.054 ms
/ # nslookup web-0.nginx # sts的名字-第几个.service的名字 是statefulset的访问格式
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: web-0.nginx
Address 1: 10.244.1.45 web-0.nginx.default.svc.cluster.local
/ #
扩容和缩容
# 扩容
[root@master statefulset]# kubectl scale sts web --replicas=6
statefulset.apps/web scaled
# 缩容
[root@master statefulset]# kubectl scale sts web --replicas=3
statefulset.apps/web scaled
[root@master statefulset]# kubectl get sts
NAME READY AGE
web 3/3 20h
[root@master statefulset]#
灰度更新
[root@master statefulset]# kubectl scale sts web --replicas=6
statefulset.apps/web scaled
[root@master statefulset]# kubectl get sts
NAME READY AGE
web 6/6 20h
[root@master statefulset]# kubectl edit sts web
statefulset.apps/web edited
# 进去之后修改
---
updateStrategy:
rollingUpdate:
partition: 3 # 把0修改为3
# 修改partition的值可以模拟灰度更新,就是说更新的时候先更新编号大于3的pod
---
# 查看
[root@master statefulset]# kubectl describe po web-1|grep nginx:
nginx:
Image: nginx:1.7.9
Normal Pulled 20h kubelet Container image "nginx:1.7.9" already present on machine
Normal Pulled 12h kubelet Container image "nginx:1.7.9" already present on machine
Normal Pulled 48m kubelet Container image "nginx:1.7.9" already present on machine
[root@master statefulset]# kubectl describe po web-5|grep nginx:
nginx:
Image: nginx:1.9.1
Normal Pulled 95s kubelet Container image "nginx:1.9.1" already present on machine
[root@master statefulset]#
# 确认新版本没有问题之后,在修改partition的值为0,来更新所有
[root@master statefulset]# kubectl edit sts web
statefulset.apps/web edited
[root@master statefulset]# kubectl describe po web-5|grep nginx:
nginx:
Image: nginx:1.9.1
Normal Pulled 6m13s kubelet Container image "nginx:1.9.1" already present on machine
[root@master statefulset]# kubectl describe po web-0|grep nginx:
nginx:
Image: nginx:1.9.1
Normal Pulled 4s kubelet Container image "nginx:1.9.1" already present on machine
[root@master statefulset]#
OnDelete策略更新
[root@master statefulset]# kubectl edit sts web
statefulset.apps/web edited
---
updateStrategy:
type: OnDelete #修改更新策略
---
[root@master statefulset]# kubectl edit sts web
statefulset.apps/web edited
---
spec:
containers:
- image: nginx:1.7.9 #修改镜像
imagePullPolicy: IfNotPresent
name: nginx
ports:
---
[root@master statefulset]# kubectl describe po web-0 |grep nginx:
nginx:
Image: nginx:1.9.1
Normal Pulled 13m kubelet Container image "nginx:1.9.1" already present on machine
[root@master statefulset]# kubectl describe po web-1 |grep nginx:
nginx:
Image: nginx:1.9.1
Normal Pulled 14m kubelet Container image "nginx:1.9.1" already present on machine
[root@master statefulset]# kubectl delete pod web-1
pod "web-1" deleted # 看似删除实则更新
[root@master statefulset]#
[root@master statefulset]# kubectl describe po web-1 |grep nginx:
nginx:
Image: nginx:1.7.9
Normal Pulled 3s kubelet Container image "nginx:1.7.9" already present on machine
[root@master statefulset]#
删除sts
rs是deployment的东西,所以sts没有rs
删除sts和headless service的时候分为两种,级联删除和非级联删除
级联删除
# 删除sts时候,会同时删除pods
[root@master statefulset]# kubectl get sts
NAME READY AGE
web 3/3 23h
[root@master statefulset]# kubectl delete sts web
statefulset.apps "web" deleted
[root@master statefulset]# kubectl get sts
No resources found in default namespace.
[root@master statefulset]# kubectl get po
NAME READY STATUS RESTARTS AGE
dns-test 1/1 Running 1 (160m ago) 162m
[root@master statefulset]#
# 删除sts的时候,直接删除pod
非级联删除
[root@master statefulset]# kubectl get sts
NAME READY AGE
web 2/2 25s
[root@master statefulset]# kubectl get po
NAME READY STATUS RESTARTS AGE
dns-test 1/1 Running 1 (166m ago) 168m
web-0 1/1 Running 0 27s
web-1 1/1 Running 0 26s
[root@master statefulset]# kubectl delete sts web --cascade=false
warning: --cascade=false is deprecated (boolean value) and can be replaced with --cascade=orphan.
statefulset.apps "web" deleted
[root@master statefulset]# kubectl get po
NAME READY STATUS RESTARTS AGE
dns-test 1/1 Running 1 (166m ago) 168m
web-0 1/1 Running 0 74s
web-1 1/1 Running 0 73s
[root@master statefulset]# kubectl get sts
No resources found in default namespace.
[root@master statefulset]#
# 非级联删除没有连带删除pod
k8s——statefulset的更多相关文章
- k8s statefulset controller源码分析
statefulset controller分析 statefulset简介 statefulset是Kubernetes提供的管理有状态应用的对象,而deployment用于管理无状态应用. 有状态 ...
- k8s StatefulSet控制器-独立存储
k8s-StatefulSet控制器-独立存储 1. StatefulSet控制器-独立存储 独享存储:StatefulSet的存储卷使用VolumeClaimTemplate创建,称为卷申请模板,当 ...
- 在Kubernetes上运行有状态应用:从StatefulSet到Operator
一开始Kubernetes只是被设计用来运行无状态应用,直到在1.5版本中才添加了StatefulSet控制器用于支持有状态应用,但它直到1.9版本才正式可用.本文将介绍有状态和无状态应用,一个通过K ...
- k8s之statefulSet-有状态应用副本集控制器
1.概述 无状态应用更关注群体,任何一个成员都可以被取代,有状态应用关注的是个体.用deployment控制器管理的nginx.myapp等都属于无状态应用,像mysql.redis.zookeepe ...
- 初探云原生应用管理(二): 为什么你必须尽快转向 Helm v3
系列介绍:这个系列是介绍如何用云原生技术来构建.测试.部署.和管理应用的内容专辑.做这个系列的初衷是为了推广云原生应用管理的最佳实践,以及传播开源标准和知识.在这个系列文章的开篇初探云原生应用管理(一 ...
- 教你在Kubernetes中快速部署ES集群
摘要:ES集群是进行大数据存储和分析,快速检索的利器,本文简述了ES的集群架构,并提供了在Kubernetes中快速部署ES集群的样例:对ES集群的监控运维工具进行了介绍,并提供了部分问题定位经验,最 ...
- [k8s]k8s配置nfs做后端存储&配置多nginx共享存储&&statefulset配置
所有节点安装nfs yum install nfs-utils rpcbind -y mkdir -p /ifs/kubernetes echo "/ifs/kubernetes 192.1 ...
- [k8s]zookeeper集群在k8s的搭建(statefulset模式)-pod的调度
之前一直docker-compose跑zk集群,现在把它挪到k8s集群里. docker-compose跑zk集群 zk集群in k8s部署 参考: https://github.com/kubern ...
- 【Kubernetes】在K8s中创建StatefulSet
在K8s中创建StatefulSet 遇到的问题: 使用Deployment创建的Pod是无状态的,当挂在Volume之后,如果该Pod挂了,Replication Controller会再run一个 ...
- 在K8s中创建StatefulSet
在K8s中创建StatefulSet 遇到的问题: 使用Deployment创建的Pod是无状态的,当挂在Volume之后,如果该Pod挂了,Replication Controller会再run一个 ...
随机推荐
- 如何使用Plotly和Dash进行数据可视化
本文分享自华为云社区<从数据到部署使用Plotly和Dash实现数据可视化与生产环境部署>,作者: 柠檬味拥抱. 数据可视化是数据分析中至关重要的一环,它能够帮助我们更直观地理解数据并发现 ...
- sweetviz工具避坑和简单使用
网上关于sweetviz的文章比较少,有些坑这里说一下给大家避坑. 使用sweetviz遇到的错误如下: KeyError: "None of ['index'] are in the co ...
- deepspeed 训练多机多卡报错 ncclSystemError Last error
最近在搞分布式训练大模型,踩了两个晚上的坑今天终于爬出来了 我们使用 2台 8*H100 遇到过 错误1 10.255.19.85: ncclSystemError: System call (e.g ...
- 存储过程编写·记(“xxx“在需要下列之一:if)
存储过程编写·记("xxx"在需要下列之一:if) 使用的数据库为Oracle数据库,数据库客户端为DBeaver 简单来说,就是使用SQL语句进行一些函数编写,进而进行一些过滤啊 ...
- 力扣904(Java)-水果成篮(中等)
题目: 你正在探访一家农场,农场从左到右种植了一排果树.这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 . 你想要尽可能多地收集水果.然而,农场的主人 ...
- 力扣481(java&python)-神奇字符串(中等)
题目: 神奇字符串 s 仅由 '1' 和 '2' 组成,并需要遵守下面的规则: 神奇字符串 s 的神奇之处在于,串联字符串中 '1' 和 '2' 的连续出现次数可以生成该字符串.s 的前几个元素是 s ...
- 企业上云如何对SLS日志审计服务进行权限控制
简介: 日志审计是信息安全审计功能的核心部分,是企业信息系统安全风险管控的重要组成部分.SLS的日志审计服务针对阿里云的多种云产品(Actiontrail.OSS.SLB.RDS.PolarDB.SA ...
- KubeVela 1.1 发布,开启混合环境应用交付新里程碑
简介: KubeVela 作为一个开箱即用.面向现代微服务架构的应用交付与管理平台,今天正式发布了 1.1 版本,以更加用户友好和完善的功能集,开启了"让混合环境应用交付更加简单高效&qu ...
- dotnet 使用 TaskTupleAwaiter 同时等待多个任务简化代码写法
在某些业务逻辑下,需要同时等待多个任务执行完成,才能继续往下执行后续逻辑.等待任务执行的逻辑,大部分情况下需要使用到 Task.WhenAll 方法,代码行数不少.另外,在需要获取多个异步任务的返回值 ...
- FPGA最大工作频率教程
FPGA最大工作频率教程 1. Quartus的时序分析 作为编译过程的一部分,Quartus对布局布线的电路做时序分析.在编译报告里,展开"Timing Analyzer",这 ...