快速创建Kubernetes集群,从零开始

入坑靠师傅,出坑靠本身!node

CI/CD是大规模数据中心不可缺乏的基础设施,也是构建集群化系统的第一步。linux

这里介绍如何从零开始基于Kubernetes创建CI/CD集群,以知足软件企业和数据中心的软件开发和部署的须要。nginx

咱们先创建一个“母机”,安装的软件包括:git

  1. MAAS 装机服务,经过网络启动进行裸机操做系统安装。
    • 须要联机时将操做系统镜像提早同步下来,或者直接拷贝到目录里面去。
    • 或者创建本身的mirror(参见 Select and Import Images
  2. ownCloud 自建云盘,用于安装过程当中各类文件的下载,包括Kubernetes的容器镜像离线包。
    • 预先上传*.iso、etcher等启动盘制做工具。
  3. apt mirror 镜像服务,提供各个节点apt安装时须要用的软件包,按期从archive.ubuntu.com更新。
    • 以及使用cron/kubernetes cronjob/rsync等按期同步,nginx/apache提供服务。
  4. IPFS 传输系统,用于快速传输、下载大的软件包,如容器镜像、大型数据文件等等。
    • 以及使用bt/aria/rsync传输和同步目录。
  5. Harbor 容器镜像服务,各个节点部署容器时直接从这里获取,避免从互联网拉取镜像耗费时间。
    • 可使用docker save/load来直接复制images文件,docker export/import复制container文件。
  6. Kubernetes Master,集群主控机,能够经过上面ownCloud下载离线包快速安装。
  7. ansible工具,用于远程操做节点主机,进行软件安装和版本更新。
  8. qTox,即时通信,用于各个节点间传输配置参数、软件包等等。

有了上面的八样神器,都配置在“母机上”,基本上能够解决Kubernetes集群部署中的任何问题。github

1、建立操做主机

操做主机是咱们创建集群的原点。docker

须要建立一个启动U盘,而后经过U盘启动计算机,安装Ubuntu操做系统。apache

  1. 下载 Ubuntu Desktop 18.04.01 LTS的ISO镜像。
  2. Ubuntu的启动U盘制做。可使用Ubuntu自带的启动盘制做工具,Unetboot或者Etcher来制做。
  3. U盘启动,初始主机安装Ubuntu。
    • 插入制做好的启动U盘。
    • 开机时,按住del或者F2/F8(根据主板不一样),设置启动盘为USB。
    • 启动后,按照正常程序安装Ubuntu操做系统。

2、建立集群主机

建立集群的多个个节点的初始系统有几种方法:json

  • 定制U盘。
    • 使用U盘启动,自动化安装,而后使用cloud-init来初始化系统。
  • 系统盘克隆。优势是速度快。
    • 先使用一个机器装好,而后把系统盘克隆不少份,装到其它的机器上。
    • 这样系统网卡的MAC地址和IP地址是同样的,直接启动后没法访问网络。
    • 须要在启动后当即修改MAC地址和IP地址,并链接到中心服务器更新系统和参数。
  • 网络启动,安装系统。
    • 可使用KickStart、Cobbler或者Ubuntu的MAAS系统,原理和内核基本是同样的。
    • 可是不一样的版本兼容性不大同样,有的版本会有些坑,须要源码作些修改。

一、网络装机,MAAS安装、配置、启用。

MAAS是Canonical为Ubuntu开发的一个集中化装机系统,能够经过WebUI安装基础操做系统到多个节点上,而后经过cloud-init来初始化系统的配置。下一步,咱们能够经过ansible来控制各个节点。ubuntu

二、安装Ansible,操做、配置多个节点。

Amsible能够集中地控制多个节点,批量地执行ssh命令。缓存

三、容器引擎,安装Docker CE。

  • 设置apt的proxy参数:

$ nano /etc/apt/apt.conf
Acquire::http::Proxy "http://192.168.199.99:9999";
Acquire::https::Proxy "http://192.168.199.99:9999";
  • 添加key:
https_proxy=192.168.199.99:9999 wget https://download.docker.com/linux/ubuntu/gpg -O docker.key
sudo apt-key add docker.key
  • 添加安装源:
sudo echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic edge" > /etc/apt/sources.list.d/docker.list
sudo apt update
sudo apt install docker-ce
  • 确保kubelet使用的cgroup driver 与 Docker的一致。要么使用下面的方法更新 Docker:
cat << EOF > /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
  • 而后重启Docker服务,运行:
sudo systemctl daemon-reload
sudo systemctl restart docker

3、安装Kubernetes集群主节点

一、安装集群管理服务,设置版本锁定。

首先,安装Kubeadm、Kubectl、Kubelet基础工具和服务。

  • 添加安装源的key:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 6A030B21BA07F4FB
  • 添加安装源:
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
  • 安装Kubernetes 1.11.3:
sudo apt update
sudo apt install kubeadm=1.11.3-00 kubectl=1.11.3-00 kubelet=1.11.3-00
sudo echo "kubeadm hold" | sudo dpkg --set-selections
sudo echo "kubectl hold" | sudo dpkg --set-selections
sudo echo "kubelet hold" | sudo dpkg --set-selections

而后,就能够安装Kubernetes容器集群管理系统了。

二、系统工具,网络、管理面板与应用管理

  • 容器网络,Flannel安装。提供容器集群内部的虚拟化网络支持,容器网络的隔离和互通。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

#启用主控机同时做为工做节点
kubectl taint nodes --all node-role.kubernetes.io/master-
  • 应用管理,Helm安装。
  • 系统面板,Dashboard安装。
  • 负载均衡,MetalLB,对外服务IP地址分配。
  • 服务入口,Ingress安装。

三、基础服务,网络存储、Ubuntu镜像服务

A、为了让集群中全部节点均可以访问同一个存储设备,须要配置网络存储,可使用NFS/Ceph/Gluster或其它的存储系统(如SAN/iSCSI等)。对于小型的系统,这里使用NFS。

B、多个节点都须要访问apt安装源来更新系统软件包,将带来较大的并发网络流量并拖慢安装的速度。经过创建局域网络的apt镜像,为网内全部节点提供缓存的apt安装源,所有镜像下来须要1个多T的磁盘空间。我将其作成为一个Kubernetes的按期任务来执行,而后在Kubernetes中建立apt mirror服务,存储使用NFS服务。之后,考虑使用IPFS来创建apt mirror站点,提供更快、全球规模的加速服务。

四、持续交付,源码管理、构建工具、容器仓库

这里创建一个最小的集合,包括GitLab源码管理系统、Jenkins X持续交付系统、Harbor镜像存储系统。

  • GitLab,使用Git进行版本管理和源码仓库存储,能够与Github.com/oschina.net等交换代码库。
  • Jenkins X,支持基于流程的代码构建,并推送到容器镜像仓库,供Kubernetes部署时使用。
  • Harbor,容器镜像服务用于创建本地的镜像仓库,是Kubernetes部署的必备服务。
    • 最新的Harbor包含有一个Helm Chart仓库管理模块。
    • 也可使用其它的方式(如Github.com)来管理Helm Charts。

更多的参考: