如何在 Azure 上部署 Kubernetes 集群
本文是一篇技术教程,由 Mike Chaliy 撰写。他是一位 .NET 平台用户,尝试在 Azure 上部署 Kubernetes 集群,并将步骤写成了这篇帖子。文章描写了部署集群过程,还对 Kubernetes 的一些功能进行了简要描述。
以下是文章主要内容:
在实验、演示的时候,或者是生产过程中,我经常会需要运行一些 Docker 负载。虽然这在本地计算机上十分容易,但是当你要在云端运行的时候就有点困难了。相比于本地运行,在云端运行真的太复杂了。我尝试了几个方法,比如在 AWS Beanstalk、AWS ECS 或者 Azure ACS DC/OS 上运行 Docker,但是针对于我的需求来说,这些尝试太复杂了,而且限制诸多。
Azure 宣布 Azure Container Service 预支持 Kubernetes,与此同时,Kubernetes 也宣布支持 ACS,所以是时候尝试一下 Kubernetes 了。
你可以跳过所有步骤,只阅读演示部署和说明,点击链接:https://github.com/chaliy/play-azure-kubernetes。
介绍
那么,什么是 Kubernetes 呢?用一句简单的话来概括:它是一个容器编排工具。第一步,将应用程序进行打包,然后 Kubernetes 可以对打包好的这些应用程序进行部署、运行以及扩展。为了深入了解,可能还需要通过 Tutorial 了解,但是这个十分容易,你完全可以跳过这个步骤直接尝试如何运行它。
所需的基础设施
在本文中,我会使用新的 Azure CLI。安装十分简单,大多数情况下,只需要“pip install azure-cli”就可以了。 所以现在让我们来预览一下我们的集群。首先,你可能需要资源组来隔离你的基础设施。
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
在等待命令完成的时候,我们来看一些评论。
1、如果你的命令出现了一些问题,比如这些命令出现一些无意义的错误,添加-debug 参数有点啰嗦,但是会出现一些错误。
2、-dnsprefix 是可选的,个人建议还是要添加上去,不然的话,就会按照“集群名字+组名字”使用,如果超过 90 个字符的长度,之后在操作过程中就会出现奇怪的错误。
默认设置下,ACS 用单个 master 和 3 个 agents 来设置集群。这些步骤默认设置下都是使用 D2 的,所以这个集群耗费比较高,当你不需要的时候记得清理资源。
以及,欢迎阅读 Kubernetes 的 ACS 引擎之下的内容,链接:https://github.com/Azure/acs-engine/blob/master/docs/kubernetes.md。上述内容给了实施过程中的一些很棒的观点。注意了,ACS 文档没有使用新的 Azure 工具,所以操作起来会有点复杂。
第一个有效负载
所有的基础设施准备完成,现在开始部署 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 1. List Pods kubectl get pods 1. List deployments kubectl get deployments 1. 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 代理作为路由器的一些真实例子。
结论
对于我来说,用户体验很棒,但是我也不确定我会不会继续使用,因为有几个问题还在困扰着我:
1、Kubernetes ACS 版本还在预发布阶段,有些功能还没有实现(比如,你还不能对你的集群进行缩容扩容)。
2、使用成本较高,至少需要 4D2 个节点,每月最高可能要花费 1000 美元。使用相对小一点的实例也是可以的,但是,我的负载类型还不知道如何利用它。
3、目前还没有可以创建系统的设备。类似于 docker-compose 能够提供相关服务。
不要忘记清理你的资源!Enjoy~
原文作者:Mike Chaliy 原文链接:https://medium.com/devoops-and-universe/your-very-own-kubernetes-cluster-on-azure-acs-9ea758dcf100#.ddd5gwi5v(浏览网页需要自行准备梯子)