環境假定如下,兩臺機器均安裝了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