<commit_before>---
layout:     post
title:      "CentOS7下Docker+k8s集群的安装过程"
subtitle:   ""
date:       2016-05-05
author:     "mubanjiu"
catalog:    true
tags:
 - 技术
---

>本docker集群采用docker-engine + flannel + k8s来搭建
>将机器分为master和node两个角色，master上相对node多了registry，etcd，kube-apiserver,kube-scheduler,kube-controller-manager

>master为：192.168.1.200  
>其他为node

# 1.安装docker engine.(所有机器)
1.1 升级所有软件包及系统内核：  `yum update`  
1.2 `reboot`   
1.3 安装docker-engine: `curl -fsSL https://get.docker.com/ | sh`  
1.4 设为开机启动： `systemctl enable docker`  

# 2.修改registry(master)
docker官方的Docker Hub由于各种原因在国内基本无法访问，好在有daocloud.io 提供的国内镜像。 
在/etc/systemd/system/docker.service.d/下新建docker.conf文件，内容为： 

    [Service]
    ExecStart=
    ExecStart=/usr/bin/docker daemon -H fd:// --graph="/data/docker-data" --storage-driver=overlay  --registry-mirror=http://78967139.m.daocloud.io --insecure-registry=78967139.m.daocloud.io

重启docker：  
`systemctl daemon-reload`  
`systemctl restart docker`

# 3.安装私有仓库(master)
registry v2和v1之间有些区别，v2中如果registry配置了proxy，那这个registry就不能push image上去了。我们建私仓当然得push image上去了，所以私仓和proxy就得分开搭建。私仓用来管理我们自己的私有image，proxy用来加速Registry Hub。  
由于是搭建的内部集群，datacenter以外访问不了，故不考虑安全问题，将registry运行在container中：  
私仓：  
`docker run -d -p 80:5000 -v /data/docker-registry/private:/var/lib/registry  --restart=always --name=registry_private registry:2`  
Proxy:  
`docker run -d -p 5000:5000 -v /data/docker-registry/proxy:/var/lib/registry  -e REGISTRY_PROXY_REMOTEURL=http://78967139.m.daocloud.io  --restart=always --name=registry_proxy registry:2`  



# 4.registry配置改成私有仓库(所有机器)  
修改/etc/systemd/system/docker.service.d/下的docker.conf文件，将相应地址改成私有仓库的地址即可  

    [Service]
    ExecStart=
    ExecStart=/usr/bin/docker daemon -H fd:// --graph="/data/docker-data" --storage-driver=overlay  --registry-mirror=http://192.168.1.200:5000 --insecure-registry=192.168.1.200

然后重启docker  
`systemctl daemon-reload`  
`systemctl restart docker`  

# 5.安装etcd(master)    
etcd是给flannel和k8s用的配置管理中心，和zookeeper类似。本来想用docker跑etcd，但是由于flannel依赖etcd，而docker会依赖flannel，如果etcd再依赖docker，这样就变成了循环依赖，在启动的时候不知道哪个应该最先启动了。所以etcd还是只能直接跑在宿主机上。只部署了单台的etcd，考虑到HA，未来需扩展成为etcd集群。  
`yum install etcd`  
`systemctl enable etcd`  
修改etcd配置文件/etc/etcd/etcd.conf：  
修改这项：ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379,http://0.0.0.0:4001  
默认是监听的localhost，这样会导致其他机器无法访问etcd  
启动etcd：  
`systemctl start etcd`  
如果其他机器无法连接到etcd，可能是firewall的原因，根据情况配置或者直接关闭，我是直接关闭：`systemctl stop firewalld`  



# 6.安装flannel(所有机器)   
docker下的网络解决访问主要有calico,flannel,weave,docker overlay.他们的使用和对比可以参考下面这个blog：http://chunqi.li/2015/11/15/Battlefield-Calico-Flannel-Weave-and-Docker-Overlay-Network/  
经过了一些粗浅的比较，在calico和flannel vxlan之间纠结了一下，最后我选择的是flannel vxlan. 选择主要考量是性能和易用性  
使用yum安装flannel: `yum install flannel` ，repository里的并不是最新版本的flannel，如果需要最新版本的可以自己下载安装. 仓库中的flannel的-etcd-prefix默认值是/atomic.io/network 而自己安装的是/coreos.com/network,在写配置到etcd时需注意。  

flannel依赖etcd来获取配置和存储网络信息  
使用etcdctl将配置写入etcd:  
`etcdctl set /atomic.io/network/config '{"Network": "10.0.0.0/16","SubnetLen": 24,"SubnetMin": "10.0.1.0","SubnetMax": "10.0.200.0","Backend": {"Type": "vxlan"}}'`

修改flannel配置/etc/sysconfig/flanneld :  
`FLANNEL_ETCD="http://192.168.1.200:2379"`
`FLANNEL_OPTIONS="-ip-masq=true"`  
-ip-masq=true 这个参数的目的是让flannel进行ip伪装，而不让docker进行ip伪装。这么做的原因是如果docker进行ip伪装，流量再从flannel出去，其他host上看到的source ip就是flannel的网关ip，而不是docker容器的ip。hadoop和hbase会依赖这个ip进行集群管理，而把flannel的网关当做cluster node将会出现问题。  
参见：https://luqmansahaf.github.io/2015/11/29/on-setting-hadoop-hbase-docker-networking/  

关闭firewall：  
`systemctl stop firewalld`  <commit_msg>nothing<commit_after>---
layout:     post
title:      "CentOS7下Docker+k8s集群的安装过程"
subtitle:   ""
date:       2016-05-05
author:     "mubanjiu"
catalog:    true
tags:
 - 技术
---

>本docker集群采用docker-engine + flannel + k8s来搭建
>将机器分为master和node两个角色，master上相对node多了registry，etcd，kube-apiserver,kube-scheduler,kube-controller-manager

>master为：192.168.1.200  
>其他为node

# 1.安装docker engine.(所有机器)
1.1 升级所有软件包及系统内核：  `yum update`  
1.2 `reboot`   
1.3 安装docker-engine: `curl -fsSL https://get.docker.com/ | sh`  
1.4 设为开机启动： `systemctl enable docker`  

# 2.修改registry(master)
docker官方的Docker Hub由于各种原因在国内基本无法访问，好在有daocloud.io 提供的国内镜像。 
在/etc/systemd/system/docker.service.d/下新建docker.conf文件，内容为： 

    [Service]
    ExecStart=
    ExecStart=/usr/bin/docker daemon -H fd:// --graph="/data/docker-data" --storage-driver=overlay  --registry-mirror=http://78967139.m.daocloud.io --insecure-registry=78967139.m.daocloud.io

重启docker：  
`systemctl daemon-reload`  
`systemctl restart docker`

# 3.安装私有仓库(master)
registry v2和v1之间有些区别，v2中如果registry配置了proxy，那这个registry就不能push image上去了。我们建私仓当然得push image上去了，所以私仓和proxy就得分开搭建。私仓用来管理我们自己的私有image，proxy用来加速Registry Hub。  
由于是搭建的内部集群，datacenter以外访问不了，故不考虑安全问题，将registry运行在container中：  
私仓：  
`docker run -d -p 80:5000 -v /data/docker-registry/private:/var/lib/registry  --restart=always --name=registry_private registry:2`  
Proxy:  
`docker run -d -p 5000:5000 -v /data/docker-registry/proxy:/var/lib/registry  -e REGISTRY_PROXY_REMOTEURL=http://78967139.m.daocloud.io  --restart=always --name=registry_proxy registry:2`  



# 4.registry配置改成私有仓库(所有机器)  
修改/etc/systemd/system/docker.service.d/下的docker.conf文件，将相应地址改成私有仓库的地址即可  

    [Service]
    ExecStart=
    ExecStart=/usr/bin/docker daemon -H fd:// --graph="/data/docker-data" --storage-driver=overlay  --registry-mirror=http://192.168.1.200:5000 --insecure-registry=192.168.1.200

然后重启docker  
`systemctl daemon-reload`  
`systemctl restart docker`  

# 5.安装etcd(master)    
etcd是给flannel和k8s用的配置管理中心，和zookeeper类似。本来想用docker跑etcd，但是由于flannel依赖etcd，而docker会依赖flannel，如果etcd再依赖docker，这样就变成了循环依赖，在启动的时候不知道哪个应该最先启动了。所以etcd还是只能直接跑在宿主机上。只部署了单台的etcd，考虑到HA，未来需扩展成为etcd集群。  
`yum install etcd`  
`systemctl enable etcd`  
修改etcd配置文件/etc/etcd/etcd.conf：  
修改这项：ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379,http://0.0.0.0:4001  
默认是监听的localhost，这样会导致其他机器无法访问etcd  
启动etcd：  
`systemctl start etcd`  
如果其他机器无法连接到etcd，可能是firewall的原因，根据情况配置或者直接关闭，我是直接关闭：`systemctl stop firewalld`  



# 6.安装flannel(所有机器)   
docker下的网络解决访问主要有calico,flannel,weave,docker overlay.他们的使用和对比可以参考下面这个blog：http://chunqi.li/2015/11/15/Battlefield-Calico-Flannel-Weave-and-Docker-Overlay-Network/  
经过了一些粗浅的比较，在calico和flannel vxlan之间纠结了一下，最后我选择的是flannel vxlan. 选择主要考量是性能和易用性  
使用yum安装flannel: `yum install flannel` ，repository里的并不是最新版本的flannel，如果需要最新版本的可以自己下载安装. 仓库中的flannel的-etcd-prefix默认值是/atomic.io/network 而自己安装的是/coreos.com/network,在写配置到etcd时需注意。  

flannel依赖etcd来获取配置和存储网络信息  
使用etcdctl将配置写入etcd:  
`etcdctl set /atomic.io/network/config '{"Network": "10.0.0.0/16","SubnetLen": 24,"SubnetMin": "10.0.1.0","SubnetMax": "10.0.200.0","Backend": {"Type": "vxlan"}}'`

修改flannel配置/etc/sysconfig/flanneld :  
`FLANNEL_ETCD="http://192.168.1.200:2379"`
`FLANNEL_OPTIONS="-ip-masq=true"`  

-ip-masq=true 这个参数的目的是让flannel进行ip伪装，而不让docker进行ip伪装。这么做的原因是如果docker进行ip伪装，流量再从flannel出去，其他host上看到的source ip就是flannel的网关ip，而不是docker容器的ip。hadoop和hbase会依赖这个ip进行集群管理，而把flannel的网关当做cluster node将会出现问题。  
参见：https://luqmansahaf.github.io/2015/11/29/on-setting-hadoop-hbase-docker-networking/  

关闭firewall：  
`systemctl stop firewalld`  
{'fraction_non_alphanumeric': 0.13075738485230295, 'fraction_numerical': 0.04759904801903962, 'mean_word_length': 5.355871886120997, 'pattern_counts': {'":': 12, '<': 3, '<?xml version=': 0, '>': 11, 'https://': 4, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 18, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5200192', 'n_tokens_mistral': 3945, 'n_tokens_neox': 3905, 'n_words': 330}