在实验、演示的时候,或者是生产过程当中,我常常会须要运行一些 Docker 负载。虽然这在本地计算机上十分容易,可是当你要在云端运行的时候就有点困难了。相比于本地运行,在云端运行真的太复杂了。我尝试了几个方法,好比在 AWS Beanstalk、AWS ECS 或者 Azure ACS DC/OS 上运行 Docker,可是针对于个人需求来讲,这些尝试太复杂了,并且限制诸多。 |
Azure 宣布 Azure Container Service 预支持 Kubernetes,与此同时,Kubernetes 也宣布支持 ACS,因此是时候尝试一下 Kubernetes 了。linux
你能够跳过全部步骤,只阅读演示部署和说明,点击连接:https://github.com/chaliy/play-azure-kubernetes。git
那么,什么是 Kubernetes 呢?用一句简单的话来归纳:它是一个容器编排工具。第一步,将应用程序进行打包,而后 Kubernetes 能够对打包好的这些应用程序进行部署、运行以及扩展。为了深刻了解,可能还须要经过 Tutorial 了解,可是这个十分容易,你彻底能够跳过这个步骤直接尝试如何运行它。github
在本文中,我会使用新的 Azure CLI。安装十分简单,大多数状况下,只须要“pip install azure-cli”就能够了。
因此如今让咱们来预览一下咱们的集群。首先,你可能须要资源组来隔离你的基础设施。docker
az group create -n my-very-own-k8s-cluster -l "West Europe"
az acs create -n my-very-own-k8s-cluster \ -g my-very-own-k8s-cluster \ --dns-prefix my-very-own-k8s-cluster \ --orchestrator-type kubernetes
在等待命令完成的时候,咱们来看一些评论。api
一、若是你的命令出现了一些问题,好比这些命令出现一些无心义的错误,添加-debug 参数有点啰嗦,可是会出现一些错误。服务器
二、-dnsprefix 是可选的,我的建议仍是要添加上去,否则的话,就会按照“集群名字+组名字”使用,若是超过 90 个字符的长度,以后在操做过程当中就会出现奇怪的错误。app
默认设置下,ACS 用单个 master 和 3 个 agents 来设置集群。这些步骤默认设置下都是使用 D2 的,因此这个集群耗费比较高,当你不须要的时候记得清理资源。curl
以及,欢迎阅读 Kubernetes 的 ACS 引擎之下的内容,连接:https://github.com/Azure/acs-engine/blob/master/docs/kubernetes.md。上述内容给了实施过程当中的一些很棒的观点。注意了,ACS 文档没有使用新的 Azure 工具,因此操做起来会有点复杂。ide
第一个有效负载工具
全部的基础设施准备完成,如今开始部署 Kubernetes。要管理集群,那么就须要 kubectl。你能够经过如下代码自动运行(可能须要自行添加到 PATH):
az acs kubernetes install-cli
接下来,你须要用集群来认证 kubectl。
az acs kubernetes get-credentials -n my-very-own-k8s-cluster \ -g my-very-k8s-cluster
检查全部一切是否 OK。这个命令行会提供客户端和服务器端的版本。
kubectl version
从这里开始,你已经拥有你所须要的东西来运行你的第一个有效负载。因此让咱们来建立第一个定义文件,而且尝试运行。Kubernetes 内的定义文件可使用不少文件格式,我用的是 YAML, 因此咱们用如下内容来建立 hello.yml 文件:
apiVersion: extension/v1beta1 kind: Deployment metadata: name: hello # Name of the deployment, just for reference purposes spec: replica: 1 # Number of instances for the given application template: metadata: labels: app: hello spec: containers: - name: ner-uk-ms # Name of container, could be anything you like image: chaliy/ner-ms:uk # Docker image to run ports: -containerPort:8080
目前,理解一些 Kubernetes 术语十分重要。
Pod——容器实例——http://kubernetes.io/docs/user-guide/pods/ Deployment——确保 pods 可以运行,扮演监督的角色——http://kubernetes.io/docs/user-guide/deployments/ Service——将 pod 组成一个系统——http://kubernetes.io/docs/user-guide/services/
因此,对于定义在模版中的单个 pod 来讲,咱们刚刚建立的定义文件是个 deployment。如下命令行会拉取Docker镜像`chaliy/ner-ms:uk`,开启它的实例而且设置监督员:
kubectl create -f ./hello.yml
如今可使用的命令行不多:
# Retrieve logs associated with deployment kubectl logs hello # List Pods kubectl get pods # List deployments kubectl get deployments # Details about concrete pod, for example in case of errors kubectl describe pods/podid
若是你想要从新配置应用程序,能够在定义文件中修改,好比设置`replicas:10`,而后运行:
kubectl apply -f ./hello.yml
技术上来讲,这已经在运行有效负载了。咱们来看看它的运行情况。Kubernetes 的 UI 界面向用户呈现集群运行情况。它的运行方式跟应用程序的运行方式是同样的。固然,若是你不但愿这样的 UI 出如今集群外面,那么默认设置下你能够只在集群内运行。可是,若是访问又会如何?
方法很简单,Kubernetes 实现 Basteon 模式,而且经过简单的方法代理到你的本地电脑。因此首先你须要运行代理:
kubectl proxy --port=8000
而后,你须要马上看到 Kubernetes Dashboard 的话。能够浏览:http://localhost:8000/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard
还有就是,你可能须要发布对集群外的服务。对于这个,你须要建立 service(对于 Kubernetes),而后使用 expose 命令,用新的 Loadbalancer。
kubectl expose deployment hello --type="LoadBalancer"--port=80 -- target-port=8080
这个命令行会开始设置新的 load balance,须要一点时间。要检查它是否运行,要查询关于 service 的信息:
kubectl get services/hello
以后你就会看到外部 IP 地址,意味着服务已处于 OK 状态,你能够用来发送请求。相似于:
curlhttp://EXTERNAL-IP/
全部的脚本均可以在这个网址找到:https://github.com/chaliy/play-azure-kubernetes。在这里你能够找到使用 Nginx 代理做为路由器的一些真实例子。
对于我来讲,用户体验很棒,可是我也不肯定我会不会继续使用,由于有几个问题还在困扰着我:
一、Kubernetes ACS 版本还在预发布阶段,有些功能尚未实现(好比,你还不能对你的集群进行缩容扩容)。
二、使用成本较高,至少须要 4D2 个节点,每个月最高可能要花费 1000 美圆。使用相对小一点的实例也是能够的,可是,个人负载类型还不知道如何利用它。
三、目前尚未能够建立系统的设备。相似于 docker-compose 可以提供相关服务。