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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容