Kubernetes 集群搭建
Kubernetes 实践 主要记录一些自己的一些部署实践。
1 虚拟机集群搭建
目标:创建 3 个虚拟机,用作一个 Master Node,两个 Work Node;当然,三个节点处于同一个网段。 具体步骤如下:
-
构建节点
构建三个虚拟机,基于 centos 7、内存 2 GB,并通过虚拟机复制功能(其实就是 copy 系统盘),完全复制出 Node 1,Node 2,Node 3。
-
搭建网络
三个节点需要互相访问,所以将其位于 VirtualBox 创建的 Nat网络下,给予每个 Node 静态的 IP(10.0.2.10 - 10.0.2.12),为了方便访问,并设置 ssh 的 DNAT。
设置每个虚拟机网卡加入其创建的 “NodeNatNetwork”。例如:
启动每个虚拟机,设置其 hostname,与网卡静态 IP。例如:
至此,三个虚拟机位于同一个网段,并且能够相互访问;对外,则通过 VirtualBox 的 Nat 网络能够访问。
2 部署 K8s
目标:通过 kubeadm 部署整个 k8s,用 Node-1 为 Master 节点,其他为工作节点。
2.1 安装 kubeadm、kubelet、kubectl
安装 kubeadm、kubelet、kubectl。这个官方文档写的很详细,见 Installing kubeadm 。
2.2 kubeadm init 初始化 Master 节点
Node-1 节点执行 kubeadm init,将其作为 Master 节点初始化。执行成功后,kubeadm 生成了 Kubernetes 组件的各个配置,以及提供服务的各类证书,位于 /etc/kubernetes 目录下:
并且已经以 static pod 的形式启动了:apiserver、controller-manager、etcd、scheduler。
还有最重要的,kubeadm 为集群生成一个【bootstrap token】,需要加入集群的节点都需要通过这个 token 加入。
* 问题
- kubeadm 检查 swap 打开着,kubeadm 推荐不使用 swap,通过
swapoff -a
关闭交换区。
- kubectl 默认通过 8080 端口访问,无法执行。 设置 kubectl 的配置文件为 kubeadm 生成的 /etc/kubernetes/admin.conf。(其实就是配置公钥,或者将 admin.conf 移动到 ~/.kube/config 文件,作为默认配置。
2.3 kubeadm join [token] 设置工作节点
通过 kubead init 最后返回的提示信息,执行对应 kubeadm join
将 Node-1 Node-2 加入到集群中,作为工作节点。
|
|
可以看到,kubelet 启动后就通过 pod 方式启动了本节点上 kube-proxy 容器:
* 问题
- 无法访问到 Node-1 节点,nc ip 失败,但是可以 ping 通。通过在 Node-1
tcpdump
可以抓取到来自 Node-3 的包,因此应该是防火墙的问题,通过iptables
对 Node-2 Node-3 IP 开放。 - kubectl 无法访问问题,与上述问题一致。
2.4 结果
目前为止,就完成了集群的搭建,但是 通过 kubectl get nodes,可以看到所有节点都是 NotReady:
kubectl describe node node-1
可以看到,原因是因为没有设置正确的 Network Plugin:
3 部署网络插件
目的:部署网络插件,使各个节点为 Ready 状态,并其内部 Pod 能够相互通信。
以 Weave 部署为例,部署网络插件:
|
|
其描述文件中定义所有 Weave 需要的 BAAC 权限组件,以及最重要的网络插件 Pod 对应的 DaemonSet:
应用成功后,可以看到对应的 DaemonSet 就运行起来,并开始给三个 Node 部署 Pod:
在节点上,可以看到 weave-net 对应的 pod ,包括两个容器:
4 部署容器存储插件
目的:为了能够让容器使用网络存储,使得容器数据持久化,需要部署存储插件。
以 Rook 项目为例,部署存储插件:
|
|
安装成功后,可以看到,rook 有着自己的 namespace,并且已经部署了 DaemonSet:
可以看到,Pod 也部署成功了: