很高兴内置支持 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 版本:
看起来是 1.8.2 版本,尽管不是最新版本但也包含了所有重要功能.
$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"
整合 Docker
Docker 希望 Kubernetes 更加易用,因此整合了 Docker stacks 和 Kubernetes 原生部署服务.
Kubernetes 是很容易扩展的,Docker 使用 Custom Resource Definitions (CRDs)引入了对 "栈(stack)" 概念的支持.可以验证如下:
看看对 compose 文件的效果:
$kubectl get stacks
No resources found.
$ kubectl get crd
NAME AGE
stacks.compose.docker.com 24d
CRD 验证:
$ 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
创建了几个 Pods:
$ kubectl get stacks
NAME AGE
prometheus 1m
Prometheus 有一个 bug,可以用这个命令 debug:$kubectl logs pod/prom-76b4f584f7-qckc9.
$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
如果仍然使用 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:
相对于 Docker Swarm,Kubernetes 使用更多对象形成服务.激活服务查看结果:
$ 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
作业运行很顺畅,而且简单易用.对于社区维护和内置 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 了.
相关链接:
https://www.docker.com/docker-mac
https://www.vagrantup.com/
https://github.com/ahmetb/kubectx
https://docs.docker.com/datacenter/ucp/2.2/guides/
https://news.ycombinator.com/item?id=16084243
原 文: First impressions: Docker for Mac with Kubernetes
译 文: Docker
作 者:杨峰 译
来源: https://sdk.cn/news/7962