【问题标题】:Can't install Kubernetes on Vagrant无法在 Vagrant 上安装 Kubernetes
【发布时间】:2017-10-22 19:53:30
【问题描述】:

使用本指南在 Vagrant 集群上安装 Kubernetes:

https://kubernetes.io/docs/getting-started-guides/kubeadm/

(2/4) Initializing your master,出现了一些错误:

[root@localhost ~]# kubeadm init
[kubeadm] WARNING: kubeadm is in beta, please do not use it for production clusters.
[init] Using Kubernetes version: v1.6.4
[init] Using Authorization mode: RBAC
[preflight] Running pre-flight checks
[preflight] Some fatal errors occurred:
    /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
[preflight] If you know what you are doing, you can skip pre-flight checks with `--skip-preflight-checks`

我查看了/proc/sys/net/bridge/bridge-nf-call-iptables文件内容,里面只有一个0

(3/4) Installing a pod network,我下载了kube-flannel文件:

https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

然后运行kubectl apply -f kube-flannel.yml,出现错误:

[root@localhost ~]# kubectl apply -f kube-flannel.yml
The connection to the server localhost:8080 was refused - did you specify the right host or port?

直到这里,我都不知道该怎么做。

我的Vagrantfile

  # Master Server
  config.vm.define "master", primary: true do |master|
    master.vm.network :private_network, ip: "192.168.33.200"
    master.vm.network :forwarded_port, guest: 22, host: 1234, id: 'ssh'
  end

【问题讨论】:

  • 这是完整的Vagrantfile 有人可以用来重现问题吗?具体来说,尚不清楚您使用的是什么基础映像。另外,kubeadm init 之后还运行了哪些其他命令?如果您可以在您的问题中澄清这一点,以便更容易重现这将是有帮助的。
  • 你使用kubeadm init成功安装master了吗?您是否按照您提到的文档中指定的方式导出了 KUBECONFIG 文件中的位置?
  • @AndyShinn @chaitukopparthi kubeadm init 没问题。它也生成了一个令牌。但现在的问题是无法从节点主机加入到主控主机。我在这里创建了一个新问题:stackoverflow.com/questions/44132179/…

标签: docker vagrant virtualbox kubernetes


【解决方案1】:

为了通过编辑/etc/sysctl.conf来设置/proc/sys/net/bridge/bridge-nf-call-iptables。在那里你可以添加 [1]

net.bridge.bridge-nf-call-iptables = 1

然后执行

sudo sysctl -p

并且将应用更改。有了这个,飞行前检查应该可以通过了。


[1]http://wiki.libvirt.org/page/Net.bridge.bridge-nf-call_and_sysctl.conf

【讨论】:

    【解决方案2】:

    更新@2019/09/02

    有时modprobe br_netfilter 不可靠,您可能需要在重新登录后重做,因此在 systemd 系统上使用以下代码:

    echo br_netfilter > /etc/modules-load.d/br_netfilter.conf
    systemctl restart systemd-modules-load.service
    echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
    echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
    

    是的,接受的答案是正确的,但我遇到了

    无法统计/proc/sys/net/bridge/bridge-nf-call-ip6tables:没有这样的文件或目录

    原来如此

    modprobe br_netfilter
    
    echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
    echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
    sudo sysctl -p
    

    然后解决了。

    【讨论】:

    • 你救了我的命,在发生一些崩溃问题后,k8s 似乎需要这个文件。
    【解决方案3】:

    在 Ubuntu 16.04 上,我只需要:

    modprobe br_netfilter
    

    /proc/sys/net/bridge/bridge-nf-call-iptables 中的默认值已经是 1

    然后我将br_netfilter 添加到/etc/modules 以在下次启动时自动加载模块。

    【讨论】:

      【解决方案4】:

      正如 K8s 文档中提到的 - Installing kubeadm让 iptables 查看桥接流量部分下:

      确保 br_netfilter 模块已加载。这可以做到 通过运行lsmod | grep br_netfilter
      要显式加载它,请调用 sudo modprobe br_netfilter.

      作为您的 Linux 节点的 iptables 正确查看的要求 桥接流量,您应该确保 net.bridge.bridge-nf-call-iptables 在您的 sysctl 中设置为 1 配置,例如

      cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
      net.bridge.bridge-nf-call-ip6tables = 1
      net.bridge.bridge-nf-call-iptables = 1
      EOF
      sudo sysctl --system
      

      关于预检错误 - 您可以在 preflight-checks 下的 Kubeadm Implementation details 中看到:

      Kubeadm 在启动 init 之前执行一组预检检查, 旨在验证先决条件并避免常见的集群启动 问题..

      以下缺少的配置会产生错误:

      .
      .
      if /proc/sys/net/bridge/bridge-nf-call-iptables file does not exist/does not contain 1
      
      if advertise address is ipv6 and /proc/sys/net/bridge/bridge-nf-call-ip6tables does not exist/does not contain 1.
      
      if swap is on
      .
      .
      

      【讨论】:

        猜你喜欢
        • 2016-12-13
        • 2015-10-07
        • 2019-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多