企业级运维之云原生与Kubernetes实战课程 第三章第5讲 阿里云ACK集群网络

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 一、 Flannel网络二、 Terway网络三、 CoreDNS四、 最佳实践

企业级运维之云原生与Kubernetes实战课程

第三章第5讲 阿里云ACK集群网络

 

视频地址:https://developer.aliyun.com/learning/course/913/detail/14606

 

目录

 

一、 Flannel网络

二、 Terway网络

三、 CoreDNS

四、 最佳实践

 

ACK中,可以通过两种网络模式实现容器网络能力,分别是Flannel网络模式和Terway网络模式。

 

一、Flannel网络

 

Flannel是为Kubernetes设置的一个简单的三层网络实现的网络插件,在阿里云上使用的Flannel网络模式采用阿里云VPC模式,Flannel网络基于阿里云VPC的自定义路由能力,来实现跨节点的Pod直接与VPC的互相访问。

 

1. Flannel工作原理

 

集群的每个节点上会起一个flannel agent,并且会给每个节点预分配一个Pod CIDR,这个Pod CIDR是容器集群Pod CIDR的子集。Pod的报文通过后端机制来进行转发。

 

在集群中,无论Pod是否跨节点,Pod之间是可以相互通信的,前面章节也讲解了PodSVCService)、Pod与外部的通信原理。在Flannel网络模式中,如下图所示,集群的CIDR地址段包含了节点所在的网络地址段,基于设备对的映射关系流量会首先经过eth0,流向cni0到达对端Podeth0CCM负责将每个节点的Pod CIDR网段在VPC路由表中指向对应的ECS

 image.png

 

问题:在集群里添加新的节点,如果Pod网络不通,在Flannel模式中如何排查?

 

解决方法:

 

  • 登录Flannel模式K8s集群Master节点;
  • 执行命令kubectl describe node xxxxxx为节点名称)可以查看到Pod CIDR网络地址段,而CCM会将该网段加到VPC的路由表;
  • 执行命令kubectl exec -it xxxxxxPod服务名) bash,以bash的方式进入任意运行的Pod中;
  • 执行dig请求或tcpdump进行抓包分析,Flannel集群模式下在主要在节点eth0和对端Podeth0上进行抓包;
  • 如果在节点eth0上可以抓到流出的包及回包,以此判断iptables/lpvs转发正常;
  • 如果在节点eth0节点上可以抓到包,而在对端Podeth0上抓不到包,可能是iptables/lpvs、内核协议栈、tcp/udp memory满导致流量包被丢弃,通过执行命令netstat -st查看所有TCP的统计信息;
  • 抓包示例:
  • 命令:tcpdump -i any host  ip  -s0 -w p.pcap -C 200 -W 50
  • -i any指定所有网卡,host ip是指定主机ip地址,-s0设置buffer值为不限制包的大小,-w指定写入的文件,-C -W指定抓包文件大小和数量。

 

二、Terway网络

 

Terway是阿里云容器服务团队推出的针对阿里云VPC网络的CNI插件,稳定、高性能,支持Kubernetes NetworkPolicy 流控等,在Terway网络下,PodIP和集群的ECS所属相同VPC,是由交换机进行分配,如下图所示:

image.png

 

Terway网络插件中,每个Pod都拥有自己网络栈和IP地址。同一台ECS内的Pod之间通信,直接通过机器内部的转发;跨ECSPod通信、报文通过VPC的弹性网卡直接转发。

 

目前云上FlannelTerway网络模式的集群,不支持节点上不同的Pod CIDR扩容,建议使用TerwayeniIP方式增加交换机。

Terway集群下执行命令:terway-cli mapping查看Pod名称及分配的Pod IP抓包命令:tcpdump -i any host ip  -nnvv -xxx

 image.png

Terway网络拓扑图

 

三、CoreDNS

 

CoreDNS是一个灵活可扩展的DNS服务器,可以作为Kubernetes集群DNS,解析服务域名和集群外部域名。

 

云上默认配置CoreDnsIPx.x.0.10x.x为容器分配的网段),与选择的网段无关,默认启动两副本,可以进入任意Pod执行命令kubectl exec -it xxx(xxx为服务名) bash,进入容器内执行命令cat /etc/resolv.conf查看nameserver的值为x.x.0.10

 image.png

 

CoreDNS的解析过程

 

集群服务域名,如:<servicename>.<namespace>.svc.cluster.local

集群外部域名,如: www.aliyun.com, rm-2z****9na.mysql.rds.aliyuncs.com

 image.png

 

  • Pod发起域名解析请求时,首先发给CoreDNS x.x.1.0进行解析,CoreDNS根据集群模式的不同转发到后端endpoint
  • 执行命令:ipvsadm -Ln|grep 0.10查看转发信息;
  • 当在集群中解析外部域名失败时,可以通过抓包,在节点和容器内分别执行命令:tcpdump -i any port 53 -nnvv -xxx|grep -i xx(xx为匹配查找的关键字)
  • 执行命令ipvsadm -Ln -c,可以查看ipvs session,默认900s会话保持,超过900s会话连接会被释放,在ipvs集群中建议长连接keepalive的值设置900s以内。

 

四、最佳实践

 

场景一:

 

当有海量DNS请求时,如何调整CoreDNS cache时间,减少CoreDNS forward外部DNS解析的压力。

 

方案一:kubectl -nkube-system edit cm coredns,修改cache的值为60

 

示例:

 

Corefile:

.:53 {

errors

health{

lameduck 5s

}

ready

 

kubernetes clusterlocal in-addrarpaip6arpa{

pods insecure

upstream

fallthrough in-addrarpaip6.arpa

ttl 30

}

rewrite name regex (.*)\.my\.domain {1}.default.svc.cluster.local

prometheus:9153

Forward. /etc/resolv.conf

cache 10

Log

Loop

reload

loadbalance

}

kind: ConfigMap

 

方案一:通过curl -4 -v url来指定通过ipv4方式访问服务。

 

方案三:Pod内启用nscdDNS缓存服务),根据nscd的缓存机制可以忽略解析本身导致的问题。

 

场景二:

 

添加svc.local后缀的外部域名,直接用默认dns去解析,而不是先走完所有zone: defaultsvc.clusterlocalsvc.clusterlocalcluster.local,如何优化呢?

 

方案一:使用标准fqdn域名,即在域名后加“.”(比如www.aliyun.com.

 

方案二:

 

修改deployment,增加options里的:

-name ndots

value:"1"

 

示例:

 

app: test1

spec:

containers:

- image: nginx: latest

imagePullPolicy: Always

LivenessProbe:

failureThreshold:3

initialDelaySeconds:15

periodSeconds:10

successThreshold:1

tcpSocket:

port:80

timeoutSeconds: 1

name:test1

resources:

limits:

cpu: “1”

memory: 100Mi

requests:

cpu:250m

memory:32Mi

terminationMessagePath:/dev/termination-log    terminationMessagePolicy: File

dnsConfig:

options:

- name: single-request-reopen

- name: ndots

value:  “1”

dnsPolicy: ClusterFirst

restartPolicyAlways

schedulerName: default-scheduler

securityContext: {}

terminationGracePeriodSeconds: 30

 

场景三:

 

如何将AAAA请求和A请求分开发送,而不是放到一个stream中,避免conntrack插表竞争导致解析失败?

 

方案:

 

修改deployment配置:kubectl edit deploy test1

template.spec下的dns配置,添加:

dnsConfig:

options:

-name:single-request-reopen

 

示例:

 

template:

metadata:

creationTimestamp:null

labels:

app:test1

Spec:

containers:

- image:nginx:latest

imagePullPolicy:Always

livenessProbe:

failureThreshold:3

initialDelaySeconds:15

periodseconds:10

successThreshold:1

tcpSocket:

port:80

timeoutSeconds:1

name:test1

resources:

limits:

cpu:"1"

memory: 100Mi

requests:

cpu:250m

memory:32Mi

terminationMessagePath: /dev/termination-log

terminationMessagePolicv: File

dnsConfig:

options:

-name: single-request-reopen

dnsPolicy: ClusterFirst

restartPolicy: Always

schedulerName: default-scheduler

securityContext: {}

terminationGracePeriodSeconds: 30

 

 

本讲小结

 

1.   集群网络相关的知识,包括flannelterway两种网络插件;

2.   CoreDns组件是如何解析集群内外部域名的;

 image.png

 

思考:

 

1.   flannel集群,Pod访问内网rdsslb实例的网络过程?

2.   flannel/terway集群,Pod访问内网rds,要如何添加 rds白名单?

3.   flannel/terway集群遇到网络问题时如何抓包?

4.   Pod内解析外部域名失败,要怎么排查?

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
打赏
0
0
0
0
12371
分享
相关文章
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
130 33
集群部署:使用Rancher部署Kubernetes集群。
以上就是使用 Rancher 部署 Kubernetes 集群的流程。使用 Rancher 和 Kubernetes,开发者可以受益于灵活性和可扩展性,允许他们在多种环境中运行多种应用,同时利用自动化工具使工作负载更加高效。
76 19
打破资源边界、告别资源浪费:ACK One 多集群Spark和AI作业调度
ACK One多集群Spark作业调度,可以帮助您在不影响集群中正在运行的在线业务的前提下,打破资源边界,根据各集群实际剩余资源来进行调度,最大化您多集群中闲置资源的利用率。
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
70 12
OpenAI故障复盘丨如何保障大规模K8s集群稳定性
OpenAI故障复盘丨如何保障大规模K8s集群稳定性
企业级LLM推理部署新范式:基于ACK的DeepSeek蒸馏模型生产环境落地指南
企业级LLM推理部署新范式:基于ACK的DeepSeek蒸馏模型生产环境落地指南
97 12
ACK One多集群Service帮助大批量应用跨集群无缝迁移
ACK One多集群Service可以帮助您,在无需关注服务间的依赖,和最小化迁移风险的前提下,完成跨集群无缝迁移大批量应用。
阿里云ACK+GitLab企业级部署实战教程
GitLab 是一个功能强大的基于 Web 的 DevOps 生命周期平台,整合了源代码管理、持续集成/持续部署(CI/CD)、项目管理等多种工具。其一体化设计使得开发团队能够在同一平台上进行代码协作、自动化构建与部署及全面的项目监控,极大提升了开发效率和项目透明度。 GitLab 的优势在于其作为一体化平台减少了工具切换,高度可定制以满足不同项目需求,并拥有活跃的开源社区和企业级功能,如高级权限管理和专业的技术支持。借助这些优势,GitLab 成为许多开发团队首选的 DevOps 工具,实现从代码编写到生产部署的全流程自动化和优化。
HTTPS 证书自动化运维:https证书管理系统-自动化部署
本指南介绍如何部署Linux服务器节点。首先复制生成的Linux脚本命令,然后将其粘贴到目标服务器上运行。接着刷新页面查看节点记录,并点击“配置证书”选择证书以自动部署。最后,节点部署完成,后续将自动调度,无需人工干预。
HTTPS 证书自动化运维:https证书管理系统-自动化部署
HTTPS 证书自动化运维:https证书管理系统- 自动化监控
本文介绍如何设置和查看域名或证书监控。步骤1:根据证书状态选择新增域名或证书监控,线上部署推荐域名监控,未部署选择证书监控。步骤2:查询监控记录详情。步骤3:在详情页查看每日定时检测结果或手动测试。
HTTPS 证书自动化运维:https证书管理系统- 自动化监控