在阿里云上部署 kubernetes
本文记录了在阿里云上部署 kubernetes 的过程。
为什么不直接购买阿里云的 kubernetes HA 集群服务
阿里云的 kubernetes HA 集群服务,需要至少 3 台 ECS 服务器作为 master,而且每台 master 上不允许运行 worker 上的 pod。 这对于对流量小、集群规模小、并且稳定性不要很高的业务而言无疑是一笔较大的费用支出。所以,在现有的几台 ECS 上搭建一个 kubernetes 集群权当做 一个尝试,不强调 HA。
环境准备
ECS 配置
将准备使用的 ECS 配置到同一个 VPC 网络中,并创建对应的路由器
网络环境
现有两台 ECS,配置如下:
- ECS 1:
os: ubuntu 16.04
memory: 2G
cores: 2
ip: inner
- ECS 2:
os: ubuntu 16.04
memory: 4G
cores: 2
ip: EIP
搭建 kubernetes 集群,首要任务是可以让 ECS 1 可以访问外部网络,两台 ECS 位于同一个 VPC 网络中。配置过程主要参考 阿里云上如何使用 VPC,该博主已经讲解的很细致,归纳起来主要 有以下几个关键点:
ECS 访问外网是怎么实现?为什么没有外网网卡的原因。
VPC 内的 ECS 默认无法访问外网也无法被外网访问,通过为 ECS 挂载公网 IP 并配置为 SNAT,则其他 ECS 就可以借助它访问公网,另外也可以为该 ECS 配置 DNAT 从而允许外部访问 VPC 内部的服务。
- 路由器下的多个网段内的 ECS 互相通讯,都把路由器当作默认网关,因为路由器有所有网段的路由表,它知道如何交付数据包。
- 具有弹性 IP 的 ECS,其包经过路由器时,会被阿里云的弹性 IP NAT 策略识别,从而经过阿里云的公网网关走到外网。
ECS 不能访问外网怎么实现?
- 不具有弹性 IP 的 ECS,其包经过路由器时,因为路由表没有相对应的路由项,因此无法路由到外网。
如何让不能访问外网的请求通过能访问外网的 ecs 转发
- 在路由器上配置默认网关(也就是找不到路由项时)为具有弹性 IP 的那台 ECS 机器,因此发往外网的包将全部流量该 ECS。
- 配置具有弹性 IP 的 ECS,利用 iptables 增加一个 SNAT 规则,将包的源 IP 修改为本 ECS 的内网网卡 IP,并重新发出。
- 经过修改的包,首先通过交换机到达路由器,因为源 IP 是弹性 IP,因此被阿里云的弹性 IP NAT 策略识别,从而经过阿里云的公网网关走到外网。
- 当应答回到阿里云公网网关后,因为弹性 IP NAT 策略识别,最终将目标 IP 改为具有弹性 IP 的 ECS 的内网网卡 IP,包经过路由器->交换机回到 ECS。
- 弹性 ECS 收到包后,因为我们配置的 iptables SNAT 规则,会发现之前的映射会话,将包的目标 IP 改回到无弹性 IP 的 ECS,再次交给交换机。
- 交换机将包直接转发给无弹性 IP ECS,整个过程结束。
关键的 iptables 配置
$ iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE
具体详细步骤请参考原文,感谢作者的付出。
利用 kubeadm 搭建一个 kubernetes 集群
环境清理
为了保持 kubernetes 和 docker 运行时的版本匹配,将已经安装的 docker 从系统中删除,具体步骤可以根据系统版本参考官方文档, 比如 ubuntu 16.04 上卸载命令:
$ sudo apt-get remove docker docker-engine docker.io containerd runc
添加 Aliyun 的 kubernetes 镜像源
为了加速安装,添加阿里云的 kubernetes 镜像源:
$ apt-get update && apt-get install -y apt-transport-https
$ curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
$ cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
$ apt-get update
安装 kubeadm 和 docker
$ apt install -y kubeadm docker.io
配置 docker 加速器
将阿里云 docker 镜像的加速配置添加到 /etc/docker/daemon.json 文件中:
{
"registry-mirrors": ["https://your-keys.mirror.aliyuncs.com"]
}
然后登陆阿里云的 registry 账户:
$ sudo docker login --username=your-username registry.cn-beijing.aliyuncs.com
Docker 镜像
鉴于 k8s.io 相关的镜像源已无法访问,需要借助 docker hub 来实现 kubernetes 安装过程中必须的镜像下载。提前下载的主要是 coredns:1.3.1 镜像,其他镜像可以通过指定 image repository 的方式解决。
$ docker pull coredns:coredns:1.3.1
$ docker tag coredns:1.3.1 mirrorgooglecontainers/coredns:1.3.1
用 kubeadm 部署一个 master 节点
$ kubeadm init --image-repository index.docker.io/mirrorgooglecontainers
然后按照安装后的提示命令配置 master,类似:
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubeadm init 也可以通过 --config kubeadm.yaml 定制配置选项。
安装 weave 网络插件
这时,CoreDNS、kube-controller-manager 等依赖于网络的 POD 都处于 Pending 状态,还需要为 kubernetes 部署一个网络插件:
$ kubectl apply -f https://git.io/weave-kube-1.6
删除 master 节点上的 Taint
为了让 master 也可以运行一些 POD,删除 master 节点的 taint:
$ kubectl taint nodes --all node-role.kubernetes.io/master-
此后,我们便可以在这个集群上部署我们自己的应用了。
bash completion
$ kubeadm completion bash > /etc/bash_completion.d/kubeadm
$ kubectl completion bash > /etc/bash_completion.d/kubectl
编辑 ~/.bashrc 放开 bash_completion 部分,然后执行
$ source ~/.bashrc
后面再使用 kubectl 等命令时便可以用 TAB 进行补齐了。
tips
- 使用
docker search XXX查找 docker hub 中的镜像