1、kubelet 配置必须增加 --network-plugin=cni 选项
2、kubec-proxy 组件不能采用 --masquerade-all 启动,因为会与 Calico policy 冲突,并且需要加上–proxy-mode=ipvs(ipvs模式),–masquerade-all=true(表示ipvs proxier将伪装访问服务群集IP的所有流量,)
1、利用之前部署的flanneld文件删除掉flanneld网络
kubectl delete -f kube-flanneld.yaml
2、删除路由
我们删除网卡会自动删除这两个网卡的路由
ip link delete cnio
ip link delete flannel.1
删掉其他路由
ip route delete 10.244.0.0/24 via 192.168.25.61 dev eth0
ip route delete 10.244.1.0/24 via 192.168.25.61 dev eth0
ip route 172.17.92.0/24 dev docker0 proto kernel scope link src 172.17.92.1
3、清除网络规则
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
1、关闭flanneld服务
systemctl stop flanneld.service
systemctl disable flanneld.service
2、执行上面的删除路由和网络规则的动作
3、修改docker.service文件
vi /usr/lib/systemd/system/docker.service
##删掉该行与flanneld相关的配置
EnvironmentFile=/run/flannel/subnet.env
重载并且重启
systemctl daemon-reload
systemctl restart docker
systemctl status docker
此时k8s集群中已无网络规则
参考与官网:https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremises
镜像由于在国外很难下载,这里提前在别处准备好并且打包过来在节点上用,
cdsn的calico离线镜像下载地址:https://download.csdn.net/download/qq_25611295/15633642
下载部署文件:
curl https://docs.projectcalico.org/v3.9/manifests/calico-etcd.yaml -o calico.yaml
镜像打包命令:
docker image save docker.io/calico/kube-controllers:v3.9.6 |gzip -9 >calico_kube-controllers.tar.gz
docker image save docker.io/calico/cni:v3.9.6|gzip -9 >calico_cni.tar.gz
docker image save docker.io/calico/pod2daemon-flexvol:v3.9.6|gzip -9 >pod2daemon-flexvol.tar.gz
docker image save docker.io/calico/node:v3.9.6|gzip -9 >calico_node.tar.gz
具体步骤如下:
配置连接etcd地址,如果使用https,还需要配置证书。(ConfigMap,Secret)
根据实际网络规划修改Pod CIDR(CALICO_IPV4POOL_CIDR)
选择工作模式(CALICO_IPV4POOL_IPIP),支持BGP,IPIP
vi calico.yaml,找到下面行并修改
1、calico.yaml中添加etd的ssl
etcd-key: (cat /opt/etcd/ssl/server-key.pem |base64 -w 0)
etcd-cert: (cat /opt/etcd/ssl/server.pem |base64 -w 0)
etcd-ca: (cat /opt/etcd/ssl/ca.pem |base64 -w 0)
将对应的都添进去,将注释去掉:
# etcd-key: null 将对应ssl下的证书转换成base64编码放进来,并去掉注释
# etcd-cert: null
# etcd-ca: null
2、calico.yaml中指定secert的配置落地的位置,直接去掉注释就可以
# You must also populate the Secret below with these files.
etcd_ca: "/calico-secrets/etcd-ca"
etcd_cert: "/calico-secrets/etcd-cert"
etcd_key: "/calico-secrets/etcd-key"
3、calico.yaml中修改pod网段
name: CALICO_IPV4POOL_CIDR
value: "172.17.0.0/16"
4、calico.yaml中增加网卡匹配规则,防止calico默认找到错误的网卡,并更改calico的工作模式。
- name: IP_AUTODETECTION_METHOD
value: "interface=ens.*"
# Auto-detect the BGP IP address.
- name: IP
value: "autodetect"
# Enable IPIP
- name: CALICO_IPV4POOL_IPIP
value: "Never"
interface=ens.*表示匹配ens开头的网卡,这里我们用“Never”禁用掉IPIP模式则会用BGP模式,
5、calico.yaml中指定etcd的地址字符串
etcd_endpoints: "https://192.168.25.135:2379,https://192.168.25.136:2379,https://192.168.25.137:2379"
6、修改k8s组件相关的服务配置
kube-controller-manager:
CALICO_IPV4POOL_CIDR需要跟kube-controller-manager里面的配置一致,如果里面没有配置,需要添加。
--allocate-node-cidrs=true \
--cluster-cidr=172.17.0.0/16 \
–allocate-node-cidrs表示是否应在云提供商上分配和设置Pod的CIDR
–cluster-cidr表示群集中Pod的CIDR范围。 要求–allocate-node-cidrs为true
kube-apiserver
--allow-privileged=true
因为calico-node需要以特权模式运行在各Node上
kubelet
--network-plugin=cni
使用CNI网络插件
7、部署calico
kubectl apply -f calico.yaml
查看pod状态
[root@master yaml_file]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-6569d6fff8-77vw7 1/1 Running 0 12m
calico-node-58n68 1/1 Running 0 12m
calico-node-r7plw 1/1 Running 0 6m27s
calico-node-rttdk 1/1 Running 0 12m
此时路由表里面还不会有更新,需要把所有的pod全部重建才会生成新的路由规则,使用calico网络,
所以更换网络是大事件,需要在夜深人静的时候操作。
如果发现日志中出现:
E0306 15:38:19.830911 1 reflector.go:125] pkg/mod/k8s.io/[email protected]+incompatible/tools/cache/reflector.go:98: Failed to list *v1.ServiceAccount: serviceaccounts is forbidden: User “system:serviceaccount:kube-system:calico-kube-controllers” cannot list resource “serviceaccounts” in API group “” at the cluster scope
我们直接授权就行。
kubectl create clusterrolebinding add-on-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:calico-kube-controllers
下载工具:https://github.com/projectcalico/calicoctl/releases
wget -o /usr/bin/calicoctl https://github.com/projectcalico/calicoctl/releases/download/v3.9.6/calicoctl
chmod +x /usr/bin/calicoctl
创建配置文件
mkdir /etc/calico
[root@master calico]# cat /etc/calico/calicoctl.cfg
apiVersion: projectcalico.org/v3
kind: CalicoAPIConfig
metadata:
spec:
datastoreType: "etcdv3"
etcdEndpoints: "https://192.168.25.135:2379,https://192.168.25.136:2379,https://192.168.25.137:2379"
etcdKeyFile: "/opt/etcd/ssl/server-key.pem"
etcdCertFile: "/opt/etcd/ssl/server.pem"
etcdCACertFile: "/opt/etcd/ssl/ca.pem"
常用命令
run命令可用于在该服务器上运行一个calico实例;
status命令可检查整个calico网络的状态;
diags用于手机calico节点的诊断信息;
checksystem命令用于检查改服务器是否可以运行一个calico实例。
查询calico状态
calicoctl node status
[root@master yaml_file]# calicoctl node status
Calico process is running.
IPv4 BGP status
+----------------+-------------------+-------+----------+-------------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
+----------------+-------------------+-------+----------+-------------+
| 192.168.25.135 | node-to-node mesh | up | 06:38:41 | Established |
| 192.168.25.136 | node-to-node mesh | up | 06:38:42 | Established |
| 192.168.25.137 | node-to-node mesh | up | 06:38:44 | Established
如果查询不到状态则尝试启动calico节点
calicoctl node run
如果是针对某个节点启动
calicoctl node run --ip=192.168.25.135
其他的一些命令:
查看节点:calicoctl get node
查看ip池:calicoctl get ippool -o wide
切换网络过程中总会出现各种奇葩的问题,网上很难找到解决方案,一般都是重启,删除node节点重新加入node节点,删除网络规则,重新安装calico 就解决了,所以非必要,还是不要切换网络,以免造成故障。
calico常见排障地址:
https://docs.projectcalico.org/maintenance/troubleshoot/troubleshooting#configure-networkmanager