kuryr研究笔记

架构分析

kuryr-k8s主要目的是统一vm和容器的网络,借助neutron来管理容器的网络。两种部署,一种是将kuryr服务和k8s集群部署在租户的虚机内,借助虚机网络间接给pod和service提供网络,需要开启trunk特性,同时l2agent也要支持trunk,使虚机port支持多vlan;另一种,在独立的虚机或者裸金属上部署kuryr和k8s集群,k8s集群和openstack节点间二层互通。

kuryr-k8s的项目分为controller和cni
controller负责和k8s及neutron通信,controller通过list&watch(pod,service,endpoint)获取资源信息,并通知给neutron操作port后,会将port信息annotate到pod上。
kuryr-cni作为k8s的网络network插件,负责网卡的创建删除,会调用ovs的命令操作实际的网络资源。

安装笔记

我试验的环境是用虚机安装k8s集群,与openstack节点二层互通
(1)k8s节点配置两张网卡,分别管理口和ovs网桥
(2)关闭selinux
(3)安装k8s:yum install -y etcd kubernetes
(4)安装ovs和ovs-agent:yum install -y openstack-neutron-openvswitch
(5)配置neutron.conf和openvswitch_agent.ini

vxlan模式,节点需要新增隧道网口。neutron加载l2population驱动,agent配置local_ip,l2population
(6)安装和配置kuryr-k8s:参考官网
(7)制作kuryr-k8s-controller的systemctl文件
(8)安装和配置kuryr-cni:参考官网

因为要使用kuryr-cni,所以需要让k8s发现并启用该cni,所以创建cni bin和conf目录。
修改kubelet启动文件,添加cni bin和etc目录,然后重启:
ExecStart = /usr/bin/kubelet —network-plugin=cni —cni-conf-dir=/etc/cni/net.d —cni-bin-dir=/opt/cni/bin
测试方式,主要是pod创建,pod与pod流量,pod与vm流量三部分。附一个pod的yaml文件:

apiversion:v1
kind:pod
metadata:
name:kuryrdem
spec:
replicas:1
selector:
app:kuryrc
template:
metadata:
lables:
app:kuryrc
spec:
containers:
-name :centos
image:centos:latest
imagePullPolicy:Never
command: ["/bin/bash","-c","--"]
args: [ "while true; do sleep 30; done;" ]

问题解决

问题一:无法创建pod的基础容器
这种情况,是因为内网环境没有pause需要的基础镜像,从外部下载好后,通过docker save和docker load的方式加载到本地环境。打上tag为基础镜像即可。

问题二:exec进入容器报错
“xxxprocess_linux.go:110: decoding init error from pipe caused \”read parent: connection reset by peer\””
这种情况,是docker 13版本bug,解决办法就是降级:yum downgrade docker docker-client docker-common

问题三:k8s起pod的时候,创建网络报错
using network plugins \”cni\”: failed to find plugin \”loopback\” in path [/opt/cni/bin /opt/cni/bin]; Skipping pod”
这种情况,是因为cni默认加载loopback插件,如果没有就会报错。解决办法,从cni获取cni插件(注意版本)。解压后将loopback包放在/opt/cni/bin/,然后重启kubelet。

个人分析,欢迎指正,若转载请注明出处!