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搭建集羣成功