1 概述node
k8s的部署常見的工具和環境:
linux
1,IaaS(虛擬機):git
1.1託管模型,部署在公有云上,K8SaaS,目前沒有用於生產環境github
1.2VPS,和本地物理機搭建同樣,可是這裏網絡是虛擬網絡了docker
2,物理機:json
3.1 構建工具 Rancher 2.0vim
3.2 OpenShift(PaaS),紅帽的官方發行版,在這個版本里有k8s相關的包centos
還有不少工具能夠實現api
3,kubeadm部署bash
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這四個包
關閉防火牆,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來同步時間
使用清華或者阿里雲的鏡像源
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]#
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搭建集羣成功