114.kubernetes之calico

1.calico在kubernetes上的应用

kubernetes-calico.png

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容器化安装

文件模板地址
https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/

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

你可能感兴趣的:(114.kubernetes之calico)