舒畅 发表于 2018-9-16 08:10:22

CentOS 7实战Kubernetes部署

  1. 前言
  上一节我们阐述了Kubernetes的系统架构,让大家对Kubernetes有一定的初步了解,但是就如何使用Kubernetes, 也许大家还不知如何下手。本文作者将带领大家如何在本地部署、配置Kubernetes集群网络环境以及通过实例演示跨机器服务间的通信,主要包括如下内容:

[*]  部署环境介绍
[*]  Kubernetes集群逻辑架构
[*]  部署Open vSwitch、Kubernetes、Etcd组件
[*]  演示Kubernetes管理容器
2. 部署环境

[*]  VMware Workstation:10.0.3
[*]  VMware Workstation网络模式:NAT
[*]  操作系统信息:CentOS 7 64位
[*]  Open vSwitch版本信息:2.3.0
[*]  Kubernetes版本信息:0.5.2
[*]  Etcd版本信息:0.4.6
[*]  Docker版本信息:1.3.1
[*]  服务器信息:
RoleHostnameIP AddressAPIServerkubernetes192.168.230.3Minionminion1192.168.230.4Minionminion2192.168.230.5
3. Kubernetes集群逻辑架构
  在详细介绍部署Kubernetes集群前,先给大家展示下集群的逻辑架构。从下图可知,整个系统分为两部分,第一部分是Kubernetes APIServer,是整个系统的核心,承担集群中所有容器的管理工作;第二部分是minion,运行Container Daemon,是所有容器栖息之地,同时在minion上运行Open vSwitch程序,通过GRE Tunnel负责minion之间Pod的网络通信工作。
4. 部署Open vSwitch、Kubernetes、Etcd组件
4.1 安装Open vSwitch及配置GRE
  为了解决跨minion之间Pod的通信问题,我们在每个minion上安装Open vSwtich,并使用GRE或者VxLAN使得跨机器之间Pod能相互通信,本文使用GRE,而VxLAN通常用在需要隔离的大规模网络中。对于Open vSwitch的具体安装步骤,可参考这篇博客,我们在这里就不再详细介绍安装步骤了。安装完Open vSwitch后,接下来便建立minion1和minion2之间的隧道。首先在minion1和minion2上建立OVS Bridge,
# ovs-vsctl add-br obr0  接下来建立gre,并将新建的gre0添加到obr0,在minion1上执行如下命令,
# ovs-vsctl add-port obr0 gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.230.5  在minion2上执行,
# ovs-vsctl add-port obr0 gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.230.4  至此,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上执行。
# brctl addbr kbr0               //创建linux bridge  
# brctl addif kbr0 obr0          //添加obr0为kbr0的接口
  
# ip link set dev docker0 down   //设置docker0为down状态
  
# ip link del dev docker0      //删除docker0
  为了使新建的kbr0在每次系统重启后任然有效,我们在/etc/sysconfig/network-scripts/目录下新建minion1的ifcfg-kbr0如下:
DEVICE=kbr0  
ONBOOT=yes
  
BOOTPROTO=static
  
IPADDR=172.17.1.1
  
NETMASK=255.255.255.0
  
GATEWAY=172.17.1.0
  
USERCTL=no
  
TYPE=Bridge
  
IPV6INIT=no
  同样在minion2上新建ifcfg-kbr0,只需修改ipaddr为172.17.2.1和gateway为172.17.2.0即可,然后执行systemctl restart network重启系统网络服务,你能在minion1和minion2上发现kbr0都设置了相应的IP地址。为了验证我们创建的隧道是否能通信,我们在minion1和minion2上相互ping对方kbr0的IP地址,从下面的结果发现是不通的,经查找这是因为在minion1和minion2上缺少访问172.17.1.1和172.17.2.1的路由,因此我们需要添加路由保证彼此之间能通信。
# ping 172.17.2.1  
PING 172.17.2.1 (172.17.2.1) 56(84) bytes of data.
  
^C
  
--- 172.17.2.1 ping statistics ---
  
2 packets transmitted, 0 received, 100% packet loss, time 1000ms
  

  
#ping 172.17.1.1
  
PING 172.17.1.1 (172.17.1.1) 56(84) bytes of data.
  
^C
  
--- 172.17.1.1 ping statistics ---
  
2 packets transmitted, 0 received, 100% packet loss, time 1000ms
  由于通过ip route add添加的路由会在下次系统重启后失效,为此我们在/etc/sysconfig/network-scripts目录下新建一个文件route-eth0存储路由,这里需要注意的是route-eth0和ifcfg-eth0的黑体部分必须保持一致,否则不能工作,这样添加的路由在下次重启后不会失效。为了保证两台minion的kbr0能相互通信,我们在minion1的route-eth0里添加路由172.17.2.0/24 via 192.168.230.5 dev eno16777736,eno16777736是minion1的网卡,同样在minion2的route-eth0里添加路由172.17.1.0/24 via 192.168.230.4 dev eno16777736。重启网络服务后再次验证,彼此kbr0的地址可以ping通,如:
# ping 172.17.1.1  
PING 172.17.1.1 (172.17.1.1) 56(84) bytes of data.
  
64 bytes from 172.17.1.1: icmp_seq=1 ttl=64 time=2.49 ms
  
64 bytes from 172.17.1.1: icmp_seq=2 ttl=64 time=0.512 ms
  
^C
  
--- 172.17.1.1 ping statistics ---
  
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
  
rtt min/avg/max/mdev = 0.512/1.505/2.498/0.993 ms
  到现在我们已经建立了两minion之间的隧道,而且能正确的工作。下面我们将介绍如何安装Kubernetes APIServer及kubelet、proxy等服务。
4.2 安装Kubernetes APIServer
  在安装APIServer之前,我们先下载Kubernetes及Etcd,做一些准备工作。在kubernetes上的具体操作如下:
# mkdir /tmp/kubernetes  
# cd /tmp/kubernetes/
  
# wget https://github.com/GoogleCloudPlatform/kubernetes/releases/download/v0.5.2/kubernetes.tar.gz
  
# wget https://github.com/coreos/etcd/releases/download/v0.4.6/etcd-v0.4.6-linux-amd64.tar.gz
  然后解压下载的kubernetes和etcd包,并在kubernetes、minion1、minion2上创建目录/opt/kubernetes/bin,
# mkdir -p /opt/kubernetes/bin  
# tar xf kubernetes.tar.gz
  
# tar xf etcd-v0.4.6-linux-amd64.tar.gz
  
# cd ~/kubernetes/server
  
# tar xf kubernetes-server-linux-amd64.tar.gz
  
# /tmp/kubernetes/kubernetes/server/kubernetes/server/bin
  复制kube-apiserver,kube-controller-manager,kube-scheduler,kubecfg到kubernetes的/opt/kubernetes/bin目录下,而kubelet,kube-proxy则复制到minion1和minion2的/opt/kubernetes/bin,并确保都是可执行的。
# cp kube-apiserver kube-controller-manager kubecfg kube-scheduler /opt/kubernetes/bin  
# scp kube-proxy kubelet root@192.168.230.4:/opt/kubernetes/bin
  
# scp kube-proxy kubelet root@192.168.230.5:/opt/kubernetes/bin
  为了简单我们只部署一台etcd服务器,如果需要部署etcd的集群,请参考官方文档,在本文中将其跟Kubernetes APIServer部署同一台机器上,而且将etcd放置在/opt/kubernetes/bin下,etcdctl跟ectd同一目录。
# cd /tmp/kubernetes/etcd-v0.4.6-linux-amd64  
# cp etcd etcdctl /opt/kubernetes/bin
  需注意的是kubernetes和minion上/opt/kubernetes/bin目录下的文件都必须是可执行的。到目前,我们准备工作已经差不多,现在开始给apiserver,controller-manager,scheduler,etcd配置unit文件。首先我们用如下脚本etcd.sh配置etcd的unit文件,
#!/bin/sh  

  
ETCD_PEER_ADDR=192.168.230.3:7001
  
ETCD_ADDR=192.168.230.3:4001
  
ETCD_DATA_DIR=/var/lib/etcd
  
ETCD_NAME=kubernetes
  

  
! test -d $ETCD_DATA_DIR && mkdir -p $ETCD_DATA_DIR
  
cat

beson2000 发表于 2019-1-11 21:25:24

谢谢分享
页: [1]
查看完整版本: CentOS 7实战Kubernetes部署