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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
.cn 域名,1个 12个月
简介: 一、 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搭建和管理企业级网站应用
相关文章
|
15天前
|
云安全 人工智能 安全
|
27天前
|
云安全 人工智能 安全
再登榜首!阿里云蝉联中国公有云网络安全即服务市场份额第一
再登榜首!阿里云蝉联中国公有云网络安全即服务市场份额第一
42 5
|
28天前
|
弹性计算 监控 数据库
制造企业ERP系统迁移至阿里云ECS的实例,详细介绍了从需求分析、数据迁移、应用部署、网络配置到性能优化的全过程
本文通过一个制造企业ERP系统迁移至阿里云ECS的实例,详细介绍了从需求分析、数据迁移、应用部署、网络配置到性能优化的全过程,展示了企业级应用上云的实践方法与显著优势,包括弹性计算资源、高可靠性、数据安全及降低维护成本等,为企业数字化转型提供参考。
53 5
|
1月前
|
云安全 人工智能 安全
阿里云稳居公共云网络安全即服务市占率第一
日前,全球领先的IT市场研究和咨询公司IDC发布了《中国公有云网络安全即服务市场份额,2023:规模稳步增长,技术创新引领市场格局》报告。报告显示,阿里云以27.0%的市场份额蝉联榜首。
|
25天前
|
弹性计算 安全 容灾
阿里云DTS踩坑经验分享系列|使用VPC数据通道解决网络冲突问题
阿里云DTS作为数据世界高速传输通道的建造者,每周为您分享一个避坑技巧,助力数据之旅更加快捷、便利、安全。本文介绍如何使用VPC数据通道解决网络冲突问题。
81 0
|
20天前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。
|
18天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
28天前
|
Cloud Native Devops 云计算
云计算的未来:云原生架构与微服务的革命####
【10月更文挑战第21天】 随着企业数字化转型的加速,云原生技术正迅速成为IT行业的新宠。本文深入探讨了云原生架构的核心理念、关键技术如容器化和微服务的优势,以及如何通过这些技术实现高效、灵活且可扩展的现代应用开发。我们将揭示云原生如何重塑软件开发流程,提升业务敏捷性,并探索其对企业IT架构的深远影响。 ####
42 3
|
29天前
|
Cloud Native 持续交付 云计算
云原生架构的演进与挑战
随着云计算技术的不断发展,云原生架构已成为企业数字化转型的重要支撑。本文深入探讨了云原生架构的概念、发展历程、核心技术以及面临的挑战,旨在为读者提供一个全面了解云原生架构的视角。通过分析Kubernetes、Docker等关键技术的应用,以及微服务、持续集成/持续部署(CI/CD)等实践案例,本文揭示了云原生架构在提高应用开发效率、降低运维成本、增强系统可扩展性等方面的显著优势。同时,也指出了云原生架构在安全性、复杂性管理等方面所面临的挑战,并提出了相应的解决策略。
|
18天前
|
运维 Cloud Native 持续交付
云原生技术深度探索:重塑现代IT架构的无形之力####
本文深入剖析了云原生技术的核心概念、关键技术组件及其对现代IT架构变革的深远影响。通过实例解析,揭示云原生如何促进企业实现敏捷开发、弹性伸缩与成本优化,为数字化转型提供强有力的技术支撑。不同于传统综述,本摘要直接聚焦于云原生技术的价值本质,旨在为读者构建一个宏观且具体的技术蓝图。 ####