歡迎光臨
每天分享高質量文章

新特性初探:Docker for Mac喜迎Kuberntes支持能力

很高興內置支持Docker Swarm和Kubernetes的Mac版Docker[1]發佈了,本文將會回顧一下此工具簡史,然後看看新功能的第一印象。

為什麼對開發者很重要?

Docker CE(簡稱Docker)是一款易用簡便的容器工具,是給用戶帶來自主和硬體無關性體驗的軟體。Mac版Docker並不是從一開始就支持Kubernetes,我們看看它的簡史:
Docker髮端於DotCloud公司,一開始並不支持Windows和Mac,只能運行在Linux上。
Docker簡史

虛機
最開始,如果Mac或者Linux用戶想使用容器技術,就需要在Linux主機中安裝如VirtualBox或者VMWare Workstation/Player之類的虛擬機工具,並設置共享目錄。為了使用統一CLI工具,用戶不得不採用Hashicorp公司的Vagrant[2]。
使用場景:這種方式都是過時的技術,並不建議採用。
Docker Machine
Docker Machine是進化的第二步,採用boot2docker鏡像在本地或者遠程環境部署虛機,並提供可寫磁盤空間,也是朝易用性邁出的一大步。一旦基於SSL認證的VM生成,Docker客戶端就可以通過TCP/IP工具訪問它,可以同時支持多個Docker版本構成的集群。
優點:
  • 同一主機支持多個容器後端

  • 只支持Linux

  • 使用boot2docker鏡像

  • 模塊化支持各家雲提供商插件

缺點:
  • 命令列方式操作

  • 不支持Windows和Mac

使用場景:使用Windows 7或者Windows 10 Home,需要在本地運行一套集群,或者需要在雲端運維一套集群。
Docker for Mac/Windows
Docker Machine需要太多手工操作(通過docker-machine env),為了採用TLS,有時還需要重建。Docker for Mac/Windows(簡稱DfM)本著造福廣大使用者的初衷,內建UI和選單支持,推出了功能有限的beta版本,剛開始主要是Twitter使用它。
優點:
  • 安裝簡便

  • 自動配置命令列

  • 圖形化界面配置

  • 一鍵啟停作業

缺點:
  • 共享捲時性能很差

  • 高耗能降低電池使用時間

  • 支持Windows 10 pro或者enterprise

使用場景:可用,但是需要本地安裝Docker Swarm或者Kubernetes。
Minikube
Minikube跟docker-machine非常類似,也依靠boot2docker,初衷是創建內含可用於開發的Docker主機的單節點Kubernetes集群。

Mac上的minikube輸出案例如下:
$ minikube start
Starting local Kubernetes v1.8.0 cluster...  
Starting VM...  
Getting VM IP address...  
Moving files into cluster...  
Setting up certs...  
Connecting to cluster...  
Setting up kubeconfig...  
Starting cluster components...  
Kubectl is now configured to use the cluster.  
Loading cached images from config file.
優點:
  • 本地環境易於訪問

  • Kubernetes可用

缺點:
  • Kubernetes在空閑時耗費大量電力

  • 感覺還是跟docker-machine很類似

  • 內置Docker版本嚴重滯後

  • 有些功能尚不支持,例如RBAC(role-based authentication control)

  • 需要使用minikube start/stop

使用場景:需要本地Kubernetes場景但是不必關註Docker版本。
以上總結了各階段優缺點,下麵看看最新內置Kubernetes功能的DfM第一印象。

第一印象

以下是我更新DfM後,使用它得到的第一印象。
開始
需要Docker 17.12或者更高版本以獲得Kubernetes支持,然後就是通過UI界面花幾分鐘下載新版本。

背景關係和命名空間
如果以前安裝了minikube,需要轉換到DfM背景關係,否則kubectl會掛起。
kubectl config use-context docker-for-desktop
如果發現有太多輸出內容,Kubernetes社區有一個叫kubectx[3]的工具可以改善輸出狀況。
Docker Swarm和Kubernetes之間一個不同是命名空間的支持。預設地,Kubernetes生態容器運行在稱為system的隱藏命名空間,可以通過以下命令查看kubectl get all –all-namespaces:

輸出有很多預設運行的服務,和Docker Swarm一樣,區別是對用戶隱藏,運行在幾個固定二進制代碼中,而不是分散運行的服務。
以下命令可以查看Kubernetes版本:
$kubectl version
Client Version: version.Info{Major:"1", Minor:"8", GitVersion:"v1.8.2", GitCommit:"bdaeafa71f6c7c04636251031f93464384d54963", GitTreeState:"clean", BuildDate:"2017-10-24T19:48:57Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"darwin/amd64"}  
Server Version: version.Info{Major:"1", Minor:"8", GitVersion:"v1.8.2", GitCommit:"bdaeafa71f6c7c04636251031f93464384d54963", GitTreeState:"clean", BuildDate:"2017-10-24T19:38:10Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"}
看起來是1.8.2版本,儘管不是最新版本但也包含了所有重要功能。
整合Docker
Docker希望Kubernetes更加易用,因此整合了Docker stacks和Kubernetes原生部署服務。
Kubernetes是很容易擴展的,Docker使用Custom Resource Definitions (CRDs)引入了對“棧(stack)”概念的支持。可以驗證如下:
$kubectl get stacks
No resources found.
$ kubectl get crd
NAME                        AGE  
stacks.compose.docker.com   24d
看看對compose檔案的效果:
$ docker stack deploy prometheus -c ./docker-compose.yml 
Stack prometheus was created  
Waiting for the stack to be stable and running...  
- Service exporter has one container running
- Service grafana has one container running
- Service prom has one container running
Stack prometheus is stable and running
CRD驗證:
$ kubectl get stacks
NAME         AGE  
prometheus   1m
創建了幾個Pods:
$kubectl get pods  
NAME                        READY     STATUS             RESTARTS   AGE  
exporter-66c7bbfcc6-r5sq4   1/1       Running            0          2m  
grafana-7c5f5f6b75-rfgzp    1/1       Running            0          2m  
prom-76b4f584f7-qckc9       0/1       CrashLoopBackOff   4          2m
Prometheus有一個bug,可以用這個命令debug:$kubectl logs pod/prom-76b4f584f7-qckc9。
如果仍然使用docker-compose開發和生產,現在可以直接轉向Kubernetes了。
內置工作流
我們期望內置工作流能夠實現:
  • kubectl apply 支持YAML

  • helm

  • RBAC激活

下麵部署OpenFaaS-Serverless功能(採用Docker和Kubernetes實現起來很簡單)。
$ mkdir -p go/src/github.com/openfaas/ && \
cd go/src/github.com/openfaas/ && \
git clone https://github.com/openfaas/faas-netes && \
cd faas-netes && \
kubectl apply -f ./yaml
如果碰到命名空間錯誤,可以在faas-netes目錄下執行kubectl apply -f ./namespaces.yml ,然後再嘗試一遍。
OpenFaaS會在localhost:31112啟動圖形界面,並啟用了RBAC和兩個命名空間(openfaas / openfaas-fn),輸出如下:
service "alertmanager" created  
deployment "alertmanager" created  
configmap "alertmanager-config" configured  
service "faas-netesd" created  
deployment "faas-netesd" created  
deployment "gateway" created  
service "gateway" created  
service "nats" created  
deployment "nats" created  
service "prometheus" created  
deployment "prometheus" created  
configmap "prometheus-config" configured  
deployment "queue-worker" created  
serviceaccount "faas-controller" configured  
role "faas-controller" configured  
rolebinding "faas-controller-fn" configured
服務也創建完畢。驗證如下:
$ kubectl get all --namespace openfaas
然後打開UI,部署一個應用功能:
http://localhost:31112 

然後選擇Figlet – figlet是Linux下二進制檔案可以產生ASCII 文本logos。

查看產生的Function/Pod:
$ kubectl get all --namespace openfaas-fn
NAME            DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE  
deploy/figlet   1         1         1            1           8m
NAME                   DESIRED   CURRENT   READY     AGE  
rs/figlet-676c995d66   1         1         1         8m
NAME            DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE  
deploy/figlet   1         1         1            1           8m
NAME                   DESIRED   CURRENT   READY     AGE  
rs/figlet-676c995d66   1         1         1         8m
NAME                         READY     STATUS    RESTARTS   AGE  
po/figlet-676c995d66-rqjpn   1/1       Running   0          8m
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE  
svc/figlet   ClusterIP   10.101.45.157           8080/TCP   8m
相對於Docker Swarm,Kubernetes使用更多物件形成服務。
激活服務查看結果:

作業運行很順暢,而且簡單易用。對於社區維護和內置OpenFaaS整合很有幫助。
之前提過需要helm(一個類似OpenFaaS的分佈式軟體管理器),在Docker Swarm中沒有類似的概念。
寫這篇博客之前,我在Twitter上看有訊息說helm也已經被支持了。

總結

其實不僅是簡單的DfM整合了“棧”,應該說在現有工具外層實現了簡單化,提高了速度,更加易用。相信Docker Swarm用戶都會使用這種整合,而且遷移到Kubernetes。
Docker Swarm 已死?作為Docker Captains用戶組成員,我並沒有更多內部訊息,但是因為Docker Swarm仍然有很多用戶,因此仍然會被支持。例如:最原始可以運行在容器內的Swarm仍然被Docker’s UCP product[4]支持。
如果讀了developer reactions on Hacker News[5],可以看到Swarm仍然有很多粉絲,如果Kubernetes想吸引他們,那麼on-prem安裝維護過程需要提高。
因此我的第一印象總結如下:很多新功能令人振奮,尤其是對DfM的更新以及內部新元素使得它看起來更像一個LinuxKit了。
相關鏈接:
  1. https://www.docker.com/docker-mac

  2. https://www.vagrantup.com/

  3. https://github.com/ahmetb/kubectx

  4. https://docs.docker.com/datacenter/ucp/2.2/guides/

  5. https://news.ycombinator.com/item?id=16084243

原文鏈接:https://blog.alexellis.io/docker-for-mac-with-kubernetes/
基於Kubernetes的DevOps實踐培訓

本次培訓包含:Kubernetes核心概念;Kubernetes集群的安裝配置、運維管理、架構規劃;Kubernetes組件、監控、網絡;針對於Kubernetes API接口的二次開發;DevOps基本理念;微服務架構;微服務的容器化等,點擊識別下方二維碼加微信好友瞭解具體培訓內容

點擊閱讀原文鏈接即可報名。
赞(0)

分享創造快樂