k8s中将flannel网络切换calico网络

注意事项:

1、kubelet 配置必须增加 --network-plugin=cni 选项
2、kubec-proxy 组件不能采用 --masquerade-all 启动,因为会与 Calico policy 冲突,并且需要加上–proxy-mode=ipvs(ipvs模式),–masquerade-all=true(表示ipvs proxier将伪装访问服务群集IP的所有流量,)

1、停止flanneld服务

yaml形式安装的flanneld切换calico

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

二进制安装的flanneld切换calico

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集群中已无网络规则

2、部署calico

参考与官网: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

3、Calico 管理工具

下载工具: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

你可能感兴趣的:(k8s)