Kubernetes v1.13 版本的文档已不再维护。您现在看到的版本来自于一份静态的快照。如需查阅最新文档,请点击 最新版本。

Edit This Page

Fedora (多节点)

本文档描述了如何在多个主机上部署 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 主节点上执行以下命令

Note:

选择一个不在公共 IP 地址范围内的 IP 范围。

将配置添加到 fed-master 上的 etcd 服务器。

etcdctl set /coreos.com/network/config < flannel-config.json

节点设置

在所有 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 配置

现在检查节点上的接口。请注意,现在有一个 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)

反馈