作者:聲東
阿里雲容器產品Kubernetes版本,即ACK,基於阿里雲IaaS層雲資源創建。資源包括雲服務器ECS,專有網絡VPC,彈性伸縮ESS等。以這些資源為基礎,ACK產品實現了Kubernetes集群的節點,網絡,自動伸縮等組件和功能。
一般而言,用戶對ACK產品有很大的管理權限,這包括集群擴容,創建服務等。與此同時,用戶可以繞過ACK產品,對集群底層雲資源進行修改。如釋放ECS,刪除SLB。如果不能理清背後的影響,這樣的修改會損壞集群功能。
這篇文章會以ACK產品安全組的配置管理為核心,深入討論安全組在集群中扮演的角色,安全組在網絡鏈路中所處的位置,以及非法修改安全組會產生的各類問題。文章內容適用於專有集群和託管集群。
安全組在ACK產品中扮演的角色
阿里雲ACK產品有兩種基本形態,專有集群和託管集群。這兩種形態的最大差別,就是用戶對master的管理權限。對安全組來說,兩種形態的集群略有差別,這裡分開討論。
專有集群使用資源編排ROS模板搭建集群的主框架。其中專有網絡是整個集群運行的局域網,雲服務器構成集群的節點,安全組構成集群節點的出入防火牆。
另外,集群使用彈性伸縮實現動態擴縮容功能,NAT網關作為集群的網絡出口,SLB和EIP實現集群API Server的入口。
託管集群與專有集群類似,同樣使用資源編排模板搭建集群的主框架。在託管集群中,雲服務器,專有網絡,負載均衡SLB,EIP,安全組等扮演的角色專有集群類似。
與專有集群不同的是,託管集群的master系統組件以Pod的形式運行在管控集群裡。這就是用Kubernetes管理Kubernetes的概念。
因為託管集群在用戶的VPC裡,而管控集群在阿里雲生產賬號的VPC裡。所以這樣的架構需要解決的一個核心問題,就是跨賬號跨VPC通信問題。
為了解決這個問題,此處用到類似傳送門的技術。託管集群會在集群VPC裡創建兩個彈性網卡,這兩個彈性網卡可以像普通雲服務器一樣,和集群節點通信。但是這兩個網卡被掛載到託管集群的API Server Pod上,這就解決了跨VPC通信問題。
安全組與ACK集群網絡
上一節總結了兩種形態ACK集群的組成原理,以及安全組在集群中所處的位置。簡單來說,安全組就是管理網絡出入流量的防火牆。
安全組規則是基於數據包的目的地址而限流的。出規則需要基於對目標地址的管控需求而定,而入規則則需要對集群內部通信對象有所理解。以下圖為例,ACK集群的內部的通信對象包括集群節點,和部署在集群上的容器組Pod兩種。
雲服務器沒有太多特殊的地方,僅僅是簡單的連接在VPC局域網內的ECS。而容器組Pod是連接在,基於veth網口對、虛擬網橋、以及VPC路由表所搭建的、和VPC獨立的虛擬三層網絡上的。
總結一下,有兩種通信實體和三種通信方式,共六種通信場景。
相同節點通信 | 跨節點通信 | 外部通信 | |
---|---|---|---|
節點 | 無關 | 無關 | 有關 |
Pod | 無關 | 無關/有關 | 有關 |
前三種場景,以節點為通信實體。第一種場景是節點與其上Pod通信,這種場景和安全組無關;第二種場景是節點與其他節點以及Pod通信,這種場景下,因為節點在相同VPC下,且Pod訪問Pod網段以外的地址都會經過SNAT,所以和安全組無關;第三種場景是節點與VPC之外實體通信,這種情況不管出入都與安全組有關。
後三種場景,以容器組Pod為主要通信實體。第四種場景是Pod在節點內部與Pod和ECS通信,這種場景和安全組無關;第五種場景是Pod跨節點與其他節點以及Pod通信,這種場景下,如果源地址和目的地址都是Pod,則需要安全組入規則放行,其他情況與場景二類似;第六種場景是Pod與VPC之外實體通信,這與場景三類似。
雖然以上場景有些複雜,但是經過總結會發現,與安全組有關的通信,從根本上說就兩種情況。一種是Pod之間跨節點通信,另一種是節點或Pod與外網互訪。這裡的外網可以是公網,也可以是與集群互聯互通的IDC或者其他VPC。
怎麼樣管理ACK集群的安全組規則
上一節詳細分析了安全組在ACK集群通信的時候,會影響到的場景。最後的結論是,配置ACK集群的安全組,只須考慮兩種情況,一個是Pod跨節點互訪,一個是集群和外網互訪。
ACK集群在創建的時候,默認添加了Pod網段放行入規則,與此同時保持出規則對所有地址全開。這使得Pod之間互訪沒有問題,同時Pod或節點可以隨意訪問集群以外的網絡。
而在默認規則的基礎上對集群安全組的配置管理,其實就是在不影響集群功能的情況下,收緊Pod或節點訪問外網的能力,和放鬆集群以外網絡對集群的訪問。
下邊我們分三個常見的場景,來進一步分析,怎麼樣在默認規則的基礎上,進一步管理集群的安全組規則。第一個場景是限制集群訪問外網,第二個場景是IDC與集群互訪,第三個場景是使用新的安全組管理部分節點。
限制集群訪問外網
這是非常常見的一個場景。為了在限制集群訪問外網的同時,不影響集群本身的功能,配置需要滿足三個條件。
- 不能限制出方向Pod網段
- 不能限制集群訪問阿里云云服務的內網地址段100.64.0.0/10
- 不能限制集群訪問一部分阿里云云服務的公網地址
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。
此問題的解決方案有三種,一個是將集群節點重新加入集群創建的安全組,另一個是對節點所在的安全組和集群創建的安全組之間互相授權,最後一個方式是,在兩個安全組裡使用規則來互相放行節點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,會導致權限問題。
另外一個現象是,集群無法從阿里雲鏡像倉庫下載容器鏡像,導致pod無法創建。在報錯中有明顯的,訪問阿里雲鏡像倉庫的報錯。
此問題的解決方案,是在限制集群出方向的時候,確保運營商級NAT保留地址100.64.0.0/10網段以及阿里云云服務公網地址被放行。其中運營商保留地址比較容易處理,雲服務公網地址比較難處理,原因有兩個,一個是集群會訪問多個雲服務且這些雲服務的公網地址有可能會更改,另一個是這些雲服務可能使用DNS負載均衡。所以需要多次解析這些服務的url並找出所有ip地址並放行。
容器組跨節點通信異常
集群創建的時候,會在安全組裡添加容器組網段入方向放行規則。有了這個規則,即使容器組網段和VPC網段不一樣,容器組在跨節點通信的時候,也不會受到安全組的限制。如果這個默認規則被移除,那麼容器組跨節點通信會失敗,進而使得多種集群基礎功能受損。
這個問題的現象,比較常見的有,容器組DNS解析失敗,容器組訪問集群內部其他服務異常等。如下圖,在容器組網段規則被移除之後,從disk controller裡訪問www.aliyun.com則無法解析域名,telnet coredns的地址不通。地址之所以可以ping通的原因,是安全組默認放行了所有icmp數據。
此問題解決方案比較簡單,就是重新把容器組地址段加入安全組。這類問題的難點在於,其引起的問題非常多,現象千奇百怪,所以從問題現象定位到容器組跨節點通信,是解決問題的關鍵一步。
結束語
這篇文章從三個方面,深入討論了阿里雲ACK產品安全組配置管理。這三個方面分別安全組在集群中扮演的角色,安全組與集群網絡,以及常見問題和解決方案。
同時通過分析,可以看到ACK產品安全組配置管理的三個重點,分別是集群的外網訪問控制,集群容器組之間跨節點訪問,以及集群使用多個安全組管理。與這三個重點對於的,就是三類常見的問題。
以上總結會在集群創建之前和創建之後,對集群安全組的規劃管理有一定指導意義。