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

简介: 一、 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之间是可以相互通信的,前面章节也讲解了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的解析过程

 

集群服务域名,如:<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内启用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技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
Kubernetes Devops 应用服务中间件
基于 Azure DevOps 与阿里云 ACK 构建企业级 CI/CD 流水线
本文介绍如何结合阿里云 ACK 与 Azure DevOps 搭建自动化部署流程,涵盖集群创建、流水线配置、应用部署与公网暴露,助力企业高效落地云原生 DevOps 实践。
1504 2
|
存储 运维 关系型数据库
开源新发布|PolarDB-X v2.4.1 增强企业级运维能力
PolarDB-X 是阿里云推出的云原生分布式数据库,自2021年10月开源以来,持续迭代升级,至2024年4月发布的v2.4.1版本,重点增强了企业级运维能力,如无锁变更、物理扩缩容、数据TTL等,提供金融级高可用、透明分布式、HTAP一体化等特性。PolarDB-X 支持集中式和分布式一体化形态,兼容MySQL生态,适用于金融、通信、政务等行业。
2557 101
|
存储 Kubernetes 测试技术
企业级LLM推理部署新范式:基于ACK的DeepSeek蒸馏模型生产环境落地指南
企业级LLM推理部署新范式:基于ACK的DeepSeek蒸馏模型生产环境落地指南
1029 12
|
存储 Kubernetes 测试技术
企业级LLM推理部署新范式:基于ACK的DeepSeek蒸馏模型生产环境落地指南
本教程演示如何在ACK中使用vLLM框架快速部署DeepSeek R1模型推理服务。
|
Kubernetes 持续交付 数据库
阿里云ACK+GitLab企业级部署实战教程
GitLab 是一个功能强大的基于 Web 的 DevOps 生命周期平台,整合了源代码管理、持续集成/持续部署(CI/CD)、项目管理等多种工具。其一体化设计使得开发团队能够在同一平台上进行代码协作、自动化构建与部署及全面的项目监控,极大提升了开发效率和项目透明度。 GitLab 的优势在于其作为一体化平台减少了工具切换,高度可定制以满足不同项目需求,并拥有活跃的开源社区和企业级功能,如高级权限管理和专业的技术支持。借助这些优势,GitLab 成为许多开发团队首选的 DevOps 工具,实现从代码编写到生产部署的全流程自动化和优化。
|
人工智能 运维 Kubernetes
阿里云容器服务ACK AI助手正式上线带来的便利性
作为开发者想必大家都知道,云原生容器技术的优势,尤其是近两年的随着容器技术的迅猛发展,Kubernetes(K8s)已成为广泛应用于容器编排和管理的领先解决方案,但是K8s的运维复杂度一直是挑战之一。为了应对这一问题,就在最近,阿里云容器服务团队正式发布了ACK AI助手,这是一款旨在通过大模型增强智能诊断的产品,旨在帮助企业和开发者降低Kubernetes(K8s)的运维复杂度。那么本文就来详细讲讲关于这款产品,让我们结合实际案例分享一下K8s的运维经验,探讨ACK AI助手能否有效降低K8s的运维复杂度,并展望ACK AI助手正式版上线后的新功能。
1150 2
阿里云容器服务ACK AI助手正式上线带来的便利性
|
存储 Kubernetes Docker
容器服务ACK常见问题之阿里云控制台进不去了如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
Kubernetes 监控 调度
阿里云容器服务ACK
阿里云容器服务ACK(Alibaba Cloud Container Service for Kubernetes)提供高性能、可伸缩的容器应用管理服务,支持企业级Kubernetes容器化应用的生命周期管理。在ACK中,利用cGPU(Containerized GPU)技术可以实现GPU资源的共享,提高GPU利用率,降低整体成本。
602 6
|
监控 Cloud Native Java
基于阿里云容器服务(ACK)的微服务架构设计与实践
本文介绍如何利用阿里云容器服务Kubernetes版(ACK)构建高可用、可扩展的微服务架构。通过电商平台案例,展示基于Java(Spring Boot)、Docker、Nacos等技术的开发、容器化、部署流程,涵盖服务注册、API网关、监控日志及性能优化实践,帮助企业实现云原生转型。
|
监控 Kubernetes Cloud Native
基于阿里云容器服务Kubernetes版(ACK)的微服务架构设计与实践
本文介绍了如何基于阿里云容器服务Kubernetes版(ACK)设计和实现微服务架构。首先概述了微服务架构的优势与挑战,如模块化、可扩展性及技术多样性。接着详细描述了ACK的核心功能,包括集群管理、应用管理、网络与安全、监控与日志等。在设计基于ACK的微服务架构时,需考虑服务拆分、通信、发现与负载均衡、配置管理、监控与日志以及CI/CD等方面。通过一个电商应用案例,展示了用户服务、商品服务、订单服务和支付服务的具体部署步骤。最后总结了ACK为微服务架构提供的强大支持,帮助应对各种挑战,构建高效可靠的云原生应用。

热门文章

最新文章