阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

基于kubernetes构建Docker集群管理详解

189次阅读
没有评论

共计 12779 个字符,预计需要花费 32 分钟才能阅读完成。

Kubernetes 是 Google 开源的容器集群管理系统,基于 Docker 构建一个容器的调度服务,提供资源调度、均衡容灾、服务注册、动态扩缩容等功能套件,目前最新版本为 0.6.2。本文介绍如何基于 CentOS7.0 构建 Kubernetes 平台。

在正式介绍之前,大家有必要先理解 Kubernetes 几个核心概念及其承担的功能。以下为 Kubernetes 的架构设计图:

基于 kubernetes 构建 Docker 集群管理详解

1. Pods

在 Kubernetes 系统中,调度的最小颗粒不是单纯的容器,而是抽象成一个 Pod,Pod 是一个可以被创建、销毁、调度、管理的最小的部署单元。比如一个或一组容器。

2. Replication Controllers

Replication Controller 是 Kubernetes 系统中最有用的功能,实现复制多个 Pod 副本,往往一个应用需要多个 Pod 来支撑,并且可以保证其复制的副本数,即使副本所调度分配的宿主机出现异常,通过 Replication Controller 可以保证在其它主宿机启用同等数量的 Pod。Replication Controller 可以通过 repcon 模板来创建多个 Pod 副本,同样也可以直接复制已存在 Pod,需要通过 Label selector 来关联。

3. Services

Services 是 Kubernetes 最外围的单元,通过虚拟一个访问 IP 及服务端口,可以访问我们定义好的 Pod 资源,目前的版本是通过 iptables 的 nat 转发来实现,转发的目标端口为 Kube_proxy 生成的随机端口,目前只提供 GOOGLE 云上的访问调度,如 GCE。如果与我们自建的平台进行整合?请关注下篇《kubernetes 与 HECD 架构的整合》文章。

4. Labels

Labels 是用于区分 Pod、Service、Replication Controller 的 key/value 键值对,仅使用在 Pod、Service、Replication Controller 之间的关系识别,但对这些单元本身进行操作时得使用 name 标签。

5. Proxy

Proxy 不但解决了同一主宿机相同服务端口冲突的问题,还提供了 Service 转发服务端口对外提供服务的能力,Proxy 后端使用了随机、轮循负载均衡算法。

说说个人一点看法,目前 Kubernetes 保持一周一小版本、一个月一大版本的节奏,迭代速度极快,同时也带来了不同版本操作方法的差异,另外官网文档更新速度相对滞后及欠缺,给初学者带来一定挑战。在上游接入层官方侧重点还放在 GCE(Google Compute Engine)的对接优化,针对个人私有云还未推出一套可行的接入解决方案。在 v0.5 版本中才引用 service 代理转发的机制,且是通过 iptables 来实现,在高并发下性能令人担忧。但作者依然看好 Kubernetes 未来的发展,至少目前还未看到另外一个成体系、具备良好生态圈的平台,相信在 V1.0 时就会具备生产环境的服务支撑能力。

一、环境部署

1. 平台版本说明

 

  1. Centos7.0 OS
  2. Kubernetes V0.6.2
  3. etcd version 0.4.6
  4. Docker version 1.3.2

 

2. 平台环境说明

基于 kubernetes 构建 Docker 集群管理详解

3. 环境安装

1)系统初始化工作(所有主机)

系统安装 - 选择 [最小化安装]

# yum -y install wget ntpdate bind-utils
# wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/epel-release-7-2.noarch.rpm
# yum update

 

CentOS 7.0 默认使用的是 firewall 作为防火墙,这里改为 iptables 防火墙(熟悉度更高,非必须)。

 

1.1 关闭 firewall:1.1、关闭 firewall:

# systemctl stop firewalld.service #停止 firewall
# systemctl disable firewalld.service #禁止 firewall 开机启动

 

1.2 安装 iptables 防火墙

# yum install iptables-services #安装
# systemctl start iptables.service #最后重启防火墙使配置生效
# systemctl enable iptables.service #设置防火墙开机启动

2)安装 Etcd(192.168.1.10 主机)

# mkdir -p /home/install && cd /home/install  
# wget https://github.com/coreos/etcd/releases/download/v0.4.6/etcd-v0.4.6-linux-amd64.tar.gz  
# tar -zxvf etcd-v0.4.6-linux-amd64.tar.gz  
# cd etcd-v0.4.6-linux-amd64  
# cp etcd* /bin/  
# /bin/etcd -version  
etcd version 0.4.6 

启动服务 etcd 服务,如有提供第三方管理需求,另需在启动参数中添加“-cors=’*’”参数。

# mkdir /data/etcd  
# /bin/etcd -name etcdserver -peer-addr 192.168.1.10:7001 -addr 192.168.1.10:4001 -data-dir /data/etcd -peer-bind-addr 0.0.0.0:7001 -bind-addr 0.0.0.0:4001 &

 

配置 etcd 服务防火墙,其中 4001 为服务端口,7001 为集群数据交互端口。

# iptables -I INPUT -s 192.168.1.0/24 -p tcp –dport 4001 -j ACCEPT
# iptables -I INPUT -s 192.168.1.0/24 -p tcp –dport 7001 -j ACCEPT

 

3)安装 Kubernetes(涉及所有 Master、Minion 主机)

通过 yum 源方式安装,默认将安装 etcd, docker, and cadvisor 相关包。

# curl https://copr.fedoraproject.org/coprs/eparis/kubernetes-epel-7/repo/epel-7/eparis-kubernetes-epel-7-epel-7.repo -o /etc/yum.repos.d/eparis-kubernetes-epel-7-epel-7.repo
#yum -y install kubernetes

 

升级至 v0.6.2,覆盖 bin 文件即可,方法如下:

# mkdir -p /home/install && cd /home/install
# wget https://github.com/GoogleCloudPlatform/kubernetes/releases/download/v0.6.2/kubernetes.tar.gz
# tar -zxvf kubernetes.tar.gz
# tar -zxvf kubernetes/server/kubernetes-server-linux-amd64.tar.gz
# cp kubernetes/server/bin/kube* /usr/bin

 

校验安装结果,出版以下信息说明安装正常。

[root@SN2014-12-200 bin]# /usr/bin/kubectl version
Client Version: version.Info{Major:”0″, Minor:”6+”, GitVersion:”v0.6.2″, GitCommit:”729fde276613eedcd99ecf5b93f095b8deb64eb4″, GitTreeState:”clean”}
Server Version: &version.Info{Major:”0″, Minor:”6+”, GitVersion:”v0.6.2″, GitCommit:”729fde276613eedcd99ecf5b93f095b8deb64eb4″, GitTreeState:”clean”}

 

4)Kubernetes 配置(仅 Master 主机)

master 运行三个组件, 包括 apiserver、scheduler、controller-manager,相关配置项也只涉及这三块。

4.1【/etc/kubernetes/config】

# Comma seperated list of nodes in the etcd cluster  
KUBE_ETCD_SERVERS=”–etcd_servers=http://192.168.1.10:4001″  
# logging to stderr means we get it in the systemd journal  
KUBE_LOGTOSTDERR=”–logtostderr=true”  
# journal message level, 0 is debug  
KUBE_LOG_LEVEL=”–v=0″  
# Should this cluster be allowed to run privleged docker containers  
KUBE_ALLOW_PRIV=”–allow_privileged=false”  

 

4.2【/etc/kubernetes/apiserver】

# The address on the local server to listen to.  
KUBE_API_ADDRESS=”–address=0.0.0.0″  
# The port on the local server to listen on.  
KUBE_API_PORT=”–port=8080″  
# How the replication controller and scheduler find the kube-apiserver  
KUBE_MASTER=”–master=192.168.1.200:8080″  
# Port minions listen on  
KUBELET_PORT=”–kubelet_port=10250″  
# Address range to use for services  
KUBE_SERVICE_ADDRESSES=”–portal_net=10.254.0.0/16″  
# Add you own!  
KUBE_API_ARGS=””

 

4.3【/etc/kubernetes/controller-manager】

 

# Comma seperated list of minions  
KUBELET_ADDRESSES=”–machines= 192.168.1.201,192.168.1.202″  
# Add you own!  
KUBE_CONTROLLER_MANAGER_ARGS=””  

 

 

4.4【/etc/kubernetes/scheduler】

 

# Add your own!  
KUBE_SCHEDULER_ARGS=””  

 

 

启动 master 侧相关服务

# systemctl daemon-reload
# systemctl start kube-apiserver.service kube-controller-manager.service kube-scheduler.service
# systemctl enable kube-apiserver.service kube-controller-manager.service kube-scheduler.service

 

5)Kubernetes 配置(仅 minion��机)

minion 运行两个组件, 包括 kubelet、proxy,相关配置项也只涉及这两块。

Docker 启动脚本更新

# vi /etc/sysconfig/docker

添加:-H tcp://0.0.0.0:2375,最终配置如下,以便以后提供远程 API 维护。

OPTIONS=–selinux-enabled -H tcp://0.0.0.0:2375 -H fd://

修改 minion 防火墙配置,通常 master 找不到 minion 主机多半是由于端口没有连通。

iptables -I INPUT -s 192.168.1.200 -p tcp –dport 10250 -j ACCEPT

修改 kubernetes minion 端配置,以 192.168.1.201 主机为例,其它 minion 主机同理。

5.1【/etc/kubernetes/config】

# Comma seperated list of nodes in the etcd cluster  
KUBE_ETCD_SERVERS=”–etcd_servers=http://192.168.1.10:4001″  
# logging to stderr means we get it in the systemd journal  
KUBE_LOGTOSTDERR=”–logtostderr=true”  
# journal message level, 0 is debug  
KUBE_LOG_LEVEL=”–v=0″  
# Should this cluster be allowed to run privleged docker containers  
KUBE_ALLOW_PRIV=”–allow_privileged=false”  

 

5.2【/etc/kubernetes/kubelet】

###  
# kubernetes kubelet (minion) config  
# The address for the info server to serve on (set to 0.0.0.0 or “” for all interfaces)  
KUBELET_ADDRESS=”–address=0.0.0.0″  
# The port for the info server to serve on  
KUBELET_PORT=”–port=10250″  
# You may leave this blank to use the actual hostname  
KUBELET_HOSTNAME=”–hostname_override=192.168.1.201″  
# Add your own!  
KUBELET_ARGS=””  

 

 

5.3【/etc/kubernetes/proxy】

KUBE_PROXY_ARGS=””  

 

启动 kubernetes 服务

# systemctl daemon-reload
# systemctl enable docker.service kubelet.service kube-proxy.service
# systemctl start docker.service kubelet.service kube-proxy.service

 

3. 校验安装 (在 master 主机操作,或可访问 master 主机 8080 端口的 client api 主机)

1) kubernetes 常用命令

# kubectl get minions    #查查看 minion 主机
# kubectl get pods    #查看 pods 清单
# kubectl get services 或 kubectl get services -o json    #查看 service 清单
# kubectl get replicationControllers    #查看 replicationControllers 清单
# for i in `kubectl get pod|tail -n +2|awk ‘{print $1}’`; do kubectl delete pod $i; done    #删除所有 pods

 

或者通过 Server api for REST 方式(推荐,及时性更高):

# curl -s -L http://192.168.1.200:8080/api/v1beta1/version | Python -mjson.tool    #查看 kubernetes 版本
# curl -s -L http://192.168.1.200:8080/api/v1beta1/pods | python -mjson.tool    #查看 pods 清单
# curl -s -L http://192.168.1.200:8080/api/v1beta1/replicationControllers | python -mjson.tool    #查看 replicationControllers 清单
# curl -s -L http://192.168.1.200:8080/api/v1beta1/minions | python -m json.tool    #查查看 minion 主机
# curl -s -L http://192.168.1.200:8080/api/v1beta1/services | python -m json.tool    #查看 service 清单

 

注: 在新版 Kubernetes 中,所有的操作命令都整合至 kubectl,包括 kubecfg、kubectl.sh、kubecfg.sh 等

2)创建测试 pod 单元

# /home/kubermange/pods && cd /home/kubermange/pods

# vi apache-pod.json

{
  “id”: “Fedoraapache”,  
  “kind”: “Pod”,  
  “apiVersion”: “v1beta1”,  
  “desiredState”: {
    “manifest”: {
      “version”: “v1beta1”,  
      “id”: “fedoraapache”,  
      “containers”: [{
        “name”: “fedoraapache”,  
        “image”: “fedora/apache”,  
        “ports”: [{
          “containerPort”: 80,  
          “hostPort”: 8080  
        }]  
      }]  
    }  
  },  
  “labels”: {
    “name”: “fedoraapache”  
  }  
}  

 

# kubectl create -f apache-pod.json

# kubectl get pod

NAME                IMAGE(S)            HOST                LABELS              STATUS
fedoraapache        fedora/apache       192.168.1.202/      name=fedoraapache   Running

 

启动浏览器访问 http://192.168.1.202:8080/,对应的服务端口切记在 iptables 中已添加。效果图如下:

基于 kubernetes 构建 Docker 集群管理详解

观察 kubernetes 在 etcd 中的数据存储结构

基于 kubernetes 构建 Docker 集群管理详解

观察单个 pods 的数据存储结构,以 json 的格式存储。

基于 kubernetes 构建 Docker 集群管理详解

二、实战操作

任务:通过 Kubernetes 创建一个 LNMP 架构的服务集群,以及观察其负载均衡,涉及镜像“yorko/webserver”已经 push 至 registry.hub.docker.com,大家可以通过“docker pull yorko/webserver”下载。

# mkdir -p /home/kubermange/replication && mkdir -p /home/kubermange/service
# cd /home/kubermange/replication 

 

1. 创建一个 replication,本例直接在 replication 模板中创建 pod 并复制,也可独立创建 pod 再通过 replication 来复制。

【replication/lnmp-replication.json】

{
  “id”: “webserverController”,  
  “kind”: “ReplicationController”,  
  “apiVersion”: “v1beta1”,  
  “labels”: {“name”: “webserver”},  
  “desiredState”: {
    “replicas”: 2,  
    “replicaSelector”: {“name”: “webserver_pod”},  
    “podTemplate”: {
      “desiredState”: {
         “manifest”: {
           “version”: “v1beta1”,  
           “id”: “webserver”,  
           “volumes”: [
             {“name”:”httpconf”, “source”:{“hostDir”:{“path”:”/etc/httpd/conf”}}},  
             {“name”:”httpconfd”, “source”:{“hostDir”:{“path”:”/etc/httpd/conf.d”}}},  
             {“name”:”httproot”, “source”:{“hostDir”:{“path”:”/data”}}}  
            ],  
           “containers”: [{
             “name”: “webserver”,  
             “image”: “yorko/webserver”,  
             “command”: [“/bin/sh”, “-c”, “/usr/bin/supervisord -c /etc/supervisord.conf”],  
             “volumeMounts”: [
               {“name”:”httpconf”, “mountPath”:”/etc/httpd/conf”},  
               {“name”:”httpconfd”, “mountPath”:”/etc/httpd/conf.d”},  
               {“name”:”httproot”, “mountPath”:”/data”}  
              ],  
             “cpu”: 100,  
             “memory”: 50000000,  
             “ports”: [{
               “containerPort”: 80,  
             },{
               “containerPort”: 22,  
            }]  
           }]  
         }  
       },  
       “labels”: {“name”: “webserver_pod”},  
      },  
  }  
}  

 

执行创建命令

#kubectl create -f lnmp-replication.json

观察生成的 pod 副本清单:

[root@SN2014-12-200 replication]# kubectl get pod

NAME                                   IMAGE(S)            HOST                LABELS               STATUS
84150ab7-89f8-11e4-970d-000c292f1620   yorko/webserver     192.168.1.202/      name=webserver_pod   Running
84154ed5-89f8-11e4-970d-000c292f1620   yorko/webserver     192.168.1.201/      name=webserver_pod   Running
840beb1b-89f8-11e4-970d-000c292f1620   yorko/webserver     192.168.1.202/      name=webserver_pod   Running
84152d93-89f8-11e4-970d-000c292f1620   yorko/webserver     192.168.1.202/      name=webserver_pod   Running
840db120-89f8-11e4-970d-000c292f1620   yorko/webserver     192.168.1.201/      name=webserver_pod   Running
8413b4f3-89f8-11e4-970d-000c292f1620   yorko/webserver     192.168.1.201/      name=webserver_pod   Running

 

2. 创建一个 service,通过 selector 指定 “name”: “webserver_pod” 与 pods 关联。

【service/lnmp-service.json】

{
  “id”: “webserver”,  
  “kind”: “Service”,  
  “apiVersion”: “v1beta1”,  
  “selector”: {
    “name”: “webserver_pod”,  
  },  
  “protocol”: “TCP”,  
  “containerPort”: 80,  
  “port”: 8080  
}  

 

执行创建命令:

# kubectl create -f lnmp-service.json

登录 minion 主机(192.168.1.201),查询主宿机生成的 iptables 转发规则(最后一行)

# iptables -nvL -t nat

Chain KUBE-PROXY (2 references)
pkts bytes target     prot opt in     out     source               destination        
    2   120 REDIRECT   tcp  —  *      *       0.0.0.0/0            10.254.102.162       /* kubernetes */ tcp dpt:443 redir ports 47700
    1    60 REDIRECT   tcp  —  *      *       0.0.0.0/0            10.254.28.74         /* kubernetes-ro */ tcp dpt:80 redir ports 60099
    0     0 REDIRECT   tcp  —  *      *       0.0.0.0/0            10.254.216.51        /* webserver */ tcp dpt:8080 redir ports 40689

 

访问测试,http://192.168.1.201:40689/info.php,刷新浏览器发现 proxy 后端的变化,默认为随机轮循算法。

基于 kubernetes 构建 Docker 集群管理详解

基于 kubernetes 构建 Docker 集群管理详解

三、测试过程

1.pods 自动复制、销毁测试,观察 Kubernetes 自动保持副本数(6 份)

删除 replicationcontrollers 中一个副本 fedoraapache

[root@SN2014-12-200 pods]# kubectl delete pods fedoraapache

I1219 23:59:39.305730    9516 restclient.go:133] Waiting for completion of operation 142530

fedoraapache

[root@SN2014-12-200 pods]# kubectl get pods

NAME                                   IMAGE(S)            HOST                LABELS              STATUS
5d70892e-8794-11e4-970d-000c292f1620   fedora/apache       192.168.1.201/      name=fedoraapache   Running
5d715e56-8794-11e4-970d-000c292f1620   fedora/apache       192.168.1.202/      name=fedoraapache   Running
5d717f8d-8794-11e4-970d-000c292f1620   fedora/apache       192.168.1.202/      name=fedoraapache   Running
5d71c584-8794-11e4-970d-000c292f1620   fedora/apache       192.168.1.201/      name=fedoraapache   Running
5d71a494-8794-11e4-970d-000c292f1620   fedora/apache       192.168.1.202/      name=fedoraapache   Running

 

# 自动生成出一个副本,保持 6 份的效果

[root@SN2014-12-200 pods]# kubectl get pods

NAME                                   IMAGE(S)            HOST                LABELS              STATUS
5d717f8d-8794-11e4-970d-000c292f1620   fedora/apache       192.168.1.202/      name=fedoraapache   Running
5d71c584-8794-11e4-970d-000c292f1620   fedora/apache       192.168.1.201/      name=fedoraapache   Running
5d71a494-8794-11e4-970d-000c292f1620   fedora/apache       192.168.1.202/      name=fedoraapache   Running
2a8fb993-8798-11e4-970d-000c292f1620   fedora/apache       192.168.1.201/      name=fedoraapache   Running
5d70892e-8794-11e4-970d-000c292f1620   fedora/apache       192.168.1.201/      name=fedoraapache   Running
5d715e56-8794-11e4-970d-000c292f1620   fedora/apache       192.168.1.202/      name=fedoraapache   Running

 

2. 测试不同角色模块中的 hostPort

1)pod 中 hostPort 为空,而 replicationcontrollers 为指定端口,则异常;两侧都指定端口,相同或不同时都异常;pod 的 hostport 为指定,另 replicationcon 为空,则正常;pod 的 hostport 为空,另 replicationcon 为空,则正常;结论是在 replicationcontrollers 场景不能指定 hostport,否则异常,待持续测试。

2)结论:在 replicationcontronllers.json 中,”replicaSelector”: {“name”: “webserver_pod”} 要与 ”labels”: {“name”: “webserver_pod”} 以及 service 中的 ”selector”: {“name”: “webserver_pod”}保持一致;

OpenStack, Kubernetes, Mesos 谁主沉浮  http://www.linuxidc.com/Linux/2015-09/122696.htm

Kubernetes 集群搭建过程中遇到的问题及解决  http://www.linuxidc.com/Linux/2015-12/125735.htm

Kubernetes 的详细介绍 :请点这里
Kubernetes 的下载地址 :请点这里

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2015-12/125760.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计12779字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中