k8s的CNI网络插件
概念
Flannel-vxLan
容器网络方案是普适性最高
的默认选择;
影响容器网络性能
最关键
的因素
是网络拓扑路径
。
CNI插件
一般由Daemon
和Binary
两部分组成。
CNI插件
要负责的事情
包括:
- 给Pod配置网卡和IP等网络配置
- 配置Network Policy
- 打通Pod间网络的访问
打通Node间网络通道的手段?
- Overlay隧道
- VPC路由表
- BGP路由
Underlay网络模式的特点
- 性能好
- 可以和集群外资源互联互通
安装cni网络插件
在master节点上运行
以最常用的calico
和flannel
插件为例
cni是容器网络接口
,作用是实现容器跨主机网络通信
。
pod
的ip地址段,也称为cidr
安装flannel网络插件(简单易用)
# 下载flannel插件的yml
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 修改kube-flannel.yml中的镜像仓库地址为国内源
sed -i 's/quay.io/quay-mirror.qiniu.com/g' kube-flannel.yml
# 安装网络插件
kubectl apply -f kube-flannel.yml
查看kubeadm配置的默认pod网段和sv网段
参考: 修改pod网段
查看k8s的pod网段和svc网段
# kubeadm的配置信息存在config-map中
kubectl -n kube-system describe cm kubeadm-config |grep -i pod
# 查看pod网段和svc网段
kubectl -n kube-system describe cm kubeadm-config |grep -i net
安装calico网络插件(复杂灵活)
calico
复杂和灵活,功能也更强大
calico配置参考: 官方配置文档
下载calico插件的yaml
# 下载calico插件的yaml
wget https://docs.projectcalico.org/manifests/calico.yaml
修改定义pod网络CALICO_IPV4POOL_CIDR的值
要和kubeadm init pod-network-cidr
的值一致
# 修改calico.yaml
vim calico.yaml
# 修改定义pod网络CALICO_IPV4POOL_CIDR的值和kubeadm init pod-network-cidr的值一致
## 取消注释
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
修改前
修改后
calico配置自动检测此主机的 IPv4 地址的方法
参考: 能预防一些cni错误
搜索env:
在CLUSTER_TYPE
下配置
# 自动检测此主机的 IPv4 地址的方法
- name: IP_AUTODETECTION_METHOD
value: "interface=ens192" # ens192为本地网卡名字
calico安装常见错误
# 安装calico
kubectl apply -f calico.yaml
# 弹出警告信息
Warning: policy/v1beta1 PodDisruptionBudget is deprecated in v1.21+, unavailable in v1.25+; use policy/v1 PodDisruptionBudget
poddisruptionbudget.policy/calico-kube-controllers created
警告:policy/v1beta1 PodDisruptionBudget 在 v1.21+ 中被弃用,在 v1.25+ 中不可用; 使用 policy/v1 PodDisruptionBudget
poddisruptionbudget.policy/calico-kube-controllers 创建
排查步骤
# 查看下colico-pod的日志,确定错误信息
kubectl logs calico-node-xxx -n kube-system
解决办法
https://github.com/projectcalico/calico/issues/4570
# 把
apiVersion: policy/v1beta1
# 修改为
apiVersion: policy/v1
再次apply资源清单
# 然后再次执行资源清单即可
kubectl apply -f calico.yaml
# 查看nodes状态,已经是Ready(就绪)状态
kubectl get nodes
k8s网络策略
一个只有spec
的network policy
,其他条件
为空
,意味着进出流全部禁止
.
网络访问控制案例:
只允许指定命名空间
中的应用
访问