kubernetes-循序渐进了解coredns
文章目录
- 概要
- 基础知识
- Kubernetes 集群中对对象名称的 DNS 流量
- 解析 Kubernetes 集群外的名称的 DNS 流量
- CoreDNS 如何确定向哪个本地 DNS 请求解析?
- 修改 CoreDNS 的配置
概要
CoreDNS 是 Kubernetes 的核心组件之一。只有在 Kubernetes 集群中安装了 容器网络接口(CNI) 后,CoreDNS 的 Pod 才会启动并运行。CoreDNS 的作用是为 Kubernetes 集群中的对象将名称解析为 IP 地址。
基础知识
CoreDNS 是 Kubernetes 集群中的核心组件,作为一个 Pod 运行在集群中的某个节点上。这个节点可以是主节点,也可以是工作节点。默认情况下,有两个 CoreDNS Pod 分布在两个不同的节点上。这种设置为集群中的名称到 IP 的功能提供了冗余和负载均衡。CoreDNS 是通过一个 Deployment 对象部署的,因此可以根据需要进行扩展或缩减。CoreDNS Pod 是通过一个服务(Service)访问的,这个服务拥有一个虚拟 IP 地址,用于在这些 Pod 之间平衡流量负载。
CoreDNS Pod 属于 kube-system 命名空间,其配置存储在同一命名空间中的一个名为 coredns 的 ConfigMap 中。默认配置类似于以下内容:
kubeuser@k8smaster:~$ kubectl get cm coredns -n kube-system -o yaml
apiVersion: v1
data:Corefile: |.:53 {log #注意,默认的configMap中,没有log,记得加上,以便于后面的调试errorshealth {lameduck 5s}readykubernetes cluster.local in-addr.arpa ip6.arpa {pods insecurefallthrough in-addr.arpa ip6.arpattl 30}prometheus :9153forward . /etc/resolv.conf {max_concurrent 1000}cache 30loopreloadloadbalance}
kind: ConfigMap
metadata:creationTimestamp: "2024-11-18T09:56:27Z"name: corednsnamespace: kube-systemresourceVersion: "255"uid: 38653b7a-05c2-4f83-bbc4-b7b1e4397f17
为了更好地理解 CoreDNS 的行为并便于故障排查,可以在配置中添加 log 选项。这样,CoreDNS 进行的所有解析操作都会被记录到日志中。随后,通过执行 kubectl logs 命令,可以查看这些记录,从而更直观地分析和排查问题。
Kubernetes 集群中对对象名称的 DNS 流量
CoreDNS 是 Kubernetes 集群的默认 DNS 解析器,其服务通常监听在 UDP 端口 53。如果需要捕获 CoreDNS Pod 的所有流入和流出流量,建议将 CoreDNS 的副本数缩减为 1 个 Pod,从而确保所有流量都通过该实例。
接下来,我们通过一个示例来演示如何捕获 DNS 流量。在示例中,一个 Pod 将发送 DNS 请求,同时我们利用 Cilium 捕获相关流量以便更好地分析和理解。这里使用的 Pod 是 netshoot,它集成了多种网络工具(在本例中,我们将使用 nslookup 工具):
kubeuser@k8smaster:~$ kubectl run netshoot --image=nicolaka/netshoot -it -- bash
netshoot:~# nslookup nginx-service.default.svc.cluster.local
Server: 10.96.0.10
Address: 10.96.0.10#53Name: nginx-service.default.svc.cluster.local
Address: 10.98.167.203
在 netshoot Pod 中,我们将集群中某个服务(nginx-service)的名称解析为其对应的 IP 地址:10.98.167.203,而 CoreDNS 服务的 IP 地址为 10.96.0.10。
与此同时,在另一个终端中,我们通过 Cilium 捕获了这段流量。为了监控该流量,需要确保使用运行在与 CoreDNS Pod 同一节点上的 Cilium 代理。捕获结果如下所示:
kubeuser@k8smaster:~$ kubectl exec -it cilium-kbwq7 -n kube-system -- cilium monitor |grep :53
Defaulted container "cilium-agent" out of: cilium-agent, config (init), mount-cgroup (init), apply-sysctl-overwrites (init), mount-bpf-fs (init), clean-cilium-state (init), install-cni-binaries (init)
-> endpoint 118 flow 0x5a3b1331 , identity 27258->53291 state new ifindex lxc29d980acbf33 orig-ip 10.0.1.127: 10.0.1.127:51805 -> 10.0.1.47:53 udp
-> endpoint 139 flow 0x0 , identity 53291->27258 state reply ifindex lxc78a71191cd5e orig-ip 10.0.1.47: 10.96.0.10:53 -> 10.0.1.127:51805 udp
netshoot Pod 的 IP 地址为 10.0.1.127,而 CoreDNS Pod 的 IP 地址为 10.0.1.47。我们可以观察到,DNS 请求通过端口 53 发送到 CoreDNS Pod,随后 CoreDNS 将解析结果返回给 netshoot Pod。
需要注意的是,即使该服务名称不存在,数据流看起来依然相同。这是因为 CoreDNS 不会进一步尝试解析此类 DNS 请求,其原因在于 CoreDNS 对域名 svc.cluster.local 具有权威性。如果 CoreDNS 无法解析,那么其他任何 DNS 解析器也无法解析。此外,执行 nslookup nginx-service.default 时,CoreDNS 会自动尝试解析其管理范围内的多个后缀。
为了完整地展示整个过程,以下是与该 DNS 流量相关的 CoreDNS 日志内容:
kubectl logs --namespace=kube-system -l k8s-app=kube-dns
...
[INFO] 10.0.1.127:54548 - 57210 "A IN nginx-service.default.svc.cluster.local. udp 57 false 512" NOERROR qr,aa,rd 112 0.000152805s
...
我们可以看到 netshoot Pod 的 IP 地址、需要解析的名称以及解析结果。NOERROR 表示解析成功完成,最后还显示了解析所花费的时间。如果解析失败,将看到 NXDOMAIN 替代 NOERROR。
解析 Kubernetes 集群外的名称的 DNS 流量
当一个 Pod 尝试解析 CoreDNS 无权限管理的域名时,会发生不同的处理方式。这些域名可能包括 Ingress 规则中指定的任意 URL,或者集群的 API Server 名称。这类名称通常需要通过集群外的 DNS 服务器进行解析,以便流量能够正确路由到 Kubernetes 集群外。
在某些架构中可能存在类似场景:例如,一个 Pod 尝试连接到 Kubernetes 集群外的 Oracle 数据库。在这种情况下,数据库的名称解析将由位于本地网络中的外部 DNS 服务器完成,而非 CoreDNS。
接下来,让我们再次使用 netshoot Pod 来进一步探索这种情况并观察具体行为:
netshoot:~# nslookup pcicvs.mydomain.com
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: pcicvs.mydomain.com
Address: 172.19.2.5
名称已经被解析,但从 Pod 的视角看不到太多有关解析过程的细节。Pod 只知道 CoreDNS 服务的 IP 地址是 10.96.0.10。如果查看该 netshoot Pod 内部的 DNS 配置,会看到如下内容:
netshoot:~# cat /etc/resolv.conf
search default.svc.cluster.local svc.cluster.local cluster.local pci.co.id
nameserver 10.96.0.10
options ndots:5
你可以看到 CoreDNS 有权管理的域名和 CoreDNS 服务的 IP 地址,仅此而已!接下来,我们来看看 Cilium 能够看到的关于这类流量的信息:
kubectl exec -it -n kube-system cilium-kbwq7 -- cilium monitor|grep ":53"
-> endpoint 1202 flow 0x226176d0 , identity 27258->53291 state new ifindex lxc0c634b736227 orig-ip 10.0.1.127: 10.0.1.127:39445 -> 10.0.1.47:53 udp
-> stack flow 0x350dacf7 , identity 53291->world state new ifindex 0 orig-ip 0.0.0.0: 10.0.1.47:60021 -> 172.19.5.5:53 udp
-> endpoint 1202 flow 0x0 , identity world->53291 state reply ifindex lxc0c634b736227 orig-ip 172.19.5.5: 172.19.5.5:53 -> 10.0.1.47:60021 udp
-> endpoint 1320 flow 0x0 , identity 53291->27258 state reply ifindex lxc15973d8c3d02 orig-ip 10.0.1.47: 10.96.0.10:53 -> 10.0.1.127:39445 udp
在这个案例中,你可以看到,由于 CoreDNS 并没有管理 mydomain.com 的权限,它会向它已知的 DNS 请求解析操作。在这个例子中,它使用了 kubernetes cluster外部的LAN DNS(172.19.5.5)来完成解析,同时为了匿名化我们本地网络中的真实 DNS IP 地址,使用了这个公共 DNS。因此,DNS 流量的路径如下所示:
Netshoot Pod (10.0.1.127) -> CoreDNS Pod (10.0.1.47) -> 本地 DNS (172.19.5.5),然后沿同一路径返回。
需要注意的是,这是 Kubernetes 集群中 Cilium 代理所观察到的流量路径,但实际上我们的本地 DNS 可能还会向其他 DNS 请求解析操作(这就是标准的 DNS 递归解析机制)。
在 CoreDNS 的日志中,可以看到这个名称解析操作已经成功完成,并且解析所花费的时间比集群内部解析稍长。这是因为流量需要经过本地 DNS,多了一些处理步骤。
kubectl logs --namespace=kube-system -l k8s-app=kube-dns -f
...
[INFO] 10.0.1.127:45895 - 16502 "A IN pcicvs.mydomain.com. udp 34 false 512" NOERROR qr,aa,rd,ra 66 0.000089403s
...
CoreDNS 如何确定向哪个本地 DNS 请求解析?
CoreDNS 知道向哪个本地 DNS 请求解析的答案来自其配置文件中的 ConfigMap,例如其中的 forward 插件配置:forward . /etc/resolv.conf。这是本文开头提到的配置。
你是否可以查看 /etc/resolv.conf 文件的内容及其来源?
Pods 的设计初衷是提供特定功能,因此其容器镜像通常仅包含实现该功能所需的最小工具集。这意味着容器中可能没有像 shell 这样的工具,从而减少了潜在攻击面。例如,CoreDNS 镜像就不包含 shell。尽管如此,你仍可以通过一些方法“模拟”出一个 shell 来探索容器中的文件:
kubectl debug -it coredns-58f6d65b75-zgfw6 -n kube-system --image=nicolaka/netshoot --target=coredns --image-pull-policy=IfNotPresent
coredns-58f6d65b75-zgfw6 ~ cat /proc/1/root/etc/resolv.conf
通过 kubectl debug,你可以使用你选择的其他镜像进入 Pod,同时仍然可以访问原始 CoreDNS 容器的内容。在目标 Pod coredns-58f6d65b75-zgfw6中,CoreDNS 容器的名称是 coredns。然后,你可以查看 /proc/1/root/etc/resolv.conf 的内容,这正是我们要找的文件。
顺便说一下,CoreDNS 的 ConfigMap 也作为文件存储在这个容器中,路径是 /proc/1/root/etc/coredns/Corefile。
问题是,这个 resolv.conf 文件是从哪里来的?其实很简单:它来自于托管 CoreDNS Pod 的节点的 /etc/resolv.conf 文件!我做了一个测试,往节点的 /etc/resolv.conf 文件中添加了一条记录,然后重新部署了 CoreDNS,结果确实如预期那样,添加的记录也出现在了 CoreDNS 容器的 /etc/resolv.conf 中!记住,CoreDNS Pod 可以托管在集群中的任何节点上。因此,如果你想做这个测试,你可以强制 Pod 调度到特定的节点,或者修改所有节点的 /etc/resolv.conf 文件。在实验室中,使用几台节点来测试应该会非常容易。
修改 CoreDNS 的配置
到目前为止,已经了解了 CoreDNS 的工作原理,但有没有办法可以从集群内部控制名称解析呢?
可能的架构中,Pod 需要使用由集群的 Ingress 控制器管理的 URL。在这种情况下,如前所述,名称解析将不会由 CoreDNS 完成,而是由你的本地 DNS 处理。在你的组织中,这些本地 DNS可能由其他团队管理,你无法对它们进行控制。如果由于某些原因这些本地 DNS 无法访问,那么集群中的应用程序将无法正常工作。
如果希望集群中的 Pod 能够独立解析这些 URL 名称,那么你可以通过使用 CoreDNS 的 hosts 插件在 CoreDNS 中静态映射这些名称。
只需编辑 CoreDNS 的 ConfigMap,将 hosts 插件添加到 forward 插件之前即可(在 CoreDNS 的术语中,这些块或指令被称为插件),如下所示:
hosts插件示范内容
hosts {172.19.2.5 pcicvs.mydomain.comfallthrough}
coredns congfigMap完整内容
kubeuser@k8smaster:/etc$ kubectl get cm coredns -n kube-system -o yaml
apiVersion: v1
data:Corefile: |.:53 {logerrorshealth {lameduck 5s}readykubernetes cluster.local in-addr.arpa ip6.arpa {pods insecurefallthrough in-addr.arpa ip6.arpattl 30}prometheus :9153hosts {172.19.2.5 pcicvs.mydomain.comfallthrough}forward . /etc/resolv.conf {max_concurrent 1000}cache 30loopreloadloadbalance}
kind: ConfigMap
metadata:creationTimestamp: "2024-11-18T09:56:27Z"name: corednsnamespace: kube-systemresourceVersion: "5271081"uid: 38653b7a-05c2-4f83-bbc4-b7b1e4397f17
不久后,如果你从 netshoot Pod 再次尝试解析pcicvs.mydomain.com 的名称,会发现它返回在 hosts 插件中设置的 IP 地址。
因此,CoreDNS 能够直接解析该 URL,而无需向 /etc/resolv.conf 中配置的本地 DNS 发送请求。参数 fallthrough 的作用是,如果 hosts 插件中没有静态映射,则会像之前一样将 DNS 请求转发给本地 DNS 进行解析。
这一更改是动态生效的(无需重启),并且通过 fallthrough 参数,如果没有找到匹配的映射,解析仍然会交由本地 DNS 处理,从而能够解析外部名称或 URL。通过这种方式,你可以根据需求逐步添加由 CoreDNS 处理的域名映射。这不仅能够加快名称解析的速度,还可以让你对解析过程保持更好的控制。然而,这样做的缺点是,当新的应用(例如使用 Ingress 规则的应用)部署到集群时,你需要及时更新这些映射。
需要注意的是,在 CoreDNS 配置中,fallthrough 参数用于决定当一个插件无法处理 DNS 请求时,是否将请求传递给下一个插件。
因此将 hosts 插件放在 forward 插件之后没有意义,因为 forward 插件没有 fallthrough 参数,无法将请求传递回 hosts 插件。因此,hosts 插件的映射就永远不会被访问到。为了确保 hosts 插件能够生效,它应该放在 forward 插件之前。
相关文章:
kubernetes-循序渐进了解coredns
文章目录 概要基础知识Kubernetes 集群中对对象名称的 DNS 流量解析 Kubernetes 集群外的名称的 DNS 流量CoreDNS 如何确定向哪个本地 DNS 请求解析?修改 CoreDNS 的配置 概要 CoreDNS 是 Kubernetes 的核心组件之一。只有在 Kubernetes 集群中安装了 容器网络接口…...
mysql8 从C++源码角度看 客户端发送的sql信息 mysql服务端从网络读取到buff缓存中
MySQL 8 版本中的客户端-服务器通信相关,特别是在接收和解析网络请求的数据包时。以下是对代码各个部分的详细解释,帮助您更好地理解这些代码的作用。 代码概述 这段代码主要负责从网络读取数据包,它包含了多个函数来处理网络数据的读取、缓…...

pygame飞机大战
飞机大战 1.main类2.配置类3.游戏主类4.游戏资源类5.资源下载6.游戏效果 1.main类 启动游戏。 from MainWindow import MainWindow if __name__ __main__:appMainWindow()app.run()2.配置类 该类主要存放游戏的各种设置参数。 #窗口尺寸 #窗口尺寸 import random import p…...

【Vim Masterclass 笔记08】第 6 章:Vim 中的文本变换及替换操作 + S06L20:文本的插入、变更、替换,以及合并操作
文章目录 Section 6:Transforming and Substituting TextS06L21 Inserting, Changing, Replacing, and Joining1 定位到行首非空字符,并启用插入模式2 在紧挨光标的下一个字符位置启动插入模式3 定位到一行末尾,并启用插入模式4 定位到光标的…...
Tailwind CSS 实战:动画效果设计与实现
在现代网页设计中,动画效果就像是一位优秀的舞者,通过流畅的动作为用户带来愉悦的视觉体验。记得在一个产品展示网站项目中,我们通过添加精心设计的动画效果,让用户的平均停留时间提升了 35%。今天,我想和大家分享如何使用 Tailwind CSS 打造优雅的动画效果。 设计理念 设计动…...

【动手学电机驱动】STM32-MBD(3)Simulink 状态机模型的部署
STM32-MBD(1)安装 Simulink STM32 硬件支持包 STM32-MBD(2)Simulink 模型部署入门 STM32-MBD(3)Simulink 状态机模型的部署 【动手学电机驱动】STM32-MBD(3)Simulink 状态机模型部署…...
Linux 服务器启用 DNS 加密
DNS 加密的常用协议包括 DNS over HTTPS (DoH)、DNS over TLS (DoT) 和 DNSCrypt。以下是实现这些加密的步骤和工具建议: 1. 使用 DoH (DNS over HTTPS) 工具推荐: cloudflared(Cloudflare 提供的客户端)doh-client(…...
PyTorch不同优化器比较
常见优化器介绍 - SGD(随机梯度下降):是最基本的优化器之一,通过在每次迭代中沿着损失函数的负梯度方向更新模型参数。在大规模数据集上计算效率高,对于凸问题和简单模型效果较好。但收敛速度慢,容易陷入局…...

stm32的掉电检测机制——PVD
有时在一些应用中,我们需要检测系统是否掉电了,或者要在掉电的瞬间需要做一些处理。 STM32内部自带PVD功能,用于对MCU供电电压VDD进行监控。 STM32就有这样的掉电检测机制——PVD(Programmable Voltage Detecter),即可编程电压检…...

Nginx 文件名逻辑漏洞(CVE-2013-4547)
目录 漏洞原理 影响版本 漏洞复现 漏洞原理 CGI:是一种协议,定义了web服务器传递的数据格式。 FastCGI:优化版的CGI程序 PHP-CGI:PHP解释器,能够对PHP文件进行解析并返回相应的解析结果 PHP-FPM:Fas…...
Java 21 优雅和安全地处理 null
在 Java 21 中,判断 null 依然是开发中常见的需求。通过使用现代 Java 提供的工具和特性,可以更加优雅和安全地处理 null。 1. 使用 Objects.requireNonNull Objects.requireNonNull 是标准的工具方法,用于快速判断并抛出异常。 示例 import java.util.Objects;public c…...
AWS Glue基础知识
AWS Glue 是一项完全托管的 ETL(提取、转换、加载)服务,与考试相关,尤其是在数据集成、处理和分析方面。 1.数据集成和 ETL(提取、转换、加载) AWS Glue 主要用于构建 ETL 管道以准备数据以进行分析。作为…...

Kubernetes——part4-1 Kubernetes集群 服务暴露 Nginx Ingress Controller
Kubernetes集群 服务暴露 Nginx Ingress Controller 一、ingress控制器 1.1 ingress控制器作用 (类似于slb,做代理服务) ingress controller可以为kubernetes 集群外用户访问Kubernetes集群内部pod提供代理服务。 提供全局访问代理访问流程…...
Flutter入门,Flutter基础知识总结。
Flutter是Google推出的一种移动应用开发框架,它允许开发者使用一套代码库同时开发Android和iOS应用。以下是对Flutter知识点的详细总结: 一、Flutter概述 特点:跨平台、高保真、高性能。 编程语言:使用Dart语言编写。 设计理念&…...
weight decay 和L2是一个东西吗
weight decay和L2正则化本质上是相同的概念。 weight decay(权重衰减)和L2正则化在深度学习中都是用来防止模型过拟合的常用技术。它们通过对损失函数添加一个正则项来限制模型参数的大小,从而控制模型的复杂度。具体来说,L2正则…...
JavaScript系列(8)-- Array高级操作
JavaScript Array高级操作 📚 在前七篇文章中,我们探讨了JavaScript的语言特性、ECMAScript标准、引擎工作原理、数值类型、字符串处理、Symbol类型和Object高级特性。今天,让我们深入了解JavaScript中的Array高级操作。数组是最常用的数据结…...

Harmony开发【笔记1】报错解决(字段名写错了。。)
在利用axios从网络接收请求时,发现返回obj的code为“-1”,非常不解,利用console.log测试,更加不解,可知抛出错误是 “ E 其他错误: userName required”。但是我在测试时,它并没有体现为空,…...

MAC环境安装(卸载)软件
MAC环境安装(卸载)软件 jdknode安装node,并实现不同版本的切换背景 卸载node从node官网下载pkg安装的node卸载用 homebrew 安装的node如果你感觉删的不够干净,可以再细分删除验证删除结果 在macOS下创建home目录 jdk 1.下载jdk 先…...

【Vim Masterclass 笔记05】第 4 章:Vim 的帮助系统与同步练习(L14+L15+L16)
文章目录 Section 4:The Vim Help System(Vim 帮助系统)S04L14 Getting Help1 打开帮助系统2 退出帮助系统3 查看具体命令的帮助文档4 查看帮助文档中的主题5 帮助文档间的上翻、下翻6 关于 linewise7 查看光标所在术语名词的帮助文档8 关于退…...

Multisim更新:振幅调制器+解调器(含仿真程序+文档+原理图+PCB)
前言 继3年前设计的:Multisim:振幅调制器的设计(含仿真程序文档原理图PCB),有读者表示已经不能满足新需求,需要加上新的解调器功能😂😂😂,鸽了很久这里便安排…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...