天天看點

阿裡雲ACK産品安全組配置管理

作者:聲東

阿裡雲容器産品Kubernetes版本,即ACK,基于阿裡雲IaaS層雲資源建立。資源包括雲伺服器ECS,專有網絡VPC,彈性伸縮ESS等。以這些資源為基礎,ACK産品實作了Kubernetes叢集的節點,網絡,自動伸縮等元件和功能。

一般而言,使用者對ACK産品有很大的管理權限,這包括叢集擴容,建立服務等。與此同時,使用者可以繞過ACK産品,對叢集底層雲資源進行修改。如釋放ECS,删除SLB。如果不能理清背後的影響,這樣的修改會損壞叢集功能。

這篇文章會以ACK産品安全組的配置管理為核心,深入讨論安全組在叢集中扮演的角色,安全組在網絡鍊路中所處的位置,以及非法修改安全組會産生的各類問題。文章内容适用于專有叢集和托管叢集。

安全組在ACK産品中扮演的角色

阿裡雲ACK産品有兩種基本形态,專有叢集和托管叢集。這兩種形态的最大差别,就是使用者對master的管理權限。對安全組來說,兩種形态的叢集略有差别,這裡分開讨論。

阿裡雲ACK産品安全組配置管理

專有叢集使用資源編排ROS模闆搭建叢集的主架構。其中專有網絡是整個叢集運作的區域網路,雲伺服器構成叢集的節點,安全組構成叢集節點的出入防火牆。

另外,叢集使用彈性伸縮實作動态擴縮容功能,NAT網關作為叢集的網絡出口,SLB和EIP實作叢集API Server的入口。

阿裡雲ACK産品安全組配置管理

托管叢集與專有叢集類似,同樣使用資源編排模闆搭建叢集的主架構。在托管叢集中,雲伺服器,專有網絡,負載均衡SLB,EIP,安全組等扮演的角色專有叢集類似。

與專有叢集不同的是,托管叢集的master系統元件以Pod的形式運作在管控叢集裡。這就是用Kubernetes管理Kubernetes的概念。

因為托管叢集在使用者的VPC裡,而管控叢集在阿裡雲生産賬号的VPC裡。是以這樣的架構需要解決的一個核心問題,就是跨賬号跨VPC通信問題。

為了解決這個問題,此處用到類似傳送門的技術。托管叢集會在叢集VPC裡建立兩個彈性網卡,這兩個彈性網卡可以像普通雲伺服器一樣,和叢集節點通信。但是這兩個網卡被挂載到托管叢集的API Server Pod上,這就解決了跨VPC通信問題。

安全組與ACK叢集網絡

上一節總結了兩種形态ACK叢集的組成原理,以及安全組在叢集中所處的位置。簡單來說,安全組就是管理網絡出入流量的防火牆。

安全組規則是基于資料包的目的位址而限流的。出規則需要基于對目标位址的管控需求而定,而入規則則需要對叢集内部通信對象有所了解。以下圖為例,ACK叢集的内部的通信對象包括叢集節點,和部署在叢集上的容器組Pod兩種。

阿裡雲ACK産品安全組配置管理

雲伺服器沒有太多特殊的地方,僅僅是簡單的連接配接在VPC區域網路内的ECS。而容器組Pod是連接配接在,基于veth網口對、虛拟網橋、以及VPC路由表所搭建的、和VPC獨立的虛拟三層網絡上的。

總結一下,有兩種通信實體和三種通信方式,共六種通信場景。

相同節點通信 跨節點通信 外部通信
節點 無關 有關
Pod 無關/有關

前三種場景,以節點為通信實體。第一種場景是節點與其上Pod通信,這種場景和安全組無關;第二種場景是節點與其他節點以及Pod通信,這種場景下,因為節點在相同VPC下,且Pod通路Pod網段以外的位址都會經過SNAT,是以和安全組無關;第三種場景是節點與VPC之外實體通信,這種情況不管出入都與安全組有關。

阿裡雲ACK産品安全組配置管理

後三種場景,以容器組Pod為主要通信實體。第四種場景是Pod在節點内部與Pod和ECS通信,這種場景和安全組無關;第五種場景是Pod跨節點與其他節點以及Pod通信,這種場景下,如果源位址和目的位址都是Pod,則需要安全組入規則放行,其他情況與場景二類似;第六種場景是Pod與VPC之外實體通信,這與場景三類似。

阿裡雲ACK産品安全組配置管理

雖然以上場景有些複雜,但是經過總結會發現,與安全組有關的通信,從根本上說就兩種情況。一種是Pod之間跨節點通信,另一種是節點或Pod與外網互訪。這裡的外網可以是公網,也可以是與叢集互聯互通的IDC或者其他VPC。

怎麼樣管理ACK叢集的安全組規則

上一節詳細分析了安全組在ACK叢集通信的時候,會影響到的場景。最後的結論是,配置ACK叢集的安全組,隻須考慮兩種情況,一個是Pod跨節點互訪,一個是叢集和外網互訪。

ACK叢集在建立的時候,預設添加了Pod網段放行入規則,與此同時保持出規則對所有位址全開。這使得Pod之間互訪沒有問題,同時Pod或節點可以随意通路叢集以外的網絡。

而在預設規則的基礎上對叢集安全組的配置管理,其實就是在不影響叢集功能的情況下,收緊Pod或節點通路外網的能力,和放松叢集以外網絡對叢集的通路。

下邊我們分三個常見的場景,來進一步分析,怎麼樣在預設規則的基礎上,進一步管理叢集的安全組規則。第一個場景是限制叢集通路外網,第二個場景是IDC與叢集互訪,第三個場景是使用新的安全組管理部分節點。

限制叢集通路外網

這是非常常見的一個場景。為了在限制叢集通路外網的同時,不影響叢集本身的功能,配置需要滿足三個條件。

  1. 不能限制出方向Pod網段
  2. 不能限制叢集通路阿裡雲雲服務的内網位址段100.64.0.0/10
  3. 不能限制叢集通路一部分阿裡雲雲服務的公網位址

ecs.cn-hangzhou.aliyuncs.com

ecs-cn-hangzhou.aliyuncs.com

vpc.cn-hangzhou.aliyuncs.com

slb.cn-hangzhou.aliyuncs.com

location-readonly.aliyuncs.com

location.aliyuncs.com

pvtz.cn-hangzhou.aliyuncs.com

cs.cn-hangzhou.aliyuncs.com

nas.cn-hangzhou.aliyuncs.com

oss-cn-hangzhou.aliyuncs.com

cr.cn-hangzhou.aliyuncs.com

metrics.cn-hangzhou.aliyuncs.com

ess.cn-hangzhou.aliyuncs.com

eci.cn-hangzhou.aliyuncs.com

alidns.cn-hangzhou.aliyuncs.com

sls.cn-hangzhou.aliyuncs.com

arms.cn-hangzhou.aliyuncs.com

其中第一條顯而易見,第二條為了確定叢集可以通過内網通路DNS或者OSS這類服務,第三條是因為叢集在實作部分功能的時候,會通過公網位址通路雲服務。

IDC與叢集互訪

IDC與叢集互訪這種場景,假設IDC和叢集VPC之間,已經通過底層的網絡産品打通,IDC内部機器和叢集節點或者Pod之間,可以通過位址找到對方。

這種情況下,隻需要在確定出方向規則放行IDC機器網段的情況下,對入規則配置放行IDC機器位址段即可。

使用新的安全組管理節點

某些時候,使用者需要新增加一些安全組來管理叢集節點。比較典型的用法,包括把叢集節點同時加入到多個安全組裡,和把叢集節點配置設定給多個安全組管理。

如果把節點加入到多個安全組裡,那麼這些安全組會依據優先級,從高到低依次比對規則,

這會給配置管理增加複雜度。而把節點配置設定給多個安全組管理,則會出現腦裂問題,需要通過安全組之間授權,或者增加規則的方式,確定叢集節點之間互通。

典型問題與解決方案

前邊的内容包括了安全組在ACK叢集中所扮演的角色,安全組與叢集網絡,以及安全組配置管理方法。最後一節基于阿裡雲售後線上客戶海量問題的排查經驗,分享一些典型的,與安全組錯誤配置有關系的問題和解決方案。

使用多個安全組管理叢集節點

托管叢集預設把節點ECS和管控ENI彈性網卡放在同一個安全組裡,根據安全組的特性,這保證了ENI網卡和ECS的網卡之間在VPC網絡平面上的互通。如果把節點從叢集預設安全組裡移除并納入其他安全組的管理當中,這導緻叢集管控ENI和節點ECS之間無法通行。

這個問題的現象,比較常見的有,使用kubectl exec指令無法進去pod終端做管理,使用kubectl logs指令無法檢視pod日志等。其中kubectl exec指令所傳回的報錯比較清楚,即從API Server連接配接對應節點10250端口逾時,這個端口的監聽者就是kubelet。

阿裡雲ACK産品安全組配置管理

此問題的解決方案有三種,一個是将叢集節點重新加入叢集建立的安全組,另一個是對節點所在的安全組和叢集建立的安全組之間互相授權,最後一個方式是,在兩個安全組裡使用規則來互相放行節點ECS和管控ENI的位址段。

限制叢集通路公網或者營運級NAT保留位址

專有或托管叢集的系統元件,如cloud controller manager,metrics server,cluster auto scaler等,使用公網位址或營運商級NAT保留位址(100.64.0.0/10)通路阿裡雲雲産品,這些産品包括但不限于負載均衡SLB,彈性伸縮ESS,對象存儲OSS。如果安全組限制了叢集通路這些位址,則會導緻系統元件功能受損。

這個問題的現象,比較常見的有,建立服務的時候,cloud controller manager無法通路叢集節點metadata并擷取token值。叢集節點以及其上的系統元件通過節點綁定的授權角色通路雲資源,如通路不到token,會導緻權限問題。

阿裡雲ACK産品安全組配置管理

另外一個現象是,叢集無法從阿裡雲鏡像倉庫下載下傳容器鏡像,導緻pod無法建立。在報錯中有明顯的,通路阿裡雲鏡像倉庫的報錯。

阿裡雲ACK産品安全組配置管理

此問題的解決方案,是在限制叢集出方向的時候,確定營運商級NAT保留位址100.64.0.0/10網段以及阿裡雲雲服務公網位址被放行。其中營運商保留位址比較容易處理,雲服務公網位址比較難處理,原因有兩個,一個是叢集會通路多個雲服務且這些雲服務的公網位址有可能會更改,另一個是這些雲服務可能使用DNS負載均衡。是以需要多次解析這些服務的url并找出所有ip位址并放行。

容器組跨節點通信異常

叢集建立的時候,會在安全組裡添加容器組網段入方向放行規則。有了這個規則,即使容器組網段和VPC網段不一樣,容器組在跨節點通信的時候,也不會受到安全組的限制。如果這個預設規則被移除,那麼容器組跨節點通信會失敗,進而使得多種叢集基礎功能受損。

這個問題的現象,比較常見的有,容器組DNS解析失敗,容器組通路叢集内部其他服務異常等。如下圖,在容器組網段規則被移除之後,從disk controller裡通路www.aliyun.com則無法解析域名,telnet coredns的位址不通。位址之是以可以ping通的原因,是安全組預設放行了所有icmp資料。

阿裡雲ACK産品安全組配置管理

此問題解決方案比較簡單,就是重新把容器組位址段加入安全組。這類問題的難點在于,其引起的問題非常多,現象千奇百怪,是以從問題現象定位到容器組跨節點通信,是解決問題的關鍵一步。

結束語

這篇文章從三個方面,深入讨論了阿裡雲ACK産品安全組配置管理。這三個方面分别安全組在叢集中扮演的角色,安全組與叢集網絡,以及常見問題和解決方案。

同時通過分析,可以看到ACK産品安全組配置管理的三個重點,分别是叢集的外網通路控制,叢集容器組之間跨節點通路,以及叢集使用多個安全組管理。與這三個重點對于的,就是三類常見的問題。

以上總結會在叢集建立之前和建立之後,對叢集安全組的規劃管理有一定指導意義。

繼續閱讀