容器相关
非root用户Docker与K8S
Containerd安装
Containerd常用命令
Docker
镜像创建
国内镜像仓库
容器创建(Dockerfile)
容器系统
docker配置
docker数据管理
docker网络管理
docker容器自启动
docker镜像加速
docker问题
搭建Portainer可视化界面
Docker Swarm
Swarm搭建Docker集群
Docker Compose
Docker Compose命令
Docker Compose模板
Docker Machine
Kubernetes常用命令
k8s部署(kubeadmin)
k8s高可用部署
MiniKube
k8s1.24部署(containerd)
k8s1.24部署(docker)
部署 Dashboard
Kuboard K8S管理台
k8s权限管理
k8s网络插件
私有仓密码镜像拉取
k8s集群管理
POD--基本单位
Pod模板
Pod生命周期
Pod健康检查
初始化容器(initContainer)
Deployment--Pod的管理
Deployment模板
Deployment升级与回滚
DaemonSet控制器
StatefulSet控制器(有状态)
JOB与CRONJOB
Service--发布服务
ingress-traefix
ingress-nginx
MetalLB
存储与配置
持久存储卷
配置存储卷
资源管理
标签、选择器与注解
资源预留
调度管理
自动扩容
Proxy API与API Server
Helm--K8S的包管理器
helm常用命令
自定义Chart
私有chart仓库
helm dashboard
K8S证书过期
K8S问题解决
Harbor安装
Harbor操作
Harbor问题
Harbor升级
Docker Registry安装
Docker Registry鉴权
Registry用Nginx代理SSL及鉴权
Docker Registry问题
Istio 服务网络
常用示例
Gateway【服务网关】
kiali 可视化页面
开启HTTPS
linkerd 服务网络
本文档使用MrDoc发布
返回首页
-
+
StatefulSet控制器(有状态)
2021年9月17日 17:13
admin
#介绍 >####RC、Deployment、DaemonSet都是面向无状态的服务,它们所管理的Pod的IP、名字,启停顺序等都是随机的,而StatefulSet是什么?顾名思义,有状态的集合,管理所有有状态的服务,比如MySQL、MongoDB集群等。 >####StatefulSet本质上是Deployment的一种变体,在v1.9版本中已成为GA版本,它为了解决有状态服务的问题,它所管理的Pod拥有固定的Pod名称,启停顺序,在StatefulSet中,Pod名字称为网络标识(hostname),还必须要用到共享存储。 >####在Deployment中,与之对应的服务是service,而在StatefulSet中与之对应的headless service,headless service,即无头服务,与service的区别就是它没有Cluster IP,解析它的名称时将返回该Headless Service对应的全部Pod的Endpoint列表。 >####除此之外,StatefulSet在Headless Service的基础上又为StatefulSet控制的每个Pod副本创建了一个DNS域名,这个域名的格式为: $(podname).(headless servername).namespace.svc.cluster.local --- #特点: ####1、Pod一致性:包含次序(启动、停止次序)、网络一致性。此一致性与Pod相关,与被调度到哪个node节点无关; ####2、稳定的次序:对于N个副本的StatefulSet,每个Pod都在[0,N)的范围内分配一个数字序号,且是唯一的; ####3、稳定的网络:Pod的hostname模式为( statefulset名称 )-(statefulset名称)-(statefulset名称)−(序号); ####4、稳定的存储:通过VolumeClaimTemplate为每个Pod创建一个PV。删除、减少副本,不会删除相关的卷。 --- #创建 ##step1:创建statefueset的命名空间 cat << EOF > nginx-ns.yaml apiVersion: v1 kind: Namespace metadata: name: nginx-ss EOF --- kubectl apply -f nginx-ns.yaml --- ##step2、基于sc创建动态存储 cat << EOF > nginx-sc.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nginx-nfs-storage provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME' parameters: archiveOnDelete: "false" # # When set to "false" your PVs will not be archived # by the provisioner upon deletion of the PVC. EOF --- kubectl apply -f nginx-sc.yaml --- ##step3、创建svc cat << EOF > nginx-svc.yaml apiVersion: v1 kind: Service metadata: name: nginx namespace: nginx-ss labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx EOF --- kubectl apply -f nginx-svc.yaml --- --- ##step4、创建statefulset cat << EOF > nginx-ss.yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: web namespace: nginx-ss spec: selector: matchLabels: app: nginx #必须匹配 .spec.template.metadata.labels serviceName: "nginx" #声明它属于哪个Headless Service. replicas: 3 #副本数 template: metadata: labels: app: nginx # 必须配置 .spec.selector.matchLabels spec: terminationGracePeriodSeconds: 10 containers: - name: nginx image: www.my.com/web/nginx:v1 ports: - containerPort: 80 name: web volumeMounts: - name: nginx-pvc mountPath: /usr/share/nginx/html volumeClaimTemplates: #可看作pvc的模板 - metadata: name: nginx-pvc spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "nginx-nfs-storage" #存储类名,改为集群中已存在的 resources: requests: storage: 1Gi EOF --- kubectl apply -f nginx-ss.yaml --- ##step6、查看sc,pv,pvc,pod,statefulset,svc ![](/media//202109/2021-09-24151052025395.png) ![](/media//202109/2021-09-24151257974413.png) ##step7、验证 >####使用 kubectl run 运行一个提供 nslookup 命令的容器,该命令来自于 dnsutils 包。通过对 Pod 的主机名执行 nslookup,你可以检查他们在集群内部的 DNS 地址 kubectl run -i --tty --image www.my.com/k8s/busybox:1.27 -n nginx-ss dns-test --restart=Never --rm nslookup web-0.nginx nslookup web-1.nginx nslookup web-2.nginx ![](/media//202109/2021-09-24151435378833.png) --- #扩容/缩容 StatefulSet kubectl scale sts web --replicas=4 -n nginx-ss #扩容 kubectl scale sts web --replicas=2 -n nginx-ss #缩容 或者 kubectl patch sts web -p '{"spec":{"replicas":4}}' -n nginx-ss #扩容 kubectl patch sts web -p '{"spec":{"replicas":2}}' -n nginx-ss #缩容 ![](/media//202109/2021-09-24151627471859.png) ####注意:扩容是,如果pv是动态的sc的话,pvc同样会增加,但当缩容时,pvc并不会自定的删除
分享到: