kubernetes 1.3 的安装和集群环境部署

来源:互联网 发布:西门子攻丝编程参数 编辑:程序博客网 时间:2024/05/12 13:46

简介:

Docker:是一个开源的应用容器引擎,可以为应用创建一个轻量级的、可移植的、自给自足的容器。

Kubernetes:由Google开源的Docker容器集群管理系统,为容器化的应用提供资源调度、部署运行、服务发现、扩容缩容等功能。

Etcd:由CoreOS开发并维护的一个高可用的键值存储系统,主要用于共享配置和服务发现。

Flannel:Flannel是 CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(Overlay Network)工具,其目的在于帮助每一个使用 Kuberentes 的主机拥有一个完整的子网。

目标:

本文主要介绍Kunbernetes(以下简称k8s)集群的搭建。
本文包括:
  1. etcd集群的搭建;
  2. docker安装和配置(简单介绍);
  3. flannel安装和配置(简单介绍);
  4. k8s集群部署;

准备工作:

主机运行服务角色172.20.30.19(centos7.1)etcd
docker
flannel
kube-apiserver
kube-controller-manager
kube-schedulerk8s-master172.20.30.21(centos7.1)etcd
docker
flannel
kubelet
kube-proxyminion172.20.30.18(centos7.1)etcd
docker
flannel
kubelet
kube-proxyminion172.20.30.20(centos7.1)etcd
docker
flannel
kubelet
kube-proxyminion
























安装:

下载好etcd、docker、flannel的rpm安装包,例如:

etcd:

    etcd-2.2.5-2.el7.0.1.x86_64.rpm

flannel:

    flannel-0.5.3-9.el7.x86_64.rpm

docker:

    device-mapper-1.02.107-5.el7_2.5.x86_64.rpm                      docker-selinux-1.10.3-44.el7.centos.x86_64.rpm
    device-mapper-event-1.02.107-5.el7_2.5.x86_64.rpm            libseccomp-2.2.1-1.el7.x86_64.rpm
    device-mapper-event-libs-1.02.107-5.el7_2.5.x86_64.rpm     lvm2-2.02.130-5.el7_2.5.x86_64.rpm
    device-mapper-libs-1.02.107-5.el7_2.5.x86_64.rpm               lvm2-libs-2.02.130-5.el7_2.5.x86_64.rpm
    device-mapper-persistent-data-0.5.5-1.el7.x86_64.rpm         oci-register-machine-1.10.3-44.el7.centos.x86_64.rpm
    docker-1.10.3-44.el7.centos.x86_64.rpm                                oci-systemd-hook-1.10.3-44.el7.centos.x86_64.rpm
    docker-common-1.10.3-44.el7.centos.x86_64.rpm                 yajl-2.0.4-4.el7.x86_64.rpm
    docker-forward-journald-1.10.3-44.el7.centos.x86_64.rpm

etcd和flannel的安装比较简单,没有依赖关系。docker的安装因为有依赖关系,需要先安装docker的依赖包,才能安装成功。此处不是本文的重点,不做赘述。

四台机器上,都必须安装etcd,docker,和flannel


下载kubernetes 1.3版本的二进制包,点击下载

下载完成后执行一下操作,以在 172.20.30.19上为例:

[cpp] view plain copy
  1. # tar zxvf kubernetes1.3.tar.gz  # 解压二进制包  
  2. # cd kubernetes/server  
  3. # tar zxvf kubernetes-server-linux-amd64.tar.gz # 解压master所需的安装包  
  4. # cd kubernetes/server/bin/  
  5. # cp kube-apiserver kube-controller-manager kubectl kube-scheduler /usr/bin #把master需要的程序,拷贝到/usr/bin下,也可以设置环境变量达到相同目的  
  6. # scp kubelet kube-proxy root@172.20.30.21:~  # 把minion需要的程序,scp发送到minion上  
  7. # scp kubelet kube-proxy root@172.20.30.19:~  
  8. # scp kubelet kube-proxy root@172.20.30.20:~  

配置和部署:

1. etcd的配置和部署

修改四台机器中etcd的etcd配置:
[cpp] view plain copy
  1. # [member]  
  2. ETCD_NAME="etcd-2"  
  3. ETCD_DATA_DIR="/data/etcd/"  
  4. #ETCD_WAL_DIR=""  
  5. #ETCD_SNAPSHOT_COUNT="10000"  
  6. #ETCD_HEARTBEAT_INTERVAL="100"  
  7. #ETCD_ELECTION_TIMEOUT="1000"  
  8. #ETCD_LISTEN_PEER_URLS="http://localhost:2380" # 去掉默认的配置  
  9. ETCD_LISTEN_PEER_URLS="http://0.0.0.0:7001"  
  10. #ETCD_LISTEN_CLIENT_URLS="http://localhost:2379" # 去掉默认的配置  
  11. ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:4001"  
  12. #ETCD_MAX_SNAPSHOTS="5"  
  13. #ETCD_MAX_WALS="5"  
  14. #ETCD_CORS=""  
  15. #  
  16. #[cluster]  
  17. #ETCD_INITIAL_ADVERTISE_PEER_URLS="http://localhost:2380"  
  18. ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.20.30.21:7001"  
  19. # if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."  
  20. #ETCD_INITIAL_CLUSTER="default=http://localhost:2380"  
  21. ETCD_INITIAL_CLUSTER="etcd-1=http://172.20.30.19:7001,etcd-2=http://172.20.30.21:7001,etcd-3=http://172.20.30.18:7001,etcd-4=http://172.20.30.20:7001" # 此处的含义为,要配置包含有4台机器的etcd集群  
  22. ETCD_INITIAL_CLUSTER_STATE="new"  
  23. #ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"  
  24. #ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379"  
  25. ETCD_ADVERTISE_CLIENT_URLS="http://172.20.30.21:4001"  
  26. #ETCD_DISCOVERY=""  
  27. #ETCD_DISCOVERY_SRV=""  
  28. #ETCD_DISCOVERY_FALLBACK="proxy"  
  29. #ETCD_DISCOVERY_PROXY=""  
  30. #  
  31. #[proxy]  
  32. #ETCD_PROXY="off"  
  33. #ETCD_PROXY_FAILURE_WAIT="5000"  
  34. #ETCD_PROXY_REFRESH_INTERVAL="30000"  
  35. #ETCD_PROXY_DIAL_TIMEOUT="1000"  
  36. #ETCD_PROXY_WRITE_TIMEOUT="5000"  
  37. #ETCD_PROXY_READ_TIMEOUT="0"  
  38. #  
  39. #[security]  
  40. #ETCD_CERT_FILE=""  
  41. #ETCD_KEY_FILE=""  
  42. #ETCD_CLIENT_CERT_AUTH="false"  
  43. #ETCD_TRUSTED_CA_FILE=""  
  44. #ETCD_PEER_CERT_FILE=""  
  45. #ETCD_PEER_KEY_FILE=""  
  46. #ETCD_PEER_CLIENT_CERT_AUTH="false"  
  47. #ETCD_PEER_TRUSTED_CA_FILE=""  
  48. #  
  49. #[logging]  
  50. #ETCD_DEBUG="false"  
  51. # examples for -log-package-levels etcdserver=WARNING,security=DEBUG  
  52. #ETCD_LOG_PACKAGE_LEVELS=""  

修改四台机器中etcd的服务配置: /usr/lib/systemd/system/etcd.service。修改后的文件内容为:
[cpp] view plain copy
  1. [Unit]  
  2. Description=Etcd Server  
  3. After=network.target  
  4. After=network-online.target  
  5. Wants=network-online.target  
  6.   
  7. [Service]  
  8. Type=notify  
  9. WorkingDirectory=/var/lib/etcd/  
  10. EnvironmentFile=-/etc/etcd/etcd.conf  
  11. User=etcd  
  12. # set GOMAXPROCS to number of processors  
  13. ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /usr/bin/etcd --name=\"${ETCD_NAME}\" --data-dir=\"${ETCD_DATA_DIR}\" --listen-client-urls=\"${ETCD_LISTEN_CLIENT_URLS}\" --listen-peer-urls=\"${ETCD_LISTEN_PEER_URLS}\" --advertise-client-urls=\"${ETCD_ADVERTISE_CLIENT_URLS}\" --initial-advertise-peer-urls=\"${ETCD_INITIAL_ADVERTISE_PEER_URLS}\" --initial-cluster=\"${ETCD_INITIAL_CLUSTER}\" --initial-cluster-state=\"${ETCD_INITIAL_CLUSTER_STATE}\""  
  14. Restart=on-failure  
  15. LimitNOFILE=65536  
  16.   
  17. [Install]  
  18. WantedBy=multi-user.target  

在每台机器上执行: 
[cpp] view plain copy
  1. # systemctl enable etcd.service  
  2. # systemctl start etcd.service  


然后选择一台机器,在其上执行:
[cpp] view plain copy
  1. # etcdctl set /cluster "example-k8s"  

再选取另外一台机器,执行:
[cpp] view plain copy
  1. # etcdctl get /cluster  
如果返回 “example-k8s”,则etcd集群部署成功。

2. docker的配置和部署

docker的配置修改比较简单,主要是添加本地的 register地址:
在每台机器的docker配置(路径为 /etc/sysconfig/docker)中,均增加以下配置项:
[cpp] view plain copy
  1. ADD_REGISTRY="--add-registry docker.midea.registry.hub:10050"  
  2. DOCKER_OPTS="--insecure-registry docker.midea.registry.hub:10050"  
  3. INSECURE_REGISTRY="--insecure-registry docker.midea.registry.hub:10050"  
以上配置项为本地 register 的地址和服务端口,在docker的服务启动项中有用。具体register的搭建,请参考上一篇文章。

修改四台机器中docker的服务启动配置项 /usr/lib/systemd/system/docker.service。修改[Serive]项下的ExecStart 的值。
修改后,服务启动配置内容为:
[html] view plain copy
  1. [Unit]  
  2. Description=Docker Application Container Engine  
  3. Documentation=http://docs.docker.com  
  4. After=network.target  
  5. Wants=docker-storage-setup.service  
  6.   
  7. [Service]  
  8. Type=notify  
  9. NotifyAccess=all  
  10. EnvironmentFile=-/etc/sysconfig/docker  
  11. EnvironmentFile=-/etc/sysconfig/docker-storage  
  12. EnvironmentFile=-/etc/sysconfig/docker-network  
  13. Environment=GOTRACEBACK=crash  
  14. ExecStart=/bin/sh -c 'exec -a docker</strong></span> /usr/bin/docker-current daemon \ #注意,在centos7上,此处是个坑。docker启动的时候,systemd是无法获取到docker的pid,可能会导致后面的flannel服务无法启动,需要加上红色部分,让systemd能抓取到 docker的pid  
  15.           --exec-opt native.cgroupdriver=systemd \  
  16.           $OPTIONS \  
  17.           $DOCKER_STORAGE_OPTIONS \  
  18.           $DOCKER_NETWORK_OPTIONS \  
  19.           $ADD_REGISTRY \   # 加入本地register服务路径  
  20.           $BLOCK_REGISTRY \  
  21.           $INSECURE_REGISTRY \  
  22.           2>&1 | /usr/bin/forward-journald -tag docker'  
  23. LimitNOFILE=1048576  
  24. LimitNPROC=1048576  
  25. LimitCORE=infinity  
  26. TimeoutStartSec=0  
  27. MountFlags=slave  
  28. Restart=on-abnormal  
  29. StandardOutput=null  
  30. StandardError=null  
  31.   
  32. [Install]  
  33. WantedBy=multi-user.target  

分别在每台机器上执行
[cpp] view plain copy
  1. # systemctl enable docker.service  
  2. # systemctl start docker  
检测docker的运行状态很简单,执行
[cpp] view plain copy
  1. # docker ps  
查看是否能正常列出运行中的容器的各个元数据项即可(此时没有container运行,只列出各个元数据项):
[cpp] view plain copy
  1. # docker ps  
  2. CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES  

3. flannel的配置和部署

修改flannel的配置文件 /etc/sysconfig/flanneld
把etcd的服务地址和端口,flannel配置子网的信息,以及日志路径等添加到配置文件中。
因为每台机器上,都有etcd在运行,因此etcd的服务地址和端口,填写本机的即可。etcd会自动同步到etcd集群中的其它节点上。
修改完成后,文件内容:
[cpp] view plain copy
  1. # Flanneld configuration options  
  2.   
  3. # etcd url location.  Point this to the server where etcd runs  
  4. FLANNEL_ETCD="http://172.20.30.21:4001"  
  5.   
  6. # etcd config key.  This is the configuration key that flannel queries  
  7. # For address range assignment  
  8. FLANNEL_ETCD_KEY="/k8s/network" #这是一个目录,etcd中的目录  
  9.   
  10. # Any additional options that you want to pass  
  11. FLANNEL_OPTIONS="--logtostderr=false --log_dir=/var/log/k8s/flannel/ --etcd-endpoints=http://172.20.30.21:4001"  

然后执行:
# etcdctl mkdir /k8s/network
该命令是在etcd上创建一个目录,再执行:
# etcdctl set /k8s/network/config '{"Network":"172.100.0.0/16"}'
该命令含义是,期望docker运行的container实例的地址,都在 172.100.0.0/16网段中
flanneld会读取/k8s/network目录中config值,然后接管docker的地址分配,并把docker和宿主机器之间的网络桥接起来。

flannel的服务启动配置不用做修改。

执行:
# systemctl enable flanneld.service
# systemctl stop docker # 暂时先关闭docker服务,启动flanneld的时候,会自动拉起docker服务
# systemctl start flanneld.service

命令执行完成,如果没有差错的话,就会顺利地拉起docker。
使用 ifconfig 查看当前系统中的网络设备,就会发现除了有本身就有的eth0和lo等网络接口之外,出现了docker0和flannel0的网络设备:
[cpp] view plain copy
  1. # ifconfig  
  2. docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1472  
  3.         inet 172.100.28.1  netmask 255.255.255.0  broadcast 0.0.0.0  
  4.         inet6 fe80::42:86ff:fe81:6892  prefixlen 64  scopeid 0x20<link>  
  5.         ether 02:42:86:81:68:92  txqueuelen 0  (Ethernet)  
  6.         RX packets 29  bytes 2013 (1.9 KiB)  
  7.         RX errors 0  dropped 0  overruns 0  frame 0  
  8.         TX packets 25  bytes 1994 (1.9 KiB)  
  9.         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0  
  10.   
  11. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500  
  12.         inet 172.20.30.21  netmask 255.255.255.0  broadcast 172.20.30.255  
  13.         inet6 fe80::f816:3eff:fe43:21ac  prefixlen 64  scopeid 0x20<link>  
  14.         ether fa:16:3e:43:21:ac  txqueuelen 1000  (Ethernet)  
  15.         RX packets 13790001  bytes 3573763877 (3.3 GiB)  
  16.         RX errors 0  dropped 0  overruns 0  frame 0  
  17.         TX packets 13919888  bytes 1320674626 (1.2 GiB)  
  18.         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0  
  19.   
  20. flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1472  
  21.         inet 172.100.28.0  netmask 255.255.0.0  destination 172.100.28.0  
  22.         unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)  
  23.         RX packets 0  bytes 0 (0.0 B)  
  24.         RX errors 0  dropped 0  overruns 0  frame 0  
  25.         TX packets 2  bytes 120 (120.0 B)  
  26.         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0  
  27.   
  28. lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536  
  29.         inet 127.0.0.1  netmask 255.0.0.0  
  30.         inet6 ::1  prefixlen 128  scopeid 0x10<host>  
  31.         loop  txqueuelen 0  (Local Loopback)  
  32.         RX packets 65311  bytes 5768287 (5.5 MiB)  
  33.         RX errors 0  dropped 0  overruns 0  frame 0  
  34.         TX packets 65311  bytes 5768287 (5.5 MiB)  
  35.         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0  

以上描述,就部署好了基本的环境,接下来要部署和启动kubernetes服务。

4. kubenetes 部署

master:
编写如下脚本,保存为start_k8s_master.sh:
[cpp] view plain copy
  1. #! /bin/sh  
  2.   
  3. # firstly, start etcd  
  4. systemctl restart etcd  
  5.   
  6. # secondly, start flanneld  
  7. systemctl restart flanneld  
  8.   
  9. # then, start docker  
  10. systemctl restart docker  
  11.   
  12. # start the main server of k8s master  
  13. nohup kube-apiserver --insecure-bind-address=0.0.0.0 --insecure-port=8080 --cors_allowed_origins=.* --etcd_servers=http://172.20.30.19:4001 --v=1 --logtostderr=false --log_dir=/var/log/k8s/apiserver --service-cluster-ip-range=172.100.0.0/16 &  
  14.   
  15. nohup kube-controller-manager --master=172.20.30.19:8080 --enable-hostpath-provisioner=false --v=1 --logtostderr=false --log_dir=/var/log/k8s/controller-manager &  
  16.   
  17. nohup kube-scheduler --master=172.20.30.19:8080 --v=1 --logtostderr=false --log_dir=/var/log/k8s/scheduler &  
然后赋予执行权限:
[cpp] view plain copy
  1. # chmod u+x start_k8s_master.sh  


由于安装k8s的操作,已经把kubelet和kube-proxy发送到作为minion机器上了(我们已经悄悄地定义好了k8s集群)
因此,编写脚本,保存为start_k8s_minion.sh
[cpp] view plain copy
  1. #! /bin/sh  
  2.   
  3. # firstly, start etcd  
  4. systemctl restart etcd  
  5.   
  6. # secondly, start flanneld  
  7. systemctl restart flanneld  
  8.   
  9. # then, start docker  
  10. systemctl restart docker  
  11.   
  12. # start the minion  
  13. nohup kubelet --address=0.0.0.0 --port=10250 --v=1 --log_dir=/var/log/k8s/kubelet --hostname_override=172.20.30.21 --api_servers=http://172.20.30.19:8080 --logtostderr=false &  
  14.   
  15. nohup kube-proxy --master=172.20.30.19:8080 --log_dir=/var/log/k8s/proxy --v=1 --logtostderr=false &  
然后赋予执行权限:
[cpp] view plain copy
  1. # chmod u+x start_k8s_minion.sh  
发送该脚本到作为minion的主机上。

运行k8s

在作为master的主机上,执行:
[cpp] view plain copy
  1. # ./start_k8s_master.sh  

在作为minion的主机上,执行:
[cpp] view plain copy
  1. # ./start_k8s_minion.sh  

在master主机上,执行:
[cpp] view plain copy
  1. # kubectl get node  
  2. NAME           STATUS    AGE  
  3. 172.20.30.18   Ready     5h  
  4. 172.20.30.20   Ready     5h  
  5. 172.20.30.21   Ready     5h  

列出以上信息,则表示k8s集群部署成功。

参考:

http://kubernetes.io/docs/user-guide/
Docker容器与容器云

感谢楚哥在学习过程中的答疑。
0 0