vlambda博客
学习文章列表

云原生时代,拥抱微服务(一) —— 搭建k8s集群


背景

现有系统是以传统的单片形式进行架构,通过采用Nginx对后端项目及前端进行反向代理。基础设施使用的是阿里云ECS服务器,直接在ECS中运行项目。在项目初期这种方式可以较快的搭建起应用,但随着项目不断地迭代,整个后端系统变得越来越臃肿,且难以进行弹性扩展和维护。为了让日后的开发及运维更为平顺,微服务化势在必行。

时间就是生命,提升效率就是延长生命。—— 皮皮叨叨

既然有了这个想法,下面就要一步步落实了。微服务化第一步就是要将项目进行容器化,而为了更好地管理容器就需要一套能“用于自动部署、扩展和管理容器化应用程序的平台”,我们将采用业界普遍使用的Kubernetes作为容器管理平台。

云平台K8S or 自行搭建?

我们最终选择自行搭建K8S平台,主要基于下述原因:

  • 已经购买了包年的ECS套餐

  • 基于费用成本考虑,阿里云容器服务Kubernetes版计费更为复杂(除了集群管理费,还包括云服务器、NAT网关、负载均衡等相关费用),总体而言费用相对更高。

  • 需要平稳过渡到新的部署架构,先从后端项目入手,成熟后再将前端等其他项目迁移过去。

  • 如果后续有需要的话,自建K8S也可以很快的迁移到使用云平台K8S方案(通过配置文件对Kubernetes对象进行声明式管理)

我们将使用轻量的、产品级且易于运维的microk8s搭建K8S集群。

搭建microk8s集群(基于Ubuntu 18.04)

  1. 安装snappy包管理器(若已安装,请忽略)

sudo apt update
sudo apt install snapd
  1. 安装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'" >> ~/.bashrcsource ~/.bashrc## 或者sudo snap alias microk8s.kubectl kubectl

microk8s.enable dns 
## 查看microk8s状态microk8s.status

## 检查coreDNS运行情况
kubectl get pods --all-namespaces

发现相关pod一直处于ContainerCreating状态!!!

云原生时代,拥抱微服务(一) —— 搭建k8s集群


发现相关pod一直处于ContainerCreating状态!!!

## 继续查找原因kubectl describe pod/coredns-9b8997588-dp9cx -n kube-system

云原生时代,拥抱微服务(一) —— 搭建k8s集群

发现由于某种原因 无法获取 指定镜像 k8s.gcr.io/pause:3.1解决方法如下:

## 下载docker hub 上的相关镜像sudo docker pull mirrorgooglecontainers/pause:3.1 ## 将相关镜像tag为 k8s.gcr.io/pause:3.1sudo 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

  1. 增加microk8s节点

## 主节点运行命令microk8s add-node

上述命令打印出microk8s join指令,用于在其他需要加入集群的节点执行。PS:需要确保节点间网络互通(并在安全组及主机防火墙开放),否则加入不成功!!!

## 查看k8s集群节点信息kubectl get nodes

大功告成!!!接下来可以愉快地对项目进行容器化管理了^-^