在阿里云上部署 kubernetes

为什么不直接购买阿里云的 kubernetes HA 集群服务

阿里云的 kubernetes HA 集群服务,需要至少 3 台 ECS 服务器作为 master,而且每台 master 上不允许运行 worker 上的 pod。 这对于对流量小、集群规模小、并且稳定性不要很高的业务而言无疑是一笔较大的费用支出。所以,在现有的几台 ECS 上搭建一个 kubernetes 集群权当做 一个尝试,不强调 HA。

环境准备

ECS 配置

将准备使用的 ECS 配置到同一个 VPC 网络中,并创建对应的路由器

网络环境

现有两台 ECS,配置如下:

os: ubuntu 16.04
memory: 2G
cores: 2
ip: inner
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 不能访问外网怎么实现?

如何让不能访问外网的请求通过能访问外网的 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

09 June 2019

blog comments powered by Disqus