容器网络接口插件
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。
安装
在 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