• kubernetes集群部署


    鉴于Docker如此火爆,Google推出kubernetes管理docker集群,不少人估计会进行尝试。kubernetes得到了很多大公司的支持,kubernetes集群部署工具也集成了gce,coreos,aws等iaas平台,部署起来也相当的方便。鉴于网上众多资料基于的是不少老版本,本篇文章针对最新的kubernetes及其依赖组件的部署简要阐述。通过本文可以比较粗暴的运行你的kubernetes集群,要优雅还需要更多的工作。部署主要分为三步:

    1、准备机器并打通网络

    如果要部署kubernetes集群至少3台机器,一个作为master两个作为minion。如果有4台机器还可以一个作为etcd服务,如果更多可以部署一个etcd集群和更多的minion,这里以4台机器为例子,这里说的机器可以是物理机也可以是kvm虚拟机。机器列表:

    master:10.180.64.6
    etcd:    10.180.64.7
    minion1:10.180.64.8
    minion2:10.180.64.9
    至于网络可以使用flannel,或者openvswitch,这方面的资料网上很多,可以google或者baidu下。

    2、部署相关组件

    kubernetes安装主要分成3部分:etcd集群、master节点和minions。

    本文为了方便以4台云主机为例搭建一个kubernetes集群,云主机机器分配如下所示:

    ip

    角色

    10.180.64.6

    Kubernetes master

    10.180.64.7

    Etcd node

    10.180.64.8

    Kubernetes minion1

    10.180.64.9

    Kubernetes minion2

    2.1     etcd集群

           本次示例中以一台云主机作为etcd node,如需etcd集群请参照后续etcd使用介绍进行搭建。

    root@cnsdev-paas-master:~# curl -L  https://github.com/coreos/etcd/releases/download/v2.0.0-rc.1/etcd-v2.0.0-rc.1-linux-amd64.tar.gz-o etcd-v2.0.0-rc.1-linux-amd64.tar.gz

    root@cnsdev-paas-master:~# tar xzvf etcd-v2.0.0-rc.1-linux-amd64.tar.gz

    root@cnsdev-paas-master:~# cdetcd-v2.0.0-rc.1-linux-amd64

           拷贝etcd下的所有可执行文件到/bin下

    2.2.    master节点

           master节点上只涉及kubernetes安装,首先下载kubernetes执行以下指令。

    root@cnsdev-paas-master:~#wget https://github.com/GoogleCloudPlatform/kubernetes/releases/download/v0.8.0/kubernetes.tar.gz

    root@cnsdev-paas-master:~#tar -zxvfkubernetes.tar.gz

    root@cnsdev-paas-master:~#cdkubernetes/server/kubernetes

    root@cnsdev-paas-master:~#tar -zxvfkubernetes-server-linux-amd64.tar.gz

    root@cnsdev-paas-master:~#cd server/bin

           在master节点上将kube-apiserver、kube-controller-manager、kube-scheduler、kubecfg、kubectl拷贝到/bin

    2.3. minion节点

           minion节点涉及到kubernetes、cadvisor和docker的安装,master上安装是已经下载了kubernetes,将解压出的kubelet和kube-proxy拷贝到所有minion上。

           在minion节点上将kubelet、kube-proxy拷贝到/bin。

    (ps:拷不拷贝到/bin都无所谓,将这些可执行文件的路径加到$PATH中可以)

           安装cadvisor:

    root@cnsdev-paas-master:wget https://github.com/google/cadvisor/releases/download/0.7.1/cadvisor

           直接是可执行文件,不用解压了,拷贝到/bin下

           安装docker:

           在minion上安装docker,kubernetes会调用docker api创建pod作为worker容器,同时kubernetes本身的agent线程等也可以运行在docker里面,这样kubernetes升级也会比较容易。

           debian 7下安装docker可以使用ubuntu的源,运行以下指令:

    root@cnsdev-paas-master:echo debhttp://get.docker.io/ubuntu docker main | sudo tee/etc/apt/sources.list.d/docker.list
    root@cnsdev-paas-master:apt-key adv--keyserver keyserver.ubuntu.com --recv-keys36A1D7869245C8950F966E92D8576A8BA88D21E9
    root@cnsdev-paas-master:apt-getupdate
    root@cnsdev-paas-master:apt-getinstall -y lxc-docker

           运行一下dockerversion看看是否正常。


    3、运行kubernetes集群


    3.1.     kubernetes配置文件

    本节涉及的配置文件和在GCE上以及通过yum安装的kubernetes的配置文件不一定吻合,是全手动安装的暂时解决方案,如果已经集成到kubernetes项目下的cluster,可以运行kubernetes本身的一键部署采用salt部署整个集群,不需要手动操作,所以这里配置文件只适用于尚未被支持的平台上进行部署。所有需要的配置文件和执行脚本打包为kube-start.tar.gz。

    3.1.1.      etcd配置文件

           etcd配置文件为cfg-etcd:

    ETCD_NAME="-nameetcd-1" 

    etcd节点名称,如果etcd集群只有一个node,这一项可以注释不用配置,默认名称为default,这个名字后面会用到。

    ETCD_PEER_ADDRESS="-initial-advertise-peer-urls http://hostip:7001"

    etcd集群之间node的通讯地址,一般指定7001或者2380端口,这里etcd node的ip为10.180.64.7,所以这一项配置修改为http://10.180.64.7:7001

    ETCD_CLIENT_ADDRESS="-advertise-client-urls http://hostip:4001" 

    etcd node对外服务的地址,一般指定4001或者2379端口,这里修改为http://10.180.64.7:4001

    ETCD_DATA_DIR="-data-dir /home/data/etcd" 

    etcd存储数据的目录,自己指定,不同的目录相同的配置也会导致产生不同的etcd集群。

    ETCD_LISTEN_PEER_ADDRESS="-listen-peer-urls http://0.0.0.0:7001"

    etcd node监听的地址,如果为0.0.0.0将会监听所有接口,这里配置为http://0.0.0.0:7001

    ETCD_LISTEN_CLIENT_ADDRESS="-listen-client-urls http://0.0.0.0:4001" 

    对外服务监听地址,配置为http://0.0.0.0:4001

    ETCD_CLUSTER_MEMBERS="-initial-clusteretcd-1=http://ip_etcd-1:7001 etcd-2=http://ip_etcd-2:7001" 

    etcd集群成员地址的列表,因为为etcd集群内部,所以需指定7001或者2380端口,这里只有一个node,而且没有配置ETCD_NAME,那么默认名称为default,这里配置为default=http://10.180.64.7:70001

    ETCD_CLUSTER_STATE="-initial-cluster-statenew" 

    etcd集群状态,new表示新建一个集群,existing表示已经存在。

    ETCD_ARGS="" 

    需要额外添加的参数,可以自己添加,etcd的所有参数可以通过etcd -h查看。

    3.1.2.      kubernetes集群配置文件

           cfg-common:

    KUBE_ETCD_SERVERS="--etcd_servers=http://10.180.64.7:4001" 

    etcd服务地址,前面已经启动了etcd服务,这里配置为http://10.180.64.7:4001

    KUBE_LOGTOSTDERR="--logtostderr=true" 

    表示错误日志记录到文件还是输出到stderr。

    KUBE_LOG_LEVEL="--v=0" 

    日志等级。

    KUBE_ALLOW_PRIV="--allow_privileged=false" 

    允许运行特权容器。

    3.1.3.      apiserver配置文件

           cfg-apiserver:

    KUBE_API_ADDRESS="--address=0.0.0.0"

    监听的接口,如果配置为127.0.0.1则只监听localhost,配置为0.0.0.0会监听所有接口,这里配置为0.0.0.0。

    KUBE_API_PORT="--port=8080"

    apiserver的监听端口,默认8080,不用修改。

    KUBE_MASTER="--master=10.180.64.6:8080"

    apiserver的服务地址,controller-manager、scheduler及kubelet都会用到这个配置,这里配置为10.180.64.6:8080

    KUBELET_PORT="--kubelet_port=10250"

    minion上kubelet监听的端口,默认10250,无需修改

    KUBE_SERVICE_ADDRESSES="--portal_net=10.254.0.0/16"

    kubernetes可以分配的ip的范围,kubernetes启动的每一个pod以及serveice都会分配一个ip地址,将从这个范围分配。

    KUBE_API_ARGS=""

    需要额外添加的配置项,简单地启用一个集群无需配置。

    3.1.4.      controller配置文件

           cfg-controller-manager:

    KUBELET_ADDRESSES="--machines=10.180.64.8,10.180.64.9"

    kubernetes集群中minion的列表,这里配置为10.180.64.8,10.180.64.9

    KUBE_CONTROLLER_MANAGER_ARGS=""

    需要额外添加的参数

    3.1.5.      scheduler配置文件

           cfg-schedule:

           如果需要额外参数可以自行添加,这里暂时不添加新的参数。

    3.1.6.      kubelet配置文件

           cfg-kubelet:

    KUBELET_ADDRESS="--address=10.180.64.8"

    minion监听的地址,每个minion根据实际的ip配置,这里minion1上为10.180.64.8,minion2上为10.180.64.9。

    KUBELET_PORT="--port=10250"

    监听端口,不要修改,如果修改,同时需要修改master上配置文件中涉及的配置项。

    KUBELET_HOSTNAME="--hostname_override=10.180.64.8"

    kubernetes看到的minion的名称,使用kubecfglist minions时看到的将是这个名称而不是hostname,设置和ip地址一样便于识别。

    KUBELET_ARGS=""

    额外增加的参数

    3.1.7.      proxy配置文件

           cfg-proxy:

           如有额外参数自行配置,这里不需要添加。

    3.2.         kubernetes启动

    将kube-start.tar.gz解压,拷贝cfg-etcd、kube-etcd到etcd node上,为kube-etcd增加可执行权限。拷贝其中的cfg-common、cfg-apiserver、cfg-controller-manager、cfg-schedule、apiserver、controller、schedule拷贝到master上,为apiserver、controller和schedule增加可执行权限。拷贝cfg-common、cfg-kubelet、cfg-proxy、cadv、kube、proxy到所有minion主机上,同时确保每一个minion的cfg-kubelet修改正确,为cadv、kube、proxy增加可执行权限。

    首先在etcd node上运行etcd服务,执行

    root@cnsdev-paas-master:./kube-etcd &

    检验etcd是否正常,在master上执行

    root@cnsdev-paas-master:curl -L http://10.180.64.7:4001/version

    etcd 2.0.0-rc.1

    然后在master上顺序执行

    root@cnsdev-paas-master:./apiserver&

    root@cnsdev-paas-master:./controller &

    root@cnsdev-paas-master:./schedule &

    最后在所有的节点上顺序执行

    root@cnsdev-paas-master:./cadv &

    root@cnsdev-paas-master:./kube &

    root@cnsdev-paas-master:./proxy &

    所有组件都运行之后,到master上检测下状态。

    查看下集群状况

    root@cnsdev-paas-master:~# kubecfg listminions 

    Minionidentifier   Labels

    ----------         ----------

    10.180.64.9

    10.180.64.8

    可以看出集群中有两个节点10.180.64.8和10.180.64.9,正是部署的2个节点。

    查看当前集群的pod

    root@cnsdev-paas-master:~#kubecfg list pods 
    Name                                   Image(s)         Host       Labels      Status 
    ---------- ---------- ---------- ---------- ---------- 
    e473c35e-961d-11e4-bc28-fa163e8b5289 dockerfile/redis 10.180.64.9/ name=redisRunning 

    这里的redis你就当没看见,如果刚创建的集群这个时候是没有pod的,当然如果你是在gce或者aws上一键创建的,默认可能会看到kubernetes命名的pod,这是默认启动的状态监测的东东。

    集群已经创建好了,那就来创建个tomcat的replicationController玩玩吧。有多种接口方式可以实现这个,这里选择json,需要写一个tomcat-controller.json的文件告诉kubernetes该怎么创建这个controller。当然文件的名字可以随意点,只要能看懂就行。tomca-controller.json大概长这个样子:

    {

      "id":"tomcatController",

      "kind":"ReplicationController",

      "apiVersion":"v1beta1",

      "desiredState": {

        "replicas": 2,

        "replicaSelector":{"name":"tomcatCluster"},

        "podTemplate":{

          "desiredState": {

            "manifest": {

              "version": "v1beta1",

              "id": "tomcat",

              "containers": [{

                "name": "tomcat",

                "image":"tutum/tomcat",

                "ports":[{

                  "containerPort":8080,"hostPort":80}

                ]

              }]

            }

          },

          "labels": {"name":"tomcatCluster"}}

        },

      "labels": {

        "name":"tomcatCluster",

      }

    }

    里面各项值的含义看完kubernetes实现分析之后就会明白了。写好文件之后就让kubernetes执行吧。

    root@cnsdev-paas-master:/home/pod# kubecfg -ctomcat-pod.json create replicationControllers

    如果告诉你success,那么可以查看下集群的controller

    root@cnsdev-paas-master:/home/pod# kubecfg listreplicationControllers

    Name                Image(s)            Selector             Replicas

    ----------          ----------          ----------           ----------

    redisController     dockerfile/redis    name=redis           1

    tomcatController    tutum/tomcat        name=tomcatCluster   2

    请无视redis,这时候看到tomcat的replicationController已经起来了,Replicas=2表示要在集群里面运行2个docker,docker运行的镜像就是tutum/tomcat了,如果你的minion上面没有这个镜像那么kubernetes就要去docker hub上为你下载了,如果本地有这个镜像那么kubernetes就直接在minion上为你运行2个tomcat的container(pod),来看看这一切是不是真的。

    root@cnsdev-paas-master:/home/pod# kubecfg listpods

    Name                                         Image(s)                   Host                  Labels                    Status

    ----------                                  ----------          ----------           ----------               ----------

    643582db-97d1-11e4-aefa-fa163e8b5289   tutum/tomcat     10.180.64.9/        name=tomcatCluster      Running

    e473c35e-961d-11e4-bc28-fa163e8b5289   dockerfile/redis    10.180.64.9/        name=redis                Running

    64348fde-97d1-11e4-aefa-fa163e8b5289   tutum/tomcat        10.180.64.8/        name=tomcatCluster      Running

    更多的使用请看接口章节。





  • 相关阅读:
    Troubleshooting MySQL Memory Usage
    Innodb Log checkpointing 和 dirty Buffer pool pages的关系
    MySQL pager 命令有趣的用法
    测定INNODB REDO LOGS的写入量
    max_allowed_packet & Mysqldump
    链接MyISAM文件
    RFID常识
    C++的程序的文件结构(zt)
    使用C#开发ActiveX控件(zt)
    RFID自动识别术语解释(zt)
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/5728502.html
Copyright © 2020-2023  润新知