环境假定如下,两台机器均安装了CentOS 7 x86_64版本:
- 192.168.1.2 -- Master
- 192.168.1.3 -- Node
Master节点安装的服务如下,各服务意义看官方文档先入门:
- etcd
- kube-apiserver
- kube-scheduler
- kube-controller-manager
Node节点安装的服务如下:
- flannel
- docker
- kubelet
- kube-proxy
如无特别说明所有的可执行命令都将在以下目录:
/data/kubernetes/server/bin/
安装步骤如下:
安装Master节点服务(以下所有操作都在Master节点)
下载Kubernete 0.21.2版本,解压获取到需要的可执行文件
$ mkdir -p /data/ && cd /data
$ curl -L -O https://github.com/GoogleCloudPlatform/kubernetes/releases/download/v0.21.2/kubernetes.tar.gz
$ tar zxvf kubernetes.tar.gz
$ tar zxvf ./kubernetes/server/kubernetes-server-linux-amd64.tar.gz -C ./
$ ll kubernetes/server/bin/
可看到全部的kubernetes的二进制文件,需要将kubelet, kube-proxy拷贝到Node节点的相同目录下。
获取etcd和etcdctl可执行文件
$ cd /data/kubernetes/cluster/images/etcd/
$ make build -- 这步其实就是下载etcd文件,使用这个的原因是要版本兼容
$ ll etcd-v2.0.12-linux-amd64/
可看到etcd和etcdctl,将其移动到/data/kubernetes/server/bin/目录,方便统一执行和管理
$ cp etcd-v2.0.12-linux-amd64/etcd etcd-v2.0.12-linux-amd64/etcdctl /data/kubernetes/server/bin/
关闭selinux,防火墙
1、临时关闭(不用重启机器):
$setenforce 0 #设置SELinux 成为permissive模式
2、修改配置文件需要重启机器:
修改/etc/selinux/config 文件
将SELINUX=enforcing改为SELINUX=disabled
$ systemctl stop firewalld iptables
$ systemctl disable firewalld iptables
启动etcd,并增加flannel需要的网络配置
$ cd /data/kubernetes/sever/bin/
$ ./etcd --addr 192.168.1.2:4001 --bind-addr 0.0.0.0:4001 --data-dir /var/lib/etcd/data/ 1>>/var/log/etcd.log 2>&1 &
$ ./etcdctl mk /coreos.com/network/config '{"Network":"10.1.0.0/16"}'
这里分配给flannel的子网网段是10.1.0.0/16,你也可以更换为如:192.168.0.0/16, 172.0.0.0/8等
关于flannel网络更多信息可查看官方文档: https://github.com/coreos/flannel
启动kube-apiserver,kube-scheduler,kube-controller-manager
因为我本机已经有服务使用8080默认的apiserver端口,所以我改为8888端口,当然你可以使用其他任意未占用的端口。
所有安装的服务统一日志目录为:/var/log/k8s/
$ mkdir -p /var/log/k8s/
$ ./kube-apiserver --insecure-bind-address=0.0.0.0 \
--insecure-port=8888 \
--etcd-servers=http://127.0.0.1:4001 \
--kubelet-port=10250 \
--service-cluster-ip-range=10.254.0.0/16 \
--log-dir=/var/log/k8s \
--v=0 \
--logtostderr=false \
--admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota &
$ ./kube-scheduler --master='127.0.0.1:8888' \
--v=0 \
--logtostderr=false \
--log-dir=/var/log/k8s &
$ ./kube-controller-manager --v=0 \
--logtostderr=false \
--log-dir=/var/log/k8s \
--master=127.0.0.1:8888 &
在日志目录查看kube-controller-manager有如下错误信息,没有设置cloudprovider,可忽略:
Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
E0712 17:07:20.492353 22996 controllermanager.go:198] Failed to start service controller: ServiceController should not be run without a cloudprovider
非8080默认端口启动的apiserver
非8080默认端口启动的apiserver需做如下配置才能使用./kubectl,如果你使用的是8080端口,请跳过此步。
$ mkdir -p ~/.kube/
$ vim ~/.kube/config
apiVersion: v1
clusters:
- cluster:
api-version: v1
server: http://127.0.0.1:8888
安装Node节点服务(以下所有操作都在Node节点)
关闭selinux,防火墙
同Master操作。
安装docker并删除 docker0 网卡
$ yum -y install docker bridge-utils && service docker start
$ iptables -t nat -F
$ ifconfig docker0 down
$ brctl delbr docker0
拷贝Master节点的kubelet, kube-proxy文件到Node下
$ vim /etc/hosts
192.168.1.2 k8s-master
$ mkdir -p /data/kubernetes/server/bin/ && cd /data/kubernetes/server/bin/
$ scp k8s-master:/data/kubernetes/server/bin/kubelet,/data/kubernetes/server/bin/kube-proxy ./
安装flannel并启动
$ cd /data/
$ curl -L -O https://github.com/coreos/flannel/releases/download/v0.5.1/flannel-0.5.1-linux-amd64.tar.gz
$ tar zxvf flannel-0.5.1-linux-amd64.tar.gz
$ cd flannel-0.5.1
$ cp flanneld /data/kubernetes/server/bin/ && cd /data/kubernetes/server/bin/
$ mkdir -p /var/log/k8s/
$ ./flanneld --v=0 \
--logtostderr=false \
--log_dir=/var/log/k8s \
--etcd-endpoints=http://k8s-master:4001 &
配置docker并启动
建议选择第一种。
以下方法来自网友:
$ vim /etc/sysconfig/docker
EnvironmentFile=-/run/flannel/subnet.env
ExecStart=/usr/bin/docker -d --bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU}以下方法是之前自己的
$ cat /run/flannel/subnet.env
FLANNEL_SUBNET=10.1.24.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=false
$ vim /etc/sysconfig/docker
OPTIONS='--selinux-enabled --bip=10.1.24.1/24 --mtu=1472 --iptables=false' //根据以上 /run/flannel/subnet.env的内容变更相应配置即可
INSECURE_REGISTRY='--insecure-registry docker.myself' //如果有自己的docker私有仓库并没有配置https的,需要取消注释这个选项,并修改相应的仓库地址
#increase the number of open files for docker
DOCKER_NOFILE=1000000 //在最后加入这一行,可以增加docker打开的文件数
$ systemctl restart docker
$ systemctl enable docker
启动Node上的Kubernetes服务
$ cd /data/kubernetes/sever/bin/
$ ./kubelet --logtostderr=false \
--v=0 \
--allow-privileged=false \
--log-dir=/var/log/k8s \
--address=0.0.0.0 \
--port=10250 \
--register-node=true
--api_servers=http://k8s-master:8888 &
$ ./kube-proxy --logtostderr=false \
--v=0 \
--log-dir=/var/log/k8s \
--master=http://k8s-master:8888 &
在日志目录查看kubelet日志有如下错误信息,暂时可忽略:
Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
E0712 17:55:12.594873 22447 kubelet.go:682] Image garbage collection failed: unable to find data for container /
到此为止, 一个强大的k8s Cluster基本部署完成了。
以下我们做些验证和安装官方的guestbook:
验证安装是否成功
以下将在Master节点上操作kubectl,其实你可以把这个kubectl二进制文件放在任意的linux x86_64 电脑下运行,只要将上面Master最后一个操作的~/.kube/config拷贝到自己的电脑上,并修改server的值为k8s-master的IP和端口就行。
$ cd /data/kubernetes/server/bin/
$ ./kubectl version
./kubectl version
Client Version: version.Info{Major:"0", Minor:"21", GitVersion:"v0.21.2", GitCommit:"4e89f2e6670b1662021a86ac42b99c5c50c37d05", GitTreeState:"clean"}
Server Version: version.Info{Major:"0", Minor:"21", GitVersion:"v0.21.2", GitCommit:"4e89f2e6670b1662021a86ac42b99c5c50c37d05", GitTreeState:"clean"}
如果你看到了以上的信息,恭喜你,你部署成功了!
此时可看到一个简单的集群已经安装完成了。你可以重复以上Node节点的操作增加更多的k8s cluster的Node节点。
遇到的问题及解决
- 如果$cat /run/flannel/subnet.env 你发现flannel子网变更了的话,你需要删除 docker0 网卡,然后把新flannel子网的信息相应变更到/etc/sysconfig/docker,才能重启docker成功。
- 我们会在Node上看到一连串错误输出,大体为:
Error: statusCode= No such image: gcr.io/google_containers/pause
好吧,在Node上运行命令:
$docker pull docker.io/kubernetes/pause
$docker tag docker.io/kubernetes/pause gcr.io/google_containers/pause:0.8.0
搭建官方的guestbook 例子
稍后推出......
参考链接:https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/getting-started-guides/scratch.md