在OpenShift中執行容器
【深入淺出學習 etcd】etcd為分散式系統提供可靠、高效的配置管理服務,在Docker、Kubernetes、Mesos等平臺中扮演了越來越重要的角色。作為2013年開始的專案,它還很年輕,官方文件中缺乏實現上全面、系統的介紹,本課程深入淺出地介紹了etcd的實現,併為運維和二次開發提供了系統的指導和建議。
本文的關注點在於OpenShift中的容器安全性問題,相信很多用過容器的讀者都會遇到在容器裡以root使用者啟動應用的情況,這篇文章著重介紹了OpenShift中我們如何處理這種情況,以及這樣處理帶來的副作用和其中的原因。
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中執行容器
相關文章
- Docker命令-docker exec-在執行的容器中執行命令Docker
- 在容器中執行UI自動化參考UI
- 在Docker中,如何停止所有正在執行的容器?Docker
- 在Docker容器中執行ASP.NET MVC應用程式DockerASP.NETMVC
- 1 分鐘上手,在容器中執行 Visual Studio Code
- 在Docker中,可以在一個容器中同時執行多個應用程序嗎?Docker
- 在容器中執行Java應用程式的提示和工具 - Even HoltheJava
- 如何在Docker容器中執行GUI程式DockerGUI
- 051、在overlay中執行容器(2019-03-18 週一)
- 在Docker容器中執行GUI圖形應用的開源專案DockerGUI
- docker學習2|在容器中部署nginx並儲存、執行容器DockerNginx
- 在Docker容器內執行 vi 編輯器 | BaeldungDocker
- 在 macOS 中執行 FortranMac
- Docker容器中執行.net framework控制檯程式DockerFramework
- Docker容器中執行.Net Core應用程式Docker
- 無需sudo使用Podman在Linux上執行容器Linux
- 教你如何修改執行中的容器埠對映
- Docker中Mysql容器內如何執行SQL檔案?DockerMySql
- 容器進階:OCI與容器執行時
- 在AWS中部署OpenShift平臺
- 使用Systemd執行Docker容器Docker
- 使用docker執行CentOS容器DockerCentOS
- 容器不是執行緒安全執行緒
- 如何把 Java Web 應用放在 docker 容器中執行JavaWebDocker
- 在 OpenFunction 中執行 Serverless 應用FunctionServer
- 在終端中執行 Swift 程式Swift
- 在shell中執行SQL*Plus命令SQL
- Java在不同執行緒中執行程式碼Java執行緒行程
- 在Docker容器中使用Hadoop執行Python MapReduce作業DockerHadoopPython
- 在Ubuntu上安裝OpenShift並使用Ubuntu
- performSelector:withObject:afterDelay: 在子執行緒中呼叫不執行performSelectorObject執行緒
- SpringBoot 專案如何在tomcat容器中執行Spring BootTomcat
- 如何優雅地恢復執行中的容器應用
- 以沙箱的方式執行容器:安全容器gvisor
- Alpine容器安裝執行ssh
- STL容器的執行緒安全?執行緒
- 使用 LXD 容器執行 Ubuntu CoreUbuntu
- Deepin Linux 在 Wine 中執行微信Linux