1. 程式人生 > >kubernetes---CentOS7安裝kubernetes1.11.2圖文完整版

kubernetes---CentOS7安裝kubernetes1.11.2圖文完整版

架構規劃

k8s至少需要一個master和一個node才能組成一個可用叢集。

本章我們搭建一個master節點和三個node節點。
我們在生產環境中使用時k8s時可以適當增加節點。

我們有三臺伺服器,ip和身份規劃如下:
192.168.11.90 master node
192.168.11.91 node
192.168.11.92 node

192.168.11.90即作master節點又作node節點。

三臺伺服器都是CentOS7系統。

注意:Kubernetes 幾乎所有的安裝元件和 Docker 映象都放在 goolge 自己的網站上,這對國內的同學可能是個不小的障礙。建議是:網路障礙都必須想辦法克服,不然連 Kubernetes 的門都進不了。

設定主機名

分別使用hostname命令把主機名稱設定為k8s,k8s1,k8s2

hostname k8s
hostname k8s1
hostname k8s2

然後編輯對應關係,使用命令

vi /etc/hosts

輸入如下:

192.168.11.90  k8s
192.168.11.91  k8s1
192.168.11.92  k8s2

安裝方式選擇

目前有三種安裝方式

下面給出兩種安裝方式:
第一種是yum安裝
配置yum源後,使用yum安裝,好處是簡單,壞處也很明顯,需要google更新yum源才能獲得最新版本的軟體,而所有軟體的依賴又不能自己指定,尤其是你的作業系統版本如果低的話,使用yum源安裝的kubernetes的版本也會受到限制。

第一種是二進位制安裝
使用二進位制檔案安裝,好處是可以安裝任意版本的kubernetes,壞處是配置比較複雜。

第三種是kubeadm安裝
kubeadm是Kubernetes官方提供的用於快速安裝Kubernetes叢集的工具,伴隨Kubernetes每個版本的釋出都會同步更新,kubeadm會對叢集配置方面的一些實踐做調整,通過實驗kubeadm可以學習到Kubernetes官方在叢集配置上一些新的最佳實踐。

1.4版本對於Linux主要發行版本Ubuntu Xenial和Red Hat centos7的使用者,可以使用熟悉的apt-get和yum來直接安裝Kubernetes。再比如,1.4版本引入了kubeadm命令,將叢集啟動簡化為兩條命令,不需要再使用複雜的kube-up指令碼。

Kubernetes的官方文件更新的速度太快了,我們注意到在Kubernetes 1.9的文件Using kubeadm to Create a Cluster中已經給出了目前1.9的kubeadm的主要特性已經處於beta狀態了,在2018年將進入GA狀態,說明kubeadm離可以在生產環境中使用的距離越來越近了。

我們選擇使用第三種方式kubeadm安裝。

文末轉載其他文章的CentOS7第一第二種安裝方式以供參考。

版本選擇

根據系統和核心的版本,適合安裝的版本是不一樣的,我們必須先收集好相關對應的版本資料,目前的版本支援哪些版本的docker和k8s,再開始安裝,才能事半功倍,否則會出現很多問題。

推薦幾個匹配的版本如下:
centos7系統環境
Centos 7.2.1511
docker 1.12.6
etcd 3.1.5
kubernetes 1.6.0
flannel 0.7.0-1

或者
CentOS 7.4
docker 17.03.2
kubernetes 1.9.0

centos6系統環境
centos6
docker-1.7
k8s-1.2

在centos6 + docker-1.7 + k8s-1.2 是能用起來,安裝了dashboard、nexus2、harbor,但是對於一些新的東西不能用,並且k8s官網文件不分版本並且沒講明白docker相容的版本(至少官網文件),感覺人家就是行到自己這裡就不行,各種折騰然後到後面是版本問題。docker和k8s在容器大熱的當前,版本更新太快了,docker都到1.17了。綜上,如果在centos6上面玩玩了解k8s的概況還是好的,但是真的生產環境要用還是升級centos7或者使用ubuntu吧。
更多相關情況
k8s在Centos6部署實踐

因為centOS6 在生產環境中意義不大,使用起來版本較老,問題也很多,所以我們記錄在centOS7中安裝k8s的步驟。版本選擇如下:
CentOS 7.4
docker 17.03.2
kubernetes 1.9.0

使用kubeadm安裝Kubernetes

注意 以下命令,非root使用者需要sudo許可權帶sudo 執行相關命令。
root使用者去掉sudo執行。

關閉防火牆

如果各個主機啟用了防火牆,需要開放Kubernetes各個元件所需要的埠,可以檢視Installing kubeadm中的”Check required ports”一節。 這裡簡單起見在各節點禁用防火牆:

centOS 7.0版本

sudo systemctl stop firewalld.service   #停止firewall
sudo systemctl disable firewalld.service #禁止firewall開機啟動
sudo firewall-cmd --state             #檢視防火牆狀態

禁用SELINUX

sudo setenforce 0
sudo vi /etc/selinux/config
#SELINUX修改為disabled
SELINUX=disabled 

建立/etc/sysctl.d/k8s.conf檔案

sudo vi /etc/sysctl.d/k8s.conf

新增如下內容:

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

使修改生效,執行

sudo sysctl -p /etc/sysctl.d/k8s.conf

可能遇到問題—is an unknown key
報錯

error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key

解決方法

sudo modprobe bridge
sudo lsmod |grep bridge
sudo sysctl -p /etc/sysctl.d/k8s.conf

可能遇到問題–sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: 沒有那個檔案或目錄
報錯

[[email protected] ~]# sysctl -p /etc/sysctl.d/k8s.conf
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: 沒有那個檔案或目錄
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: 沒有那個檔案或目錄

解決方法

modprobe br_netfilter
ls /proc/sys/net/bridge
sudo sysctl -p /etc/sysctl.d/k8s.conf

安裝Docker

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

以及

sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

檢視當前的Docker版本:
使用命令

sudo yum list docker-ce.x86_64  --showduplicates |sort -r

輸出如下:

[[email protected] ~]$ sudo yum list docker-ce.x86_64  --showduplicates |sort -r
 * updates: mirrors.aliyun.com
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror, priorities
 * extras: mirrors.aliyun.com
 * elrepo: mirrors.tuna.tsinghua.edu.cn
docker-ce.x86_64            18.03.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            18.03.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.12.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.12.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.09.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.09.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.2.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.2.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.0.ce-1.el7.centos             docker-ce-stable
 * base: mirrors.aliyun.com
Available Packages
[[email protected] ~]$ 

Kubernetes 1.8已經針對Docker的1.11.2, 1.12.6, 1.13.1和17.03等版本做了驗證。 因此我們這裡在各節點安裝docker的17.03.2版本。
使用命令如下:

sudo yum makecache fast

以及

sudo yum install -y --setopt=obsoletes=0 \
  docker-ce-17.03.2.ce-1.el7.centos \
  docker-ce-selinux-17.03.2.ce-1.el7.centos

可能遇到的問題

獲取 GPG 金鑰失敗:[Errno 12] Timeout on https://download.docker.com/linux/centos/gpg: (28, 'Operation timed out after 30002 milliseconds with 0 out of 0 bytes received')

解決方法
一般超時原因都是網路問題,需要檢查網路以及能夠直接訪問到這個資源比如使用命令:

curl -l https://download.docker.com/linux/centos/gpg

啟動和停止docker

centOS7

sudo systemctl start docker

centOS6

sudo service docker start

Docker從1.13版本開始調整了預設的防火牆規則,禁用了iptables filter表中FOWARD鏈,這樣會引起Kubernetes叢集中跨Node的Pod無法通訊,在各個Docker節點執行下面的命令:

sudo iptables -P FORWARD ACCEPT

同時在docker的systemd unit檔案中以ExecStartPost加入允許訪問的程式碼,使用命令如下:

# 為docker服務建立一個systemd外掛目錄
mkdir -p /etc/systemd/system/docker.service.d
# 建立一個/etc/systemd/system/docker.service.d/port.conf配置檔案
vi /etc/systemd/system/docker.service.d/port.conf

輸入以下內容,儲存退出:

ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT

重啟docker服務

systemctl daemon-reload
systemctl restart docker

安裝kubeadm和kubelet

下面在各節點安裝kubeadm和kubelet,編輯資源庫

vi   /etc/yum.repos.d/kubernetes.repo

輸入如下內容:

[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
        https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg

使用命令測試地址是否可用

curl https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64

如果能正常訪問繼續安裝,使用命令如下:

yum makecache fast
yum install -y kubelet kubeadm kubectl

安裝完成後輸出如下:

已安裝:
  kubeadm.x86_64 0:1.11.2-0                                                                               kubectl.x86_64 0:1.11.2-0                                                                               kubelet.x86_64 0:1.11.2-0                                                                              

作為依賴被安裝:
  cri-tools.x86_64 0:1.11.0-0                                                                            kubernetes-cni.x86_64 0:0.6.0-0                                                                            socat.x86_64 0:1.7.3.2-2.el7    

安裝結果可以看出安裝的依賴和版本。
如果我們要手動安裝,也可以參考相應的依賴版本。

調整啟動方式

kubelet的啟動環境變數要與docker的cgroup-driver驅動一樣。

檢視docker的cgroup-driver驅動
使用命令

docker info
或者
docker info | grep -i cgroup

輸出如下:

Cgroup Driver: cgroupfs

可以看出docker 17.03使用的Cgroup Driver為cgroupfs。

Kubernetes文件中kubelet的啟動引數:

--cgroup-driver string Driver that the kubelet uses to manipulate cgroups on the host.
Possible values: 'cgroupfs', 'systemd' (default "cgroupfs")

預設值為cgroupfs,yum安裝kubelet,kubeadm時生成10-kubeadm.conf檔案中可能將這個引數值改成了systemd。

檢視kubelet的配置檔案,其中包含如下內容:
使用命令

cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
或者
cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf|grep "cgroup-driver"

1.11.2版本的封裝在/var/lib/kubelet/kubeadm-flags.env檔案中
使用命令

cat /var/lib/kubelet/kubeadm-flags.env|grep "cgroup-driver"

如果沒找到則是預設的cgroupfs,不需要修改。

如果輸出如下則需要修改成一致的方式,即可以修改10-kubeadm.conf中的也可以修改docker的。

KUBELET_CGROUP_ARGS=--cgroup-driver=systemd

我們這裡修改各節點docker的cgroup driver使其和kubelet一致

即修改或建立/etc/docker/daemon.json
使用命令

vi /etc/docker/daemon.json

加入下面的內容:

{
  "exec-opts": ["native.cgroupdriver=systemd"]
}

重啟docker:

systemctl restart docker
systemctl status docker

處理swap

Kubernetes 1.8開始要求關閉系統的Swap,如果不關閉,預設配置下kubelet將無法啟動。
可以通過kubelet的啟動引數–fail-swap-on=false更改這個限制。

方式一關閉swap

關閉系統的Swap方法如下:

swapoff -a

同時還需要修改/etc/fstab檔案,註釋掉 SWAP 的自動掛載,防止機子重啟後swap啟用。
使用命令

vi /etc/fstab

輸出如下:

#
# /etc/fstab
# Created by anaconda on Tue Jun 19 06:52:02 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=2d32a0e0-9bda-4a68-9abf-6a827a517177 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

註釋swap這一行後儲存退出

#/dev/mapper/centos-swap swap                    swap    defaults        0 0

確認swap已經關閉,使用命令

free -m

swap輸出為0則說明已經關閉,如下:

[[email protected] ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:            976         115         283           6         577         661
Swap:             0           0           0

k8s的swappiness引數調整,修改配置檔案

vi /etc/sysctl.d/k8s.conf

新增下面一行:

vm.swappiness=0

執行

sysctl -p /etc/sysctl.d/k8s.conf

使修改生效。

方式二去掉swap的限制

因為主機上還執行其他服務,關閉swap可能會對其他服務產生影響,則修改kubelet的啟動引數去掉這個限制。
修改/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
使用命令

vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

加入內容:

Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"
systemctl daemon-reload

啟動kubelet服務

在各節點開機啟動kubelet服務
使用命令

systemctl enable kubelet.service
systemctl start kubelet.service

準備映象

Kubernetes安裝過程中一個很大的問題,相關元件的映象都是託管在Google Container Registry上的。國內的映象加速一般針對的是Dockerhub上的映象。所以國內的伺服器是沒法直接安裝GCR上的映象的。
注意,這裡即使翻牆之後,在執行初始化時仍然會報錯
所有最好的解決方法是 在可訪問gcr.io/google-containers的國外節點(一般在aws或者全域性訪問外網的節點)中,把gcr.io的映象拉到可訪問的映象倉庫中,例如Docker Hub或者阿里雲等。

設定全域性代理後瀏覽器訪問 gcr.io/google-containers 顯示如下:

新建倉庫

根據如下步驟:
建立映象倉庫
命名-公開
本地倉庫
建立完成後點選管理
這樣我們就拿到了這個映象倉庫的公網地址

registry.cn-qingdao.aliyuncs.com/joe-k8s/k8s

登入命令

docker login --username=xxx registry.cn-qingdao.aliyuncs.com

登入密碼在 首頁設定




首先登入 倉庫
執行命令
登入命令

docker login --username=xxx registry.cn-qingdao.aliyuncs.com

輸入密碼。
登入成功輸出如下:

[root@k8s ~]# docker login --username=xxx registry.cn-qingdao.aliyuncs.com
Password: 
Login Succeeded

獲取版本號

K8s每個版本需要的映象版本號在kubeadm Setup Tool Reference Guide這個文件的的Running kubeadm without an internet connection一節裡有寫。所以可以根據安裝的實際版本來調整這個指令碼的引數。注意把上面的映象地址換成自己的。k8s是你建立的一個namespace,而不是倉庫名。

如圖可以看到 1.11版本的k8s可以使用命令獲取需要的映象版本如下:

kubeadm config images list

輸出如下:

k8s.gcr.io/kube-apiserver-amd64:v1.11.2
k8s.gcr.io/kube-controller-manager-amd64:v1.11.2
k8s.gcr.io/kube-scheduler-amd64:v1.11.2
k8s.gcr.io/kube-proxy-amd64:v1.11.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd-amd64:3.2.18
k8s.gcr.io/coredns:1.1.3

準備映象倉庫

方式一有國外伺服器節點編寫指令碼獲取推送映象

在國外的伺服器節點建立指令碼

vi push.sh

根據我們的經新倉庫連結和需要的映象版本號調整指令碼如下:

#!/bin/bash
set -o errexit
set -o nounset
set -o pipefail

KUBE_VERSION=v1.11.2
KUBE_PAUSE_VERSION=3.1
ETCD_VERSION=3.2.18
DNS_VERSION=1.1.3

GCR_URL=gcr.io/google-containers
ALIYUN_URL=registry.cn-qingdao.aliyuncs.com/joe-k8s/k8s

images=(kube-proxy-amd64:${KUBE_VERSION}
kube-scheduler-amd64:${KUBE_VERSION}
kube-controller-manager-amd64:${KUBE_VERSION}
kube-apiserver-amd64:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd-amd64:${ETCD_VERSION}
coredns:${DNS_VERSION})

for imageName in ${images[@]} 
do
  docker pull $GCR_URL/$imageName
  docker tag $GCR_URL/$imageName $ALIYUN_URL/$imageName
  docker push $ALIYUN_URL/$imageName
  docker rmi $ALIYUN_URL/$imageName
done

執行push.sh

sh push.sh

成功獲取和push之後我們的映象倉庫registry.cn-qingdao.aliyuncs.com/joe-k8s/k8s中就有了相關的包。

方式二使用別人在國內做好的映象倉庫

如果沒有國外的伺服器節點,那我們就不能自由的定製需要的版本號映象了。只能去找找別人已經做好的映象倉庫中有哪些版本,是否有在更新。
目前做的比較好的 持續更新的 k8s映象倉庫推薦 安家的。
Google Container Registry(gcr.io) 中國可用映象(長期維護)
安家的github
映象目錄
我們在映象目錄中可以看到 v1.11.2版本的映象也是有了的,可以使用。

這裡的映象目錄https://hub.docker.com/u/anjia0532/與我們自己準備的映象倉庫registry.cn-qingdao.aliyuncs.com/joe-k8s/k8s 是同等的作用,下面會用到。

獲取映象

在master節點建立獲取的指令碼

vi pull.sh

根據自己的映象倉庫獲取地址調整指令碼,如下:

#!/bin/bash
KUBE_VERSION=v1.11.2
KUBE_PAUSE_VERSION=3.1
ETCD_VERSION=3.2.18
DNS_VERSION=1.1.3
username=registry.cn-qingdao.aliyuncs.com/joe-k8s/k8s

images=(kube-proxy-amd64:${KUBE_VERSION}
kube-scheduler-amd64:${KUBE_VERSION}
kube-controller-manager-amd64:${KUBE_VERSION}
kube-apiserver-amd64:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd-amd64:${ETCD_VERSION}
coredns:${DNS_VERSION}
    )

for image in ${images[@]}
do
    docker pull ${username}/${image}
    docker tag ${username}/${image} k8s.gcr.io/${image}
    #docker tag ${username}/${image} gcr.io/google_containers/${image}
    docker rmi ${username}/${image}
done

unset ARCH version images username

執行

sh pull.sh

注意,安家的指令碼因為修改過命名使用的pull.sh指令碼如下:

#!/bin/bash
KUBE_VERSION=v1.11.2
KUBE_PAUSE_VERSION=3.1
ETCD_VERSION=3.2.18
DNS_VERSION=1.1.3
username=anjia0532

images=(google-containers.kube-proxy-amd64:${KUBE_VERSION}
google-containers.kube-scheduler-amd64:${KUBE_VERSION}
google-containers.kube-controller-manager-amd64:${KUBE_VERSION}
google-containers.kube-apiserver-amd64:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd-amd64:${ETCD_VERSION}
coredns:${DNS_VERSION}
    )

for image in ${images[@]}
do
    docker pull ${username}/${image}
    docker tag ${username}/${image} k8s.gcr.io/${image}
    #docker tag ${username}/${image} gcr.io/google_containers/${image}
    docker rmi ${username}/${image}
done

unset ARCH version images username

檢查映象
使用命令

docker images

發現已經有了需要的映象

[[email protected] ~]# docker images
REPOSITORY                                                                 TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/google-containers.kube-apiserver-amd64                          v1.11.2             821507941e9c        6 days ago          187 MB
k8s.gcr.io/google-containers.kube-proxy-amd64                              v1.11.2             46a3cd725628        6 days ago          97.8 MB
k8s.gcr.io/google-containers.kube-controller-manager-amd64                 v1.11.2             38521457c799        6 days ago          155 MB
k8s.gcr.io/google-containers.kube-scheduler-amd64                          v1.11.2             37a1403e6c1a        6 days ago          56.8 MB
k8s.gcr.io/coredns                                                         1.1.3               b3b94275d97c        2 months ago        45.6 MB
k8s.gcr.io/etcd-amd64                                                      3.2.18              b8df3b177be2        4 months ago        219 MB
k8s.gcr.io/pause                                                           3.1                 da86e6ba6ca1        7 months ago        742 kB

注意 這裡的字首需要與kubeadm config images list時輸出的字首對應,否則init時仍然會識別不到去下載。
我們這裡是k8s.gcr.io所以 指令碼中pull 時重新命名使用的是

docker tag ${username}/${image} k8s.gcr.io/${image}

如果使用的是anjia0532的版本則還需要調整一遍命名,使用命令如下:

docker tag  k8s.gcr.io/google-containers.kube-apiserver-amd64:v1.11.2   k8s.gcr.io/kube-apiserver-amd64:v1.11.2
docker tag  k8s.gcr.io/google-containers.kube-controller-manager-amd64:v1.11.2  k8s.gcr.io/kube-controller-manager-amd64:v1.11.2
docker tag  k8s.gcr.io/google-containers.kube-scheduler-amd64:v1.11.2  k8s.gcr.io/kube-scheduler-amd64:v1.11.2
docker tag k8s.gcr.io/google-containers.kube-proxy-amd64:v1.11.2   k8s.gcr.io/kube-proxy-amd64:v1.11.2

準備好的映象如下,與kubeadm config images list時輸出的映象名稱版本一致。

[[email protected] ~]# docker images
REPOSITORY                                                                 TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/kube-controller-manager-amd64                                   v1.11.2             38521457c799        6 days ago          155 MB
k8s.gcr.io/kube-apiserver-amd64                                            v1.11.2             821507941e9c        6 days ago          187 MB
k8s.gcr.io/kube-proxy-amd64                                                v1.11.2             46a3cd725628        6 days ago          97.8 MB
k8s.gcr.io/kube-scheduler-amd64                                            v1.11.2             37a1403e6c1a        6 days ago          56.8 MB
k8s.gcr.io/coredns                                                         1.1.3               b3b94275d97c        2 months ago        45.6 MB
k8s.gcr.io/etcd-amd64                                                      3.2.18              b8df3b177be2        4 months ago        219 MB
k8s.gcr.io/pause                                                           3.1                 da86e6ba6ca1        7 months ago        742 kB

使用kubeadm init初始化叢集 (只在主節點執行)

初始化前確認 kubelet啟動和 cgroup-driver等方式是否對應。

接下來使用kubeadm初始化叢集,選擇k8s作為Master Node
確保沒有設定http_proxy和https_proxy代理
在k8s上執行下面的命令:

kubeadm init   --kubernetes-version=v1.11.2   --pod-network-cidr=10.244.0.0/16   --apiserver-advertise-address=192.168.11.90 --token-ttl 0

–kubernetes-version根據上面安裝成功時的提示:kubectl.x86_64 0:1.11.2-0對應版本。
因為我們選擇flannel作為Pod網路外掛,所以上面的命令指定–pod-network-cidr=10.244.0.0/16。
對於某些網路解決方案,Kubernetes master 也可以為每個節點分配網路範圍(CIDR),這包括一些雲提供商和 flannel。通過 –pod-network-cidr 引數指定的子網範圍將被分解併發送給每個 node。這個範圍應該使用最小的 /16,以讓 controller-manager 能夠給叢集中的每個 node 分配 /24 的子網。如果我們是通過 這個 manifest 檔案來使用 flannel,那麼您應該使用 –pod-network-cidr=10.244.0.0/16。大部分基於 CNI 的網路解決方案都不需要這個引數。
–apiserver-advertise-address是apiserver的通訊地址,一般使用master的ip地址。

通過kubeadm初始化後,都會提供節點加入k8s叢集的token。預設token的有效期為24小時,當過期之後,該token就不可用了,需要重新生成token,會比較麻煩,這裡–token-ttl設定為0表示永不過期。
token過期後重新建立token的方法看文末。

可能遇到的問題-卡在preflight/images

init過程中kubernetes會自動從google伺服器中下載相關的docker映象
kubeadm init過程首先會檢查代理伺服器,確定跟 kube-apiserver 的 https 連線方式,如果有代理設定,會提出警告。
如果一直卡在preflight/images

[preflight/images] Pulling images required for setting up a Kubernetes cluster
[preflight/images] This might take a minute or two, depending on the speed of your internet connection
[preflight/images] You can also perform this action in beforehand using 'kubeadm config images pull'

請檢視上一小節,先準備相關映象。

可能遇到的問題-uses proxy

如果報錯

    [WARNING HTTPProxy]: Connection to "https://192.168.11.90" uses proxy "http://127.0.0.1:8118". If that is not intended, adjust your proxy settings
    [WARNING HTTPProxyCIDR]: connection to "10.96.0.0/12" uses proxy "http://127.0.0.1:8118". This may lead to malfunctional cluster setup. Make sure that Pod and Services IP ranges specified correctly as exceptions in proxy configuration
    [WARNING HTTPProxyCIDR]: connection to "10.244.0.0/16" uses proxy "http://127.0.0.1:8118". This may lead to malfunctional cluster setup. Make sure that Pod and Services IP ranges specified correctly as exceptions in proxy configuration

則設定no_proxy
使用命令

vi /etc/profile

在最後新增

export no_proxy='anjia0532,127.0.0.1,192.168.11.90,k8s.gcr.io,10.96.0.0/12,10.244.0.0/16'

使用命令讓配置生效

source /etc/profile

更多init的錯誤可以新開一個控制檯使用命令跟蹤:

journalctl -f -u kubelet.service

可以檢視具體的卡住原因。

可能遇到的問題-failed to read kubelet config file “/var/lib/kubelet/config.yaml”

814 20:44:42 k8s systemd[1]: kubelet.service holdoff time over, scheduling restart.
814 20:44:42 k8s systemd[1]: Started kubelet: The Kubernetes Node Agent.
814 20:44:42 k8s systemd[1]: Starting kubelet: The Kubernetes Node Agent...
814 20:44:42 k8s kubelet[5471]: F0814 20:44:42.477878    5471 server.go:190] failed to load Kubelet config file /var/lib/kubelet/config.yaml, error failed to read kubelet config file "/var/lib/kubelet/config.yaml", error: open /var/lib/kubelet/config.yaml: no such file or directory

原因
關鍵檔案缺失,多發生於沒有做 kubeadm init就運行了systemctl start kubelet。
解決方法
先成功執行kubeadm init。

可能遇到的問題–cni config uninitialized

KubeletNotReady runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

原因
因為kubelet配置了network-plugin=cni,但是還沒安裝,所以狀態會是NotReady,不想看這個報錯或者不需要網路,就可以修改kubelet配置檔案,去掉network-plugin=cni 就可以了。
解決方法

vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

刪除最後一行裡的$KUBELET_NETWORK_ARGS
1.11.2版本的封裝在/var/lib/kubelet/kubeadm-flags.env檔案中
使用命令

[root@k8s ~]# cat /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS=--cgroup-driver=systemd --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --network-plugin=cni

重啟kubelet

systemctl enable kubelet && systemctl start kubelet

重新初始化

kubeadm reset 
kubeadm init   --kubernetes-version=v1.11.2   --pod-network-cidr=10.244.0.0/16   --apiserver-advertise-address=192.168.11.90 --token-ttl 0

正確初始化輸出如下:

[[email protected] ~]# kubeadm init   --kubernetes-version=v1.11.2   --pod-network-cidr=10.244.0.0/16   --apiserver-advertise-address=192.168.11.90 --token-ttl 0
[init] using Kubernetes version: v1.11.2
[preflight] running pre-flight checks
I0815 16:24:34.651252   21183 kernel_validator.go:81] Validating kernel version
I0815 16:24:34.651356   21183 kernel_validator.go:96] Validating kernel config
[preflight/images] Pulling images required for setting up a Kubernetes cluster
[preflight/images] This might take a minute or two, depending on the speed of your internet connection
[preflight/images] You can also perform this action in beforehand using 'kubeadm config images pull'
[kubelet] Writing kubelet environment file with flags to file "/var/lib/kubelet/kub