当 Kubernetes 遇到阿里云
阿里云提供了丰富多样的云产品支持,包括ECS、VPC网络、经典网络、负载均衡SLB等等,可以帮助Docker应用轻松在云端运行。阿里云除了推出容器服务提供了一站式的容器应用管理解决方案,也在不断推动其他开源容器技术和阿里云的集成更好地满足用户的多样化需求。
本文将会介绍如何非常方便的在阿里云上运行起一个安全的高可用的Kubernetes集群。同时为了让Kubernetes用户更好的使用阿里云服务,容器服务团队为Kubernetes提供了阿里云CloudProvider,支持为Kubernetes service 创建阿里云LoadBalance; 也为Flannel编写了网络驱动,让Flannel可以更好的支持阿里云VPC网络;同时我们基于当前最新的kubernetes 1.6.0-alpha版本制作了阿里云上一键部署安装脚本,开箱即用。
前置条件
- 支持阿里云CentOS 7.2-x64版本 、Ubuntu 16.04 x64版本
- 支持阿里云VPC网络和经典网络,创建VPC网络的网段建议使用192.168.0.0或者10.0.0.0网段,可以避免与本次安装Kubernetes的默认网段172.16.0.0冲突。
- 准备阿里云账号KeyID与KeySecret
- 如果您需要下载任何墙外的镜像,请移步使用阿里云镜像服务加速器。
- 请至少准备两个ECS实例,其中 node1 将作为master节点,node2作为工作节点。请注意不要修改ECS实例的名称(包括hostname)。
安装Kubernetes
准备3个配置参数
- 获取阿里云KeyID和KeySecret,请点击. 假设
ACCESS_KEY_ID=xxxxxxxx
,ACCESS_KEY_SECRET=xxxxxxxxxxxxxxxx
-
创建ECS CentOS 7.2-x64版本或者Ubuntu 16.04 x64版本。记录ECS所在region,以下列表为支持的region。例如杭州region名称为
cn-hangzhou
. 假设REGION=cn-hangzhou
Region名称 | 值 |Region名称 | 值 | ------------------|-----------------------|------------------|-----------------------| 杭州 | cn-hangzhou |新加坡 | ap-southeast-1 | 青岛 | cn-qingdao |上海 | cn-shanghai | 北京 | cn-beijing |迪拜 | me-east-1 | 香港 | cn-hongkong |东京 | ap-northeast-1 | 深圳 | cn-shenzhen |悉尼 | ap-southeast-2 | 硅谷 | us-west-1 |法兰克福 | eu-central-1 | 弗吉尼亚 | us-east-1 |||
注意: VPC网络可以不用设置REGION参数,系统会自动推测。但是经典网络必须要设置REGION参数。
开始安装
-
安装Master节点:
ssh root@node1
登录master节点安装master.注意将下面的$ACCESS_KEY_ID
和$ACCESS_KEY_SECRET
,$REGION
替换成上一步中获得的参数。[root@node1 ~]# curl -L 'http://aliacs-k8s.oss-cn-hangzhou.aliyuncs.com/installer/kubemgr.sh' | \ bash -s nice --node-type master --key-id $ACCESS_KEY_ID --key-secret $ACCESS_KEY_SECRET \ --region $REGION --discovery token://
输出如下,注意记录输出中的token,
TOKEN=token://xxxxxx:xxxxxxxxxxxxxxxx@12x.2x.24x.21x:989x
:docker has been installed 3.0: Pulling from google-containers/pause-amd64 Digest: sha256:3b3a29e3c90ae7762bdf587d19302e62485b6bef46e114b741f7d75dba023bd3 ... [tokens] Generated token: "xxxxxx:xxxxxxxxxxxxxxxx" [certificates] Generated Certificate Authority key and certificate. ... [apiclient] All control plane components are healthy after 17.286402 seconds [apiclient] Waiting for at least one node to register and become ready [apiclient] First node is ready after 4.003314 seconds ... Your Kubernetes master has initialized successfully! You should now deploy a pod network to the cluster. ## 注意记录这个Token kubeadm join --discovery token://xxxxxx:xxxxxxxxxxxxxxxx@12x.2x.24x.21x:989x ... NAME READY STATUS RESTARTS AGE dummy-3158885821-vkv5q 1/1 Running 0 5s etcd-izbp12l8fznm0yt7bas5p2z 1/1 Running 0 19s kube-apiserver-izbp12l8fznm0yt7bas5p2z 1/1 Running 1 18s ... kubectl --namespace=kube-system get po
-
安装Node节点:
ssh root@node2
登录到您的node2节点上。使用刚才您记录下来的token,执行以下命令,注意替换下面的变量:[root@node2 ~]# curl -L 'http://aliacs-k8s.oss-cn-hangzhou.aliyuncs.com/installer/kubemgr.sh' \ | bash -s nice --node-type node --key-id $ACCESS_KEY_ID --key-secret \ $ACCESS_KEY_SECRET --region $REGION --discovery $TOKEN
输出如下:
docker has been installed 3.0: Pulling from google-containers/pause-amd64 ... Digest: sha256:3b3a29e3c90ae7762bdf587d19302e62485b6bef46e114b741f7d75dba023bd3 Status: Image is up to date for registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0 [preflight] Running pre-flight checks [discovery] Created cluster info discovery client, requesting info from "http://12x.2x.24x.21x:989x/cluster-info/v1/?token-id=56974f" [discovery] Cluster info object received, verifying signature using given token [discovery] Cluster info signature and contents are valid, will use API endpoints [https://12x.2x.24x.21x:6443] [bootstrap] Trying to connect to endpoint https://12x.2x.24x.21x:6443 [bootstrap] Detected server version: v1.6.0-alpha.0.2229+88fbc68ad99479-dirty [bootstrap] Successfully established connection with endpoint "https://12x.2x.24x.21x:6443" [csr] Created API client to obtain unique certificate for this node, generating keys and certificate signing request [csr] Received signed certificate from the API server: Issuer: CN=kubernetes | Subject: CN=system:node:iZbp12l8fznm0yt7bas5p1Z | CA: false Not before: 2017-01-18 07:46:00 +0000 UTC Not After: 2018-01-18 07:46:00 +0000 UTC [csr] Generating kubelet configuration [kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf" Node join complete: * Certificate signing request sent to master and response received. * Kubelet informed of new secure connection details. Run 'kubectl get nodes' on the master to see this machine join.
Congratulations! 您已经成功的安装的了一个master和一个node节点。您可以重复在其他机器上执行安装node操作来添加更多节点。但是要让Kubernetes能正常运行您还需要为集群添加网络支持。
为集群添加网络支持
目前阿里云支持两种类型的网络:VPC网络和经典网络。请根据您的集群的网络类型不同为kubernetes选择相应的网络组件。
注意:以下两种网络只需要按照您的实际网络情况安装对应的一种。
方案一、增加VPC 网络支持: (适用于VPC网络)我们专门为flannel编写了vpc支持的插件。为Kubernetes安装flannel网络插件支持也非常容易。注意修改flannel-vpc.yml 文件中的replace with your id
为您自己的KEY_ID和KEY_SECRET。在Master node上面执行下面的命令:
[root@node1 ~]# curl -sSL http://aliacs-k8s.oss-cn-hangzhou.aliyuncs.com/conf/flannel-vpc.yml -o flannel-vpc.yml
[root@node1 ~]# vi flannel-vpc.yml
[root@node1 ~]# kubectl apply -f flannel-vpc.yml
等待一会儿,然后使用kubectl --namespace=kube-system get ds
列出所有kube-system命名空间下的所有daemonsets,您会看见一个名字叫kube-falnnel
的ds处于Running状态. 说明网络部署成功。
[root@node1 ~]# kubectl get ds --namespace=kube-system
NAME DESIRED CURRENT READY NODE-SELECTOR AGE
kube-flannel-ds 2 2 2 <none> 2h
kube-proxy 2 2 2 <none> 2h
方案二、增加经典网络支持: (适用于经典网络和VPC网络)通过flannel的VXLAN,我们可以为Pod打通经典网络内的网络连通性。安装经典网络支持同样很简单,运行以下命令即可:
[root@node1 ~]# kubectl apply -f http://aliacs-k8s.oss-cn-hangzhou.aliyuncs.com/conf/flannel-vxlan.yml
等待一会儿,通过命令kubectl --namespace=kube-system get ds
可以查看您的网络插件的运行状态。安装完成,收工。
在您的Kubernetes集群里创建应用
运行nginx应用
现在运行一个nginx应用,运行以下命令创建一个具有两个nginx副本的应用。
[root@node1 ~]# kubectl run nginx --image=registry.cn-hangzhou.aliyuncs.com/spacexnice/nginx:latest --replicas=2 --labels run=nginx
deployment "nginx" created
[root@node1 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-3579028506-9qxxl 1/1 Running 0 50s
nginx-3579028506-p032g 1/1 Running 0 50s
然后为nginx应用创建服务。可以指定type=Loadbalance
来启用阿里云SLB能力,阿里云CloudProvider会自动为该服务创建LoadBalance。
[root@node1 ~]# kubectl expose deployment nginx --port=80 --target-port=80 --type=LoadBalancer
service "nginx" exposed
[root@node1 ~]# kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 172.19.0.1 <none> 443/TCP 3h
nginx 172.19.6.158 118.178.111.31 80:30146/TCP 6s
现在打开您的浏览器访问http://118.178.111.31
(注意,这儿需要替换成您自己的EXTERNAL-IP)吧,熟悉的Welcome to nginx!
是否出现。您还可以去您的阿里云SLB控制台上确认SLB相关信息。
重置节点
当您发现安装过程有错误,或者想卸载Kubernetes安装的时候,随时执行如下命令即可卸载安装。
[root@node1 ~]# curl -L 'http://aliacs-k8s.oss-cn-hangzhou.aliyuncs.com/installer/kubemgr.sh' | bash -s nice --node-type down
阿里云SLB能力支持
Kubernetes阿里云CloudProvider提供了丰富的annotation来让用户高度定制化自己的SLB的行为,支持创建一个https和http的SLB,支持自定义SLB的带宽,支持自定义SLB健康检查,SLB网络地址类型等等。
为nginx创建一个https的SLB
如将刚刚创建的nginx服务的SLB类型更换成https,可以执行如下操作步骤:
- 前往阿里云SLB控制台将您自己的https证书上传到阿里云。并记录生成的
certid
。假如生成的certid=124395s8ifs8ffftte
. -
为刚刚创建的service添加相应的annotation(每个可用的annotation的含义见附表).并将spec节中的port更改为443端口。使用命令
kubectl edit svc nginx
来编辑刚刚创建的服务,编辑完成后按:wq
保存即可:[root@node1 ~]# kubectl edit svc nginx apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/alicloud-loadbalancer-ProtocolPort: "https:443" service.beta.kubernetes.io/alicloud-loadbalancer-Bandwidth: 60 service.beta.kubernetes.io/alicloud-loadbalancer-CertID: "replace with your certid" service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckFlag: off creationTimestamp: 2017-01-18T10:45:32Z labels: run: nginx name: nginx namespace: default resourceVersion: "14365" selfLink: /api/v1/namespaces/default/services/nginx uid: 3c0e72e1-dd6b-11e6-b1ec-00163e0c1de5 spec: clusterIP: 172.19.6.158 ports: - nodePort: 30146 port: 443 protocol: TCP targetPort: 80 selector: run: nginx sessionAffinity: None type: LoadBalancer status: loadBalancer: ingress: - ip: 118.178.111.31
稍等片刻,然后访问https://118.178.111.31
即可看到一个安全的https nginx服务。 Go rock and roll!
小结
阿里云提供一个开放的公有云环境,为开源社区软件提供丰富的运行环境。您可以十分方便的在阿里云环境上搭建一个kubernetes集群来运行您的服务,但是阿里云容器服务为您提供了一站式解决方案,使用阿里云容器服务可以免去您集群运维的烦恼。
阿里云容器服务团队致力于在阿里云上推广容器技术。想了解更多容器服务内容,请访问https://www.aliyun.com/product/containerservice
附件 可用Annotation列表参考
Annotation | Description | Default | |
---|---|---|---|
service.beta.kubernetes.io/alicloud-loadbalancer-ProtocolPort | comma separated pair like "https:443,http:80" | none | |
service.beta.kubernetes.io/alicloud-loadbalancer-AddressType | Be "internet" or "intranet" | "internet" | |
service.beta.kubernetes.io/alicloud-loadbalancer-SLBNetworkType | slb network type, which is classic or vpc | Be "classic" or "vpc" | |
service.beta.kubernetes.io/alicloud-loadbalancer-ChargeType | Be "paybytraffic" or "payby bandwidth" | "paybybandwidth" | |
service.beta.kubernetes.io/alicloud-loadbalancer-Region | Which region this SLB in | ||
service.beta.kubernetes.io/alicloud-loadbalancer-Bandwidth | SLB bandwidth | 50 | |
service.beta.kubernetes.io/alicloud-loadbalancer-CertID | certification id on AlibabaCloud, you need to upload first | "" | |
service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckFlag | "on" or "off" | "off" tcp no need for this mark because it default to "on" | |
service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckType | see HealthCheck | ||
service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckURI | see HealthCheck | ||
service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckConnectPort | see HealthCheck | ||
service.beta.kubernetes.io/alicloud-loadbalancer-HealthyThreshold | see HealthCheck | ||
service.beta.kubernetes.io/alicloud-loadbalancer-UnhealthyThreshold | see HealthCheck | ||
service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckInterval | see HealthCheck | ||
service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckConnectTimeout | see HealthCheck | ||
service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckTimeout | see HealthCheck |