Kubernetes 1.3 中一些隱藏的功能

伴隨着5000屢次的提交,以及大約350位貢獻者在社區以及該行業的貢獻,Kubernetes如今已經到1.3版本了,已於上週發佈!網址:點這裏html

Kubernetes的首次發佈要追溯到兩年前。這個項目的社區參與度和創新度都達到了驚人的地步,有我的參與合做,也有行業領導者(谷歌,紅帽等等)來推動,而且給全部人帶來生產級容器集羣管理。這篇博客就是來探究Kubernetes1.3中的一些隱藏功能的。nginx

Kubernetes1.3中的新功能

Kubernetes1.3已經把重點放到了跨集羣、跨區域和跨雲邊界上的部署和擴容服務,運行稍大範圍的工做(包括有狀態服務,好比說數據庫),增長規模和自動化,而且支持rkt,OCI&CNI容器標準。docker

PetSet數據庫

到如今爲止,部署有狀態應用(好比分佈式數據庫)已是一個棘手的問題,可是其實也不是作不到。Jetstack在倫敦的KubeCon上演講描述了這些挑戰,一樣也描述瞭解決方案的普通模式。網址:連接api

社區引進的alpha版本中的「PetSet」對象來描述這樣的系統。kubernetes如今有一個功能,能夠用來部署Pods,這些Pods的功能是保障網絡和存儲身份。它甚至還能夠動態規定雲端的按需存儲(目前只能用在AWS EBS和GCE PD上)。網絡

集羣聯盟(「Ubernetes」)分佈式

Kubernetes1.3令運行在多個集羣上的服務發現成爲可能,可能會讓跨區域,或者跨雲提供商來供容器或者外部客戶使用。這個「Ubernetes」聯盟能夠被用來增長HA,地理分配和混合雲/多雲端,是使人興奮的第一階段,並會在1.4及以後的版本中繼續開發和完善。ide

Rktnetes 1.0工具

Kubernetes建立之初就沒有與特定容器運行環境綁定。Kubernetes1.3版本是第一個整合rkt運行環境的穩定版本,能夠用來替換Docker(目前爲止的默認運行環境)。是的,這就是rktnetes。性能

rkt是Core OS一個快速成熟的項目,如今已是1.10.0版本了。它實現了應用程序容器規範,還擁有不少能夠完美取代Docker的功能。好比,兼容初始化系統(如systemd,nspawn),確保有更大的隔離(使用LKVM stage1)。

在最近的博客中從CoreOS團隊那裏瞭解更多關於rktnetes的信息。網址:連接

可擴展性

Kubernetes如今支持2000個節點的集羣,同時還減小了端對端Pod啓動時間。在這樣的狀況下,最後形成了可擴展性的改進的挑戰就是使用基於Protocol Buffer(網址:連接)系列化的API,而不是JSON,最後對可擴展性的作了改進。

最近的博客帖子描述了一些改進的細節,以及項目使用的Kubemark性能測試工具。網址:連接

在幾周或幾個月後,Jetstack將會在博客中更加細緻地講述這些新的用戶面對的功能,重點是,他們還會解釋如何開啓,如何將他們用到實踐中去。好比,我會展現如何處理使用Kubernetes多區/多雲。咱們也會展現如何在本地更加輕鬆地部署分佈式數據庫——在咱們與客戶目前正在積極處理的區域內。

Kubernetes1.3隱藏的新功能

這篇帖子中除了主要的部分,咱們還想要引出一些咱們十分喜歡的,可是知道的人還不多的功能,可是這些功能也一樣有用,一樣十分重要。要注意的是,一些功能和加強功能都仍是alpha版本。

Kubectl Deployment

Deployment是一個提供聲明式,服務端更新Pod和ReplicaSets的API。雖然它仍是個測試版功能,可是它如今已經被普遍接受和使用了,並處於活躍開發期,包括計劃和進行中的新功能(具體請參閱路線部署圖)。在Kubernetes1.3中,新的命令已經被添加到kubectl使管理和監控部署更新更加便利。

更新Deployment的容器鏡像

之前,若是你想要在ReplicaSet中爲Pods更新容器鏡像,經過Deployment管理,你可使用kubectl而且直接編輯Deployment的YAML。

新的命令kubectl設置如今容許容器鏡像在單行命令行上設置。

clipboard.png

監控deployment rollout

爲了監控更新的rollout,而且驗證它是否成功,這裏有個新的很方便的命令:rolloutstatus。好比,nginx/nginx:1.7.9中查看nginx/nginx:1.9.1 的rollout。

clipboard.png

垃圾回收(測試版)

Kubernetes資源經常互相依賴。好比,ReplicaSets根據指定的模板建立Pods。若是你想要刪除這個ReplicaSet,你就必需要找出跟選擇器匹配的Pod,串聯刪除匹配的Pods。

之後在1.4版本或者更高版本中,這樣的串聯清理會由KCM(kube controller manager)來處理。在準備階段,1.3爲API對象引入了額外的元數據域ownerReferences。對於ReplicaSet/Pods的例子,Pods包含了到它們全部者的ReplicaSet的引用。一旦ReplicaSet被刪除,garbage collector也會刪除這個Pod。還有一個叫作orphanDependents的配置選項,能夠禁用串聯刪除的功能。

垃圾回收在1.3中仍是一個alpha功能,因此默認狀態下,它是禁用的。要打開這個功能,你須要打開kube-apiserver和KCM,還有flag——啓用garbage collector。

在用戶指南那裏瞭解更多關於garbage collector的功能,要注意的是,使用的時候要本身承擔風險(畢竟是測試版)。

Shell補全整合到kubectl

做爲資深kubectl用戶,你可能已經知道這個補全腳本,保存在/contrib/completions核心項目的文件夾中。這不只提供了kubectl的子命令和參數,還提供了像Namespace和Pods資源的名字。

像往常同樣,對於Go語言二進制文件來講,kubectl的分佈一般只包括單個文件。這就令保留兼容性的完整文件更加困難了。出於這個緣由,這個腳本從1.3版本起就被整合到kubectl。如今加載補全性跟添加一行代碼同樣簡單:

clipboard.png

Init containers(測試版)

測試版本功能init containers容許在長期運行的主要Pod容器發佈以前運行某一命令。這些命令按順序執行,只有當這些命令成功運行,主容器纔會開始運行。這就容許你可以下載特定的文件到數據卷,生成應用程序的配置文件,在這個過程當中不須要再從新打包到容器鏡像等等。

下面是Pod運行kubectl的特定版本的例子。在每次Pod發佈的時候下載這個版本。爲了演示,第二個init containers包括了一個執行kubectl二進制的命令。Pod說明書包括了必要的annotation,以下圖所示:

clipboard.png

clipboard.png

Pod一旦在狀態內運行,你就可使用下載好的kubectl二版本-kubectl exec到Pod容器中來運行kubectl;):

clipboard.png

連接裏瞭解更多init containers及其使用方法。

爲pods/containers使用定製配置(測試版)

docker 從1.10版本開始支持配置Seccomp策略來初步限制容器執行特權。Seccomp經過攔截系統調用來實施這個沙箱機制。這個過濾器由BPF規則來定義。

要把特定配置文件綁定到Pod上,你可使用如下alpha annotations:
爲全部Pod的容器定義一個Seccomp:seccomp.security.alpha.kubernete.io/pod
爲單個容器定義一個Seccomp文件:container.seccomp.security.alpha.kubernetes.io/${container_name}
對註釋的值,你可使用如下內容:

clipboard.png

若是你想要使用定製配置(前綴是localhost/),你必須把這些複製到你集羣中的每個工做節點。文件的默認文件夾是/var/lib/kubelet/seccomp.

例子:如何阻止chmod 系統調用

在這個例子中,咱們建立了兩個Pods。都要嘗試在文件上修改權限。當Pod chmod-unconfined用Docker的默認文件運行成功,在Pod chmod-prevented中一樣的命令行運行失敗,由於這是它的Seccomp文件所不容許的。

要清楚的是你必須知足如下要求才能夠:

  • Docker版本必須1.10及以上

  • Kubernetes的版本要1.3.0-beta.2版本及以上

  • 要複製prevent-chmod到全部的worker節點

Seccomp Profile/var/lib/kubelet/seccomp/prevent-chmod

clipboard.png

Pod specification seccomp-pods.yaml

clipboard.png

create pods

clipboard.png

原文連接

相關文章
相關標籤/搜索