部署calico网络(注意本步骤在入门篇中未安装第六步flannel网络)
Calico组件: Felix:Calico agent 运行在每台node上,为容器设置网络信息:IP,路由规则,iptable规则等 etcd:calico后端存储 BIRD: BGP Client: 负责把Felix在各node上设置的路由信息广播到Calico网络( 通过BGP协议)。 BGP Route Reflector: 大规模集群的分级路由分发。 calico: calico命令行管理工具
安装Calico用于策略和网络
使用etcd数据存储区安装
- 如果您的群集已启用RBAC,请发出以下命令以配置Calico所需的角色和绑定。
kubectl apply -f \
https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/rbac.yaml
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
- 下载etcd的Calico网络清单。
curl \
https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/calico.yaml \
-O
- 在
ConfigMap
命名中calico-config
,将值设置为etcd_endpoints
etcd服务器的IP地址和端口。
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_endpoints:Calico使用etcd来保存网络拓扑和状态,该参数指定etcd的地址,可以使用K8S Master所用的etcd,也可以另外搭建。
calico_backend:Calico的后端,默认为bird。
cni_network_config:符合CNI规范的网络配置,其中type=calico表示,Kubelet从 CNI_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″的虚拟网络接口。
- 使用以下命令应用清单。
kubectl apply -f calico.yaml
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模式。
7,安装calicoctl:
在单个主机上将calicoctl作为二进制文件安装
- 登录主机,打开终端提示,然后导航到要安装二进制文件的位置。
提示:考虑导航到您的位置
PATH
。例如,/usr/local/bin/
。
- 使用以下命令下载
calicoctl
二进制文件。
curl -O -L https://github.com/projectcalico/calicoctl/releases/download/v3.1.6/calicoctl
- 将文件设置为可执行文件。
chmod +x calicoctl
注意:如果您的位置
calicoctl
不在您的位置PATH
,请将文件移动到您的位置或将其位置添加到您的位置PATH
。这将允许您调用它而无需在其前置位置。
- 示例配置文件
/etc/calico/calicoctl.cfg
apiVersion: projectcalico.org/v3
kind: CalicoAPIConfig
metadata:
spec:
etcdEndpoints: https://etcd1:2379,https://etcd2:2379,https://etcd3:2379
etcdKeyFile: /etc/calico/key.pem
etcdCertFile: /etc/calico/cert.pem
etcdCACertFile: /etc/calico/ca.pem