如何调试kubectl申请kube-flannel.yml?

时间:2017-12-05 19:24:00

标签: kubernetes flannel

我正在尝试按照以下文档创建一个kubernetes集群:https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/

首先,我在VirtualBox中使用Vagrant在Coreos(1520.9.0)上安装了带有docker镜像的kubeadm:

docker run -it \
    -v /etc:/rootfs/etc \
    -v /opt:/rootfs/opt \
    -v /usr/bin:/rootfs/usr/bin \
    -e K8S_VERSION=v1.8.4 \
    -e CNI_RELEASE=v0.6.0 \
    xakra/kubeadm-installer:0.4.7 coreos

这是我的kubeadm init:

kubeadm init --pod-network-cidr=10.244.0.0/16

运行命令时:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

它返回:

clusterrole "flannel" configured
clusterrolebinding "flannel" configured
serviceaccount "flannel" configured
configmap "kube-flannel-cfg" configured
daemonset "kube-flannel-ds" configured

但如果我检查“kubectl get pods --all-namespaces”

它返回:

NAMESPACE     NAME                              READY     STATUS             RESTARTS   AGE
kube-system   etcd-coreos1                      1/1       Running            0          18m
kube-system   kube-apiserver-coreos1            1/1       Running            0          18m
kube-system   kube-controller-manager-coreos1   0/1       CrashLoopBackOff   8          19m
kube-system   kube-scheduler-coreos1            1/1       Running            0          18m

使用journalctl -f -u kubelet我可以看到此错误:Unable to update cni config: No networks found in /etc/cni/net.d

我怀疑命令kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

出错了

有没有办法知道为什么这个命令不起作用?我可以从任何地方获取一些日志吗?

1 个答案:

答案 0 :(得分:4)

就在今晚,我使用kubespray在CoreOS上使用法兰绒(vxlan)来设置一个流浪群,而且我也对法兰绒如何成为Kubernetes中的Pod感到困惑

事实证明,as seen here他们正在使用flannel-cni图片from quay.io使用法兰绒侧车加上hostDir音量调整来写出CNI文件;它输出cni-conf.json(配置CNI使用法兰绒),然后net-conf.json(配置法兰绒使用的子网和后端)。

我希望jinja2胡子语法不会混淆答案,但我发现看到Kubernetes人如何选择“真实地”进行比较并与之对照DaemonSet进行对比非常有趣flannel-cni自述文件。我想这是很长的说法:尝试flannel-cni README中的描述符,然后如果它不起作用,看看它们是否与已知工作的kubespray设置有所不同

更新:作为具体示例,请注意the Documentation yaml不包含--iface=开关,如果您的Vagrant设置同时使用NAT和“private_network”,那么它可能意味着法兰绒绑定到eth0(NAT一个)而不是eth1绑定更多的静态IP。我在文档中看到了这个警告,但不能立即回想起为什么要引用它

更新2

  

有没有办法知道为什么这个命令不起作用?我可以从任何地方获取一些日志吗?

可能几乎总是以相同的方式访问Pod的日志(甚至是静态定义的日志,例如kube-controller-manager-coreos1):kubectl --namespace=kube-system logs kube-controller-manager-coreos1,并且在CrashLoopBackOff情况下,添加{{1对于“-p”revious将显示最近崩溃的日志(但只有​​几秒钟,而不是无限期),偶尔-p将在底部的“事件”部分显示有用的信息,或者在顶部附近的“状态”块中,如果它是因为原因终止

如果出现非常糟糕的故障,例如apiserver未能出现(因此kubectl --namespace=kube-system describe pod kube-controller-manager-coreos1将不会执行任何操作),则使用{{1的混合物ssh到节点和kubectl logs尝试查看任何错误文本。在后一种情况下,您几乎肯定需要journalctl -u kubelet.service --no-pager --lines=150才能找到已退出的容器的sha或名称,但同样“仅持续几秒钟”也适用,因为死容器将在一段时间后被修剪。

在流浪者的情况下,可以通过以下几种方式之一进入VM:

  • docker logs ${the_sha_or_name}
  • docker ps -a
  • 或者如果它有一个“private_network”地址,例如192.168.99.101等,那么你通常可以vagrant ssh coreos1,但前两个中的一个几乎总是更方便