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”
8月 14 20:44:42 k8s systemd[1]: kubelet.service holdoff time over, scheduling restart.
8月 14 20:44:42 k8s systemd[1]: Started kubelet: The Kubernetes Node Agent.
8月 14 20:44:42 k8s systemd[1]: Starting kubelet: The Kubernetes Node Agent...
8月 14 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