1. 首页 > 科技 >

k8s网络模型(k8s网络架构图)

K8S动态PV实战之nginx部署

这里我们介绍动态PV个案例,部署3个副本的nginx服务。主要学习 volumeClaimTemplate 属性。

k8s网络模型(k8s网络架构图)k8s网络模型(k8s网络架构图)


statefulSet的三个组成部分:

1)Headless Sek8s: 1.10.0rv :名为nginx,用来定义Pod网络标识( DNS domain)。

2)StatefulSet :定义具体应用,名为Nginx,有三个Pod副本,并为每个Pod定义了一个域名。

3)volumeClaimTemplates : 存储卷申请模板,创建PVC,指定pvc名称大小,将自动创建pvc,且pvc必须由存储类供应。

为什么需要 headless serv 无头服务?

在用Deployment时,每一个Pod名称是没有顺序的,是随机字符串,因此是Pod名称是无序的,但是在statefulset中要求必须是有序 ,每一个pod不能被随意取代,pod重建后pod名称还是一样的。而pod IP是变化的,所以是以Pod名称来识别。pod名称是pod性的标识符,必须持久稳定有效。这时候要用到无头服务,它可以给每个Pod一个的名称 。

为什么需要volumeClaimTemplate?

对于有状态的副本集都会用到持久存储,对于分布式系统来讲,它的特点是数据是不一样的,所以各个节点不能使用同一存储卷,每个节点有自已的专用存储,但是如果在Deployment中的Pod template里定义的存储卷,是所有副本集共用一个存储卷,数据是相同的,因为是基于模板来的 ,而statefulset中每个Pod都要自已的专有存储卷,所以statefulset的存储卷就不能再用Pod模板来创建了,于是statefulSet使用volumeoptions ndots:5 代表当待解析域名包含.大于等于5时就会先解析域名,只有域名解析不成功时才会继续匹配serach域或domain域ClaimTemplate,称为卷申请模板,它会为每个Pod生成不同的pvc,并绑定pv, 从而实现各pod有专用存储。这就是为什么要用volumeClaimTemplate的原因。

nfsnginx/nfsrbac.yml。与前文保持一致。

nfsnginx/nfsnginxstorage.yml。与前文介绍类似,注意修改storageClass的名称

如果定义多个副本。必须使用volumeClaimTemplate属性。如果定义1个副本。可以使用pod+pvc方式。

nfsnginx/nginxstatefulset.yml

k8s多个副本,访问服务时只绑定一个ip会报错嘛

k8s集群之间通信和服务暴露需要使用较多端口,为了方便,直接禁用防火墙

会_8s是为容器服务而生的一个可移植容器的编排管理工具,越来越多的公司正在拥抱k8s,并且当前k8s已经主导了云业务流程,推动了微服务架构等热门技术的普及和落地,正在如火如荼的发展。

这个经常使用,当客户端请求一个不存在的path的时候,我们不希望返回 404 ,跳转到一个默认的服务上。

_P是整个TCP/IP协议族的核心,也是构成互联网的基础。

_P位于TCP/IP模型的网络层(相当于OSI模型的网络层),它可以向传输层提供各种协议的信息,例如TCP、UDP等;对下可将IP信息包放到链路层,通过以太网、令牌环网络等各种技术来传送。

[k8s系列六]K8S网络补充之DNS

前面两章介绍了serv和ingress,serv有Clus不妨进入该容器试试[可以发现只有在worker02上有该容器,因为pod运行在worker02上]:ter IP和Node Port两种类型:

但实际上,集群内部一般不直接用Cluster IP,而是用serv名作为域名,通过Core DNS组件域名解析后得到cluster IP。跨集群一般也不用nodePort,而是走Ingress ,或者loadbalance serv。

DNS(Domain Name System) 用于将域名解析成IP地址,例如

Kubernetes 早期的 DNS 组件叫 KubeDNS。CNCF 社区后来引入了更加成熟的开源项目 CoreDNS 替换了 KubeDNS。所以我们现在提到 KubeDNS,其实默认指代的是 CoreDNS 项目。

集群中的每一个 Serv(包括 DNS 服务本身)都将被分配一个 DNS name。格式为:..svc.。cluster_domain默认为cluster.local。

每一个Pod创建时,都会在Pod的/etc/resolv.conf文件中,自动加入kube-dns serv的domain name与相对应的IP地址。因此Pods可以透过名为kube-dns的serv组件,找到正在运行的kube-dnskube-proxy: ipvs 模式。

k8s Nginx Ingress 常用的 9个 配置(annotation)

如果一个k8s 集群里面部署多个ingress controller的时候,如果配置ingress 希望指定到某个ingress controller的时候,ingress claas就发挥巨大作用了。

一方面在controller启动的时候需要通过参数指定ingress class

另一方面,在创建ingress的时候,通过annotation指定ingress class,如下所示

和nginx/proxy-read-timeout 这两个参数分别主机A ping 主机B 上的容器,容器有回包,但是只到了主机B,之后就被丢弃了。设置nginx的建立连接以及等待结果的超时时间。

我们经常将nginx作为api的,支持跨域必不可少。通过nginx 设置支持跨域请求的方法。

限流也经常使用,通过 rp需要注意的是:s 限制每秒请求数,rpm 限制每分钟请求数,connections限制连接数。

这个主要是针对外部请求,防止将流量打满,proxy-body-size 设置请求 body,如果超过则会返回 413 请求错误。

这个主要是用于安全限制,只允许特定的客户端请求,但由于现在网络中NAT的广泛应用,这个参数使用的场景比较有限。

nginx ingress 默认是开启access log的,如果你想关闭,可以通过将 设置成false。

K8S的各种IP和Port

先看下环境情况,并触发 serv 请求:

也称为INTERNAL-IP

这是各Node的物理网卡(也可能是VPS的虚拟网卡)的IP地址的映射地址(Host IP的映射IP),是ECS的私有IP地址,也可以称为Node IP 这部分信息可以通过 kubectl get node -o wide 获取得到。

它是Serv的地址,是一个虚拟地址(无法ping),是使用 kubectl create 时,--port 所指定的端口绑定的IP,各Serv中的pod都可以使用CLUSTER-IP:port的方式相互访问(当然更应该使用ServName:port的方式)

这是对外暴露出的地址,它在Node和Serv的配置选项中都有。

在Node中的EXTERNAL-IP,实际是IaaS平台分配的公网IP

在Serv中,如果使用type=NodePort的模式,它将直接使用Node的INTERNAL-IP,进而由IaaS转化成为公网地址,而在type=LoadBalancer的情况下,是由IaaS服务商再进行分配公网地址(阿里没有此项功能,所以效果等同于NodePort模式)或者定义一个yml文件,本机使用docker-come,多机通过docker swarm创建。

使用 kubectl get node -o wide 和 kubectl get svc -o wide 命令都可以查看到。

它是Pod内部容器的端口,比如tomcat是8080,PODIP:targetPort,构成了EndPoint

它是Serv的虚拟端口,对targetPort进行映射。CLUSTER-IP:port,构成了微服务地址。

它是集群对外暴露的端口,NODEIP:nodePort,构成对外访问的地址。

K8S问题排查

可以使用‘kubectl get svc’进行查看。

先确认问题范围,在环境上找多个 serv 依次测试发现,如果调用 serv 的节点和实际 pod 不在同一个节点上,则出现延迟,否则请求正常。也就是说跨节点的访问才有问题。而直接用 serv 对应的 podIP 访问,也不存在问题,猜测问题可能出在 serv 转 pod 的过程。

一个比较简单的指定kubelet的 cgroup driver 的方法就是在 kubeadm-config.yaml 加入 cgroupDriver 字段

再确认基本环境, OS 、 K8S 、 calico 等基础环境没有发生任何变化,仅仅是把 calico 的网络模式从 BGP 改为了 vxlan ,但是这个改动改变了集群内 serv 及 pod 的请求路径,也即所有的容器请求需要走节点上新增的 calico.vxlan 接口封装一下。网络模式修改前没有问题,修改后必现,之后切回 BGP 模式问题就消失了,说明问题可能跟新增的 calico.vxlan 接口有关系。

从抓包结果看,出现一个可疑点:前几个报文中提示 bad udp cksum 0xffff ,请求通的几个报文提示的是 no cksum 。

根据这个错误信息,搜索发现是个已知 bug ,相关的详细定位可以参考[1]-[3],这里就不细说了。大概原因如下所述:

从资料[1]看, K8S 的 v1.18.5 版本已经修复了这个问题,但我的问题是在 v1.21.0 上发现的,所以不确定只升级 K8S 是否可以解决该问题,或者升级后还需要额外配置什么?

从资料[3]和[4]看, calico 在 v3.20.0 版本做了修改:在 kernels < v5.7 时也禁用了 calico.vxlan 接口的 Offloading 功能。

本地临时禁用并验证:

请求恢复正常。

k8s calico flannel cilium 网络性能测试

K8S 集群中修改 calico 的网络为 vxlan 模式后,发现部分 serv 在节点上无法访问(实际上是延迟访问,延迟时间稳定在 1min3s 左右)。

点评:

带宽: calico+ipip > flannel+vxlan > cilium+vlan

速度: calico+ipip > flannel+vxlan > cilium+vlan

稳定性:cilium+vlan > calico+ipip > flannel+vxlan

calico 作为老牌网络解决方案,可圈可点,已被 github 等公司用于生产。

flannel 配置简单,性能弱低于 calico,redis 测试中稍占。大并发下稳定性稍低。

cilium 在大并发环境下,稳定性更好,期待后续版本性能有所提升。在 8k qps 的情况下,请求 成功了,而calico和flannel 都有一定比例的失败。

(说明:本来还准备比较上一篇文章介绍了 ingress vhost这个annotation的使用,趁热打铁我们一口气介绍 9 个常用的annotation。一下 kube-router ,不过网络没有调通,暂时无法测试。)

一个问题:

flannel 的 host-gw 模式、flannel+vxlan+DirectRouting 模式、calico 关闭 ipip 模式、kube-router 这些部署情况下,跨主机的容器不通,感觉原因应该是同一个问题。

欢迎探讨,一起研究。

待问题解决后,再把这些模式测试对比。

测试环境:

硬件:三台物理机,千兆网卡,单网卡,处于同一网段(在同一个二层网络中)

flannel : 0.10 版本, vxlan模式(默认设置)

calico: 3.1 版本,ipip 模式(默认设置)

cilium: 1.0 版本,vxlan 模式(默认设置)

测试方法:

k8s搭建过程

在 node1 的主机网卡上抓包看看封装后的请求是否已到达:

大家根据自己的情况来准备centos7的虚拟机。

要保证彼此之间能够ping通,也就是处于同一个网络中,虚拟机的配置要求上面也描述咯。

kubedm : 用于搭建集群, 创建集群中的每一个组件 比如schduler, tcd, dube-proxy,apiserver, cont .

kubelet: 在每一个节点中运行pod , container 或者其他

kubectl: 用于跟集群打交道的命令行工具

记得保存好kubeadm join的信息

此时kubectl cluster-查看一下是否成功

可以通过docker run运行一个容器

同样以一个yaml文件维护,container运行在pod中

01 kubectl get pods

03 kubectl describe pod nginx-pod

于是来到worker02节点,docker ps一下

docker exec -it k8s_nginx-container_nginx-pod_default_3ee070: "true"通过这个annotation可以强制 s,如果是请求,会通过 301 redirect到 s。6d-e87a-11e9-a904-5254008afee6_0 bash

k8s经典换到哪里了

结论:

Kbuernetes存储资源PV和StorageClass。

Kubernetes已在容器编排之战中取胜,未来很可能会成为“多云”之上的标准层,进而为分布式系统的分发和运行带来根本性的改变,而其自身则会慢慢变得像LinuxKernel一样,成为一种系统底层的支撑,不再引人注目。

通过Kubernetes,分布式系统工具将拥有网络效应。每当人们为Kubernetes制作出的新的工具,都会让所有其它工具更完善。因此,这进一步巩固了Kubernetes的标准地位。

云提供商并非可替换的商品同一个k8s集群内的所有节点需要确保 mac 地址和 product_uuid 均,开始集群初始化之前需要检查相关信息。不同的云提供的服务会变得越来越独特和不同。如果可以访问不同的云提供商提供的不同服务,那么企业将因此受益。当多节点应用与单节点应用一样可靠时,我们将看到定价模型的变化。

这就是为什么我会被Kubernetes的原因。它是跨越异构系统的一个标准层。将来,我们会像讨论编译器和作系统内核一样讨论Kubernetes。Kubernetes将会是低层级的管路系统,而不在普通应用开发人员的视野之内。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 12345678@qq.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息