首页 » 云自动化 » k8s » 正文

calico 网络部署

#所有docker.service 服务/lib/systemd/system/docker.service 注释#EnvironmentFile=/etc/profile.d/flanneld.env 配置
#取消#--bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU} ;重启执行systemctl daemon-reload  ; systemctl restart docker.service

#   kubelet 需要配配加入参数 "--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin"
#   kube-proxy 配置加入参数 "--proxy-mode=iptables"

echo "net.netfilter.nf_conntrack_max=1000000" >> /etc/sysctl.conf

#注意最后送上https的方式的calico 调用etcd 通讯存储集群配置,保证每个节点存存在三个文件目录/etc/kubernetes/ssl/etcd-ca   /etc/kubernetes/ssl/etcd-cert /etc/kubernetes/ssl/etcd-key
#这三个文件是用kubernets的证书复制重命名过来的 也就是etcd的证书 cd /etc/kubernetes/ssl/ ; cp kubernetes-key.pem etcd-key; cp  kubernetes.pem etcd-cert; cp ca.pem etcd-ca 
#下发到所有的kubelet 的节点 /etc/kubernetes/ssl/ 

 #calico里面一定要叫这个名字,原理如下,然后用hostpath 挂载卷        - name: etcd-certs    调用configmap 里面的  etcd_ca: "/calico-secrets/etcd-ca"   # "/calico-secrets/etcd-ca"
  #etcd_cert: "/calico-secrets/etcd-cert" # 最终容器证书目录 "/calico-secrets/etcd-cert"
 # etcd_key: "/calico-secrets/etcd-key"  # "/calico-secrets/etcd-key"
 
   #        hostPath:
  #          path: /etc/kubernetes/ssl

https://blog.csdn.net/idea77/article/details/73090403

http://blog.51cto.com/newfly/2062210

部署calico网络

Calico组件:

Felix:Calico agent     运行在每台node上,为容器设置网络信息:IP,路由规则,iptable规则等

 etcd:calico后端存储

 BIRD:  BGP Client: 负责把Felix在各node上设置的路由信息广播到Calico网络( 通过BGP协议)。

 BGP Route Reflector: 大规模集群的分级路由分发。

 calico: calico命令行管理工具

为各Node部署calico的步骤如下:

参照官方文档:https://docs.projectcalico.org/v2.6/getting-started/kubernetes/installation/hosted/hosted

1、下载部署的yaml文件:

wget https://docs.projectcalico.org/v2.6/getting-started/kubernetes/installation/rbac.yaml
wget https://docs.projectcalico.org/v2.6/getting-started/kubernetes/installation/hosted/calico.yaml

2、对于RBAC文件,不用做修改,直接创建即可:

calico# /data/calico.yaml# kubectl create -f calico-rbac.yaml 
clusterrole "calico-kube-controllers" created
clusterrolebinding "calico-kube-controllers" created
clusterrole "calico-node" created
clusterrolebinding "calico-node" created

3、配置calico

calico# vim calico.yaml
data:
  # Configure this with the location of your etcd cluster.
  etcd_endpoints: "https://10.3.1.15:2379,https://10.3.1.16:2379,https://10.3.1.17:2379"
   
  # If you're using TLS enabled etcd uncomment the following.
  # 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"
   
   
apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: calico-etcd-secrets
  namespace: kube-system
data:  
 etcd-key: (cat /etc/kubernetes/ssl/etcd-key.pem | base64 | tr -d '\n') #将输出结果填写在这里
  etcd-cert: (cat /etc/kubernetes/ssl/etcd.pem | base64 | tr -d '\n') #将输出结果填写在这里
  etcd-ca: (cat /etc/kubernetes/ssl/ca.pem | base64 | tr -d '\n') #将输出结果填写在这里
   #如果etcd没用启用tls则为null 
  #上面是必须要修改的参数,文件中有一个参数是设置pod network地址的,根据实际情况做修改:
   - name: CALICO_IPV4POOL_CIDR
     value: "192.168.0.0/16"

关于ConfigMap部分主要参数如下:

etcd_endpointsCalico使用etcd来保存网络拓扑和状态,该参数指定etcd的地址,可以使用K8S Master所用的etcd,也可以另外搭建。

calico_backendCalico的后端,默认为bird。

cni_network_config:符合CNI规范的网络配置,其中type=calico表示,KubeletCNI_PATH(默认为/opt/cni/bin)找名为calico的可执行文件,用于容器IP地址的分配。

etcd如果配置了TLS安全认证,则还需要指定相应的ca、cert、key等文件

关于通过DaemonSet部署的calico-node服务的主要参数:

该POD中主包括如下两个容器:

      calico-node:calico服务程序,用于设置Pod的网络资源,保证pod的网络与各Node互联互通,它还需要以HostNetwork模式运行,直接使用宿主机网络。

      install-cni:在各Node上安装CNI二进制文件到/opt/cni/bin目录下,并安装相应的网络配置文件到/etc/cni/net.d目录下。



  calico-node服务的主要参数:

     CALICO_IPV4POOL_CIDR: Calico IPAM的IP地址池,Pod的IP地址将从该池中进行分配。

     CALICO_IPV4POOL_IPIP:是否启用IPIP模式,启用IPIP模式时,Calico将在node上创建一个tunl0的虚拟隧道。

     FELIX_LOGSEVERITYSCREEN: 日志级别。

     FELIX_IPV6SUPPORT : 是否启用IPV6。

  IP Pool可以使用两种模式:BGP或IPIP。使用IPIP模式时,设置 CALICO_IPV4POOL_IPIP="always",不使用IPIP模式时,设置为"off",此时将使用BGP模式。

  IPIP是一种将各Node的路由之间做一个tunnel,再把两个网络连接起来的模式,启用IPIP模式时,Calico将在各Node上创建一个名为"tunl0"的虚拟网络接口。

4、创建:

calico# kubectl create -f calico.yaml 
configmap "calico-config" created
secret "calico-etcd-secrets" created
daemonset "calico-node" created
deployment "calico-kube-controllers" created
deployment "calico-policy-controller" created
serviceaccount "calico-kube-controllers" created
serviceaccount "calico-node" created
calico# kubectl get deployment,pod -n kube-system 
NAME                              DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deploy/calico-kube-controllers    1         1         1            1           4m
deploy/calico-policy-controller   0         0         0            0           4m
 
NAME                                           READY     STATUS    RESTARTS   AGE
po/calico-kube-controllers-56d9f8c44c-6hftd    1/1       Running   0          4m
po/calico-node-6k827                           2/2       Running   0          4m
po/calico-node-wfbpz                           2/2       Running   0          4m

#calico-node用的是daemonset,会在每个node上启动一个 创建的资源如下:

DaemonSet: name: calico-node 这个pod里运行两个容器 hostNetwork: true serviceAccountName: calico-node 两个容器: name: calico-node image: quay.io/calico/node:v2.6.5

name: install-cni
      image: quay.io/calico/cni:v1.11.2
      command: ["/install-cni.sh"]

Deployment name —calico-kube-controllers replicas: 1 #网络策略控制器 serviceAccountName: calico-kube-controllers containers:
– name: calico-kube-controllers image: quay.io/calico/kube-controllers:v1.0.2

5、修改kubelet配置:

设置各node上Kubelet服务的启动参数: --network-plugin=cni, 可能还要加上这两个参数:

   --cni-conf-dir  CNI插件的配置文件目录,默认为/etc/cni/net.d 该目录下的配置文件内容需要符合CNI规范

   --cni-bin-dir: CNI插件的可执行文件目录,默认为/opt/cni/bin

设置 master上的kube-apiserver服务的启动参数: --allow-privileged=true (因为calico-node需要以特权模式运行在各node上)

设置好后,重新启动kubelet。

这样通过calico就完成了Node间容器网络的设置 ,在后续的pod创建过程中,Kubelet将通过CNI接口调用 calico进行Pod的网络设置包括IP地址,路由规则,Iptables规则

6,验证各Node间网络联通性:

kubelet启动后主机上就生成了一个tunl0接口。 #第一台Node查看:

root@node1# ip route
192.168.77.192/26 via 10.3.1.17 dev tunl0  proto bird onlink 
 
#第二台Node查看:
root@node2# ip route
192.168.150.192/26 via 10.3.1.16 dev tunl0  proto bird onlink

#每台node上都自动设置了到其它node上pod网络的路由,去往其它节点的路都是通过tunl0接口,这就是IPIP模式。 如果设置CALICO_IPV4POOL_IPIP=”off” ,即不使用IPIP模式,则Calico将不会创建tunl0网络接口,路由规则直接使用物理机网卡作为路由器转发。

赞 (2)

发表评论