【K8S系列】第七讲:有状态服务 VS 无状态服务

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【K8S系列】第七讲:有状态服务 VS 无状态服务

序言:

昨天有位大佬,问这个问题

 

………………………………………………


决定学习之后,有了这篇文章.

1.无状态服务介绍

1.数据方面:无状态服务不会在本地存储持久化数据.多个实例可以共享相同的持久化数据

2.结果方面:多个服务实例对于同一个用户请求的响应结果是完全一致的

3.关系方面:这种多服务实例之间是没有依赖关系

4.影响方面:在k8s控制器 中动态启停无状态服务的pod并不会对其它的pod产生影响

5.示例方面:nginx实例,tomcat实例,web应用

6.资源方面:相关的k8s资源有:ReplicaSet、ReplicationController、Deployment

7.创建方式:Deployment被设计用来管理无状态服务的pod

每个pod完全一致,原因如下:无状态服务内的多个Pod创建的顺序是没有顺序的

无状态服务内的多个Pod的名称是随机的.pod被重新启动调度后,它的名称与IP都会发生变化

无状态服务内的多个Pod背后是共享存储的

8.缩容方式:随机缩容

       由于是无状态服务,所以这些控制器创建的pod序号都是随机值。并且在缩容也是随机,并不会明确缩容某一个pod。因为所有实例得到的返回值都是一样,所以缩容任何一个pod都可以

2 有状态服务介绍

1.数据方面:有状态服务需要在本地存储持久化数据,典型的是分布式数据库的应

2.结果方面:实例之间,请求结果可能存在不一致

3.关系方面:分布式节点实例之间有依赖的拓扑关系.比如,主从关系.4.影响方面:如果K8S停止分布式集群中任 一实例pod,就可能会导致数据丢失或者集群的crash5.示例方面:mysql数据库、kafka、zookeeper、Redis主从架构
6.资源方面:statefulSet

7.创建方式:statefulSet管理

   Pod的特点:

唯一性: 每个Pod会被分配一个唯一序号

顺序性: Pod启动,更新,销毁是线性的,按顺序进行

稳定的网络标识: Pod主机名,DNS地址不会随着Pod被重新调度而发生变化.

稳定的持久化存储: Pod被重新调度后,仍然能挂载原有的PV,从而保证了数据的完整性和一致性.

8.缩容方式:有顺序的缩容

       StatefulSet 缩容只会操作 一个 pod 实例,因此有状态应用的缩容相对于无状态的缩容速度会慢。
举例来说, 一个分布式存储应用若同时下线多个节点 ,则可能导致其数据丢失 。
比如说,一个数据项副本数设置为 2 的数据存储应用, 若同时有两个节点下线,如果一份数据它正好保存在这两个节点上,这份数据就会丢失。
因此缩容是线性的 ,则分布式存储应用需要时间把丢失的副本复制到其他节点 ,从而保证数据不会丢失。其实,这也是第七点中所讲的顺序性。

2.1 稳定的网络标识

如何理解稳定的网络标识?以redis为例:可以这样理解:

例如:需要创建名为test-redis-pod的Stateful模型,

根据配置的Replica=3的设置,K8S会创建三个Pod,依次命名为:
test-redis-pod-0

test-redis-pod-1

test-redis-pod-2

K8S为有状态的服务Pod分配稳定的网络标识,具体实现基于test-redis-pod-0名称,借助Headless DNS进行如下解析,获取后端其中一个Pod的地址.

$(pod name).$(service name).$(namespace).svc.cluster.local

下面通过Pod名称访问Redis集群的Master节点地址的方法.

session.save_path = "tcp://test-redis-pod-0.test-redis-service.default.svc.cluster.local:6379"

在Redis Pod内部,主从节点之间数据同步的需求,Slave节点对应的配置文件中需要一个稳定的Master地址.

下边脚本通过稳定访问test-redis-pod-0 名称来间接获得Redis Master节点IP地址,
然后写入到Redis Slave的配置文件中,这样后续Slave节点与Master节点可以完成增量数据的同步.
if [ "${server_host}" != "test-redis-pod-0" ];then
        #echo "server-count: ${server_counts}" >> /data/redistest.log
        while [ -z "${master_address}" ];do
            echo "master_address is not available, ${master_address} waiting for redis master..." >> /data/redistest.log
            master_address=$(replication_master_address)
            sleep 1s
        done
    fi
    echo "master_address: $(master_address)" >> /data/redistest.log
    if [ ! -z "$master_address" ]; then
        printf "\nslaveof %s 6379\n" "$master_address" >> $conf
    fi

在Redis Pod外部, 可以这样来访问具体的Pod服务.

$(pod name).$(service name).$(namespace).svc.cluster.local

2.2  稳定持久化存储

如何理解稳定的持久化存储,可以参考下图:


如图:

1.唯一:每个Redis Pod对应一个PVC/PV.当Pod发生调度时,需要在别的节点启动时,根据Pod背后关联的存储信息,可以保证其名称的稳定性.

2.复用Pod还是会attach挂载到原来的PV/PVC中,从而确定每个Pod有自己专用的存储卷.

3 总结

主要介绍了无状态和有状态服务的基础概念,从八个方面介绍了两者的区别,

并以redis集群为例,详细讲解了稳定的网络标识和稳定的持久化存储

介绍了:

Deployment部署无状态服务

Stateful新的部署组件.

 

Stateful 主要是通过支持Pod一些特性


名称唯一性

稳定的网络标识

稳定的持久化存储

从而实现在K8S中部署运维有状态服务


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
2月前
|
运维 Kubernetes 持续交付
ACK One GitOps:让全球化游戏服务持续交付更简单
ACK One GitOps 致力于提供开箱即用的多集群 GitOps 持续交付能力,简化游戏等服务的多集群/多地域统一部署,让您更加专注于业务开发。
|
11月前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
585 62
|
11月前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
290 60
|
10月前
|
存储 Kubernetes 网络协议
k8s的无头服务
Headless Service 是一种特殊的 Kubernetes 服务,其 `spec:clusterIP` 设置为 `None`,不会分配 ClusterIP,通过 DNS 解析提供服务发现。与普通服务不同,Headless Service 不提供负载均衡功能,每个 Pod 都有唯一的 DNS 记录,直接映射到其 IP 地址,适用于有状态应用的场景,如与 StatefulSet 一起部署数据库。示例中通过创建 Nginx 的 StatefulSet 和 Headless Service,展示了如何直接访问单个 Pod 并进行内容修改。
250 3
|
10月前
|
存储 Kubernetes Devops
Kubernetes集群管理和服务部署实战
Kubernetes集群管理和服务部署实战
209 0
|
11月前
|
负载均衡 Kubernetes 区块链
随机密码生成器+阿里k8s负载均衡型服务加证书方法+移动终端设计+ico生成器等
随机密码生成器+阿里k8s负载均衡型服务加证书方法+移动终端设计+ico生成器等
172 1
|
11月前
|
Kubernetes 应用服务中间件 nginx
k8s学习--kubernetes服务自动伸缩之水平收缩(pod副本收缩)VPA策略应用案例
k8s学习--kubernetes服务自动伸缩之水平收缩(pod副本收缩)VPA策略应用案例
255 1
|
4月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
151 9
|
4月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。
|
6月前
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
592 33

推荐镜像

更多