阿里云 ACK 集群网络 | 学习笔记

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 快速学习阿里云 ACK 集群网络

开发者学堂课程【企业级运维之云原生与 Kubernets 实战课程:阿里云 ACK 集群网络】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/913/detail/14606


阿里云 ACK 集群网络


目录

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

image.png

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

解决方法:

Ÿ 登录 Flannel 模式 K8s 集群 Master 节点;

Ÿ 执行命令 kubectl describe node xxx(xxx为节点名称)可以查看到 Pod CIDR 网络地址段,而 CCM 会将该网段加到 VPC 的路由表;

Ÿ 执行命令 kubectl exec -it xxx(xxx为Pod服务名) bash,以 bash 的方式进入任意运行的 Pod 中;

Ÿ 执行 dig 请求或 tcpdump 进行抓包分析,Flannel 集群模式下在主要在节点 eth0 和对端 Pod 内 eth0 上进行抓包;

ž 如果在节点 eth0 上可以抓到流出的包及回包,以此判断 iptables/lpvs 转发正常;

ž 如果在节点 eth0 节点上可以抓到包,而在对端 Pod 内 eth0 上抓不到包,可能是 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 网络下,Pod 的 IP 和集群的 ECS 所属相同 VPC,是由交换机进行分配,如下图所示:

image.png

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

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

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

image.png

Terway 网络拓扑图

 

三、CoreDNS

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

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

image.png

CoreDNS 的解析过程

集群服务域名,如: ..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 内启用 nscd(DNS 缓存服务),根据 nscd 的缓存机制可以忽略解析本身导致的问题。

场景二:

添加 svc.local 后缀的外部域名,直接用默认 dns 去解析,而不是先走完所有 zone: defaultsvc.clusterlocal,svc.clusterlocal,cluster.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

restartPolicy:Always

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. 集群网络相关的知识,包括 flannel、terway 两种网络插件;

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

image.png

思考:

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

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

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

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

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
20天前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
124 1
|
26天前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
188 89
|
6月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
240 9
|
6月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。
|
2月前
|
存储 Kubernetes 网络安全
关于阿里云 Kubernetes 容器服务(ACK)添加镜像仓库的快速说明
本文介绍了在中国大陆地区因网络限制无法正常拉取 Docker 镜像的解决方案。作者所在的阿里云 Kubernetes 集群使用的是较旧版本的 containerd(1.2x),且无法直接通过 SSH 修改节点配置,因此采用了一种无需更改 Kubernetes 配置文件的方法。通过为 `docker.io` 添加 containerd 的镜像源,并使用脚本自动修改 containerd 配置文件中的路径错误(将错误的 `cert.d` 改为 `certs.d`),最终实现了通过多个镜像站点拉取镜像。作者还提供了一个可重复运行的脚本,用于动态配置镜像源。虽然该方案能缓解镜像拉取问题,
289 2
|
8月前
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
754 33
|
8月前
|
Kubernetes 开发者 Docker
集群部署:使用Rancher部署Kubernetes集群。
以上就是使用 Rancher 部署 Kubernetes 集群的流程。使用 Rancher 和 Kubernetes,开发者可以受益于灵活性和可扩展性,允许他们在多种环境中运行多种应用,同时利用自动化工具使工作负载更加高效。
419 19
|
8月前
|
人工智能 分布式计算 调度
打破资源边界、告别资源浪费:ACK One 多集群Spark和AI作业调度
ACK One多集群Spark作业调度,可以帮助您在不影响集群中正在运行的在线业务的前提下,打破资源边界,根据各集群实际剩余资源来进行调度,最大化您多集群中闲置资源的利用率。
|
8月前
|
Kubernetes Shell Windows
【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停止抓包。
265 12
|
9月前
|
Cloud Native Serverless 数据中心
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
289 10

热门文章

最新文章

推荐镜像

更多