2019-07-10发布:hangge阅读:9593
本文演示如何搭建一个三节点的 Kubernetes Cluster 集群(一个 master 节点和两个 node 节点),并且这三台服务器使用的都是 CentOS 7 系统。
所有的节点都需要安装 Docker,具体步骤可以参考我之前写的文章:
(1)我们需要在所有节点上安装 kubelet、kubeadm 和 kubectl,它们作用分别如下:
(2)依次执行下面命令进行安装这三个工具(为避免出现“网络不可达”错误,这里将谷歌的镜像换成国内镜像):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
对于 RHEL/CentOS 7 系统,可以会由于 iptables 被绕过导致网络请求被错误的路由。所以还需执行如下命令保证 sysctl 配置中 net.bridge.bridge-nf-call-iptables 被设为1。
(1)使用 vi 命令编辑相关文件:
1 |
|
(2)在文件中添加如下内容后,保存退出。
1 2 3 |
|
(3)最后执行如下命令即可:
1 |
|
(1)首先执行如下命令将其关闭:
1 |
|
(2)接着编辑 /etc/fstab 文件。
1 |
|
(3)将 /dev/mapper/centos-swap swap swap default 0 0 这一行前面加个 # 号将其注释掉。
(4)编辑完毕后保存退出。这样机器重启后 swap 便不会又自动打开了。
(1)我们在 Master 上执行如下命令进行初始化:
注意:--pod-network-cidr=10.244.0.0/16 是 k8s 的网络插件所需要用到的配置信息,用来给 node 分配子网段。然后我们这边用到的网络插件是 flannel,就是这么配。
1 |
|
(2)初始化的时候 kubeadm 会做一系列的校验,以检测你的服务器是否符合 kubernetes 的安装条件,检测结果分为 [WARNING] 和 [ERROR] 两种。其中 [ERROR] 部分要予以解决。
(3)比如上图我这里检测到三个 error:
(4)所有 error 解决后,再执行最开始的 init 命令后 kubeadm 就开始安装了。但通常这时还是会报错,这是因为国内 gcr.io 无法访问(谷歌自己的容器镜像仓库),造成镜像下载不下来。
(5)我们可以通过国内厂商提供的 kubernetes 的镜像服务来下载,比如第一个 k8s.gcr.io/kube-apiserver:v1.14.1 镜像,可以执行如下命令从阿里云下载:
1 |
|
(6)镜像下载下来以后再通过 docker tag 命令将其改成kudeadm安装时候需要的镜像名称。
1 |
|
(7)其它缺失的镜像也依照上面步骤进行操作。
(8)镜像全部下载完毕后,再执行最开始的 init 命令后 kubeadm 就能成功安装了。最后一行,kubeadm 会提示我们,其他节点需要加入集群的话,只需要执行这条命令就行了,同时里面包含了加入集群所需要的 token(这个要记下来)。
kubectl 是管理 Kubernetes 集群的命令行工具,前面我们已经在所有的节点安装了 kubectl。Master 初始化安装完后需要做一些配置工作,然后 kubectl 就能使用了。
(1)具体操作就依照前面 kubeadm init 输出的第一个红框内容。这里推荐使用使用普通用户执行 kubectl(root 会有一些问题),首先我们新建个普通用户 hangge,具体方法可以参考我之前写的文章:
(2)切换成 hangge 用户
1 |
|
(3)依次执行如下命令(即前面 kubeadm init 输出的第一个红框内容),为 hangge 用户配置 kubectl:
1 2 3 |
|
(4)为了使用更加便捷,启用 kubectl 命令的自动补全功能。
1 |
|
要让 Kubernetes 集群能够工作,必须安装 Pod 网络,否则 Pod 之间无法通信。(即前面 kubeadm init 输出的第二个红框内容)
Kubernetes 支持多种网络方案,这里我们使用 flannel。执行如下命令即可部署 flannel:
1 |
|
分别执行下面两条命令配置 firewall 防火墙策略,开放相关端口:
1 2 3 4 5 6 7 |
|
(1)在两个 node 节点上分别执行如下命令(即前面 kubeadm init 输出的最后一个红框内容),将其注册到 Cluster 中:
1 |
|
(2)显示如下内容则说明节点添加成功:
(1)在每一个 node 节点上我们还需要下载 quay.io/coreos/flannel:v0.11.0-amd64、k8s.gcr.io/pause 和 k8s.gcr.io/kube-proxy 这三个镜像,其中后面两个镜像具体版本可以执行kubeadm config images list 查看一下:
(2)由于网络问题,后面两个镜像可能没法自动下载下来(第一个可以直接下载)。我们可以通过国内厂商提供的 kubernetes 的镜像服务来下载,再通过 docker tag 命令将其改成kudeadm 需要的镜像名称。
1 2 3 4 5 6 7 |
|
10250 端口是一定要开放的,如果控制节点也要运行容器,也需要开启对应的端口(30000-32767)
1 2 |
|
(1)在 master 节点上执行 kubectl get nodes 查看节点状态:
(2)目前 node 节点还处于 NotReady 状态,这是因为每个节点都需要启动若干组件,这些组件都是在 Pod 中运行,需要首先从 Google 下载镜像。
(3)我们可以通过如下命令查看 Pod 状态。CrashLoopBackOff、ContainerCreating、Init:0/1 等都表明 Pod 没有就绪,只有 Running 才是就绪状态。
1 |
|
(4)我们也可以通过 kubectl describe pod
1 |
|
(5)结果如下,是由于下载 image 时失败。这个可能是网络问题,我们可以继续等待,因为 Kubernetes 会自动重试。当然我们也可以自己手动执行 docker pull 去下载这个镜像。
注意:不一定都是 Master 节点下载镜像失败,还有可能是 node 节点上下载镜像失败,具体是哪里可以看前面部分信息。比如这里的 k8s.gcr.io/pause:3.1 就是 node 节点上没下载下来。
(6)当所有的 Pod 都处于 Running 状态后,可以发现所有的节点也就准备好了。至此 Kubernetes集群创建成功。