從Kubernetes 1.11版本開(kāi)始,Kubernetes集群的DNS服務(wù)由CoreDNS提供。CoreDNS是CNCF基金會(huì)的一個(gè)項(xiàng)目,是用Go語(yǔ)言實(shí)現(xiàn)的高性能、插件式、易擴(kuò)展的DNS服務(wù)端。CoreDNS解決了KubeDNS的一些問(wèn)題,例如dnsmasq的安全漏洞、externalName不能使用stubDomains設(shè)置,等等。

我們提供的服務(wù)有:成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、長(zhǎng)寧ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的長(zhǎng)寧網(wǎng)站制作公司
CoreDNS支持自定義DNS記錄及配置upstream DNS Server,可以統(tǒng)一管理Kubernetes基于服務(wù)的內(nèi)部DNS和數(shù)據(jù)中心的物理DNS。
CoreDNS沒(méi)有使用多個(gè)容器的架構(gòu),只用一個(gè)容器便實(shí)現(xiàn)了KubeDNS內(nèi)3個(gè)容器的全部功能。
從kubernetes官方提供的 coredns.yml 文件中,不難看出coredns服務(wù)配置至少需要一個(gè)ConfigMap、一個(gè)Deployment和一個(gè)Service共3個(gè)資源對(duì)象。ConfigMap coredns 主要配置文件Corefile的內(nèi)容:
其中主要有二個(gè)地方來(lái)解析配置
1、這段配置的意思是cluster.local后綴的域名都是kubernetes內(nèi)部域名,coredns會(huì)監(jiān)控service的變化來(lái)修改域名的記錄
2、如果coredns沒(méi)有找到dns記錄,則去找 /etc/resolv.conf 中的 nameserver 解析
接下來(lái)使用一個(gè)帶有nslookup工具的Pod來(lái)驗(yàn)證DNS服務(wù)能否正常工作:
通過(guò)nslookup進(jìn)行測(cè)試。
查找defaul命名空間存在的ng-deploy-80服務(wù)
如果某個(gè)Service屬于不同的命名空間,那么在進(jìn)行Service查找時(shí),需要補(bǔ)充Namespace的名稱,組合成完整的域名。下面以查找kubernetes-dashboard服務(wù)為例,
眾所周知, DNS 服務(wù)器用于將域名轉(zhuǎn)換為 IP (具體為啥要轉(zhuǎn)換建議復(fù)習(xí)下 7 層網(wǎng)絡(luò)模型). Linux 服務(wù)器中 DNS 解析配置位于 /etc/resolv.conf , 在 Pod 中也不例外,
DNS 策略可以逐個(gè) Pod 來(lái)設(shè)定。當(dāng)前kubernetes支持這4中DNS 策略
如果我們不填dnsPolicy, 默認(rèn)策略就是 ClusterFirst 。
kubelet 在起 pause 容器的時(shí)候,會(huì)將其 DNS 解析配置初始化成集群內(nèi)的配置。配置: 它的 nameserver 就是指向 coredns 的
k8s里面有4種DNS策略, 而coredns使用的DNS策略就是Default, 這個(gè)策略的意思就是繼承宿主機(jī)上的/etc/resolve.conf, 所以coredns Pod 里面的/etc/resolve.conf 的內(nèi)容就是宿主機(jī)上的內(nèi)容。
在集群中 pod 之間互相用 svc name 訪問(wèn)的時(shí)候,會(huì)根據(jù) resolv.conf 文件的 DNS 配置來(lái)解析域名,下面來(lái)分析具體的過(guò)程。
pod 的 resolv.conf 文件主要有三個(gè)部分,分別為 nameserver、search 和 option。而這三個(gè)部分可以由 K8s 指定,也可以通過(guò) pod.spec.dnsConfig 字段自定義。
nameserver
resolv.conf 文件的第一行 nameserver 指定的是 DNS 服務(wù)的 IP,這里就是 coreDNS 的
clusterIP:
也就是說(shuō)所有域名的解析,都要經(jīng)過(guò)coreDNS的虛擬IP 10.100.0.2 進(jìn)行解析, 不論是內(nèi)部域還是外部域名。
search 域
resolv.conf 文件的第二行指定的是 DNS search 域。解析域名的時(shí)候,將要訪問(wèn)的域名依次帶入 search 域,進(jìn)行 DNS 查詢。
比如我要在剛才那個(gè) pod 中訪問(wèn)一個(gè)域名為 ng-deploy-80的服務(wù),其進(jìn)行的 DNS 域名查詢的順序是:
options
resolv.conf 文件的第三行指定的是其他項(xiàng),最常見(jiàn)的是 dnots。dnots 指的是如果查詢的域名包含的點(diǎn) “.” 小于 5,則先走 search 域,再用絕對(duì)域名;如果查詢的域名包含點(diǎn)數(shù)大于或等于 5,則先用絕對(duì)域名,再走 search 域。K8s 中默認(rèn)的配置是 5。
也就是說(shuō),如果我訪問(wèn)的是 a.b.c.e.f.g ,那么域名查找的順序如下:
通過(guò) svc 訪問(wèn)
在 K8s 中,Pod 之間通過(guò) svc 訪問(wèn)的時(shí)候,會(huì)經(jīng)過(guò) DNS 域名解析,再拿到 ip 通信。而 K8s 的域名全稱為 "service-name.namespace.svc.cluster.local",而我們通常只需將 svc name 當(dāng)成域名就能訪問(wèn)到 pod,這一點(diǎn)通過(guò)上面的域名解析過(guò)程并不難理解。
參考
(1)K8S落地實(shí)踐 之 服務(wù)發(fā)現(xiàn)(CoreDNS)
(2)自定義 DNS 服務(wù)
(3)Kubernetes 服務(wù)發(fā)現(xiàn)之 coreDNS
(4)Kubernetes 集群 DNS 服務(wù)發(fā)現(xiàn)原理
(5)Kubernetes之服務(wù)發(fā)現(xiàn)和域名解析過(guò)程分析
參考:
Goroutine并發(fā)調(diào)度模型深度解析手?jǐn)]一個(gè)協(xié)程池
Golang 的 goroutine 是如何實(shí)現(xiàn)的?
Golang - 調(diào)度剖析【第二部分】
OS線程初始棧為2MB。Go語(yǔ)言中,每個(gè)goroutine采用動(dòng)態(tài)擴(kuò)容方式,初始2KB,按需增長(zhǎng),最大1G。此外GC會(huì)收縮棧空間。
BTW,增長(zhǎng)擴(kuò)容都是有代價(jià)的,需要copy數(shù)據(jù)到新的stack,所以初始2KB可能有些性能問(wèn)題。
更多關(guān)于stack的內(nèi)容,可以參見(jiàn)大佬的文章。 聊一聊goroutine stack
用戶線程的調(diào)度以及生命周期管理都是用戶層面,Go語(yǔ)言自己實(shí)現(xiàn)的,不借助OS系統(tǒng)調(diào)用,減少系統(tǒng)資源消耗。
Go語(yǔ)言采用兩級(jí)線程模型,即用戶線程與內(nèi)核線程KSE(kernel scheduling entity)是M:N的。最終goroutine還是會(huì)交給OS線程執(zhí)行,但是需要一個(gè)中介,提供上下文。這就是G-M-P模型
Go調(diào)度器有兩個(gè)不同的運(yùn)行隊(duì)列:
go1.10\src\runtime\runtime2.go
Go調(diào)度器根據(jù)事件進(jìn)行上下文切換。
調(diào)度的目的就是防止M堵塞,空閑,系統(tǒng)進(jìn)程切換。
詳見(jiàn) Golang - 調(diào)度剖析【第二部分】
Linux可以通過(guò)epoll實(shí)現(xiàn)網(wǎng)絡(luò)調(diào)用,統(tǒng)稱網(wǎng)絡(luò)輪詢器N(Net Poller)。
文件IO操作
上面都是防止M堵塞,任務(wù)竊取是防止M空閑
每個(gè)M都有一個(gè)特殊的G,g0。用于執(zhí)行調(diào)度,gc,棧管理等任務(wù),所以g0的棧稱為調(diào)度棧。g0的棧不會(huì)自動(dòng)增長(zhǎng),不會(huì)被gc,來(lái)自os線程的棧。
go1.10\src\runtime\proc.go
G沒(méi)辦法自己運(yùn)行,必須通過(guò)M運(yùn)行
M通過(guò)通過(guò)調(diào)度,執(zhí)行G
從M掛載P的runq中找到G,執(zhí)行G
本教程介紹 Go 中多模塊工作區(qū)的基礎(chǔ)知識(shí)。使用多模塊工作區(qū),您可以告訴 Go 命令您正在同時(shí)在多個(gè)模塊中編寫代碼,并輕松地在這些模塊中構(gòu)建和運(yùn)行代碼。
在本教程中,您將在共享的多模塊工作區(qū)中創(chuàng)建兩個(gè)模塊,對(duì)這些模塊進(jìn)行更改,并在構(gòu)建中查看這些更改的結(jié)果。
本教程需要 go1.18 或更高版本。使用go.dev/dl中的鏈接確保您已在 Go 1.18 或更高版本中安裝了 Go 。
首先,為您要編寫的代碼創(chuàng)建一個(gè)模塊。
1、打開(kāi)命令提示符并切換到您的主目錄。
在 Linux 或 Mac 上:
在 Windows 上:
2、在命令提示符下,為您的代碼創(chuàng)建一個(gè)名為工作區(qū)的目錄。
3、初始化模塊
我們的示例將創(chuàng)建一個(gè)hello依賴于 golang.org/x/example 模塊的新模塊。
創(chuàng)建你好模塊:
使用 . 添加對(duì) golang.org/x/example 模塊的依賴項(xiàng)go get。
在 hello 目錄下創(chuàng)建 hello.go,內(nèi)容如下:
現(xiàn)在,運(yùn)行 hello 程序:
在這一步中,我們將創(chuàng)建一個(gè)go.work文件來(lái)指定模塊的工作區(qū)。
在workspace目錄中,運(yùn)行:
該go work init命令告訴為包含目錄中模塊的工作空間go創(chuàng)建一個(gè)文件 。go.work./hello
該go命令生成一個(gè)go.work如下所示的文件:
該go.work文件的語(yǔ)法與go.mod相同。
該go指令告訴 Go 應(yīng)該使用哪個(gè)版本的 Go 來(lái)解釋文件。它類似于文件中的go指令go.mod 。
該use指令告訴 Go在進(jìn)行構(gòu)建時(shí)hello目錄中的模塊應(yīng)該是主模塊。
所以在模塊的任何子目錄中workspace都會(huì)被激活。
2、運(yùn)行工作區(qū)目錄下的程序
在workspace目錄中,運(yùn)行:
Go 命令包括工作區(qū)中的所有模塊作為主模塊。這允許我們?cè)谀K中引用一個(gè)包,即使在模塊之外。在模塊或工作區(qū)之外運(yùn)行g(shù)o run命令會(huì)導(dǎo)致錯(cuò)誤,因?yàn)樵揼o命令不知道要使用哪些模塊。
接下來(lái),我們將golang.org/x/example模塊的本地副本添加到工作區(qū)。然后,我們將向stringutil包中添加一個(gè)新函數(shù),我們可以使用它來(lái)代替Reverse.
在這一步中,我們將下載包含該模塊的 Git 存儲(chǔ)庫(kù)的副本golang.org/x/example,將其添加到工作區(qū),然后向其中添加一個(gè)我們將從 hello 程序中使用的新函數(shù)。
1、克隆存儲(chǔ)庫(kù)
在工作區(qū)目錄中,運(yùn)行g(shù)it命令來(lái)克隆存儲(chǔ)庫(kù):
2、將模塊添加到工作區(qū)
該go work use命令將一個(gè)新模塊添加到 go.work 文件中。它現(xiàn)在看起來(lái)像這樣:
該模塊現(xiàn)在包括example.com/hello模塊和 `golang.org/x/example 模塊。
這將允許我們使用我們將在模塊副本中編寫的新代碼,而不是使用命令stringutil下載的模塊緩存中的模塊版本。
3、添加新功能。
我們將向golang.org/x/example/stringutil包中添加一個(gè)新函數(shù)以將字符串大寫。
將新文件夾添加到workspace/example/stringutil包含以下內(nèi)容的目錄:
4、修改hello程序以使用該功能。
修改workspace/hello/hello.go的內(nèi)容以包含以下內(nèi)容:
從工作區(qū)目錄,運(yùn)行
Go 命令在go.work文件指定的hello目錄中查找命令行中指定的example.com/hello模塊 ,同樣使用go.work文件解析導(dǎo)入golang.org/x/example。
go.work可以用來(lái)代替添加replace 指令以跨多個(gè)模塊工作。
由于這兩個(gè)模塊在同一個(gè)工作區(qū)中,因此很容易在一個(gè)模塊中進(jìn)行更改并在另一個(gè)模塊中使用它。
現(xiàn)在,要正確發(fā)布這些模塊,我們需要發(fā)布golang.org/x/example 模塊,例如在v0.1.0. 這通常通過(guò)在模塊的版本控制存儲(chǔ)庫(kù)上標(biāo)記提交來(lái)完成。發(fā)布完成后,我們可以增加對(duì) golang.org/x/example模塊的要求hello/go.mod:
這樣,該go命令可以正確解析工作區(qū)之外的模塊。
FilpChip-BGA的流程包括:晶圓減薄→晶圓凸點(diǎn)生成→晶圓切割→芯片倒裝→回流焊接→裸芯片下部填膠→表面打標(biāo)→BGA基板植球→基板回流焊→切割分離→最終檢查→測(cè)試包裝。
FilpChip-BGA封裝前,晶圓同樣會(huì)做減薄處理,然后在晶圓上制作凸點(diǎn)Bump。之后進(jìn)行晶圓切割,再將芯片倒裝焊接到基板上。焊接好后進(jìn)行清洗,芯片底部填膠等操作,以固定芯片并克服由于芯片和基板CET不一致而導(dǎo)致的應(yīng)力。BGA基板植球、回流焊接、清洗、打標(biāo)、切割、測(cè)試、包裝等流程與Wire Bonding-BGA基本一致。
擴(kuò)展資料
通過(guò)兩種工藝的對(duì)比,可以看出,兩者的基本的流程是一致的,主要區(qū)別在于FlipChip倒裝焊在切割晶圓片之前要生成芯片的凸點(diǎn),然后進(jìn)行芯片倒裝、回流焊接等一系列流程。
FlipChip整個(gè)工藝流程需要兩次回流焊,包括芯片回流焊和BGA基板回流焊。而Wire Bonding則需要芯片粘結(jié)、鍵合、模封等過(guò)程,整個(gè)工藝流程只需要一次回流焊。
對(duì)于SiP系統(tǒng)級(jí)封裝,由于是多個(gè)芯片,就有可能會(huì)遇到混合工藝的情況,即在一顆SiP封裝中既有WB芯片,也有FC芯片。目前,在實(shí)際應(yīng)用中這種情況已經(jīng)比較常見(jiàn),在設(shè)計(jì)中經(jīng)常會(huì)遇到,如所選的裸芯片中有支持WB工藝的芯片,也有支持FC工藝的芯片,就需要做混合工藝SiP的生產(chǎn)制造。
本文標(biāo)題:go語(yǔ)言解析sip流程 go sip
標(biāo)題URL:http://chinadenli.net/article8/highop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、域名注冊(cè)、、靜態(tài)網(wǎng)站、關(guān)鍵詞優(yōu)化、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)