go语言开发cni插件 go语言开发ide( 三 )


syntax on
autocmd FileType go autocmd BufWritePre buffer Fmt
" 代码补全的插件
Bundle 'Blackrush/vim-gocode'
" 代码跳转提示
Bundle 'dgryski/vim-godef'
" 代码结构提示
Bundle 'majutsushi/tagbar'
nmap F8 :TagbarToggleCR
let g:tagbar_type_go = {
\ 'ctagstype' : 'go',
\ 'kinds': [
\ 'p:package',
\ 'i:imports:1',
\ 'c:constants',
\ 'v:variables',
\ 't:types',
\ 'n:interfaces',
\ 'w:fields',
\ 'e:embedded',
\ 'm:methods',
\ 'r:constructor',
\ 'f:functions'
\ ],
\ 'sro' : '.',
\ 'kind2scope' : {
\ 't' : 'ctype',
\ 'n' : 'ntype'
\ },
\ 'scope2kind' : {
\ 'ctype' : 't',
\ 'ntype' : 'n'
\ },
\ 'ctagsbin': 'gotags',
\ 'ctagsargs' : '-sort -silent'
\ }
kubernetes网络和CNI简介 对于任何kubernetes网络方案go语言开发cni插件 , 都需要满足以下 需求 :
容器通过使用linux内核提供的Cgroups和Namespaces技术实现go语言开发cni插件了相互之间的网络、存储等资源的隔离与限制 。对于网络,kubernetes项目中的Pod则通过让一组用户容器和pause容器/infra容器共享一个network namespace的方式,使一个Pod内的容器都使用了一个网络栈 。而一个 Network Namespace 的网络栈包括:网卡(Network Interface)、回环设备(Loopback Device)、路由表(Routing Table)和 iptables 规则 。所以 , 不难想象,Pod的网络和一台虚拟机的网络栈配置起来实际上是类似的,比如同样需要虚拟网卡,IP、MAC地址等,并且每个Pod都有自己唯一的网络栈 。当所有的Pod都有了自己的网络栈后,如果想要连接两个Pod进行通信,则类似于其go语言开发cni插件他任何网络架构,需要配置交换机、路由器等,并为其规划IP , 路由等信息 。如果是对于物理机 , go语言开发cni插件我们可以使用网线、交换机、路由器这些设备进行连接,但在Pod中显然需要其他方式 。
kubernetes Pod的网络方案有很多,最典型的就是Flannel的三种后端实现方式了(UDP、VxLan、host-gw),讨论这些则主要是在关注容器跨主机通信的问题 。而这里主要讨论的则是Pod的内部的网卡如何创建,又如何将网络数据包在宿主机和容器之间传递 。
图片来自 这里
CNI是Container Network Interface的缩写,它是一个通用的容器网络插件的k8s 网络接口 ,开源社区里已经有了很多实现容器网络的方案,不同的网络实现方案在k8s内都是以插件调用的形式工作,所以这里需要一个统一的标准接口 。如果将k8s的Pod视为一台“虚拟机”,那么网络插件的工作就是管理这台虚拟机的网络栈,包括给这台虚拟机插入网卡、配置路由、IP等go语言开发cni插件;而CNI的工作则是对接 网络插件 和 kubelet 容器运行时管理工具(对于docker容器运行时来说实际上是dockershim),主要体现在Pod的创建和删除过程:
CNI 配置文件 , 给CRI使用的,比如dockershim
CNI官方维护的插件包括以下几个,对于已经搭建好的k8s,cni插件可以在 /opt/cni/bin/ 文件夹下查看:
CNI的基础可执行文件按照功能可以划分为三类:
Main插件:创建具体网络设备
bridge :网桥设备,连接container和host
ipvlan :为容器增加ipvlan网卡
loopback :lo设备
macvlan :为容器创建一个MAC地址
ptp :创建一对Veth Pair
vlan :分配一个vlan设备
host-device :将已存在的设备移入容器内
IPAM插件:负责分配IP地址
dhcp :容器向DHCP服务器发起请求,给Pod发放或回收IP地址
host-local :使用预先配置的IP地址段来进行分配

推荐阅读