K8S使用Statefulset管理集群pod模式(7)

上次我们说到了deployment来管理pod容器的副本数量,如果挂掉之后容器再次启动就可以了,但是如果要是启动的是mysql集群、zookeeper集群、etcd这种集群,里面都有id号,这种有关联的,如果一旦挂掉之后,在启动之后呢,集群id是否会变化呢?答案是肯定会变的。
那有没有另外的一种控制器模式吗?当然k8s会给我吗提供的。【statefulset】
那什么场景需要使用StatefulSet呢?官方给出的建议是,如果你部署的应用满足以下一个或多个部署需求,则建议使用StatefulSet

稳定的、唯一的网络标识。
稳定的、持久的存储。
有序的、优雅的部署和伸缩。
有序的、优雅的删除和停止。
有序的、自动的滚动更新。
接下来看一下statefulset和deployment的区别:

1、接下来我们开始实践一下statefulset这种模式,来部署zookeeper集群

docker pull leolee32/kubernetes-library:kubernetes-zookeeper1.0-3.4.10
安装zk的机器下载这个镜像

2、Zookeeper集群需要用到存储,这里需要准备持久卷(PersistentVolume,简称PV),我这里以yaml文件创建3个PV,供待会儿3个Zookeeper节点创建出来的持久卷声明

3、创建一个pv;{persistent-volume.yaml}

cat persistent-volume.yaml
kind: PersistentVolume
apiVersion: v1
metadata:
name: k8s-pv-zk1
annotations:
volume.beta.kubernetes.io/storage-class: "anything"
labels:
type: local
spec:
capacity:
storage: 3Gi
accessModes:

  • ReadWriteOnce
    hostPath:
    path: "/var/lib/zookeeper"
    persistentVolumeReclaimPolicy: Recycle

    kind: PersistentVolume
    apiVersion: v1
    metadata:
    name: k8s-pv-zk2
    annotations:
    volume.beta.kubernetes.io/storage-class: "anything"
    labels:
    type: local
    spec:
    capacity:
    storage: 3Gi
    accessModes:

  • ReadWriteOnce
    hostPath:
    path: "/var/lib/zookeeper"
    persistentVolumeReclaimPolicy: Recycle

    kind: PersistentVolume
    apiVersion: v1
    metadata:
    name: k8s-pv-zk3
    annotations:
    volume.beta.kubernetes.io/storage-class: "anything"
    labels:
    type: local
    spec:
    capacity:
    storage: 3Gi
    accessModes:

  • ReadWriteOnce
    hostPath:
    path: "/var/lib/zookeeper"
    persistentVolumeReclaimPolicy: Recycle


    接下来启动一下;这里发现pv和pvc还没有绑定状态是Available

4、部署Zookeeper集群

cat zookeeper.yaml
apiVersion: v1
kind: Service
metadata:
name: zk-hs
labels:
app: zk
spec:
ports:

  • port: 2888
    name: server
  • port: 3888
    name: leader-election
    clusterIP: None
    selector:
    app: zk

    apiVersion: v1
    kind: Service
    metadata:
    name: zk-cs
    labels:
    app: zk
    spec:
    ports:

  • port: 2181
    name: client
    selector:
    app: zk

    apiVersion: policy/v1beta1
    kind: PodDisruptionBudget
    metadata:
    name: zk-pdb
    spec:
    selector:
    matchLabels:
    app: zk
    maxUnavailable: 1

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
    name: zk
    spec:
    selector:
    matchLabels:
    app: zk
    serviceName: zk-hs
    replicas: 3
    updateStrategy:
    type: RollingUpdate
    podManagementPolicy: Parallel
    template:
    metadata:
    labels:
    app: zk
    spec:
    affinity:
    podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:

    • labelSelector:
      matchExpressions:

      • key: "app"
        operator: In
        values:

        • zk
          topologyKey: "kubernetes.io/hostname"
          containers:

          • name: kubernetes-zookeeper
            imagePullPolicy: Always
            image: "leolee32/kubernetes-library:kubernetes-zookeeper1.0-3.4.10"
            resources:
            requests:
            memory: "1Gi"
            cpu: "0.5"
            ports:
          • containerPort: 2181
            name: client
          • containerPort: 2888
            name: server
          • containerPort: 3888
            name: leader-election
            command:
          • sh
          • -c
          • "start-zookeeper \
            --servers=3 \
            --data_dir=/var/lib/zookeeper/data \
            --data_log_dir=/var/lib/zookeeper/data/log \
            --conf_dir=/opt/zookeeper/conf \
            --client_port=2181 \
            --election_port=3888 \
            --server_port=2888 \
            --tick_time=2000 \
            --init_limit=10 \
            --sync_limit=5 \
            --heap=512M \
            --max_client_cnxns=60 \
            --snap_retain_count=3 \
            --purge_interval=12 \
            --max_session_timeout=40000 \
            --min_session_timeout=4000 \
            --log_level=INFO"
            readinessProbe:
            exec:
            command:
    • sh
    • -c
    • "zookeeper-ready 2181"
      initialDelaySeconds: 10
      timeoutSeconds: 5
      livenessProbe:
      exec:
      command:
    • sh
    • -c
    • "zookeeper-ready 2181"
      initialDelaySeconds: 10
      timeoutSeconds: 5
      volumeMounts:
      • name: datadir
        mountPath: /var/lib/zookeeper
        securityContext:
        runAsUser: 1000
        fsGroup: 1000
        volumeClaimTemplates:
  • metadata:
    name: datadir
    annotations:
    volume.beta.kubernetes.io/storage-class: "anything"
    spec:
    accessModes: [ "ReadWriteOnce" ]
    resources:
    requests:
    storage: 3Gi




完成之后开始创建


没起来看一下啥原因

发现没有zookeeper用户
创建一下并给个权限


【注意】{每个安装zk的机器都要执行}
发现有2个已经启动了,有1个pening状态,在master上面没有安装
接下来看一下日志发现报这个错误

使用kubeadm初始化的集群,出于安全考虑Pod不会被调度到Master Node上,也就是说Master Node不参与工作负载
我们这里让master也运行一个,机器有限就三台
允许master节点部署pod,使用命令如下:
kubectl taint nodes --all node-role.kubernetes.io/master-

执行完成过一会再看看

启动了

【禁止master部署pod:】
kubectl taint nodes k8s node-role.kubernetes.io/master=true:NoSchedule

好了,接下来我们看一下效果是不是集群模式

说明已经成功了



但是我们3个zk,一般允许宕机一个,另外2个可以对外工作
接下来我们模拟一下宕机一个
模拟k8s-node1节点故障

看一下效果:


说明机器故障了,接下来
机器启动之后看一下


看到了吧,节点恢复之后会自动加入到原来的集群之中
为啥会这样呢

因为StatefulSet的稳定的唯一的网络标识特性,我们能比较轻松的实现Pod的固定IP需求,但是要是deployment就复杂的多了,会随机给你拉起,但是这个不会的
这里有个其他的知识点:


PodDisruptionBudget控制器可以设置应用POD集群处于运行状态最低个数,也可以设置应用POD集群处于运行状态的最低百分比,这样可以保证在主动销毁应用POD的时候,不会一次性销毁太多的应用POD,从而保证业务不中断或业务SLA不降级
咱们这里会保留一个对外提供服务
通过两个参数来配置PodDisruptionBudget:
1、 MinAvailable参数:表示最小可用POD数,表示应用POD集群处于运行状态的最小POD数量,或者是运行状态的POD数同总POD数的最小百分比。

2、 MaxUnavailable参数:表示最大不可用PO数,表示应用POD集群处于不可用状态的最大POD数,或者是不可用状态的POD数同总POD数的最大百分比。
!!!!!这里需要注意的是,MinAvailable参数和MaxUnavailable参数是互斥的,也就是说如果使用了其中一个参数,那么就不能使用另外一个参数了
这个在后面专门会讲到,这里只是提一下用到了。

今天演示讲到这里,后面有问题欢迎私信留言给我,一起讨论

原文地址:https://blog.51cto.com/xiaorenwutest/2482932

时间: 2024-10-29 18:52:12

K8S使用Statefulset管理集群pod模式(7)的相关文章

rancher+docker+k8s搭建容器管理集群

一, 环境准备 服务器 Linux k8s-m 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux m节点:10.0.0.202 s1节点:10.0.0.203 s2节点:10.0.0.204 测试环境关闭各种墙 systemctl stop firewalld.service systemctl stop firewalld.service docker 版本包 htt

Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之部署master/node节点组件(四)

0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 1.部署master组件 master 服务器的组件有:kube-apiserver.kube-controller-manager.kube-scheduler 因此需要下载k8s master,下载地址:https://github.com/kubernetes/kubernetes/blob/master/CHANGE

Spark集群-Standalone 模式

Spark 集群相关 来源于官方, 可以理解为是官方译文, 外加一点自己的理解. 版本是2.4.4 本篇文章涉及到: 集群概述 master, worker, driver, executor的理解 打包提交,发布 Spark application standalone模式 SparkCluster 启动 及相关配置 资源, executor分配 开放网络端口 高可用(Zookeeper) 名词解释 Term(术语) Meaning(含义) Application 用户构建在 Spark 上的

LVS(三)LVS集群NAT模式

LVS集群NAT模式 一 Director服务器环境 1.查看Director服务器内核中是否有IPVS的功能 #显示IPVS配置信息以及支持的调度算法grep -i 'vs' /boot/config-3.10.0-514.el7.x86_64 ... # IPVS scheduler CONFIG_IP_VS_RR=m CONFIG_IP_VS_WRR=m CONFIG_IP_VS_LC=m CONFIG_IP_VS_WLC=m CONFIG_IP_VS_LBLC=m CONFIG_IP_V

k8s控制平面apiserver集群安装

注意:如果没有特殊指明,本文档的所有操作均在 k8s-master 节点上执行,然后远程分发文件和执行命令. 1.创建 kubernetes 证书和私钥 创建证书签名请求: cd /opt/k8s/work source /opt/k8s/bin/environment.sh cat > kubernetes-csr.json <<EOF { "CN": "kubernetes", "hosts": [ "127.0.

linux lvs集群nat模式(比上一篇的lvs nat实用)

这是一篇以apcache服务为例介绍lvs的nat模式配合keepalived实现的方案.实验拓扑图如下所示,虚线上面的大图可以看成是虚线下面"服务器群"的放大版: 本实验共用到4台linux虚拟服务器,其中两台rhel5.6作为主从HA(keepalived)服务器,另外两台rhel4.6模拟Apache服务器--用两台Apache服务器模拟多台Apache服务器. 实验原理是,用Apache服务器为代表模拟实际用到的服务器,用两台Apache模拟多台Apache,所有的Apache

管理集群中的 crs 管理员

 管理集群中的 crs 管理员 oracle Managing CRS Administrators in the Cluster Use the following commands to manage CRS Administrators in the cluster: The CRS Administrator is a predefined administrator role in Oracle Clusterware that controls the creation of s

Redis集群主从模式(理论)

redis集群主从模式介绍: 为保证数据的高可用性,redis clustar加入了主从模式:一个master对应一个或多个slave. master负责数据存取:slave负责同步master数据然后进行备份. 当master挂掉之后,就会在该master的slave中选取一个来代替mater角色, 从而保证redis集群slot的完整性. 如果其中一个mster和它的slave都挂掉后,会导致slot不完整,整个集群都会挂掉. master之间分配slots(16384个slot),如果检测

Spark新手入门——3.Spark集群(standalone模式)安装

主要包括以下三部分,本文为第三部分: 一. Scala环境准备 查看二. Hadoop集群(伪分布模式)安装 查看三. Spark集群(standalone模式)安装 Spark集群(standalone模式)安装 若使用spark对本地文件进行测试学习,可以不用安装上面的hadoop环境,若要结合hdfs使用spark,则可以参考上面的步骤搭建hadoop. 1. 下载安装包并解压(如:~/tools/spark-2.3.1-bin-hadoop2.7): 2. 启动服务 a.启动master