CentOS 6.5安装部署Kubernetes 1.4过程记录

标签:
kubernetesdockercentos6.5 |
分类: IT那点事儿说起来却也又臭又长 |
1、升级CentOS 6.5内核版本
因为CentOS
6.5的内核版本比较低,导致无法安装docker的较新版本,所以先把内核版本升级一下,安装新版内核方法如下:
rpm --import
https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -ivh
http://www.elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel
install kernel-lt -y
完成安装之后,需要修改grub引导顺序,让系统自动引导新的内核版本,修改后的grub内容如下:
# cat
/etc/grub.conf
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS
(3.10.105-1.el6.elrepo.x86_64)
title CentOS
(2.6.32-573.22.1.el6.x86_64)
title CentOS
(2.6.32-431.23.3.el6.x86_64)
完成grub修改之后,重启系统,此时通过uname
-r命令可以看到系统已经完成了内核版本升级。
2、安装docker
这里使用yum来安装docker,所以需要先安装一下yum源,命令如下:
# yum -y install
http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# yum install
docker-io
完成安装之后通过service命令启动docker,发现启动失败,改成前台启动方式,发现如下错误信息:
# docker -d
INFO[0000] Listening for HTTP
on unix (/var/run/docker.sock)
docker: relocation error:
docker: symbol dm_task_get_info_with_deferred_remove, version Base
not defined in file libdevmapper.so.1.02 with link time
reference
解决以上问题的方法升级device-mapper-libs库,直接使用yum升级即可:
# yum upgrade
device-mapper-libs
经过以上处理过程,再通过service docker
start就可以成功启动docker了。
3、升级docker
通过上一步安装完的docker版本为1.7,而我希望安装的Kubernetes版本为1.4,很遗憾两者不兼容,docker
api的版本太低了,所以没办法只能把docker版本也做一下升级。升级之前停止docker服务,然后执行如下命令直接下载版本为1.10.3的docker:
# wget -c
https://get.docker.com/builds/Linux/x86_64/docker-1.10.3 -O
/usr/bin/docker
需要注意的是docker 1.10的启动方式与docker
1.7略有不同,所以需要修改一下启动脚本中的start函数,将-d选项修改为daemon选项:
# cat
/etc/init.d/docker
...
start() {
}
...
完成修改后再次通过service启动docker,发现启动失败,转为前台启动发现如下错误信息:
# docker
daemon
WARN[0000] devmapper: Udev sync
is not supported. This will lead to unexpected behavior, data loss
and errors. For more information, see
https://docs.docker.com/reference/commandline/daemon/#daemon-storage-driver-option
WARN[0000] devmapper: Usage of
loopback devices is strongly discouraged for production use. Please
use `--storage-opt dm.thinpooldev` or use `man docker` to refer to
dm.thinpooldev section.
WARN[0000] devmapper: Base
device already exists and has filesystem ext4 on it. User specified
filesystem will be
ignored.
INFO[0000] [graphdriver] using
prior storage driver "devicemapper"
INFO[0000] Graph migration to
content-addressability took 0.00
seconds
INFO[0000] Default bridge
(docker0) is assigned with an IP address 192.168.0.0/20. Daemon
option --bip can be used to set a preferred IP
address
FATA[0000] Error starting
daemon: Error initializing network controller: Error creating
default "bridge" network: Failed to setup IP tables, cannot acquire
Interface address: Interface docker0 has no IPv4
addresses
解决方法,清空所有低版本docker数据,包括docker0这个网络接口地址:
# ip link del
docker0
# rm -rf
/var/lib/docker/*
# rm -rf
/var/run/docker*
此时再次通过service启动docker就OK了。当然为了加快docker在国内的镜像下载速度,可以为docker配置一下加速器,方法见链接:http://blog.csdn.net/qq_26091271/article/details/51501768。
4、下载安装etcd、flannel和kubernetes
这三者均可以下载二进制的发布版本,但因为Kubernetes
1.4的发布版本超过1GB,我尝试了很多次都没能下成功,所以最后决定etcd和flannel直接用二进制发布版,而Kubernetes通过源码来编译。这里我选择了etcd
2.3.8和flannel 0.6.2,Kubernetes源码用1.4.9,下载命令如下:
# wget
https://github.com/coreos/etcd/releases/download/v2.3.8/etcd-v2.3.8-linux-amd64.tar.gz
# wget
https://github.com/coreos/flannel/releases/download/v0.6.2/flannel-v0.6.2-linux-amd64.tar.gz
# wget
https://github.com/kubernetes/kubernetes/archive/v1.4.9.tar.gz
接下来编译Kubernetes源码,所以如果没有现成的Go语言环境,需要先安装Go,安装方法就不赘述了。需要注意的是下载下来的源码需要修改一下目录名称,安装如下代码目录来组织,否则编译时会报找不到package的错误:
# ls -l $GOPATH/src/k8s.io/kubernetes/
总用量 336
drwxrwxr-x. 3 liangzhichao liangzhichao
4096 3月 22 18:58 api
drwxrwxr-x. 7 liangzhichao liangzhichao
4096 3月 22 18:58 build
-rw-rw-r--. 1 liangzhichao liangzhichao
159348 3月 22 18:58 CHANGELOG.md
drwxrwxr-x. 25 liangzhichao liangzhichao
4096 3月 22 18:58 cluster
drwxrwxr-x. 20 liangzhichao liangzhichao
4096 3月 22 18:58 cmd
-rw-rw-r--. 1 liangzhichao liangzhichao
3061 3月 22 18:58
code-of-conduct.md
drwxrwxr-x. 3 liangzhichao liangzhichao
4096 3月 22 18:58 contrib
-rw-rw-r--. 1 liangzhichao liangzhichao
139 3月 22
18:58 CONTRIB.md
-rw-rw-r--. 1 liangzhichao liangzhichao
2609 3月 22 18:58
CONTRIBUTING.md
-rw-rw-r--. 1 liangzhichao liangzhichao
433 3月 22
18:58 DESIGN.md
drwxrwxr-x. 12 liangzhichao liangzhichao
4096 3月 22 18:58 docs
drwxrwxr-x. 31 liangzhichao liangzhichao
4096 3月 22 18:58 examples
drwxrwxr-x. 12 liangzhichao liangzhichao
4096 3月 22 18:58 federation
drwxrwxr-x. 2 liangzhichao liangzhichao
4096 3月 22 18:58 Godeps
drwxrwxr-x. 11 liangzhichao liangzhichao
4096 3月 22 18:58 hack
drwxrwxr-x. 2 liangzhichao liangzhichao
4096 3月 22 18:58 hooks
-rw-rw-r--. 1 liangzhichao liangzhichao
6328 3月 22 18:58
labels.yaml
-rw-rw-r--. 1 liangzhichao liangzhichao
11354 3月 22 18:58 LICENSE
drwxrwxr-x. 2 liangzhichao liangzhichao
4096 3月 22 18:58 logo
-rw-rw-r--. 1 liangzhichao liangzhichao
8273 3月 22 18:58
Makefile
-rw-rw-r--. 1 liangzhichao liangzhichao
20640 3月 22 18:58
Makefile.generated_files
-rw-rw-r--. 1 liangzhichao liangzhichao
102 3月 22
18:58 OWNERS
drwxrwxr-x. 44 liangzhichao liangzhichao
4096 3月 22 18:58 pkg
drwxrwxr-x. 4 liangzhichao liangzhichao
4096 3月 22 18:58 plugin
-rw-rw-r--. 1 liangzhichao liangzhichao
8358 3月 22 18:58
README.md
drwxrwxr-x. 2 liangzhichao liangzhichao
4096 3月 22 18:58 release
drwxrwxr-x. 3 liangzhichao liangzhichao
4096 3月 22 18:58 staging
drwxrwxr-x. 11 liangzhichao liangzhichao
4096 3月 22 18:58 test
drwxrwxr-x. 7 liangzhichao liangzhichao
4096 3月 22 18:58
third_party
-rw-rw-r--. 1 liangzhichao liangzhichao
11422 3月 22 18:58
Vagrantfile
drwxrwxr-x. 10 liangzhichao liangzhichao
4096 3月 22 18:59 vendor
drwxrwxr-x. 2 liangzhichao liangzhichao
4096 3月 22 18:59 www
编译方法很简单,只需要在源码的cmd目录下,进入不同的组件执行go
build命令即可,例如要编译kube-apiserver,则命令如下:
# cd $GOPATH/src/k8s.io/kubernetes/cmd/kube-apiserver
# go build
这里需要注意的是有一个组件不在cmd目录下,而是在plugin的cmd目录下,那就是kube-scheduler,所以编译kube-scheduler的命令如下:
# cd
$GOPATH/src/k8s.io/kubernetes/plugin/cmd/kube-scheduler
# go build
最终编译后得到的各个组件的二进制文件包括:kube-controller-manager、kube-dns、kube-apiserver、kubectl、kubelet、kube-proxy、kube-scheduler,还有一些其他组件不太清楚是做啥的,所以就先略过不编译了,以后用到再说。
5、部署基础环境
这里先给出一张集群的拓扑图,一共包括三台机器,一台用来作为Kubernetes
Master,另外两台作为Kubernetes Minion。在部署Kubernetes前,先准备基础环境,把etcd和flannel运行起来,然后根据flannel的网络接口信息对docker进行相关配置。
http://s8/mw690/001kDQi5zy79WnP45Kv87&6906.5安装部署Kubernetes 1.4过程记录" TITLE="CentOS 6.5安装部署Kubernetes 1.4过程记录" />
修改Linux内核参数,开启Linux内核桥接网卡的iptables功能,修改方法及内容如下:
# vim
/etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
# sysctl -p
启动etcd,这里仅启动一个单节点的etcd集群,命令如下:
# etcd --name infra0 --initial-advertise-peer-urls
http://10.28.63.15:2380,http://10.28.63.15:7001 --listen-peer-urls
http://10.28.63.15:2380,http://10.28.63.15:7001
--listen-client-urls
http://10.28.63.15:2379,http://10.28.63.15:4001
--advertise-client-urls
http://10.28.63.15:2379,http://10.28.63.15:4001
--initial-cluster-token etcd-cluster --initial-cluster
infra0=http://10.28.63.15:2380,infra0=http://10.28.63.15:7001
--data-dir /root/data/etcd/data --initial-cluster-state new
成功启动etcd之后,向etcd中写入flannel的配置信息,命令如下:
# etcdctl
--endpoints=http://10.28.63.15:2379,http://10.28.63.15:4001 mk
/coreos.com/network/config '{"Network":"172.17.0.0/16",
"SubnetMin": "172.17.1.0", "SubnetMax": "172.17.254.0"}'
启动flannel,命令如下:
flanneld
-etcd-endpoints=http://10.28.63.15:2379,http://10.28.63.15:4001
此时,通过ifconfig命令可以看到新增了一个名为flannel0的网络接口:
flannel0 Link encap:UNSPEC
HWaddr
00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
接下来需要对docker进行配置,在flannel的二进制文件包中有一个mk-docker-opts.sh,执行该文件可以生成针对docker的配置参数,具体步骤如下:
# ./mk-docker-opts.sh -c
该命令会生成docker配置参数并写出到文件/run/docker_opts.env
中
# cat /run/docker_opts.env
拷贝该文件中的内容并添加到docker的配置文件/etc/sysconfig/docker中
DOCKER_OPTS="
--bip=172.17.88.1/24 --ip-masq=true --mtu=1472"
# cat /etc/sysconfig/docker
# vim /etc/sysconfig/docker
other_args="--bip=172.17.88.1/24
--ip-masq=true --mtu=1472"
DOCKER_CERT_PATH=/etc/docker
DOCKER_NOWARN_KERNEL_VERSION=1
完成以上修改之后重启docker,再次通过ifconfig命令可以发现docker0和flannel0目前已经处于同一网段了。
docker0 Link encap:Ethernet
HWaddr 02:42:84:3D:48:5E
flannel0 Link encap:UNSPEC
HWaddr
00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
6、部署运行Kubernetes
首先,启动Kubernetes
Master上的相关组件,包括kube-apiserver、kube-controller-manager、kube-scheduler和kube-dns。这里只给出相关命令,具体进程可以考虑通过supervisor来管理。
启动kube-apiserver,命令如下:
# kube-apiserver
--admission-control=NamespaceLifecycle,NamespaceAutoProvision,LimitRanger,ResourceQuota
--insecure-bind-address=0.0.0.0 --insecure-port=8080
--allow-privileged=true
--etcd-servers=http://10.28.63.15:2379,http://10.28.63.15:4001
--service-cluster-ip-range=10.0.0.0/24
启动kube-controller-manager,命令如下:
# kube-controller-manager
--master=http://10.28.63.15:8080
启动kube-scheduler,命令如下:
# kube-scheduler
--master=http://10.28.63.15:8080
启动kube-dns,命令如下:
# kube-dns --kube-master-url=http://10.28.63.15:8080
此时通过kubectl命令查看组件状态,可以发现核心组件已成功启动:
# kubectl get
componentstatuses
NAME
STATUS
MESSAGE
ERROR
controller-manager
Healthy ok
scheduler
Healthy ok
etcd-0
Healthy
{"health": "true"}
etcd-1
Healthy
{"health": "true"}
然后,启动两台Kubernetes
Minion上的相关组件,包括kubelet和kube-proxy。
启动kubelet,命令如下:
kubelet --address=0.0.0.0 --port=10250
--hostname-override=10.28.60.8 --api-servers=10.28.63.15:8080
--allow-privileged=true --cadvisor-port=4194
--cluster_dns=10.28.63.15 --cluster_domain=cluster.local
--healthz-bind-address=0.0.0.0 --healthz-port=10248
启动kube-proxy,命令如下:
kube-proxy --master=10.28.63.15:8080
--proxy-mode=iptables
通过以上步骤,Kubernetes集群中的相关组件就启动完成了,但此时还无法创建Pod,因为Kubernetes会为每个Pod启动一个pause容器,而这个pause容器的镜像gcr.io/google_containers/pause-amd64:3.0被墙了。解决方法如下:
# docker pull rainf/pause
# docker tag rainf/pause
gcr.io/google_containers/pause-amd64:3.0
7、创建Pod验证集群功能
这里通过创建两个TensorFlow的Pod来验证Kubernetes集群是否能够正常工作,用来创建Pod的yaml文件内容如下:
# cat
ps-pod.yaml
apiVersion: v1
kind:
ReplicationController
metadata:
spec:
# kubectl create
-f ps-pod.yaml
# kubectl get rc
NAME
DESIRED
CURRENT READY
AGE
tensorflow-ps-rc
2
2
2
1m
# kubectl get pods
NAME
READY
STATUS
RESTARTS AGE
tensorflow-ps-rc-apx41
1/1
Running
0
1m
tensorflow-ps-rc-yaict
1/1
Running
0
1m
通过以上结果可知,Kubernetes集群基本功能可用,本博主终于可以在Kubernetes上继续玩耍啦!
参考链接:http://www.jianshu.com/p/8358117a23bb
http://www.cnblogs.com/saneri/p/6178536.html
http://blog.csdn.net/gsying1474/article/details/53256599
http://blog.csdn.net/yarntime/article/details/50721904