1.calico在kubernetes上的应用
calico包括如下重要组件:calico/node,Typha,Felix,etcd,BGP Client,BGP Route Reflector。
calico/node:把Felix,calico client, confd,Bird封装成统一的组件作为统一入口,同时负责给其他的组件做环境的初始化和条件准备。
Felix:主要负责路由配置以及ACLS规则的配置以及下发,它存在在每个node节点上。
etcd:存储各个节点分配的子网信息,可以与kubernetes共用;
BGPClient(BIRD), 主要负责把 Felix写入 kernel的路由信息分发到当前 Calico网络,确保 workload间的通信的有效性;
BGPRoute Reflector(BIRD), 大规模部署时使用,在各个节点之间不是mesh模式,通过一个或者多个 BGPRoute Reflector 来完成集中式的路由分发;当etcd中有新的规则加入时,Route Reflector 就会将新的记录同步。
BIRD Route Reflector负责将所有的Route Reflector构建成一个完成的网络,当增减Route Reflector实例时,所有的Route Reflector监听到新的Route Reflector并与之同步交换对等的路由信息。
Typha:在节点数比较多的情况下,Felix可通过Typha直接和Etcd进行数据交互,不通过kube-apiserver,既降低其压力。生产环境中实例数建议在3~20之间,随着节点数的增加,按照每个Typha对应200节点计算。
如果由kube-apiserver转为Typha。需要将yaml中typha_service_name 修改calico-typha,同时replicas不能为0 ,否则找不到Typha实例会报连接失败。
2.实践
3.calicoctl安装
curl -O -L https://github.com/projectcalico/calicoctl/releases/download/v3.2.3/calicoctl
chmod +x calicoctl
配置
$ export CALICO_DATASTORE_TYPE=kubernetes
$ export CALICO_KUBECONFIG=~/.kube/config
$ calicoctl get workloadendpoints
相关操作
[root@host229 gaogao]# ./calicoctl node status
Calico process is running.
IPv4 BGP status
+--------------+-------------------+-------+----------+---------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
+--------------+-------------------+-------+----------+---------+
| 172.16.1.1 | node-to-node mesh | start | 01:12:01 | Connect |
| 172.16.3.1 | node-to-node mesh | start | 01:12:01 | Connect |
| 172.16.2.1 | node-to-node mesh | start | 01:12:01 | Connect |
+--------------+-------------------+-------+----------+---------+
[root@host229 gaogao]# ./calicoctl get ipPool -o wide
NAME CIDR NAT IPIPMODE DISABLED
default-ipv4-ippool 192.168.0.0/16 true Always false
[root@host229 gaogao]# ./calicoctl get workloadEndpoint
WORKLOAD NODE NETWORKS INTERFACE
myip-5fc5cf6476-m65c5 host228 192.168.1.5/32 calia0a174e3b5b
myip-5fc5cf6476-n47g8 host229 192.168.2.2/32 cali99ed6eefcc9
myip-5fc5cf6476-npxvp host227 192.168.0.2/32 cali433253597ce
myip-5fc5cf6476-th7t2 host214 192.168.3.4/32 calid09129ac453
4.kubernetes上calico的使用
//由于我的环境是kube-router需要将以前的数据清理下,如果遇到问题需要清理也可以按照如下步骤
4.1环境的清理
删除网卡
ip tunnel show
modprobe -r ipip
删除node已经分配的podCIDR
此处为了方便,在/etc/profile操作做了两个 alias
export ETCDCTL_API=3
alias etcdctl='etcdctl --endpoints=https://10.20.16.227:2379,https://10.20.16.228:2379,https://10.20.16.229:2379 --cacert=/data/cloud/ssl/ca.pem --cert=/data/cloud/ssl/etcd.pem --key=/data/cloud/ssl/etcd-key.pem'
alias kubectl='kubectl --kubeconfig=/data/cloud/ssl/admin.conf'
4.1配置的调整
kube-manager
[Service]
ExecStart=/data/cloud/kubernetes/bin/kube-controller-manager \
--address=127.0.0.1 \
--allocate-node-cidrs=true \
--cluster-cidr=192.168.0.0/16 \ //换个新的网段以便区别
--cluster-name=kubernetes \
--cluster-signing-cert-file=/data/cloud/ssl/ca.pem \
--cluster-signing-key-file=/data/cloud/ssl/ca-key.pem \
--service-account-private-key-file=/data/cloud/ssl/sa.key \
--root-ca-file=/data/cloud/ssl/ca.pem \
--leader-elect=true \
--use-service-account-credentials=true \
--node-monitor-grace-period=40s \
--node-monitor-period=5s \
--pod-eviction-timeout=2m0s \
--controllers=*,bootstrapsigner,tokencleaner \
--log-dir=/data/cloud/work/kubernetes/manager \
--logtostderr=false \
--kubeconfig=/data/cloud/ssl/controller-manager.conf \
--v=2
kubelet
[Service]
ExecStart=/data/cloud/kubernetes/bin/kubelet \
--fail-swap-on=false \
--hostname-override=host229 \
--pod-infra-container-image=k8s.gcr.io/pause:3.1 \
--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin \ //网络插件位置指定
--kubeconfig=/data/cloud/ssl/kubelet.conf \
--bootstrap-kubeconfig=/data/cloud/ssl/bootstrap.conf \
--pod-manifest-path=/data/cloud/kubernetes/manifests \
--allow-privileged=true \
--cluster-dns=10.254.0.2 \
--cluster-domain=cluster.kube. \
--authorization-mode=Webhook \
--client-ca-file=/data/cloud/ssl/ca.pem \
--rotate-certificates=true \
--cert-dir=/data/cloud/kubernetes/ssl \
--cgroup-driver=cgroupfs \
--serialize-image-pulls=false \
--root-dir=/data/cloud/work/kubernetes/kubelet \
--log-dir=/data/cloud/work/kubernetes/kubelet \
--logtostderr=false \
--v=2
[root@host229 ~]# etcdctl get / --prefix --keys-only |grep minions
/registry/minions/host214
/registry/minions/host227
/registry/minions/host228
/registry/minions/host229
[root@host229 ~]# etcdctl del /registry/minions/host214
[root@host229 ~]# etcdctl del /registry/minions/host227
[root@host229 ~]# etcdctl del /registry/minions/host228
[root@host229 ~]# etcdctl del /registry/minions/host229
5.calico容器化安装
Typha:在节点数比较多的情况下,Felix可通过Typha直接和Etcd进行数据交互,不通过kube-apiserver,既降低其压力。生产环境中实例数建议在3~20之间,随着节点数的增加,按照每个Typha对应200节点计算。如果需要启用需要调整Typha的replicas。
//指定calico权限rbac-kdd.yaml
[root@host229 ~]# kubectl aaply -f rbac.yaml
//calico的安装
[root@host229 ~]# kubectl apply -f calico.yaml
//进程查看
[root@host229 ~]# kubectl -n kube-system get pod
NAME READY STATUS RESTARTS AGE
calico-node-873k8 2/2 Running 0 8s
calico-node-d7hfd 2/2 Running 0 10s
calico-node-lq4f9 2/2 Running 0 10s
calico-node-qsb66 2/2 Running 0 10s
//查看各个主机的路由表
[root@host229 calico]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.20.16.1 0.0.0.0 UG 100 0 0 eno1
10.0.0.0 0.0.0.0 255.0.0.0 U 100 0 0 eno1
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tunl0
192.168.1.0 10.20.16.228 255.255.255.0 UG 0 0 0 eno1
192.168.2.0 10.20.16.227 255.255.255.0 UG 0 0 0 eno1
192.168.3.0 10.20.16.214 255.255.255.0 UG 0 0 0 eno1
[root@host229 calico]# kubectl run tomcat --image=tomcat --replicas=3
[root@host229 yaml]# kubectl get pod -o wide |grep tomcat
tomcat-64f79959d8-mngnz 1/1 Running 0 15s 192.168.2.3 host227
tomcat-64f79959d8-tsnv2 1/1 Running 0 10s 192.168.0.2 host229
tomcat-64f79959d8-zdf2z 1/1 Running 0 10s 192.168.1.2 host228
//再次查看路由表
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.20.16.1 0.0.0.0 UG 100 0 0 eno1
10.0.0.0 0.0.0.0 255.0.0.0 U 100 0 0 eno1
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tunl0
192.168.1.0 10.20.16.228 255.255.255.0 UG 0 0 0 eno1
192.168.2.0 10.20.16.227 255.255.255.0 UG 0 0 0 eno1
192.168.3.0 10.20.16.214 255.255.255.0 UG 0 0 0 eno1
192.168.0.2 0.0.0.0 255.255.255.255 UH 0 0 0 cali12b26626b64
//联通性测试
//容器到容器
[root@host229 yaml]# kubectl exec -it tomcat-64f79959d8-mngnz -- ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_seq=1 ttl=62 time=0.404 ms
64 bytes from 192.168.0.2: icmp_seq=2 ttl=62 time=0.257 ms
64 bytes from 192.168.0.2: icmp_seq=3 ttl=62 time=0.287 ms
//主机到容器
[root@host229 yaml]# ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.097 ms
64 bytes from 192.168.0.2: icmp_seq=2 ttl=64 time=0.064 ms
64 bytes from 192.168.0.2: icmp_seq=3 ttl=64 time=0.054 ms
6.策略控制(待续)
7.说明
calico有两种模式iptable和ipvs,之一通过调整kube-proxy中的--proxy-mode=ipvs 来指定,相比iptables模式,ipvs模式性能更好,能够支持更大的集群规模。
- 需要额外的iptables的标记为
- 需要指定端口范围
- 不支持使用本地分配的外部IP的Kubernetes服务,但是支持通过外部负载均衡器实现的外部存储器。
- kube-proxy中的网卡名称限制ethXXX,BUG