1 kubernetes 简介
kubernetes是提供了一套组件来管理容器的集群管理系统,kubernetes可以放便地管理跨主机运行的容器,可以对容器进行维护和扩展。
2 kubernetes核心组件
master端组件
2.1 apiserver
kubernetes系统的入口,封装了核心对象的增删改查操作,以RESTFul接口方式提供给外部客户和内部组件调用。它维护的REST对象将持久化到etcd(一个分布式强一致性的key/value存储)
2.2 controller-manager
负责执行各种控制器,目前有两类:
endpoint-controller:定期关联service和pod(关联信息由endpoint对象维护),保证service到pod的映射总是最新的。
replication-controller:定期关联replicationController和pod,保证replicationController定义的复制数量与实际运行pod的数量总是一致的。
2.3 scheduler
负责集群的资源调度,为新建的pod分配机器
2.4 etcd
提供pod,services等信息的持久化存储
minion端组件
2.5 kubelet
负责管控docker容器,如启动/停止、监控运行状态等。它会定期从etcd获取分配到本机的pod,并根据pod信息启动或停止相应的容器。同时,它也会接收apiserver的HTTP请求,汇报pod的运行状态
2.6 kube-proxy
负责为pod提供代理。它会定期从etcd获取所有的service,并根据service信息创建代理。当某个客户pod要访问其他pod时,访问请求会经过本机proxy做转发。
3 基本操作对象
3.1 pod
Kubernetes最基本的部署调度单元,可以包含一个或多个container,逻辑上表示某种应用的一个实例。比如一个web站点应用由前端、后端及数据库构建而成,这三个组件将运行在各自的容器中,那么我们可以创建包含三个container的pod。
3.2 service
是pod的路由代理抽象,用于解决pod之间的服务发现问题。因为pod的运行状态可动态变化(比如切换机器了、缩容过程中被终止了等),所以访问端不能以写死IP的方式去访问该pod提供的服务。service的引入旨在保证pod的动态变化对访问端透明,访问端只需要知道service的地址,由service来提供代理
3.3 replicationController
是pod的复制抽象,用于解决pod的扩容缩容问题。通常,分布式应用为了性能或高可用性的考虑,需要复制多份资源,并且根据负载情况动态伸缩。通过replicationController,我们可以指定一个应用需要几份复制,Kubernetes将为每份复制创建一个pod,并且保证实际运行pod数量总是与该复制数量相等(例如,当前某个pod宕机时,自动创建新的pod来替换)。
service和replicationController只是建立在pod之上的抽象,最终是要作用于pod的,那么它们如何跟pod联系起来呢?这就要引入label的概念:label就是为pod加上可用于搜索或关联的一组key/value标签,而service和replicationController正是通过label来与pod关联的。创建service和replicationController时可以指定同样的label:"xxx=yyy",再通过label selector机制,就将它们与这三个pod关联起来了。
4 kubernetes安装
4.1 环境准备
4.2 用openvswitch GRE实现kubernetes的网络模型
利用openvswitch GRE通道实现跨主机间的容器通信
分别在192.168.100.92和192.168.100.93上做下列操作
安装openvswitch,bridge-utils,docker
apt-get install openvswitch-switch bridge-utils docker-engine
建立ovs bridge
ovs-vsctl add-br obr0
建立gre,并将新建的gre0添加到obr0
ovs-vsctl add-port obr0 gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.100.93
在192.168.100.93上将remote_ip=192.168.100.93改为remote_ip=192.168.100.92
创建linux bridge
brctl addbr kbr0
添加obr0为kbr0的接口
brctl addif kbr0 obr0
设置docker0为down状态
ip link set dev docker0 down
删除docker0
ip link del dev docker0
为了是kbr0永久生效,在/etc/network/interfaces,添加如下语句
auto kbr0
iface kbr0 inet static
address 172.17.1.1
netmask 255.255.255.0
dns-nameservers 8.8.8.8
up route add -net 172.17.2.0/24 gw 192.168.100.93 dev enp0s3
在192.168.100.93的/etc/network/interfaces,添加如下语句
auto kbr0
iface kbr0 inet static
address 172.17.2.1
netmask 255.255.255.0
dns-nameservers 8.8.8.8
up route add -net 172.17.1.0/24 gw 192.168.100.92 dev enp0s3
开启ip_forward
在/etc/sysctl.conf中开启
net.ipv4.ip_forward=1
sysctl -p
分别在192.168.100.92上ping 172.17.2.1,在192.168.100.93上ping 172.17.1.1,如果能相互ping通则GRE通道已经打通了。