阿里云快速部署Kubernetes - VPC环境

  1. 云栖社区>
  2. 博客>
  3. 正文

阿里云快速部署Kubernetes - VPC环境

初扬 2016-12-13 17:04:33 浏览37187 评论30

摘要: 本文展示了一个在阿里云VPC网络上快速部署一个安全的kubernetes集群的方法,安装使用kubeadm工具,这个工具是k8s-release1.5的一部分(注意kubeadm还处在beta版本,欢迎大家使用的时候多提宝贵的意见)。由于kubeadm使用的默认镜像仓库是gcr.io/g


本文展示了一个在阿里云VPC网络上快速部署一个安全的kubernetes集群的方法,安装使用kubeadm工具,这个工具是k8s-release1.5的一部分(注意kubeadm还处在beta版本,欢迎大家使用的时候多提宝贵的意见)。本文带大家在阿里云上快速安装kubernetes-1.5.1。由于kubeadm使用的默认镜像仓库是gcr.io/google-containers,国内无法访问,并且支持自定义镜像仓库的代码并不包含在kubeadm-release1.5,因此我们从master分支编译了一个支持自定义镜像仓库的kubeadm版本放到了阿里云OSS共享存储上供大家下载使用。同样因为kubernetes官方yum源国内无法访问的原因,我们为大家将所需的rpm包下载好统一放到了阿里云OSS上。

前置条件

  • 一个或者多个运行centos7的ECS机器
  • 每个ECS机器至少有1G的RAM内存(太少会导致留给app的可用内存不足)
  • 所有ECS机器同在一个VPC网络下
  • 准备好阿里云账号的AccessKeyID与AccessKeySecret。可以通过查找KEY获取

安装步骤

通过阿里云控制台上创建ECS

  • 登录阿里云控制台,创建一个VPC网络。过程参见VPC
  • 登录阿里云控制台,在刚创建的VPC网络下创建至少2个ECS,注意操作系统选择centos7. 具体参见ECS

使用默认配置快速创建k8s集群

如果你只是想快速的搭建起来一套k8s试一下,我们为您提供了一键式快速部署脚本,部署全部使用默认配置,支持centos7。以下命令需要通过ssh登录到master或者node机器上后在执行。

1.使用一条命令即可部署一套最小化的安全的k8s集群,以下命令在一个centos7上面启动一个k8smaster,注意记录输出中的token,在添加node节点的时候需要用到.

# curl -sSL "http://k8s.oss-cn-shanghai.aliyuncs.com/admin-1.5.1.sh" | sudo bash -s master 

2.以下命令在一个centos7上面启动一个k8s node,并加入到刚才创建的master集群中。注意将xxxxx.xxxxxxxx替换成上一步记录的token

# curl -sSL "http://k8s.oss-cn-shanghai.aliyuncs.com/admin-1.5.1.sh" | sudo bash -s join --token xxxxx.xxxxxxxxx 119.123.211.22

3.以下命令完全销毁一个k8s节点,node 或者master,并且清除数据

# curl -sSL "http://k8s.oss-cn-shanghai.aliyuncs.com/admin-1.5.1.sh" | sudo bash -s down

4.为k8s创建Flannel VPC网络

# curl -sSL "http://k8s.oss-cn-shanghai.aliyuncs.com/kube/flannel-vpc.yml" -o flannel-vpc.yml

# vi flannel-vpc.yml

// 找到[replace with your id] 替换成你自己的ACCESS_KEY_ID和ACCESS_KEY_SECRET查找KEY

# kubectl create -f flannel-vpc.yml 

5.然后可以通过节点IP:NodePort访问kubernetes dashboard. 可以通过kubectl查询NodePort.

[root@iZbp14tmy66i2l0ln0vwreZ ~]# kubectl --namespace=kube-system describe svc kubernetes-dashboard|grep NodePort
Type:           NodePort
NodePort:       <unset> 31158/TCP

Enjoy Your dashboard.

自定义方式创建k8s集群

如果你想了解手动创建集群的过程,可以参照以下步骤。创建k8s节点你需要安装如下几个组件,会通过step2安装。

  • docker : kubernetes依赖的容器运行时
  • kubelet: kubernetes最核心的agent组件,每个节点都会启动一个,负责像pods及节点的生命周期等管理
  • kubectl: kubernetes的命令行控制工具,只可以在master上使用.
  • kubeadm: 用来bootstrap kubernetes. 初始化一个k8s集群.

自定义创建过程

Step: 1

登录目标机器:通过ssh root@abc.abc.abc.abc 登录到你刚刚申请的ECS上面,请使用root权限,一般ECS默认是root登录,如果不是用sudo su - 切换过去.

Step: 2

安装k8s软件包:

  • 由于k8s的官方安装包在墙外,ECS无法直接下载,因此我们将下载好的包放到了一个公共的阿里云存储服务中供大家下载。我们正在对k8s官方安装包做镜像,敬请期待。目前CentOS可以通过下面的命令安装k8s软件。

    请注意安装顺序
    1. 安装 socat 
    # yum install -y socat
    2. 安装docker
    # curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -
    3. 下载kubectl
    # curl -sSL http://k8s.oss-cn-shanghai.aliyuncs.com/kube/rpm/kubectl-1.5.1.x86_64.rpm -o kubectl-1.5.1.x86_64.rpm 
    4. 下载kubelet 
    # curl -sSL http://k8s.oss-cn-shanghai.aliyuncs.com/kube/rpm/kubelet-1.5.1.x86_64.rpm -o kubelet-1.5.1.x86_64.rpm 
    5. 下载kubernetes-cni 插件
    # curl -sSL http://k8s.oss-cn-shanghai.aliyuncs.com/kube/rpm/kubernetes-cni-0.3.0.1-1.07a8a2.x86_64.rpm -o kubernetes-cni-0.3.0.1-1.07a8a2.x86_64.rpm 
    6. 下载kubeadm 
    # curl -sSL http://k8s.oss-cn-shanghai.aliyuncs.com/kube/rpm/kubeadm-1.6.0-0.alpha.0.2074.a092d8e0f95f52.x86_64.rpm -o kubeadm-1.6.0-0.alpha.0.2074.a092d8e0f95f52.x86_64.rpm 
    7.安装 #
    rpm -ivh kubectl-1.5.1.x86_64.rpm kubelet-1.5.1.x86_64.rpm kubernetes-cni-0.3.0.1-1.07a8a2.x86_64.rpm kubeadm-1.6.0-0.alpha.0.2074.a092d8e0f95f52.x86_64.rpm
  • 在启动kubelet之前我们需要先修改vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf,为kubelet添加一个额外的参数

    // 这样kubelet就不会在启动pod的时候去墙外的k8s仓库拉取pause-amd64:3.0镜像了
    --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0
  • 为了让修改生效你需要执行以下命令 systemctl enable kubelet && systemctl start kubelet 此时kubelet应该处在等待/etc/kubernetes/kubelet.conf配置文件就行的循环重启过程中。这一点可以从 journalctl -f -u kubelet.service的输出日志来验证。

Step: 3

初始化master节点: master节点是控制组件运行的地方,包含apiserver,etcd,shecduler,controllermanager, proxy等等,这些组件都会以容器的方式由kubelet拉起.从上一步里面安装完成kubeadm及kubelet的ECS中挑选一台执行如下命令:

# export KUBE_REPO_PREFIX=registry.cn-hangzhou.aliyuncs.com/google-containers \
         KUBE_HYPERKUBE_IMAGE=registry.cn-hangzhou.aliyuncs.com/google-containers/hyperkube-amd64:v1.5.1 \
         KUBE_DISCOVERY_IMAGE=registry.cn-hangzhou.aliyuncs.com/google-containers/kube-discovery-amd64:1.0 \
         KUBE_ETCD_IMAGE=registry.cn-hangzhou.aliyuncs.com/google-containers/etcd-amd64:3.0.4
# kubeadm init --pod-network-cidr="10.24.0.0/16"

通过设置KUBE_REPO_PREFIX、KUBE_HYPERKUBE_IMAGE、KUBE_DISCOVERY_IMAGE三个环境变量告诉kubeadm在创建k8s组件的时候使用阿里云上提供的官方仓库,这样可以避免国内无法访问国外k8s官方仓库的问题。 不指定 --api-advertise-addresses=<ip-address> 参数,kubeadm 会自动侦测可用的IP作为master的监听IP.本条命令会

  • 创建安全通信相关的证书及秘钥,注意记录输出中的token, 你在接下来的创建node节点的时候会用到.
  • 生产kubelet相关配置文件存放到/etc/kubernetes下,生成static pods配置文件用以启动k8s各个组件(apiserver,kubeproxy,etcd,shecduler等)

使用kubeadm -h来查看更多的配置参数。默认情况下,出于安全的原因,集群不会往master上面调度Pods,如果你需要往master上面调度Pods(例如部署单节点的k8s测试集群),需要运行如下命令打开master的调度

# kubectl taint nodes --all dedicated-

本条命令会移除所有节点上的"dedicated"的taint,意味着schedule可以往任意的节点上调度pods,包含master.

Step: 4

往集群中添加节点: node节点是Pods和containers实际调度运行的地方.要把某个节点到你的集群,你需要先SSH登录到该节点,然后切换到root身份,运行kubeadm join 命令:

# kubeadm join --token <token> <master-ip>

等待几分钟,命令成功返回代表创建node成功,然后在master上执行 kubectl --namespace=kube-system get no 会显示你刚创建的集群上的所有节点及其健康状态. 但是请注意你的集群还并没有READY!!! 在你可以部署应用前你还需要为Pod创建网络.

Step: 5

为集群添加网络插件: 为了让集群中的所有Pods能够互相通信,你还需要为集群添加网络插件,目前flannel,weaver,canal,calico等支持k8s cni网络模型.注意,一个集群只能添加一种网络支持。 

Flannel: 对于VPC集群,可以使用flannel网络插件for k8s,首先准备好自己的access key and secret 查找KEY, 然后SSH登录到master机器执行:

# curl -ssL http://k8s.oss-cn-shanghai.aliyuncs.com/kube/flannel-vpc.yml -o flannel.yml
# vi flannel.yml
// ACCESS_KEY_ID 与 ACCESS_KEY_SECRET。 找到[replace with your own id]替换成自己的accesskeyid与accesskeysecret.
# kubectl create -f flannel.yml
# kubectl --namespace=kube-system get po 
NAME                                    READY     STATUS    RESTARTS   AGE
dummy-2340867639-owm2g                  1/1       Running   0          1d
etcd-192.168.1.191                      1/1       Running   0          1d
kube-apiserver-192.168.1.191            1/1       Running   0          1d
kube-controller-manager-192.168.1.191   1/1       Running   0          1d
kube-dns-3378589527-rifti               4/4       Running   0          1d
kube-flannel-ds-5ud36                   2/2       Running   0          1d
kube-flannel-ds-br3zb                   2/2       Running   0          1d
kube-proxy-jcbcy                        1/1       Running   0          1d
kube-proxy-uhzsn                        1/1       Running   0          1d
kube-scheduler-192.168.1.191            1/1       Running   3          1d

WeaveNet: 你也可以为k8s集群添加weave网络支持.执行以下命令:

# kubectl apply -f http://k8s.oss-cn-shanghai.aliyuncs.com/kube/weave-kube-1.7.2
  daemonset "weave-net" created

Step: 6

部署kubernetes-dashboard

# kubectl apply -f http://k8s.oss-cn-shanghai.aliyuncs.com/kube/kubernetes-dashboard1.5.0.yaml
# kubectl --namespace=kube-system describe svc kubernetes-dashboard
Name:           kubernetes-dashboard
Namespace:      kube-system
Labels:         app=kubernetes-dashboard
Selector:       app=kubernetes-dashboard
Type:           NodePort
IP:         10.1.56.28
Port:           <unset> 80/TCP
NodePort:       <unset> 30624/TCP   <=== 使用 http://节点IP:30624访问dashboard
Endpoints:      10.24.4.79:9090
Session Affinity:   None

f6c11f9f89a0c8b2814f99dd3c257290fb97f1da

Step: 7 (可选)

运行一个demo程序:从github.com clone一份demo程序,关于demo的更多信息参加GitHub README

# git clone https://github.com/microservices-demo/microservices-demo
# kubectl apply -f microservices-demo/deploy/kubernetes/manifests/sock-shop-ns.yml -f microservices-demo/deploy/kubernetes/manifests
# kubectl get po

小结

  1. 针对kubernetes的软件源和镜像仓库在国内无法直接访问的情况,阿里云专门对kubernetes软件源与镜像仓库做了镜像,为用户提供一个安全快速的镜像服务,请访问阿里Mirror镜像服务了解更多信息。

  2. 针对kubeadm在部署kubenetes时不支持自定义镜像仓库的问题,我们向kubernetes社区提交了自定义镜像仓库PR,用户可以通过设置KUBE_REPO_PREFIX环境变量指定使用自己的镜像仓库来部署kubenetes.推荐使用阿里云容器服务提供的镜像仓库服务,免去自建仓库的烦恼。

  3. 同时我们向flannel社区提交了另外一个PR,让flannel适配到阿里云的VPC网络上,并且方便的与kubernetes进行集成。

阿里云容器服务团队致力于在阿里云上推广容器技术。想了解更多容器服务内容,请访问https://www.aliyun.com/product/containerservice

【云栖快讯】一站式开发者服务,海量学习资源免费学  详情请点击

网友评论