Quantcast
Channel: CodeSection,代码区,Linux操作系统:Ubuntu_Centos_Debian - CodeSec
Viewing all articles
Browse latest Browse all 11063

How-to setup Kubernetes to manage Docker Cluster on ubuntu

$
0
0
什么是 Kubernetes

Kubernetes 是来自 Google 云平台的开源容器集群管理系统。基于 Docker 构建一个容器的调度服务。该系统可以自动在一个容器集群中选择一个工作容器供使用。其核心概念是 Container Pod。详细的设计思路请参考 这里 。

关于 Kubernetes 系统架构及组件介绍见这里。

本文通过实际操作来演示Kubernetes的使用,主要包括如下内容:

部署环境介绍,以及Kubernetes集群逻辑架构 安装部署Open vSwitch跨机器容器通信工具 安装部署Etcd和Kubernetes的各大组件 演示Kubernetes管理容器和服务 部署环境及架构 操作系统: ubuntu 14.04 x86_64 Kubernetes: v1.0.1 Etcd版本: 3.0.0 Docker版本: 1.6.2 Open vSwith版本: 2.0.2 主机信息 服务器信息:

RoleserviceHostnameIPAddress masterKube-APIServerkubeletproxyetcdlucy.suzf.net172.16.9.86 Minion1kubeletproxyopen-switch dockereva.suzf.net172.16.9.10 Minion2kubeletproxyopen-switch dockercali.suzf.net172.16.9.20

在详细介绍部署Kubernetes集群前,先给大家展示下集群的逻辑架构。从下图可知,整个系统分为两部分,第一部分是Kubernetes APIServer,是整个系统的核心,承担集群中所有容器的管理工作;第二部分是minion,运行Container Daemon,是所有容器栖息之地,同时在minion上运行Open vSwitch程序,通过GRE Tunnel负责minions之间Pod的网络通信工作。


How-to setup Kubernetes to manage Docker Cluster on ubuntu

http://suzf.net 纯手工锻造 欢迎关注与交流 ^_^

安装Open vSwitch及配置GRE

为了解决跨minion之间Pod的通信问题,我们在每个minion上安装Open vSwtich,并使用GRE或者VxLAN使得跨机器之间P11od能相互通信,本文使用GRE,而VxLAN通常用在需要隔离的大规模网络中。对于Open vSwitch的介绍请参考另一篇文章Open vSwitch。

[ bothminion ] sudoapt-getinstallopenvswitch-switch bridge-utils -y

安装完Open vSwitch和桥接工具后,接下来便建立minion节点之间的隧道。首先在所有minion上分别建立OVS Bridge:

sudoovs-vsctladd-brobr0

接下来建立gre,并将新建的gre0添加到obr0

# minion1 sudoovs-vsctladd-portobr0gre0 -- setInterface gre0type=greoptions:remote_ip=172.16.3.20 # minion2 sudoovs-vsctladd-portobr0gre0 -- setInterface gre0type=greoptions:remote_ip=172.16.3.10

至此,minion1和minion2之间的隧道已经建立。然后我们在minion1和minion2上创建linux网桥kbr0替代Docker默认的docker0(我们假设minion1和minion2都已安装Docker),设置minion1的kbr0的地址为172.17.1.1/24, minion2的kbr0的地址为172.17.2.1/24,并添加obr0为kbr0的接口,以下命令在minion1和minion2上执行:

[ bothminion ] # sudo brctl addbr kbr0 # 创建linux bridge代替docker0 # sudo brctl addif kbr0 obr0# 添加obr0为kbr0的接口 # # sudo ip link set dev obr0 up# 设置obr0为up状态 # sudo ip link set dev docker0 down # 设置docker0为down状态 # sudo ip link del dev docker0# 删除docker0,可选

查看这些接口的状态

# service openvswitch-switch status openvswitch-switch start/running @eva:~# ovs-vsctl show 52c65487-12fc-4228-b2ee-7c5ba409d8d2 Bridge "obr0" Port "gre0" Interface "gre0" type: gre options: {remote_ip="172.16.3.20"} Port "obr0" Interface "obr0" type: internal ovs_version: "2.0.2" @eva:~# brctl show bridgename bridgeid STPenabled interfaces kbr0 8000.de14d8a90948 no obr0

为了使新建的kbr0在每次系统重启后任然有效,我们在minion1的/etc/network/interfaces文件中追加内容如下:(在CentOS上会有些不一样)

@eva:~# tail -9 /etc/network/interfaces autokbr0 ifacekbr0inetstatic address 172.16.1.1 netmask 255.255.255.0 # gateway 172.16.1.0 # dns-nameservers 172.31.1.1 uprouteadd 172.16.2.0/24 via 172.16.3.20 deveth0 downrouteadd 172.16.2.0/24 via 172.16.3.20 deveth0

minion2 网卡配置类似 。然后 启动虚拟网络接口

sudoiplinksetdevobr0up

你能在minion1和minion2上发现kbr0都设置了相应的IP地址。这是我们创建的隧道还不能通信。经查找这是因为在minion1和minion2上缺少访问172.17.2.1和172.17.1.1的路由,因此我们需要添加路由保证彼此之间能通信:

# minion1 上执行 sudoiprouteadd 172.16.2.0/24 via 172.16.3.20 deveth0 # minion2 上执行 sudoiprouteadd 172.16.1.0/24 via 172.16.3.10 deveth0

现在网络之间可以正常通信了

@eva:~# ping 172.16.2.1 -c 2 PING 172.16.2.1 (172.16.2.1) 56(84) bytesofdata. 64 bytesfrom 172.16.2.1: icmp_seq=1 ttl=64 time=0.714 ms 64 bytesfrom 172.16.2.1: icmp_seq=2 ttl=64 time=0.337 ms --- 172.16.2.1 pingstatistics --- 2 packetstransmitted, 2 received, 0% packetloss, time 1000ms rttmin/avg/max/mdev = 0.337/0.525/0.714/0.189 ms @cali:~# ping 172.16.1.1 -c 2 PING 172.16.1.1 (172.16.1.1) 56(84) bytesofdata. 64 bytesfrom 172.16.1.1: icmp_seq=1 ttl=64 time=0.577 ms 64 bytesfrom 172.16.1.1: icmp_seq=2 ttl=64 time=0.269 ms --- 172.16.1.1 pingstatistics --- 2 packetstransmitted, 2 received, 0% packetloss, time 999ms rttmin/avg/max/mdev = 0.269/0.423/0.577/0.154 ms

Minion 节点安装 docker

[ bothminion ] sudoapt-getinstalldocker.io -y

修改docker默认桥接网桥,并重启

sudovi /etc/default/docker DOCKER_OPTS="-b kbr0" sudoservicedockerrestart

Etcd 安装与配置

etcd是一个开源的用于配置共享和服务发现的高性能的键值存储系统。

注意:创建存放所有组件二进制文件目录,最好是/opt/bin目录,因为启动脚本里面写的就是这个目录。

@lucy:~# cd /usr/local/src/ @lucy:/usr/local/src#sudo wget https://github.com/coreos/etcd/releases/download/v3.0.0/etcd-v3.0.0-linux-amd64.tar.gz tarxfetcd-v3.0.0-linux-amd64.tar.gz cdetcd-v3.0.0-linux-amd64/ mkdir /opt/bin cp -a etcdetcdctl /opt/bin

etcd官方建议使用新的2379端口代替4001

cat >/etc/default/etcd << EOF ETCD_OPTS="\\ --listen-client-urls http://0.0.0.0:4001 \\ --advertise-client-urls http://0.0.0.0:4001 \\ --data-dir /var/lib/etcd/default.etcd" EOF # 选项说明: --listen-peer-urls :etcd作为分布式节点通信端口,默认指定端口7001,我们这里做的是单节点,这个参数可以不写,需要知道的是v2版本中改变为2380,7001仍可用 --listen-client-urls :客户端操作etcdAPI的端口,默认指定端口4001,v2中改变为2379,在k8s中我们要使用4001端口 --data-dir :指定数据存放目录 --advertise-client-urls :作为分布式的客户端连接端口,如果不写这个参数会出现以下报错 etcdmain: errorverifyingflags, -advertise-client-urlsis requiredwhen -listen-client-urlsis setexplicitly. See 'etcd --help'. etcdmain: Whenlisteningonspecificaddress(es), this etcdprocessmustadvertiseaccessibleurl(s) to each connectedclient.

etcd服务配置好后先不启动,待会用下面kubernetes提供的启动脚本启动! one key start cool ~ ~~

下面安装 Kubernetes APIServer 及kubelet、proxy 等服务。

安装Kubernetes APIServer 下载安装kubernetes各组件

可以自己从源码编译kubernetes(需要安装golang环境),也可以从 GitHub Kubernetes repo release page. 选择源码包v1.0.1版本下载。

@lucy:~# cd /usr/local/src/ @lucy:/usr/local/src#sudo wget https://github.com/coreos/etcd/releases/download/v3.0.0/etcd-v3.0.0-linux-amd64.tar.gz @lucy:/usr/local/src#sudo wget https://github.com/GoogleCloudPlatform/kubernetes/releases/download/v1.0.1/kubernetes.tar.gz

然后解压下载的kubernetes和etcd包,并在kubernetes(minion1)、minion2上创建目录/opt/bin

[ Allnodes ] # mkdir /opt/bin # echo "export PATH=\$PATH:/opt/bin" >> /etc/profile # source /etc/profile

解压kubernetes

tarxfkubernetes.tar.gz cdkubernetes/server && tarxfkubernetes-server-linux-amd64.tar.gz cdkubernetes/server/bin/

APIserver本身需要的是kube-apiserver kube-scheduler kube-controller-manager kubecfg四个

@lucy #cp kube-apiserver kube-scheduler kube-controller-manager kubecfg/opt/bin/

把proxy和kubelet复制到其他minions,确保这些文件都是可执行的

scpkube-proxykubeletroot@eva.suzf.net:/opt/bin scpkube-proxykubeletroot@cali.suzf.net:/opt/bin

拷贝相关组件启动脚本


Viewing all articles
Browse latest Browse all 11063

Trending Articles