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

简介: 快速学习阿里云 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
相关文章
|
2月前
|
弹性计算 安全 应用服务中间件
阿里云渠道商:怎么配置阿里云网络ACL?
阿里云网络ACL是子网级无状态防火墙,支持精准流量控制、规则热生效且免费使用。本文详解5步配置流程,助您实现Web与数据库层的安全隔离,提升云上网络安全。
|
2月前
|
人工智能 安全 架构师
2025云栖大会 | 阿里云网络技术Session主题资料和视频回放归档
2025年9月24日-26日,杭州,一年一度的云栖大会如期而至;阿里云飞天洛神云网络作为阿里云计算的连接底座,是飞天云操作系统的核心组件,致力于为上云企业提供高可靠、高性能、高弹性、智能的连接服务。本次云栖,云网络产品线也带来全系列产品升级,以及创新技术重磅解读,围绕增强确定性、提效自动化、深耕智能化和敏捷全球化带来技术、产品和服务升级,以及全新的云网络产品生态合作计划发布。
484 2
|
2月前
|
弹性计算 网络安全 数据中心
阿里云创建专有网络VPC的【IPv4网段】如何选择?有什么区别?
阿里云VPC创建时需选IPv4网段,默认提供10.0.0.0/16、172.16.0.0/16、192.168.0.0/16,三者无功能差异。若仅单VPC且不连本地数据中心,可任选其一,确保不冲突即可。多VPC或混合云场景需规划避免IP重叠。不支持100.64.0.0/10等特殊网段。建议结合IPAM进行地址管理。
|
3月前
|
存储 Kubernetes 网络安全
关于阿里云 Kubernetes 容器服务(ACK)添加镜像仓库的快速说明
本文介绍了在中国大陆地区因网络限制无法正常拉取 Docker 镜像的解决方案。作者所在的阿里云 Kubernetes 集群使用的是较旧版本的 containerd(1.2x),且无法直接通过 SSH 修改节点配置,因此采用了一种无需更改 Kubernetes 配置文件的方法。通过为 `docker.io` 添加 containerd 的镜像源,并使用脚本自动修改 containerd 配置文件中的路径错误(将错误的 `cert.d` 改为 `certs.d`),最终实现了通过多个镜像站点拉取镜像。作者还提供了一个可重复运行的脚本,用于动态配置镜像源。虽然该方案能缓解镜像拉取问题,
398 2
|
12月前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
279 17
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
231 10
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,并提供一些实用的代码示例。通过阅读本文,您将了解到如何保护自己的网络安全,以及如何提高自己的信息安全意识。
244 10
|
监控 安全 网络安全
网络安全与信息安全:漏洞、加密与意识的交织
在数字时代的浪潮中,网络安全与信息安全成为维护数据完整性、保密性和可用性的关键。本文深入探讨了网络安全中的漏洞概念、加密技术的应用以及提升安全意识的重要性。通过实际案例分析,揭示了网络攻击的常见模式和防御策略,强调了教育和技术并重的安全理念。旨在为读者提供一套全面的网络安全知识框架,从而在日益复杂的网络环境中保护个人和组织的资产安全。

推荐镜像

更多