加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2017-03-31 20:39:29)
标签:

kubernetes

docker

centos6.5

分类: IT那点事儿说起来却也又臭又长
       最近在看Tensorflow分布式集群的东西,于是就想学着用Kubernetes来简化集群管理。无奈目前手头上只有几个CentOS 6.5的云主机可以用,又不能随便换成CentOS 7,所以只好凑合着用了。折腾了一天总算把k8s跑起来了,这里记录下整个安装部署过程,虽然可能对别人没什么参考价值

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)
        root (hd0,0)
        kernel /boot/vmlinuz-3.10.105-1.el6.elrepo.x86_64 ro root=UUID=94e4e384-0ace-437f-bc96-057dd64f42ee rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /boot/initramfs-3.10.105-1.el6.elrepo.x86_64.img
title CentOS (2.6.32-573.22.1.el6.x86_64)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.32-573.22.1.el6.x86_64 ro root=UUID=94e4e384-0ace-437f-bc96-057dd64f42ee rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /boot/initramfs-2.6.32-573.22.1.el6.x86_64.img
title CentOS (2.6.32-431.23.3.el6.x86_64)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.32-431.23.3.el6.x86_64 ro root=UUID=94e4e384-0ace-437f-bc96-057dd64f42ee rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /boot/initramfs-2.6.32-431.23.3.el6.x86_64.img

完成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() {
    if [ ! -x $exec ]; then
      if [ ! -e $exec ]; then
        echo "Docker executable $exec not found"
      else
        echo "You do not have permission to execute the Docker executable $exec"
      fi              
      exit 5
    fi

    check_for_cleanup

    if ! [ -f $pidfile ]; then
        prestart
        printf "Starting $prog:\t"
        echo "\n$(date)\n" >> $logfile
        $exec daemon $other_args &>> $logfile &
        pid=$!
        touch $lockfile
        # wait up to 10 seconds for the pidfile to exist.  see
        # https://github.com/docker/docker/issues/5359
        tries=0
        while [ ! -f $pidfile -a $tries -lt 10 ]; do
            sleep 1
            tries=$((tries + 1))
        done
        success
        echo
    else
        failure
        echo
        printf "$pidfile still exists...\n"
        exit 7
    fi
}
...

完成修改后再次通过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  
          inet addr:172.17.88.0  P-t-P:172.17.88.0  Mask:255.255.0.0
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1472  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

接下来需要对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  
          inet addr:172.17.88.1  Bcast:0.0.0.0  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1472  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
flannel0  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:172.17.88.0  P-t-P:172.17.88.0  Mask:255.255.0.0
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1472  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

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:
  name: tensorflow-ps-rc
spec:
  replicas: 2
  selector:
    name: tensorflow-ps
  template:
    metadata:
      labels:
        name: tensorflow-ps
        role: ps
    spec:
      containers:
        - name: ps
          image: tensorflow/tensorflow:latest
          ports:
           - containerPort: 2222
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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有