在OpenShift中執行容器

貓飯先生發表於2017-10-11
本文講的是在OpenShift中執行容器【編者的話】本文不是一篇關於如何在OpenShift中使用和部署容器的指導性文章,也沒有具體介紹OpenShift的原理組成,關於如何使用OpenShift可以參考另一篇《OpenShift V3 應用釋出部署的簡單場景演示》。

【深入淺出學習 etcd】etcd為分散式系統提供可靠、高效的配置管理服務,在Docker、Kubernetes、Mesos等平臺中扮演了越來越重要的角色。作為2013年開始的專案,它還很年輕,官方文件中缺乏實現上全面、系統的介紹,本課程深入淺出地介紹了etcd的實現,併為運維和二次開發提供了系統的指導和建議。

本文的關注點在於OpenShift中的容器安全性問題,相信很多用過容器的讀者都會遇到在容器裡以root使用者啟動應用的情況,這篇文章著重介紹了OpenShift中我們如何處理這種情況,以及這樣處理帶來的副作用和其中的原因。
openshift.png


OpenShift 是Red Hat公司推出的一個基於Kubernetes的容器應用平臺。並且很簡捷,沒錯,它就是一個PaaS。新的V3版本的OpenShift做了一次重大的改變,所有的元件用go語言重新編寫,並且和現在的Kubernetes有了很好的結合。當你使用OpenShift的時候,你其實得到了一個Red Hat推出的基於Kubernetes的分散式系統,OpenShift的功能是圍繞著程式碼部署,自動化構建等等,是一個典型的PaaS平臺。

Openshift的優點是什麼呢?Red Hat經常引以為豪的就是它的安全性

我不是一個安全領域的專家,但是當你考慮使用Kubernetes並且如果你不想圍繞secrets爭論的時候,你會發現,Kubernetes有很多關於安全性的功能。RBAC就是一個當你用kubeadm去部署一個叢集環境時預設的設定。可以通過強制的網路規則進行網路隔離,pod也可以用安全策略控制非常嚴格。加上身份驗證機制,為所有組建間的通訊提供TSL加密,許可權控制,至少對我來說,這是一個非常強大和安全系統。

但是對早期的使用者來說這些安全設定是有代價的。在OpenShift中,使用Kubernetes預設的Pod安全策略,他們被SCC(Security Context Constraints)呼叫。預設使用SCC最明顯的地方是在OpenShift的容器中,程式不能用ROOT使用者執行。(譯者注:表現為許可權不夠)

所以如果你在minishift裡,沒有指定一個非ROOT使用者去執行一個Docker映象,這肯定會失敗。這意味著,非常遺憾,我們的Bitnami映象現在還不能執行在OpenShift上。我們正在修復解決這個問題,也就是說在Dockerfile中用一個非特權使用者,我將向您展示如何暫時規避這個問題。

開始使用OpenShift

使用OpenShift可以從minishift開始,他是一個定製的minikube,也就是說,它可以執行在你桌面系統的虛擬機器裡(就像k8s)。客戶端oc(譯者注:oc是OpenShift的主要命令)可以被非常容易的配置,因為他實際上是在kubectl外面包裝了一層。

當你下載後,使用它感覺就像在使用minikube一樣:(除了它預設的驅動是xhyve,當然如果你用的是Virtual Box……):

minishift start — vm-driver virtualbox


oc新增到你的PATH中:

$ minishift oc-env
export
PATH=”/Users/sebgoa/.minishift/cache/oc/v1.5.0:$PATH”

Run this command to configure your shell:

eval $(minishift oc-env)

$ eval $(minishift oc-env) 

修改SCC

為了修改SCC,你需要用admin使用者登入到OpenShift中:

oc login -u sysadmin:admin


這時修改scc

oc edit scc anyuid


如果你不使用admin使用者登入,那麼RBAC不會讓你修改安全約束(security constraints),這時增加user會像這樣:

users:
- system:serviceaccount:default:ci
- system:serviceaccount:ci:default
- system:serviceaccount:myproject:default


基本上,你在你自己的專案裡(myproject)可以用預設的服務帳號(service account)以任何uid包括ROOT使用者去在執行一個容器。需要注意的是,你自己建立的專案(myproject)是一個可以用被你自己訪問的名字空間。它是預設被minishift建立的,你可以用oc config view在k8s中找到它。

作為普通使用者切換回minishift( oc config just like kubectl config ):

oc config use-context minishift


用容器建立一個應用程式,並以ROOT身份執行一個程式

你現在可以用容器去建立一個應用程式了,並且這個應用程式的程式是ROOT使用者執行的。你解除了pod的安全規則。但是這部太符合最小許可權執行原則。oc new-app看起來很像kubectl run

oc new-app --name foobar 
--docker-image bitnami/mariadb 
--env MARIADB_ROOT_PASSWORD=root


現在你已經執行起來了bitnami mariadb在OpenShift裡了,( oc logs like kubectl logs :

$ oc logs foobar-1-zft17
Welcome to the Bitnami mariadb container
Subscribe to project updates by watching
https://github.com/bitnami/bitnami-docker-mariadb
Submit issues and feature requests at
https://github.com/bitnami/bitnami-docker-mariadb/issues
Send us your feedback at containers@bitnami.com
nami INFO Initializing mariadb
mariadb INFO ==> Configuring permissions…
mariadb INFO ==> Validating inputs…
mariadb INFO ==> Initializing database…
...<snip> 


結論

雖然在OpenShift裡可以繞過預設的安全約束策略(SCC)但其實這並不是一個理想狀態。這就是為什麼在Bitnami中,我們現在去修改我們的容器應用模板去harden它們並且讓它訥訥個夠和執行在OpenShift中。

原文連線:Running Containers in OpenShift(翻譯:王曉軒)

原文釋出時間為:2017-05-18

本文作者:王曉軒

本文來自雲棲社群合作伙伴Dockerone.io,瞭解相關資訊可以關注Dockerone.io。

原文標題:在OpenShift中執行容器


相關文章