大家好,我们即将开始学习使用kubeadm搭建Kubernets集群。在开始之前,我们要完成一些准备工作。
在之前的文章中,我们了解了 k8s 的基本概念与⼏个主要的组件,实际上我们在了解了 k8s 的基本概念过后,就可以去正式使⽤了,现在我们⾃⼰来⼿动搭建⼀套 k8s 的环境,在搭建环境之前,先来看⼀张更丰富的 k8s 的架构图。
在更进⼀步了解了 k8s 集群的架构后,我们就可以来正式安装我们的 k8s 集群环境了,我们这⾥使⽤的是 kubeadm ⼯具来进⾏集群的搭建。
kubeadm是 Kubernetes 官⽅提供的⽤于快速安装 Kubernetes 集群的⼯具,通过将集群的各个组件进 ⾏容器化安装管理,通过 kubeadm 的⽅式安装集群⽐⼆进制的⽅式安装要⽅便不少,但是⽬ 录 kubeadm 还处于 beta 状态,还不能⽤于⽣产环境,Using kubeadm to Create a Cluster ⽂档中已经说明 kubeadm 将会很快能够⽤于⽣产环境了。
我们这⾥准备两台 Centos7 的主机⽤于安装,后续节点可以根究需要添加即可:
$ cat /etc/hosts
10.151.30.57 master
10.151.30.62 node01
禁用防火墙:
$ systemctl stop firewalld
$ systemctl disable firewalld
禁用SELINUX:
$ setenforce 0
$ cat /etc/selinux/config
SELINUX=disabled
创建 /etc/sysctl.d/k8s.conf ⽂件,添加如下内容:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
执行如下命令使修改生效:
$ modprobe br_netfilter
$ sysctl -p /etc/sysctl.d/k8s.conf
如果你的节点上⾯有科学上⽹的⼯具,可以忽略这⼀步,我们需要提前将所需的 gcr.io 上⾯的镜像下 载到节点上⾯,当然前提条件是你已经成功安装了`docker。master节点,执⾏下⾯的命令:
docker pull cnych/kube-apiserver-amd64:v1.10.0
docker pull cnych/kube-scheduler-amd64:v1.10.0
docker pull cnych/kube-controller-manager-amd64:v1.10.0
docker pull cnych/kube-proxy-amd64:v1.10.0
docker pull cnych/k8s-dns-kube-dns-amd64:1.14.8
docker pull cnych/k8s-dns-dnsmasq-nanny-amd64:1.14.8
docker pull cnych/k8s-dns-sidecar-amd64:1.14.8
docker pull cnych/etcd-amd64:3.1.12
docker pull cnych/flannel:v0.10.0-amd64
docker pull cnych/pause-amd64:3.1
docker tag cnych/kube-apiserver-amd64:v1.10.0 k8s.gcr.io/kube-apiserver-amd64:v1.10.0
docker tag cnych/kube-scheduler-amd64:v1.10.0 k8s.gcr.io/kube-scheduler-amd64:v1.10.0
docker tag cnych/kube-controller-manager-amd64:v1.10.0 k8s.gcr.io/kube-controller-manager-
amd64:v1.10.0
docker tag cnych/kube-proxy-amd64:v1.10.0 k8s.gcr.io/kube-proxy-amd64:v1.10.0
docker tag cnych/k8s-dns-kube-dns-amd64:1.14.8 k8s.gcr.io/k8s-dns-kube-dns-amd64:1.14.8
docker tag cnych/k8s-dns-dnsmasq-nanny-amd64:1.14.8 k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64
:1.14.8
docker tag cnych/k8s-dns-sidecar-amd64:1.14.8 k8s.gcr.io/k8s-dns-sidecar-amd64:1.14.8
docker tag cnych/etcd-amd64:3.1.12 k8s.gcr.io/etcd-amd64:3.1.12
docker tag cnych/flannel:v0.10.0-amd64 quay.io/coreos/flannel:v0.10.0-amd64
docker tag cnych/pause-amd64:3.1 k8s.gcr.io/pause-amd64:3.1
可以将上⾯的命令保存为⼀个 shell 脚本,然后直接执⾏即可。这些镜像是在 master 节点上需要使⽤到的镜像,⼀定要提前下载下来。其他Node,执⾏下⾯的命令:
docker pull cnych/kube-proxy-amd64:v1.10.0
docker pull cnych/flannel:v0.10.0-amd64
docker pull cnych/pause-amd64:3.1
docker pull cnych/kubernetes-dashboard-amd64:v1.8.3
docker pull cnych/heapster-influxdb-amd64:v1.3.3
docker pull cnych/heapster-grafana-amd64:v4.4.3
docker pull cnych/heapster-amd64:v1.4.2
docker pull cnych/k8s-dns-kube-dns-amd64:1.14.8
docker pull cnych/k8s-dns-dnsmasq-nanny-amd64:1.14.8
docker pull cnych/k8s-dns-sidecar-amd64:1.14.8
docker tag cnych/flannel:v0.10.0-amd64 quay.io/coreos/flannel:v0.10.0-amd64
docker tag cnych/pause-amd64:3.1 k8s.gcr.io/pause-amd64:3.1
docker tag cnych/kube-proxy-amd64:v1.10.0 k8s.gcr.io/kube-proxy-amd64:v1.10.0
docker tag cnych/k8s-dns-kube-dns-amd64:1.14.8 k8s.gcr.io/k8s-dns-kube-dns-amd64:1.14.8
docker tag cnych/k8s-dns-dnsmasq-nanny-amd64:1.14.8 k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64
:1.14.8
docker tag cnych/k8s-dns-sidecar-amd64:1.14.8 k8s.gcr.io/k8s-dns-sidecar-amd64:1.14.8
docker tag cnych/kubernetes-dashboard-amd64:v1.8.3 k8s.gcr.io/kubernetes-dashboard-amd64:v
1.8.3
docker tag cnych/heapster-influxdb-amd64:v1.3.3 k8s.gcr.io/heapster-influxdb-amd64:v1.3.3
docker tag cnych/heapster-grafana-amd64:v4.4.3 k8s.gcr.io/heapster-grafana-amd64:v4.4.3
docker tag cnych/heapster-amd64:v1.4.2 k8s.gcr.io/heapster-amd64:v1.4.2
上⾯的这些镜像是在 Node 节点中需要⽤到的镜像,在 join 节点之前也需要先下载到节点上⾯。
在确保 docker 安装完成后,上⾯的相关环境配置也完成了,对应所需要的镜像(如果可以科学上⽹可以跳过这⼀步)也下载完成了,现在我们就可以来安装 kubeadm 了,我们这⾥是通过指定yum 源的⽅式来进⾏安装的:
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
当然了,上⾯的 yum 源也是需要科学上⽹的,如果不能科学上⽹的话,我们可以使⽤阿⾥云的源进⾏安装:
⽬前阿⾥云的源最新版本已经是1.10.2版本,所以可以直接安装,由于我们上⾯的相关镜像是关联的 1.10版本,所以我们安装的时候需要指定版本。yum 源配置完成后,执⾏安装命令即可:
$ yum makecache fast && yum install -y kubelet-1.10.0-0 kubeadm-1.10.0-0 kubectl-1.10.0-0
正常情况我们可以都能顺利安装完成上⾯的⽂件。
安装完成后,我们还需要对 kubelet 进⾏配置,因为⽤ yum 源的⽅式安装的 kubelet ⽣成的配置⽂ 件将参数 --cgroup-driver 改成了 systemd ,⽽ docker 的 cgroup-driver 是 cgroupfs ,这⼆者必须 ⼀致才⾏,我们可以通过 docker info 命令查看:
$ docker info |grep Cgroup
Cgroup Driver: cgroupfs
修改⽂件 kubelet 的配置⽂件 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf ,将其中 的 KUBELET_CGROUP_ARGS 参数更改成 cgroupfs :
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=cgroupfs"
另外还有⼀个问题是关于交换分区的,之前我们在⼿动搭建⾼可⽤的 kubernetes 集群⼀⽂中已经提到 过,Kubernetes 从1.8开始要求关闭系统的 Swap ,如果不关闭,默认配置的 kubelet 将⽆法启动,我 们可以通过 kubelet 的启动参数 --fail-swap-on=false 更改这个限制,所以我们需要在上⾯的配置⽂ 件中增加⼀项配置(在 ExecStart 之前):
Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"
当然最好的还是将 swap 给关掉,这样能提⾼ kubelet 的性能。修改完成后,重新加载我们的配置⽂件 即可:
$ systemctl daemon-reload