k8s 之二 kubeadm安裝k8s集羣

1 概述

k8s的部署常見的工具和環境:

1,IaaS(虛擬機):

     1.1託管模型,部署在公有云上,K8SaaS,目前沒有用於生產環境

     1.2VPS,和本地物理機搭建一樣,但是這裏網絡是虛擬網絡了

2,物理機:

     3.1 構建工具 Rancher 2.0

     3.2 OpenShift(PaaS),紅帽的官方發行版,在這個版本里有k8s相關的包

     還有很多工具可以實現

3,kubeadm部署

4,藉助於工具kubespray,kopts部署

5,ansible,基於roles實現部署

k8s的兩種部署方式

1.kubeadm方式部署,k8s可以把k8s自身的大部分應用管控起來,即運行於pod上,但是kubelet和docker不能這樣實現自託管,這兩個主機運行爲守護進程,因此,只需要在所有主機都安裝kubelet和docker,構建k8s集羣。相當於是自舉。etcd也是託管於pod上運行,使用kubeadm進行部署,安裝過程相對簡單。這些主件的pod一般爲靜態pod(不屬於k8s管理),也可以運行爲自託管的pod.每個主機都要運行flannel這個主件,可以運行爲pod。flannel爲動態pod

kubeadm的介紹可以查看如下鏈接

https://github.com/kubernetes/kubeadm/blob/master/docs/design/design_v1.10.md

通過kubeadm init 完成集羣master節點的初始化,用kubeadm join加入集羣

2:手動配置,主節點和node都主要組件運行爲系統級的守護進程,每一步都需要手動處理,如證書和配置過程都是用手動配置的。另外,這種方式在github上有playbook自動化實現

    a).master:安裝apiserver,scheduler,controller-manager,etcd,flanel

    b).node:安裝kublet,kub-proxy,docker(container engine),flannel,需要多個節點

    c).etcd:安裝etcd存儲服務器,建議配置爲高可用

這種方式,可以到https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.11.md#downloads-for-v1112下載相關的安裝包,注意,master或者node都是要安裝server端的包。client是交互時使用,也需要安裝,不建議使用這種方式安裝,難度較高

本文僅介紹使用kubeadm實現k8s集羣安裝

2 集羣安裝

最關鍵,服務器的資源至少爲2G內存,否則初始化k8s會報錯

默認情況下,會到google託管的站點下載所有的鏡像

使用kubeadm安裝,默認網絡如下:

pod的默認ip 爲 10.244.0.0/16

service的默認ip  10.92.0.0/12

節點網絡爲:172.20.0.0/16

docker要和k8s結合使用,首先要先通過k8s認證,否則會報警。目前k8s只認證到17.03.02之前的版本

準備三臺主機,分別安裝docker和kubelet,其他服務都是通過自託管實現

安裝步驟如下三步

1.master和node 安裝 kubelet,kubeadm,docker

2.mster:kubeadm init

3.nodes:kubeadm join

第2和3步,相關步驟查看https://github.com/kubernetes/kubeadm/blob/master/docs/design/design_v1.10.md

所有服務器需要安裝docker-ce,kubeadm,kubelet,kubectl這四個包

2.1 環境準備

關閉防火牆,selinux,基於主機名訪問(dns或者dns),同步時間(時間不一致,集羣運行異常,如不能啓動),關閉swap分區

三臺主機的hosts文件如下

vim /etc/hosts
10.10.10.74 server74
10.10.10.75 server75
10.10.10.76 server76

所有的主機,內存至少2G以上

關閉swap分區

swapoff -a

關閉防火牆

systemctl stop firewalld
systemctl disable firewalld


使用時間服務器同步所有的k8s集羣服務器,防止出現異常,centos7使用chrony來同步時間

2.2 安裝docker-ce

使用清華或者阿里雲的鏡像源

wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo


安裝命令

yum -y install docker-ce

配置docker鏡像加速

mkdir -p /etc/docker
vim /etc/docker/daemon.json
{
 "registry-mirrors": ["https://eyg9yi6d.mirror.aliyuncs.com"]
}


阿里雲上有大量的鏡像,所以建議使用阿里雲進行加速

由於k8s安裝有很多鏡像國內下載不到,因爲編輯如下的配置文件可以找到需要的鏡像,啓動docker前,在Service配置段裏定義環境變量,Environment,表示通過這個代理去加載k8s所需的鏡像,加載完成後,可以註釋掉,僅使用國內的加速器來拉取非k8s的鏡像,後續需要使用時,再開啓。

#以下的NO_PROXY表示對這些網段的服務器不使用代理,如果不需要用到代理服務器,以下的配置可以不寫,注意,以下的代理是不通的。不建議使用代理,因爲國內有資源可以訪問到gcr.io需要的鏡像,下文會介紹
vim /usr/lib/systemd/system/docker.service
Environment="HTTPS_PROXY=http://www.ik8s.io:10080"
Environment="HTTP_PROXY=http://www.ik8s.io:10080"
Environment="NO_PROXY=127.0.0.0/8,172.20.0.0/16"
#保存退出後,執行
systemctl  daemon-reload
#確保如下兩個參數值爲1,默認爲1。
 cat /proc/sys/net/bridge/bridge-nf-call-ip6tables
 cat /proc/sys/net/bridge/bridge-nf-call-iptables
#啓動docker-ce
systemctl start docker
#設置開機啓動
systemctl enable docker.service


2.3 k8s集羣master節點安裝

k8s集羣節點都要安裝kubeadm,kubelet,kubectl

使用kubeadm官方文檔:https://kubernetes.io/docs/setup/independent/install-kubeadm/

官方的k8s包倉庫爲https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86-64,這個站點國內目前打不開,建議使用國內具有k8s包的站點,這裏建議使用阿里雲站點

https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/

編輯k8s倉庫源文件

vim k8s.repo
[k8s]
name=aliyun_k8s
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
#這裏,如果要使用key認證,配置如下
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
#保存退出後,需要下載key然後導入
wget  https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
rpm --import yum-key.gpg
rpm --import rpm-package-key.gpg

然後再安裝即可

安裝軟件

yum -y install kubeadm kubelet kubectl

當前,這邊安裝的版本爲1.11.2

安裝k8s集羣,kubeadm會讀取/etc/systemd/system/kubelet.service.d/10-kubeadm.conf文件的配置信息,更改cgroup的驅動,這裏的驅動要要docker一致,因此用docker info| grep Cgroup命令查看docker的驅動類型,如這裏查到的結果爲 cgroupfs.因此修改kubeadm的配置文件如下

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

#添加如下配置

Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=cgroupfs"

啓動kubelet

systemctl start kubelet

注意,此時啓動會出現報錯,查看/var/log/messages的日誌

tail -f /var/log/messages

如果出現如下的報錯

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

忽略以上的報錯,設置爲開機自啓動即可,因爲此時的配置還沒初始化完成,所以此時不能啓動kubelet,等後續kubeadm啓動成功後再查看

設置開機啓動

systemctl enable kubelet.service

初始化kubeadm

查看kubeadm相關的參數

 kubeadm init --help

#注意,需要關閉swap分區,或者在如下的配置文件裏修改,表示添加而且的啓動選項
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--fail-swap-on=false"

建議執行 swapoff -a 關閉swap分區,不用配置上述選項

開始初始化

kubeadm init --kubernetes-version=v1.11.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12

初始化過程的報錯

/var/log/messages日誌出現如下的報錯,很有可能是服務器的資源,尤其是內存太小,導致節點啓動不成功

eviction_manager.go:243] eviction manager: failed to get get summary stats: failed to get node info: node "server74" not found

添加內存資源,centos7建議最後爲2G內存

只有遇到如下的日誌,k8s纔是安裝成功

Successfully registered node server74

鏡像加載注意事項

初始化過程,默認會到gcr.io/google_containers站點拉取相關k8s的鏡像信息,當前國內不能進行這些站點的訪問,如果網絡不能訪問google,則會出現鏡像錄取失敗的報錯

https://console.cloud.google.com/gcr/images/google-containers?project=google-containers

v1.11.2版本初始化需要的鏡像如下

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

有個技術大牛把gcr.io的鏡像每天同步到https://github.com/anjia0532/gcr.io_mirror這個站點,因此,如果需要用到gcr.io的鏡像,可以執行如下的腳本進行鏡像拉取

執行如下的腳步進行安裝

vim pullimages.sh
#!/bin/bash
images=(kube-proxy-amd64:v1.11.2 kube-scheduler-amd64:v1.11.2 kube-controller-manager-amd64:v1.11.2 kube-apiserver-amd64:v1.11.2
etcd-amd64:3.2.18 coredns:1.1.3 pause:3.1 )
for imageName in ${images[@]} ; do
docker pull anjia0532/google-containers.$imageName
docker tag anjia0532/google-containers.$imageName k8s.gcr.io/$imageName
docker rmi anjia0532/google-containers.$imageName
done

鏡像拉取成功後再重新執行init命令

初始化命令執行成功後,執行如下的命令,啓動集羣

[root@server76 ~]# mkdir -p $HOME/.kube
[root@server76 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@server76 ~]# chown $(id -u):$(id -g) $HOME/.kube/config
[root@server76 ~]#


獲取組件的健康狀態

[root@server76 ~]# kubectl get cs
NAME                 STATUS    MESSAGE              ERROR
controller-manager   Healthy   ok                   
scheduler            Healthy   ok                   
etcd-0               Healthy   {"health": "true"}

 

查看節點信息

root@server76 ~]# kubectl get nodes
NAME       STATUS     ROLES     AGE       VERSION
server76   NotReady   master    16m       v1.11.2

這裏status未就緒,是因爲沒有網絡插件,如flannel.地址https://github.com/coreos/flannel可以查看flannel在github上的相關項目,執行如下的命令自動安裝flannel

[root@server76 ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.extensions/kube-flannel-ds-amd64 created
daemonset.extensions/kube-flannel-ds-arm64 created
daemonset.extensions/kube-flannel-ds-arm created
daemonset.extensions/kube-flannel-ds-ppc64le created
daemonset.extensions/kube-flannel-ds-s390x created
[root@server76 ~]#


執行完上述命令後,會拉取flannel的鏡像,可用docker image ls查看flannel鏡像是否成功拉取,如quay.io/coreos/flannel :v0.10.0-amd64

鏡像拉取成功後,一般會把啓動起來。此時默認的node狀態爲Ready,如下

[root@server76 docker]# kubectl get nodes
NAME       STATUS    ROLES     AGE       VERSION
server76   Ready     master    33m       v1.11.2
[root@server76 docker]#


執行如下的命令,獲取當前系統上所有在運行的pod的狀態,指定名稱空間爲kube-system,爲系統級的pod,命令如下

[root@server76 docker]# kubectl get pods -n kube-system
NAME                               READY     STATUS    RESTARTS   AGE
coredns-78fcdf6894-mbs8h           1/1       Running   0          35m
coredns-78fcdf6894-twkj6           1/1       Running   0          35m
etcd-server76                      1/1       Running   1          34m
kube-apiserver-server76            1/1       Running   1          34m
kube-controller-manager-server76   1/1       Running   1          34m
kube-flannel-ds-amd64-f8mf2        1/1       Running   0          13m
kube-proxy-vpb6x                   1/1       Running   1          35m
kube-scheduler-server76            1/1       Running   1          34m
[root@server76 docker]#


執行如下命令,獲取當前系統的名稱空間

[root@server76 docker]# kubectl get ns
NAME          STATUS    AGE
default       Active    36m
kube-public   Active    36m
kube-system   Active    36m
[root@server76 docker]#

2.4 node節點操作

yum倉庫準備好後,在以下的兩個節點上執行安裝如下包,

yum -y install kubeadm kubelet kubectl docker-ce

關閉swap

swapoff -a

開啓轉發的參數,根據實際報錯情況開啓,一般有如下三項


echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables


安裝完成後

啓動docker-ce

systemctl start docker

注意,kubelet此時不啓動,因爲缺配置文件,啓動也會報錯,所以不啓動

設置開機啓動,必須的操作

systemctl enable docker.service
systemctl enable kubelet.service

把配置文件拷貝到要加入該master節點的node上,保持配置一致。不是必須,建議操作

[root@server76 ~]# for i in 74 75;do scp /usr/lib/systemd/system/docker.service  server$i:/usr/lib/systemd/system/;done
[root@server76 ~]# for i in 74 75;do scp /etc/sysconfig/kubelet server$i:/etc/sysconfig/;done

在server74 和 75 節點上,要執行如下的命令,加入master節點,注意,如下命令token和discovery-token-ca-cert-hash是隨機生成,可以用命令查找,比較麻煩,建議安裝成功後,在成功的信息中,如下的命令需要保存,後期方便加入主節點。

  kubeadm join 192.168.137.134:6443 --token wbg1tk.dwg75846yjjsa22f --discovery-token-ca-cert-hash sha256:29e3babf8235abfff5bb522bdb0fa5ab068d31ed3221f18999f3c5cfc8527488

在node上執行上述命令成功後,信息如下

This node has joined the cluster:
* Certificate signing request was sent to master and a response
  was received.
* The Kubelet was informed of the new secure connection details.
 
Run 'kubectl get nodes' on the master to see this node join the cluster.

注意,可以忽略如下的報錯,只要看到以上成功的信息即表搭建成功

[root@server75 ~]#  kubeadm join 192.168.137.134:6443 --token wbg1tk.dwg75846yjjsa22f --discovery-token-ca-cert-hash sha256:29e3babf8235abfff5bb522bdb0fa5ab068d31ed3221f18999f3c5cfc8527488
[preflight] running pre-flight checks
[WARNING RequiredIPVSKernelModulesAvailable]: the IPVS proxier will not be used, because the following required kernel modules are not loaded: [ip_vs_rr ip_vs_wrr ip_vs_sh ip_vs] or no builtin kernel ipvs support: map[ip_vs:{} ip_vs_rr:{} ip_vs_wrr:{} ip_vs_sh:{} nf_conntrack_ipv4:{}]
you can solve this problem with following methods:
 1. Run 'modprobe -- ' to load missing kernel modules;
2. Provide the missing builtin kernel ipvs support

到這裏從節點配置完成

2.5 驗證

上述命令執行完成後,從節點同樣需要到互聯網上拉取flannel的鏡像,並啓動,因此需要一點時間,用docker images 查看是否成功拉取flannel鏡像到本地,等flannel拉取成功啓動後,在master上可以看到node的狀態爲Ready.

需要在主節點上執行如下的命令,查看node的信息

[root@server76 docker]# kubectl get nodes
NAME       STATUS    ROLES     AGE       VERSION
server74   Ready     <none>    6m        v1.11.2
server76   Ready     master    1h        v1.11.2

需要查看pod的詳細信息,則添加選項-o wide

[root@server76 docker]# kubectl get pods -n kube-system -o wide
NAME                               READY     STATUS    RESTARTS   AGE       IP            NODE       NOMINATED NODE
coredns-78fcdf6894-mbs8h           1/1       Running   0          1h        10.244.0.2    server76   <none>
coredns-78fcdf6894-twkj6           1/1       Running   0          1h        10.244.0.3    server76   <none>
etcd-server76                      1/1       Running   1          1h        10.10.10.76   server76   <none>
kube-apiserver-server76            1/1       Running   1          1h        10.10.10.76   server76   <none>
kube-controller-manager-server76   1/1       Running   1          1h        10.10.10.76   server76   <none>
kube-flannel-ds-amd64-f8mf2        1/1       Running   0          43m       10.10.10.76   server76   <none>
kube-flannel-ds-amd64-xql2h        1/1       Running   0          10m       10.10.10.74   server74   <none>
kube-proxy-tb496                   1/1       Running   0          10m       10.10.10.74   server74   <none>
kube-proxy-vpb6x                   1/1       Running   1          1h        10.10.10.76   server76   <none>
kube-scheduler-server76            1/1       Running   1          1h        10.10.10.76   server76   <none>
[root@server76 docker]#

以上信息有server74這個從節點的信息,flannel和proxy都有兩個pod

把server75也加進去後,在master server76上查看如下信息

[root@server76 ~]# kubectl get nodes
NAME       STATUS    ROLES     AGE       VERSION
server74   Ready     <none>    41m       v1.11.2
server75   Ready     <none>    4m        v1.11.2
server76   Ready     master    1h        v1.11.2
[root@server76 ~]#

到這裏,k8s通過kubeadm搭建集羣成功



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章