云原生时代,拥抱微服务(一) —— 搭建k8s集群
背景
现有系统是以传统的单片形式进行架构,通过采用Nginx对后端项目及前端进行反向代理。基础设施使用的是阿里云ECS服务器,直接在ECS中运行项目。在项目初期这种方式可以较快的搭建起应用,但随着项目不断地迭代,整个后端系统变得越来越臃肿,且难以进行弹性扩展和维护。为了让日后的开发及运维更为平顺,微服务化势在必行。
时间就是生命,提升效率就是延长生命。—— 皮皮叨叨
既然有了这个想法,下面就要一步步落实了。微服务化第一步就是要将项目进行容器化,而为了更好地管理容器就需要一套能“用于自动部署、扩展和管理容器化应用程序的平台”,我们将采用业界普遍使用的Kubernetes作为容器管理平台。
云平台K8S or 自行搭建?
我们最终选择自行搭建K8S平台,主要基于下述原因:
已经购买了包年的ECS套餐
基于费用成本考虑,阿里云容器服务Kubernetes版计费更为复杂(除了集群管理费,还包括云服务器、NAT网关、负载均衡等相关费用),总体而言费用相对更高。
需要平稳过渡到新的部署架构,先从后端项目入手,成熟后再将前端等其他项目迁移过去。
如果后续有需要的话,自建K8S也可以很快的迁移到使用云平台K8S方案(通过配置文件对Kubernetes对象进行声明式管理)
我们将使用轻量的、产品级且易于运维的microk8s搭建K8S集群。
搭建microk8s集群(基于Ubuntu 18.04)
安装snappy包管理器(若已安装,请忽略)
sudo apt update
sudo apt install snapd
安装microk8s(以1.17版本为例)
sudo snap install microk8s --classic --channel=1.17/stable
## 配置防火墙以允许pod间通信
sudo ufw allow in on cni0 && sudo ufw allow out on cni0
## 创建kubectl别名以方便后续使用
echo "alias kubectl='microk8s.kubectl'" >> ~/.bashrc
source ~/.bashrc
## 或者
sudo snap alias microk8s.kubectl kubectl
microk8s.enable dns
## 查看microk8s状态
microk8s.status
## 检查coreDNS运行情况
kubectl get pods --all-namespaces
发现相关pod一直处于ContainerCreating状态!!!
发现相关pod一直处于ContainerCreating状态!!!
## 继续查找原因
kubectl describe pod/coredns-9b8997588-dp9cx -n kube-system
发现由于某种原因 无法获取 指定镜像 k8s.gcr.io/pause:3.1。解决方法如下:
# 下载docker hub 上的相关镜像
sudo docker pull mirrorgooglecontainers/pause:3.1
# 将相关镜像tag为 k8s.gcr.io/pause:3.1
sudo docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
# 保存镜像为本地镜像文件
sudo docker save k8s.gcr.io/pause > pause.tar
# ctr导入本地镜像
sudo microk8s.ctr image import pause.tar
增加microk8s节点
# 主节点运行命令
microk8s add-node
上述命令打印出microk8s join指令,用于在其他需要加入集群的节点执行。PS:需要确保节点间网络互通(并在安全组及主机防火墙开放),否则加入不成功!!!
# 查看k8s集群节点信息
kubectl get nodes
大功告成!!!接下来可以愉快地对项目进行容器化管理了^-^