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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 一、 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搭建和管理企业级网站应用
相关文章
|
2月前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
115 2
|
15天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
86 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
5天前
|
负载均衡 容灾 Cloud Native
云原生应用网关进阶:阿里云网络ALB Ingress 全能增强
在过去半年,ALB Ingress Controller推出了多项高级特性,包括支持AScript自定义脚本、慢启动、连接优雅中断等功能,增强了产品的灵活性和用户体验。此外,还推出了ingress2Albconfig工具,方便用户从Nginx Ingress迁移到ALB Ingress,以及通过Webhook服务实现更智能的配置校验,减少错误配置带来的影响。在容灾部署方面,支持了多集群网关,提高了系统的高可用性和容灾能力。这些改进旨在为用户提供更强大、更安全的云原生网关解决方案。
66 7
|
15天前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
30 2
|
2月前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
2月前
|
Kubernetes Cloud Native 开发者
云原生入门:Kubernetes的简易指南
【10月更文挑战第41天】本文将带你进入云原生的世界,特别是Kubernetes——一个强大的容器编排平台。我们将一起探索它的基本概念和操作,让你能够轻松管理和部署应用。无论你是新手还是有经验的开发者,这篇文章都能让你对Kubernetes有更深入的理解。
|
2月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
2月前
|
Kubernetes 负载均衡 Cloud Native
探索Kubernetes:云原生应用的基石
探索Kubernetes:云原生应用的基石
|
2月前
|
Kubernetes 监控 负载均衡
深入云原生:Kubernetes 集群部署与管理实践
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其弹性、可扩展性成为企业IT架构的首选。本文将引导你了解如何部署和管理一个Kubernetes集群,包括环境准备、安装步骤和日常维护技巧。我们将通过实际代码示例,探索云原生世界的秘密,并分享如何高效运用这一技术以适应快速变化的业务需求。
74 1
|
2月前
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。

热门文章

最新文章