K8s网络和分布式事务

Posted 云架构师大白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了K8s网络和分布式事务相关的知识,希望对你有一定的参考价值。

本期主题有点混搭的意思,不过我喜欢,您呢。

 

回顾下k8s基础概念:

1、Pod

    Pod 是 Kubernetes 管理的最小工作单元,每个 Pod 包含一个或多个容器。Pod 中的容器会作为一个整体被 Master 调度到一个 Node 上运行。一般一个pod里只允许一个容器,如果是交互非常频繁需要资源共享的容器可以放在一个pod里(pod内部容器通过localhost通信)

 

2、Controller

    Kubernetes 通常不会直接创建 Pod,而是通过Controller 来管理和运行这个后 Pod 的。Controller中定义了 Pod 的部署特性,比如有几个副本,在什么样的Node(虚拟机或物理机)上运行等。为了满足不同的业务场景,Kubernetes 提供了多种 Controller,包括 Deployment(创建pod)、ReplicaSet(多副本管理)、DaemonSet(每个node只允许一个该类型的pod,一般用于监控代理日志采集代理等)、StatefuleSet、Job (结束既删除的应用,如定期任务类)等

 

3、Service

    Kubernetes Service 定义了外界访问一组特定 Pod 的方式。Service为 Pod 提供了负载均衡。又可以分为如下几种:

ClusterIP 
    Service
通过 Cluster 内部的 IP 对外提供服务,只有 Cluster 内的节点和 Pod 可访问

NodePort 
    Service
通过Cluster节点的静态端口对外提供服务。Cluster外部可以通过 <NodeIP>:<NodePort> 访问 Service。Nodeport和clusterip底层实现都是iptables,Nodeport是将node节点IP负载到一组pod,clusterip是将一个内部ip负载到一组pod

LoadBalancer 
    Service
利用 cloud provider 特有的 load balancer 对外提供服务,cloud provider 负责将 load balancer 的流量导向 Service。支持的 cloud provider 有 GCP、AWS、Azur 等。

     

4、Namespace

    实现资源逻辑上的隔离,实现多租户。Kubernetes默认创建了两个 1、 Namespace。default -- 创建资源时如果不指定,将被放到这个 Namespace 中。2、kube-system -- Kubernetes 自己创建的系统资源将放到这个 Namespace 中。

 

5、master节点

    Master 是 Kubernetes Cluster 的大脑,运行的服务有kube-apiserver(提供API)、kube-scheduler(调度pod在哪个node)、kube-controller-manager(负责管理各类资源,如Deployment、StatefulSet、DaemonSet等)、etcd (负责保存配置信息)和 Pod 网络(本文讨论的重点后面再说)。

 

6、node节点

    Node 是 Pod 运行的地方,Kubernetes 支持 Docker、rkt 等容器Runtime。Node上运行的 Kubernetes 组件有 kubelet(接收Scheduler信息创建和管理pod)、kube-proxy(负责接收service的请求并负载到实际容器) 和 Pod 网络。

 

7HealthCheck

    包括Liveness (探测是否存活以便重启服务自愈)和Readiness(探测服务状态是否为ready,是否可以对外提供服务,可用于滚动升级、服务是否就绪是否可以加入service)

 

8、helm

    完成复杂的容器逻辑编排能力,并可以做到高度复用

 

9、其他

    普罗米修斯监控、日志采集

 

10:K8s网络

    K8s是通过CNI插件,可以选择不同的网络插件,常用的如下

Calico:采用iptables走BGP实现通信,没有走opverlay性能更好,同时支持ACL。(生产使用)

 

 

事务

  • 单机事务


单机事务的acid属性(理论,具体实现不一定能全部满足)

原子性:事务中的所有操作要么成功,要么回退undo

一致性:

隔离性:分为不同的隔离级别,事务隔离级别分为串行化、可重复读、读已提交、读未提交。性能依次变强、问题依次变多。

事务隔离级别

脏读

不可重复读

幻读

读未提交:一个事务修改了数据但是还没有commit就允许其他事务读修改的内容

这样如果回滚会造成脏读,也就是你读到了一个脏数据。

读已提交:一个事务操作过程中可以读取到其他事务已经提交的最新数据。大多数关系型数据库默认使用(oracle\sqlserver

会造成不可重复读,如一次事务两次读之间数据被修改会造成两次读的数据不一致,既造成不可重复读。

可重复读: 一个事务操作中对于一个读取操作不管多少次,读取到的结果都是一样的。mysql默认的模式,采购了间隙锁锁住查询的范围,防止其他事务插入数据。

会造成幻读:如事务A修改表中所有某字段值为0然后查询值,但是同时有另一个事务修改值为1,会造成事务A查询的值是1,好像产生了幻觉

串行化:事务依次排队执行

 

持久性:事务执行完成后就是持久的,不会因为故障等原因被破怪。比如redo binlog写入完成才能代表事务执行完成

 

1.2 mysql为什么默认隔离级别是可重复读

    因为老的主从复制模式只有statement(记录的SQL语句)一种方式,这种在使用读已提交的隔离模式时可能会出现从库数据错乱问题。

    新版本的mysql主从复制请使用row(记录的是数据变化)方式,不会出现上述问题,请修改隔离级别为读已提交。

 

  • 分布式事务

    概念:首选说下分布式数据库的CAP原理,既在保障P分区的情况下,强一致性和可用性只能满足其中一个,如数据同步就相当于选择了一致性放弃了可用其,采用最终一致性(柔性事务)的方案就相当于选择了可用性放弃了强一致性。

 

2.1 分布式事务可以分为如下三种形式:

1、单服务多数据库

2、单服务分库分表:一般可通过mycat等类似中间件进行数据库分片和分布式事务

3、多服务多数据库

 

2.2 分布式事务解决方案

TCC:第一步查询检测做资源预留,第二步确认提交,失败则补偿回滚。实际这种方式还是有问题的。


可靠消息最终一致性:可靠消息最终一致性,需要业务系统结合MQ消息中间件实现,在实现过程中需要保证消息的成功发送及成功消费。即需要通过业务系统控制MQ的消息状态。目前只有rocketMQ实现了分布式事务消息的支持。推荐这种方式


最大努力通知:主要用在与第三方系统通讯时,比如:调用微信或支付宝支付后的支付结果通知。这种方案也是结合MQ进行实现,例如:通过MQ发送http请求,设置最大通知次数。达到通知次数后即不再通知。当然通知失败需要有记录可以查询到即可。


以上是关于K8s网络和分布式事务的主要内容,如果未能解决你的问题,请参考以下文章

基于MySQL和DynamoDB的强一致性分布式事务实践

微服务下分布式事务模式的详细对比

微服务下分布式事务模式的详细对比

分布式事务中Tcc模式常见问题解决

求救,分布式事务怎么处理

拥抱.NET5?先搞定分布式事务吧!