目前基于容器管理的Kubernetes 已经占住了80%的市场份额,基本上以成为该领域的标准,由于国内网络环境的影响,让kubernetes搭建成了一道技术难题,下面就一步一步教大家如何去搭建kubernetes集群,本文所有的组件均采用的是最新版。

一、kubeadm 介绍

Kubernetes 是 Google 开源的基于 Docker 的容器集群管理系统,通过 yaml 语言写的配置文件,简单快速的就能自动部署好应用环境,支持应用横向扩展,并且可以组织、编排、管理和迁移这些容器化的应用。Kubeadm 是一个可以快速帮助我们创建稳定集群服务的工具,通过它,我们可以在虚拟机、实体机或者云端快速部署一个高可用的集群服务。

二、环境、软件准备

安装之前,先介绍下 Kubeadm 安装 kubernetes 需要的一些基本硬件要求。

  • 系统要求,支持的系统 Ubuntu 16.04+、 CentOS 7 、HypriotOS v1.0.1+
  • 内存要求,每台机器至少要有 1GB 内存,否则集群启动后,留给运行的应用可用内存就很少了。
  • 网络要求,保证集群内所有机器之前的网络是可以互相连通的。

本次演示我准备了两台系统为 CentOS Linux 7 (Core) 的虚拟机,一台作为 Master,一台作为 Node,默认 Master 机器不参与 Pod 调度。集群机器信息如下:

三、初始化工作

1、安装 ebtables ethtool,否则后边执行 kubeadm init 的时候会报错。

yum install ebtables ethtool

2、修改网络开启桥接网络支持,只针对(RHEL/CentOS 7)系统。

vim /usr/lib/sysctl.d/00-system.conf 
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

3、关闭 SELinux,目的为了允许容器能够与本机文件系统交互。

$ setenforce 0
$ systemctl daemon-reload

4、修改节点的 hostname,因为 kubernetes 是根据 hostname 来标示各节点的。

# Master 节点
$ echo "master.localdomain" > /etc/hostname
$ echo "10.236.65.125 master.localdomain" >> /etc/hosts
$ sysctl kernel.hostname=master.localdomain # 不重启情况下使内核修改生效

5、关闭swapoff

swapoff -a

四、软件安装配置

我们知道 kubernetes 环境底层是依赖 Docker 的,所以这里软件安装包括了 Docker 安装, kubelet、kubeadm、kubectl 组件安装,以及一些初始化配置工作。

Master 和 Node 节点由于分工不一样,所以安装的服务不同,最终安装完毕,Master 和 Node 启动的核心服务分别如下:

五、镜像准备

针对国内镜像环境,我指定了一个脚本,执行该脚本即可,pull 不下来多执行几次就好了

#!/bin/bash
images=(kube-proxy-amd64:v1.10.1 kube-scheduler-amd64:v1.10.1 kube-controller-manager-amd64:v1.10.1 kube-apiserver-amd64:v1.10.1
etcd-amd64:3.2.18 pause-amd64:3.1 kubernetes-dashboard-amd64:v1.8.3 k8s-dns-sidecar-amd64:1.14.10 k8s-dns-kube-dns-amd64:1.14.10
k8s-dns-dnsmasq-nanny-amd64:1.14.10)
for imageName in ${images[@]} ; do
 docker pull longhuixuan/$imageName
 docker tag longhuixuan/$imageName k8s.gcr.io/$imageName
 docker rmi longhuixuan/$imageName
done

六、安装 Docker

每台机器都需要安装 Docker,我这里安装的是1.13版本。

$ yum install -y docker
# 设置开启启动并启动服务
$ systemctl enable docker && systemctl start docker

如出现以下错误

Error starting daemon: SELinux is not supported with the overlay2 graph driver on this kernel. Either boot into a newer kernel or disable selinux in docker (--selinux-enabled=false)
vim /etc/sysconfig/docker
# Modify these options if you want to change the way the docker daemon runs
OPTIONS='--selinux-enabled=false --log-driver=journald --signature-verification=false'
if [ -z "${DOCKER_CERT_PATH}" ]; then
 DOCKER_CERT_PATH=/etc/docker
fi

修改Docker cgroup 的驱动为 cgroupfs

$ vim /usr/lib/systemd/system/docker.service
cgroupdriver=cgroupfs

七、安装并配置 kubernetes 组件

需要安装的 kubernetes 组件主要有 kubelet、kubeadm、kubectl 这几个。针对可以翻墙的用户可以 yum 配置 kubernetes 官方源:

vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
#gpgcheck=1
gpgcheck=0
#设置完成后,安装kubelet、kubeadm、kubectl 组件
$ yum install -y kubelet kubeadm kubectl
# 设置开机启动,以及启动各组件
$ systemctl enable kubelet && systemctl start kubelet

安装完毕后,我们还需要配置一下 kubelet,主要修改配置文件 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf中的 KUBELET_CGROUP_ARGS=cgroupfs配置。

这里要特别强调一下,一定要修改kubelet 和 docker 的驱动为cgroupfs,修改后 reload 一下服务

$ systemctl daemon-reload

八、初始化启动 Master

kubeadm init --kubernetes-version=v1.10.1 --pod-network-cidr=10.96.0.0/12

配置完主机后,我们可以启动 Master 节点了。在执行初始化 init 时,kubernetes 并没有选择默认的 Pod Network,它支持很多种,这里我们选择 Flannel 作为 Pod Network,按照文档说明,执行 init 时,需要带上参数 --pod-network-cidr,即指定网络区间,同时我们也可以通过 --kubernetes-version指定选择 kubernetes 的版本号

九、在master 节点下安装 Flannel 网络组件

kubernetes 提供了很多种网络组件选择,有 Calia、Canal、Flannel、Kube-router、Romana、Weave Net 可以使用,具体使用可以参考 官方文档 (3/4) Installing a pod network 来操作,这里我们选择 Flannel 作为网络组件。

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.0/Documentation/kube-flannel.yml

安装完毕后,我们稍等一会再来查看下 pod 列表,看是不是都是Running状态。

十、安装kubernates-dashboard

1、生成证书

openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt
openssl req -newkey rsa:4096 -nodes -sha256 -keyout weishuichao.key -out weishuichao.csr
openssl x509 -req -in weishuichao.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out weishuichao.crt
2、导入证书到kube-system
kubectl create secret generic kubernetes-dashboard-certs --from-file=/data/cert -n kube-system
3、创建kubernetes-dashboard.yaml
kubectl apply -f /data/k8s/kubernetes-dashboard.yaml

配置在官网的基础上需要加上下面配置ClusterRoleBinding,用以配置权限,这样通过token登陆进去才不至于没有权限

# ------------------- Dashboard ClusterRoleBinding ------------------- #
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
 name: kubernetes-dashboard
subjects:
 - kind: ServiceAccount
 name: kubernetes-dashboard
 namespace: kube-system
roleRef:
 kind: ClusterRole
 name: cluster-admin
 apiGroup: rbac.authorization.k8s.io

kubernetes采用暴露端口的方式使用,增加一下配置

4、获取kube-system 的secret

kubectl -n kube-system get secret

5、查看token,这个token 是用于登陆使用的

kubectl -n kube-system describe secret kubernetes-dashboard-token-2qmtr

6、访问dashboard

https://192.168.2.107:31000 输入令牌,进入dashboard主页

十一、建立机器互信

1、在每台服务器需要建立主机互信的用户名执行以下命令生成公钥/密钥,默认回车即可

$
 ssh-keygen -t rsaGenerating public/private rsa key pair.Enter file in 
which to save the key (/root/.ssh/id_rsa):Created directory 
'/root/.ssh'.Enter passphrase (empty for no passphrase):Enter same 
passphrase again:Your identification has been saved in 
/root/.ssh/id_rsa.Your public key has been saved in 
/root/.ssh/id_rsa.pub.The key fingerprint 
is:0c:1f:76:aa:80:b2:2f:b9:9a:6a:48:96:9d:8f:a1:cc root@cctvyyycns04The 
key's randomart image is:+--[ RSA 2048]----+| || || . o . || . = + ||. +
 o S || * + . . ||B.. + . ||+E . . ||Oo. |+-----------------+

2、互传公钥,第一次需要输入密码,之后就OK了



$ ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.199.132



可以看到是在.ssh/下生成了个authorized_keys的文件,记录了能登陆这台服务器的其他服务器的公钥

3、测试是否能登陆


$ ssh 192.168.199.132


十二、生成join token

kubeadm token create --print-join-command
把Node加入到master中去
kubeadm join 192.168.2.107:6443 --token uakb7l.mg4j5vprx87o1w4c --discovery-token-ca-cert-hash sha256:a0f50e9bb2fe44511b2ad068e65a1c903ab08cac0aa4329a0c1c70aff57b9cc0