查看集群各服务的进程是都在正常运行
kubectl get cs -o wide
kubectl get nodes -o wide
kubectl get svc kubernetes

容器一直在 pendding,node 节点的负载却很低
kube-scheduler 负责调度,查看这个服务的日志

node 节点无法访问 CLUSTER-IP 和 端口不通
看 kube-proxy 的日志,如果出现 “Failed to list *core.Endpoints: endpoints is forbidden: User “system:node:foo” cannot list endpoints at the cluster scope” ,则是 RBAC 的原因。
kube-proxy 没有权限访问 apiserver 的相应接口,导致获取不到 CLUSTER-IP,从而无法配置 iptables 策略导致访问失败。

cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: system:kube-nodes
namespace: “”
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:node-proxier
subjects:

  • apiGroup: rbac.authorization.k8s.io
    kind: Group
    name: system:nodes
    EOF
    kubernets 1.10 完整的 rbac.yaml

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
annotations:
rbac.authorization.kubernetes.io/autoupdate: “true”
labels:
kubernetes.io/bootstrapping: rbac-defaults
name: system:kube-apiserver-to-kubelet
rules:

  • apiGroups:
    • “”
      resources:
    • nodes/proxy
    • nodes/stats
    • nodes/log
    • nodes/spec
    • nodes/metrics
      verbs:
    • “*”

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: system:kube-apiserver
namespace: “”
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:kube-apiserver-to-kubelet
subjects:

  • apiGroup: rbac.authorization.k8s.io
    kind: User
    name: kubernetes

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: system:kube-nodes
namespace: “”
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:node-proxier
subjects:

  • apiGroup: rbac.authorization.k8s.io
    kind: Group
    name: system:nodes

flannel E0329 报错
E0329 14:33:39.634406 1 vxlan_network.go:158] failed to add vxlanRoute (10.244.0.0/24 -> 10.244.0.0): invalid argument
其他网卡的 ip 地址设置和 flannel 的网段冲突了。

flannel 或 calico 网络问题:相同主机上的 node 与 pod 互通,跨主机的 node 和 pod 不通,跨主机的 pod 和 pod 不通。其他情况都正常。
原因: 使用了 bridge 模块,导致跨主机不通。删除所有 node 节点的 /etc/cni/net.d/10-bridge.conf 文件,并重启所有 node 系统。

并没有使用 bridge 模块,跨主机网络还是不通
flannel: host-gw 或 vxlan+DirectRouting
calico: 关闭 ipip
kube-router
以上三种网络情况,我也遇到过跨主机网络不通的情况,主机 A ping 主机 B 上的容器,容器有回包,但是只到了主机B,之后就被丢弃了。问题没有直接解决。
绕过的办法:
flannel: vxlan 模式,不要开启 DirectRouting (默认就是这样设置的)
calico: 开启 ipip 模式 (默认就是这样设置的)
cilium:vxlan 模式(默认设置)

calico-node 使用官网推荐的办法无法启动成功,报错提示 Calico node ‘foo’ is already using the IPv4 address 10.244.0.1.
原因:calico-node 检测 ip 地址的时候,判断不准确。 解决方法: 在 calico.yml 中,autodetect 下面增加 IP_AUTODETECTION_METHOD :

        # Auto-detect the BGP IP address.
        - name: IP
          value: "autodetect"
        - name: IP_AUTODETECTION_METHOD
          value: "can-reach=8.8.8.8"

以下内容可以不加,不加上也不会报错。

        # Set noderef for node controller.
        - name: CALICO_K8S_NODE_REF
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: NODENAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName

这个解决方法也是受 https://mritd.me/2017/07/31/calico-yml-bug/ 启发,再各种查资料综合而来。
如果服务器有外网网卡和内网网卡,需要把上面的 8.8.8.8 替换为内网网段的地址。

Flannel 宿主网络
如果宿主机不超过200台的中小规模的集群,尽可能所有宿主机使用相同的vlan,
flannel 使用 vxlan ,并开启 DirectRouting (替代默认的 vxlan )
kube-flannel.yaml 中 增加一行 “DirectRouting”: true,

net-conf.json: |
{
“Network”: “10.244.0.0/16”,
“Backend”: {
“DirectRouting”: true,
“Type”: “vxlan”
}
}
Flannel 开启 DirectRouting 后,pod 不通
待解决。目前设置的是 “DirectRouting”: false, 来绕过这个问题。

Calico 网络
如果宿主机不超过200台的中小规模的集群,尽可能所有宿主机使用相同的vlan,
calico 使用 CALICO_IPV4POOL_IPIP 设为 Off ( Off, Always, CrossSubnet )
对于不同网段的宿主机,再部署一台 RR 节点

IPVS 模式取代 IPTABLES
在大量的 services 时,IPVS 效率显著提升。kube-proxy 的参数设置为

–ipvs-scheduler=wrr --ipvs-min-sync-period=5s --ipvs-sync-period=5s --proxy-mode=ipvs
参考
http://www.lijiaocn.com/%E9%A1%B9%E7%9B%AE/2017/04/11/calico-usage.html#bgp-speaker-rr%E6%A8%A1%E5%BC%8F

作者:akka9
链接:https://www.jianshu.com/p/593c53dbdf7b
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐