在Kubernetes集群中,网络插件是必需的,因为它们为Pod提供了可访问的IP地址,并确保它们能够相互通信。Kubernetes支持多种网络插件,包括Calico、Flannel、Weave Net等。这里以Calico为例介绍如何配置Kubernetes集群的网络插件。

插件配置可以参考官网: K8S集群网络插件列表

1: 安装Calico
使用kubectl命令安装Calico网络插件,示例命令如下:

kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml

该命令将安装Calico的所有必需组件,包括etcd、Calico节点和Calico CNI插件。

2: 配置Calico网络策略
Calico支持强大的网络策略功能,可以在集群中实现细粒度的网络控制。您可以使用Calico的Kubernetes网络策略API来定义网络策略,示例命令如下:

kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico-policy-only.yaml

该命令将启用Calico的Kubernetes网络策略API,并关闭所有其他策略,只允许使用Kubernetes网络策略。

3: 检查Calico是否正常工作
您可以使用以下命令检查Calico是否正常工作:

kubectl get pods --all-namespaces

此命令将显示所有命名空间中的Pod,包括Calico节点和CNI插件。确保这些组件都正常运行并且没有错误。

4: 配置网络CIDR
在安装Calico之前,您需要确定Kubernetes集群中将使用的网络CIDR。网络CIDR是集群中所有Pod的IP地址的子网。示例命令如下:

kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml -f - <<EOF
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: my-ippool
spec:
  cidr: 192.168.0.0/16
  natOutgoing: true
EOF

该命令将创建名为“my-ippool”的IP地址池,其中CIDR为“192.168.0.0/16”。

5: 配置节点互联
如果您的Kubernetes集群跨越多个节点,请确保所有节点都能够相互通信。您可以使用以下命令在节点之间创建Calico网络:

kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml -f - <<EOF
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: my-ippool
spec:
  cidr: 192.168.0.0/16
  natOutgoing: true
---
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
  name: default
spec:
  logSeverityScreen: Info
---
apiVersion:

k8s- kube-proxy

在Kubernetes集群中,kube-proxy是一个控制平面组件,它负责维护集群中的网络规则。kube-proxy的主要职责是在每个节点上监听Kubernetes API服务器上的服务和端口对象,然后动态地将这些服务和端口对象映射到对应的Pod或节点IP地址和端口上。

kube-proxy有三种工作模式:

  • Userspace模式:kube-proxy会在每个节点上启动一个代理进程,该进程通过绑定服务的端口和地址来实现服务的负载均衡和代理。这种模式的性能比较低,但是可以在几乎所有的环境中运行。
  • iptables模式:kube-proxy通过在节点上设置iptables规则来实现服务的负载均衡和代理。这种模式的性能比Userspace模式要好,并且可以利用Linux内核的高性能网络功能,例如IPVS。
  • IPVS模式:kube-proxy通过利用Linux内核的IPVS模块来实现服务的负载均衡和代理。这种模式的性能比iptables模式更好,并且可以支持更多的负载均衡算法。

在默认情况下,Kubernetes使用iptables模式来运行kube-proxy。如果您想使用其他模式,请在kube-proxy配置中指定。要查看kube-proxy的配置,请使用以下命令:

kubectl describe configmap -n kube-system kube-proxy

kube-proxy是Kubernetes网络体系结构中的一个关键组件,它确保了服务的可用性和可靠性。

删除 calico 网络插件

如果您要从Kubernetes集群中删除Calico网络插件,则可以按照以下步骤操作:

删除Calico DaemonSet:要删除Calico网络插件,首先需要删除它的DaemonSet对象。您可以使用以下命令删除DaemonSet::

kubectl delete ds calico-node -n kube-system

除Calico自定义资源定义:Calico网络插件使用自定义资源定义(CRD)来管理其配置和策略。您可以使用以下命令删除这些CRD:

kubectl delete crd felixconfigurations.crd.projectcalico.org \
  ipamblocks.crd.projectcalico.org \
  ipamconfigs.crd.projectcalico.org \
  blockaffinities.crd.projectcalico.org \
  ipamhandles.crd.projectcalico.org \
  clusterinformations.crd.projectcalico.org \
  globalnetworkpolicies.crd.projectcalico.org \
  networkpolicies.crd.projectcalico.org \
  hostendpoints.crd.projectcalico.org \
  bgppeers.crd.projectcalico.org \
  bgpconfigurations.crd.projectcalico.org \
  ippools.crd.projectcalico.org \
  hostsubnetpolicies.crd.projectcalico.org \
  networksets.crd.projectcalico.org

删除Calico命名空间:Calico网络插件通常会在kube-system命名空间中安装,因此您可以使用以下命令删除该命名空间:

kubectl delete ns kube-system

注意:在执行这些命令之前,建议您备份您的Kubernetes集群。此外,删除Calico网络插件可能会影响您的Kubernetes集群中的网络配置和策略。如果您不确定如何删除Calico网络插件,请咨询Kubernetes社区或Calico社区的支持。

网络插件

kubectl 本身不是网络插件,它是 Kubernetes 的命令行工具,用于与 Kubernetes API 交互并管理 Kubernetes 对象。要安装网络插件,您可以使用 kubectl apply 命令应用所需的 YAML 文件或使用工具(例如 Helm)来部署预定义的 Kubernetes 应用程序。以下是一些常见的网络插件及其安装方法:

Calico:您可以使用以下命令安装 Calico 网络插件:

kubectl apply -f https://docs.projectcalico.org/v3.19/manifests/calico.yaml

Flannel:您可以使用以下命令安装 Flannel 网络插件:

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

Weave Net:您可以使用以下命令安装 Weave Net 网络插件:

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

请注意,这些命令将应用所需的 YAML 文件,以在您的 Kubernetes 群集中部署网络插件。

Flannel 网络插件安装后使用

确认Flannel网络插件已经正常启动。可以通过以下命令检查:
kubectl get pods --all-namespaces
如果看到Flannel相关的pod处于Running状态,则表示Flannel已经正常启动。

创建一个Flannel配置文件。可以使用以下命令创建一个名为flannel.yaml的文件:
apiVersion: v1
kind: ConfigMap
metadata:
  name: kube-flannel-cfg
  namespace: kube-system
data:
  cni-conf.json: |
    {
        "name": "cbr0",
        "plugins": [
            {
                "type": "flannel",
                "delegate": {
                    "hairpinMode": true,
                    "isDefaultGateway": true
                }
            },
            {
                "type": "portmap",
                "capabilities": {
                    "portMappings": true
                }
            }
        ]
    }
  net-conf.json: |
    {
        "Network": "10.244.0.0/16",
        "Backend": {
            "Type": "vxlan"
        }
    }
使用kubectl apply命令将Flannel配置文件应用到Kubernetes集群中:
kubectl apply -f flannel.yaml

这会将Flannel配置文件中定义的ConfigMap创建到Kubernetes集群的kube-system命名空间中。

检查Flannel是否正常工作。可以使用以下命令检查:
kubectl get pods --all-namespaces
如果看到Flannel相关的pod处于Running状态,则表示Flannel已经正常工作。

踩坑必备:

安装的Calico网络插件是3.19.4的镜像,存在以下问题:
1: 在 Kubernetes 1.19 版本中,calico/node v3.19.4 存在一个已知问题,会导致节点上的所有Pod无法与其它节点上的Pod通信。该问题在calico/node v3.19.5中已修复。

2:在 Kubernetes 1.21 版本中,calico/node v3.19.4 存在一个已知问题,会导致集群中出现大量的gc go routines,可能会导致节点变慢。该问题在calico/node v3.19.5中已修复。

建议尽快升级到 calico/node v3.19.5 或更高版本,以避免以上问题

升级步骤:

检查当前集群中 Calico 的版本:
kubectl get daemonset calico-node -n kube-system -o=jsonpath='{.spec.template.spec.containers[0].image}{"\n"}'


停止当前版本的 Calico:
 kubectl delete -f https://docs.projectcalico.org/v3.19/manifests/calico.yaml

修改 calico-node 镜像版本为 3.20.6 并保存到 calico.yaml 文件
讲calico.yaml文件下载下来: wget https://docs.projectcalico.org/v3.19/manifests/calico.yaml
sed -i 's|image: .*calico-node:.*|image: calico/node:v3.20.6|' calico.yaml


安装3.20.6 版本的 Calico:

kubectl apply -f calico.yaml