容器网络接口插件

Kubernetes(k8s)使用容器网络接口(CNI)插件来管理容器网络。CNI是一个规范,定义了用于配置 Linux 容器运行时的网络插件的接口。

Calico

Calico 是一个开源的 CNI 插件,用于提供高性能的容器网络和网络安全功能。它支持 BGP (Border Gateway Protocol) 和 IPIP (IP in IP) 等协议,以实现网络的路由和隔离。

模式

  • IPIP模式是一种将各Node的路由之间做一个tunnel,再把两个网络连接起来的模式。启用IPIP模式时,Calico将在各Node上创建一个名为”tunl0″的虚拟网络接口。如下图所示。
  • BGP模式则直接使用物理机作为虚拟路由路(vRouter),不再创建额外的tunnel。 calico

安装

在 Kubernetes 环境中安装 Calico 通常涉及使用 kubectl 应用一个 YAML 文件来部署 Calico 的 Kubernetes 资源。下面是一个基本的 Calico YAML 文件示例或者

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

二选一

# calico.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: calico-system

---
apiVersion: v1
kind: Secret
metadata:
  name: calico-etcd-secrets
  namespace: calico-system
data:
  etcdctl-key: BASE64_ENCODED_KEY
  etcdctl-cacert: BASE64_ENCODED_CERT
  etcdctl-cert: BASE64_ENCODED_CERT

---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: calico-node
  namespace: calico-system
spec:
  selector:
    matchLabels:
      k8s-app: calico-node
  template:
    metadata:
      labels:
        k8s-app: calico-node
    spec:
      hostNetwork: true
      containers:
        - name: calico-node
          image: calico/node:v3.19.1  # 替换为最新版本
          env:
            - name: ETCD_ENDPOINTS
              value: "https://ETCD_ENDPOINT_IP:2379"  # 替换为你的 etcd 集群地址
          volumeMounts:
            - name: var-run-calico
              mountPath: /var/run/calico
            - name: etcd-certs
              mountPath: /calico-secrets
          readinessProbe:
            httpGet:
              path: /health
              port: 9099
          securityContext:
            privileged: true
            capabilities:
              add:
                - NET_ADMIN
          resources:
            requests:
              memory: "64Mi"
              cpu: "250m"
            limits:
              memory: "256Mi"
              cpu: "500m"

      volumes:
        - name: var-run-calico
          hostPath:
            path: /var/run/calico
        - name: etcd-certs
          secret:
            secretName: calico-etcd-secrets

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: calico-config
  namespace: calico-system
data:
  typha_service_name: ""
  typha_prometheus_metrics_enabled: "true"

  • BASE64_ENCODED_KEY: 替换为 etcd 密钥的 Base64 编码字符串。
  • BASE64_ENCODED_CERT: 替换为 etcd 证书的 Base64 编码字符串。
  • https://ETCD_ENDPOINT_IP:2379: 替换为你的 etcd 集群地址。

然后,使用以下命令应用这个 YAML 文件:

kubectl apply -f calico.yaml

验证

kubectl get nodes -o wide
kubectl get pods -n calico-system

确保 Calico 的节点 DaemonSet(calico-node)在每个节点上运行,并且所有相关的 Pod 处于正常运行状态。

通过创建一个简单的 Pod,并尝试访问其他 Pod 来验证 Calico 的网络功能:

# test-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - name: test-container
    image: busybox
    command: ["sleep", "3600"]
kubectl apply -f test-pod.yaml

在创建的 Pod 中,你可以执行以下命令,尝试访问其他 Pod:

kubectl exec -it test-pod -- /bin/sh

# 在 Pod 中执行以下命令
ping OTHER_POD_IP

确保网络通信正常。

Flannel

Flannel 是一个简单而有效的 CNI 插件,它使用 overlay 网络模型,通过为每个节点分配唯一的子网,将容器连接到集群中的其他节点。

安装

下载,保存 kube-flannel.yml 文件

wget https://github.jobcher.com/gh/https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

执行 kube-flannel.yml 文件

kubectl apply -f kube-flannel.yml

应用之后,我们通过watch来实时监控查看下应用的进度

watch kubectl get pods -A | grep flannel
Last Updated:
Contributors: jobcher