本文档描述了如何在多个主机上部署 Kubernetes 来建立一个多节点集群和 flannel 网络。遵循 fedora 入门指南设置 1 个主节点 (fed-master) 和 2 个或更多节点。确保所有节点具有不同的名称(fed-node1、fed-node2 等等)和标签(fed-node1-label、fed-node2-label 等等),以避免 任何冲突。还要确保 Kubernetes 主节点主机正在运行 etcd、kube-controller-manager、kube-scheduler 和 kube-apiserver 服务,节点正在 运行 docker、kube-proxy 和 kubelet 服务。现在在 Kubernetes 节点上安装 flannel。每个节点上的 flannel 配置 docker 使用的 overlay 网络。 Flannel 在每个节点上运行,以设置一个唯一的 class-C 容器网络。
安装 Fedora 您需要两台或更多机器。
在 Kubernetes 主节点上执行以下命令
flannel-config.json
来配置 flannel。Flannel 在其他 overlay 网络后端选项中提供 udp 和 vxlan 。在本指南中,我们选择基于内核的 vxlan 后端。json 的内容为:{
"Network": "18.16.0.0/16",
"SubnetLen": 24,
"Backend": {
"Type": "vxlan",
"VNI": 1
}
}
Note:选择一个不在公共 IP 地址范围内的 IP 范围。
将配置添加到 fed-master 上的 etcd 服务器。
etcdctl set /coreos.com/network/config < flannel-config.json
etcdctl get /coreos.com/network/config
在所有 Kubernetes 节点上执行以下命令
安装 flannel 包
# dnf -y install flannel
编辑 flannel 配置文件 /etc/sysconfig/flanneld,如下所示:
# Flanneld 配置选项
# etcd url 位置,将此指向 etcd 运行的服务器
FLANNEL_ETCD="http://fed-master:2379"
# etcd 配置的键。这是 flannel 查询的配置键
# 用于地址范围分配
FLANNEL_ETCD_KEY="/coreos.com/network"
# 您想要传递的任何附加选项
FLANNEL_OPTIONS=""
Note:默认情况下,flannel 使用默认路由的接口。如果您有多个接口并且想要使用默认路由以外的接口,则可以将 “-iface=” 添加到 FLANNEL_OPTIONS。有关其他选项,请在命令行上运行
flanneld --help
。
启用 flannel 服务。
systemctl enable flanneld
如果 docker 没有运行,那么启动 flannel 服务就足够了,跳过下一步。
systemctl start flanneld
如果 docker 已经运行,则停止 docker,删除 docker bridge(docker0),启动 flanneld 并重新启动 docker,如下所示。另一种方法是重启系统(systemctl reboot)。
systemctl stop docker
ip link delete docker0
systemctl start flanneld
systemctl start docker
现在检查节点上的接口。请注意,现在有一个 flannel.1 接口,docker0 和 flannel.1 接口的 ip 地址在同一个网络中。您会注意到 docker0 在上面配置的 IP 范围之外的每个 Kubernetes 节点上分配了一个子网(18.16.29.0/24,如下所示)。 正常运行的输出应如下所示:
# ip -4 a|grep inet
inet 127.0.0.1/8 scope host lo
inet 192.168.122.77/24 brd 192.168.122.255 scope global dynamic eth0
inet 18.16.29.0/16 scope global flannel.1
inet 18.16.29.1/24 scope global docker0
从集群中的任何节点,通过 curl 向 etcd 服务器发出查询来检查集群成员(仅显示部分输出 grep -E "\{|\}|key|value
)。如果您设置了 1 个主节点和 3 个节点集群,您应该会看到每个节点都有一个块,显示分配给它们的子网。您可以通过输出中列出的 MAC 地址(VtepMAC)和 IP 地址(公共 IP) 将这些子网关联到每个节点。
curl -s http://fed-master:2379/v2/keys/coreos.com/network/subnets | python -mjson.tool
{
"node": {
"key": "/coreos.com/network/subnets",
{
"key": "/coreos.com/network/subnets/18.16.29.0-24",
"value": "{\"PublicIP\":\"192.168.122.77\",\"BackendType\":\"vxlan\",\"BackendData\":{\"VtepMAC\":\"46:f1:d0:18:d0:65\"}}"
},
{
"key": "/coreos.com/network/subnets/18.16.83.0-24",
"value": "{\"PublicIP\":\"192.168.122.36\",\"BackendType\":\"vxlan\",\"BackendData\":{\"VtepMAC\":\"ca:38:78:fc:72:29\"}}"
},
{
"key": "/coreos.com/network/subnets/18.16.90.0-24",
"value": "{\"PublicIP\":\"192.168.122.127\",\"BackendType\":\"vxlan\",\"BackendData\":{\"VtepMAC\":\"92:e2:80:ba:2d:4d\"}}"
}
}
}
从所有节点,查看 /run/flannel/subnet.env
文件。这个文件是由 flannel 自动生成的。
# cat /run/flannel/subnet.env
FLANNEL_SUBNET=18.16.29.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=false
此时,我们在 Kubernetes 主节点上运行了 etcd,在 Kubernetes 节点上运行了 flannel / docker。接下来的步骤是测试跨主机容器通信,这将确认 docker 和 flannel 配置正确。
在任意两个节点上发出以下命令:
# docker run -it fedora:latest bash
bash-4.3#
您将会进入容器中。安装 iproute 和 iputils 包来安装 ip 和 ping 实用程序。由于一个错误,需要修改 ping 二进制文件的功能来处理”操作不允许”错误。
bash-4.3# dnf -y install iproute iputils
bash-4.3# setcap cap_net_raw-ep /usr/bin/ping
现在记下第一个节点上的 IP 地址:
bash-4.3# ip -4 a l eth0 | grep inet
inet 18.16.29.4/24 scope global eth0
还要注意另一个节点上的 IP 地址:
bash-4.3# ip a l eth0 | grep inet
inet 18.16.90.4/24 scope global eth0
现在从第一个节点 ping 到另一个节点:
bash-4.3# ping 18.16.90.4
PING 18.16.90.4 (18.16.90.4) 56(84) bytes of data.
64 bytes from 18.16.90.4: icmp_seq=1 ttl=62 time=0.275 ms
64 bytes from 18.16.90.4: icmp_seq=2 ttl=62 time=0.372 ms
现在,Kubernetes 多节点集群通过 flannel 设置 overlay 网络。
IaaS 供应商 | 配置 管理 | 系统 | 网络 | 文档 | 标准 | 支持级别 |
---|---|---|---|---|---|---|
Bare-metal | custom | Fedora | flannel | docs | Community (@aveshagarwal) | |
libvirt | custom | Fedora | flannel | docs | Community (@aveshagarwal) | |
KVM | custom | Fedora | flannel | docs | Community (@aveshagarwal) |
此页是否对您有帮助?
Thanks for the feedback. If you have a specific, answerable question about how to use Kubernetes, ask it on Stack Overflow. Open an issue in the GitHub repo if you want to report a problem or suggest an improvement.