快速安裝與配置kubernetes集群搭建
Kubernetes是什么?
首先,它是一個(gè)全新的基于容器技術(shù)的分布式架構(gòu)領(lǐng)先方案。這個(gè)方案盡然很新,但它是谷歌十幾年以來(lái)大規(guī)模應(yīng)用容器技術(shù)的經(jīng)驗(yàn)積累和升華的一個(gè)重要成果。確切地說(shuō),kubernetes是谷歌嚴(yán)格保密十幾年的秘密武器Borg的一個(gè)開(kāi)源版本。Borg是谷歌的一個(gè)久負(fù)盛名的內(nèi)部使用的大規(guī)模集群管理系統(tǒng),它基于容器技術(shù),目的是實(shí)現(xiàn)資源管理的自動(dòng)化,以及跨多個(gè)數(shù)據(jù)中心的資源利用率的***化。
2015年4月,傳聞許久的Borg論文伴隨kubernetes(K8S)的高調(diào)宣傳被谷歌***公開(kāi),大家才得以了解它的更多內(nèi)幕。正是由于站在Borg這個(gè)前輩的肩膀上,吸取了Borg過(guò)去十年間的經(jīng)驗(yàn)與教訓(xùn),所以kubernetes一經(jīng)開(kāi)源就一鳴驚人,并迅速稱(chēng)霸了容器技術(shù)領(lǐng)域。
如果我們的系統(tǒng)設(shè)計(jì)遵循了kubernetes的設(shè)計(jì)思想,那么傳統(tǒng)系統(tǒng)架構(gòu)中哪些和業(yè)務(wù)沒(méi)有多大關(guān)系的底層代碼或功能模塊,都可以立刻從我們的視線(xiàn)中消失,我們不必再費(fèi)心于負(fù)載均衡的選型和部署實(shí)施問(wèn)題,不必再考慮引入或自己開(kāi)發(fā)一個(gè)復(fù)雜的服務(wù)治理框架,不必再頭疼與服務(wù)監(jiān)控和故障處理模塊的開(kāi)發(fā)??傊?,使用kubernetes提供的解決方案,我們節(jié)約了不少于30%的開(kāi)發(fā)成本,同時(shí)可以將精力更加集中于業(yè)務(wù)本身,而且由于kubernetes提供了強(qiáng)大的自動(dòng)化機(jī)制,所以系統(tǒng)后期的運(yùn)維難度和運(yùn)維成本大幅降低。
Kubernetes概述
隨著 Docker 技術(shù)的發(fā)展和廣泛流行,云原生應(yīng)用和容器調(diào)度管理系統(tǒng)也成為 IT 領(lǐng)域大熱的詞匯。事實(shí)上,在 Docker 技術(shù)火爆之前,云原生應(yīng)用的思想已經(jīng)由云計(jì)算技術(shù)的***和分布式系統(tǒng)架構(gòu)的推廣者廣泛傳播。例如早在 2011 年 Heroku 的工程師提出了云原生應(yīng)用的 12 要素,只不過(guò)以虛擬機(jī)技術(shù)作為云原生應(yīng)用的基礎(chǔ)實(shí)施。由于虛擬機(jī)鏡像大、鏡像標(biāo)準(zhǔn)不統(tǒng)一以及打包流程和工具不統(tǒng)一,導(dǎo)致了業(yè)界無(wú)法廣泛接受的云原生應(yīng)用標(biāo)準(zhǔn),限制了云原生應(yīng)用的流行。而 Docker 的出現(xiàn)正好解決了這些限制云原生應(yīng)用構(gòu)建、交付和運(yùn)行的瓶頸,使得構(gòu)建云原生應(yīng)用成為了使用 Docker 的開(kāi)發(fā)者自然而然的選擇。
Kubernetes 是為生產(chǎn)環(huán)境而設(shè)計(jì)的容器調(diào)度管理系統(tǒng),對(duì)于負(fù)載均衡、服務(wù)發(fā)現(xiàn)、高可用、滾動(dòng)升級(jí)、自動(dòng)伸縮等容器云平臺(tái)的功能要求有原生支持。由于 Kubernetes 在K和s間有8個(gè)字母,因此常簡(jiǎn)稱(chēng) k8s。事實(shí)上,隨著對(duì) k8s 系統(tǒng)架構(gòu)與設(shè)計(jì)理念的了解深入,會(huì)發(fā)現(xiàn) K8s 系統(tǒng)正是處處為運(yùn)行云原生應(yīng)用而設(shè)計(jì)考慮;同時(shí),隨著對(duì) k8s 系統(tǒng)使用的加深和推廣,也會(huì)有越來(lái)越多有關(guān)云原生應(yīng)用的設(shè)計(jì)模式產(chǎn)生出來(lái),使得基于 k8s 系統(tǒng)設(shè)計(jì)和開(kāi)發(fā)生產(chǎn)級(jí)的復(fù)雜云原生應(yīng)用變得像啟動(dòng)一個(gè)單機(jī)版容器服務(wù)那樣簡(jiǎn)單易用。
為什么要用 Kubernetes
使用 Kubernetes 的理由有很多,最基本的一個(gè)理由就是:IT 是新技術(shù)驅(qū)動(dòng)行業(yè)。Docker 這個(gè)新興的容器化技術(shù)當(dāng)前已經(jīng)被很多公司所采用,其從單機(jī)走向集群已成必然,而云計(jì)算的蓬勃發(fā)展正在加速這一進(jìn)程。Kubernetes 作為當(dāng)前唯一被業(yè)界廣泛認(rèn)可和看好的 Docker 分布式系統(tǒng)解決方案??梢灶A(yù)見(jiàn),在未來(lái)幾年內(nèi),會(huì)有大量的新系統(tǒng)選擇它,不管是運(yùn)行在企業(yè)本地服務(wù)器上還是被托管到公有云上。
使用 Kubernetes 又會(huì)收獲哪些好處呢?
首先,使用 Kubernetes 就是在全面擁抱微服務(wù)架構(gòu)。微服務(wù)架構(gòu)的核心就是將一個(gè)巨大的單體應(yīng)用分解為很多小的互相連接的微服務(wù),一個(gè)微服務(wù)背后可能有多個(gè)實(shí)例副本在支撐,副本的數(shù)量可能會(huì)隨著系統(tǒng)的負(fù)荷變化而進(jìn)行調(diào)整,內(nèi)嵌的負(fù)載均衡器在 k8s 平臺(tái)中有多個(gè)實(shí)例副本在支撐,副本的數(shù)量可能會(huì)隨著系統(tǒng)的負(fù)荷變化而進(jìn)行調(diào)整,內(nèi)嵌的負(fù)載均衡器 k8s 平臺(tái)中發(fā)揮了重要的作用。微服務(wù)架構(gòu)使得每個(gè)服務(wù)都可以由專(zhuān)門(mén)的開(kāi)發(fā)團(tuán)隊(duì)來(lái)開(kāi)發(fā),開(kāi)發(fā)者可以自由選擇開(kāi)發(fā)技術(shù),這對(duì)于大規(guī)模團(tuán)隊(duì)來(lái)說(shuō)很有價(jià)值。另外,每個(gè)微服務(wù)獨(dú)立開(kāi)發(fā)、升級(jí)、擴(kuò)展,使得系統(tǒng)具備很高的穩(wěn)定性和快速迭代進(jìn)化能力。
其次,Kubernetes 系統(tǒng)架構(gòu)具備了超強(qiáng)的橫向擴(kuò)容能力。對(duì)于互聯(lián)網(wǎng)公司來(lái)說(shuō),用戶(hù)規(guī)模就等價(jià)于資產(chǎn),誰(shuí)擁有更多的用戶(hù),誰(shuí)就能在競(jìng)爭(zhēng)中勝出,因此超強(qiáng)的橫向擴(kuò)容能力是互聯(lián)網(wǎng)業(yè)務(wù)系統(tǒng)的關(guān)鍵指標(biāo)之一。不用修改代碼,一個(gè) Kubernetes 集群即可從只包含幾個(gè)Node 的小集群平滑擴(kuò)展到擁有成百上千 Noder 大規(guī)模集群,利用 Kubernetes 提供的工具,甚至可以在線(xiàn)完成集群的擴(kuò)容。只要微服務(wù)設(shè)計(jì)的得好,結(jié)合硬件或者公有云資源的線(xiàn)性增加,系統(tǒng)就能夠承受大量用戶(hù)并發(fā)訪(fǎng)問(wèn)所帶來(lái)的壓力。
Kubernetes 基本概念和術(shù)語(yǔ)
Kubernetes中的大部分概念如Node、Pod、Replication Controller、Server、Deploymeng、Job、DaemonSet 等都可以看作一種資源對(duì)象,幾乎所有的資源對(duì)象都可以通過(guò) Kubernetes提供的 kubectl 工具執(zhí)行增、刪、改、查等操作,并將其保存在 etcd 中持久化存儲(chǔ)。從這個(gè)角度來(lái)看,Kubernets 其實(shí)是一個(gè)高度自動(dòng)化的資源控制系統(tǒng),它通過(guò)跟蹤對(duì)比 etcd 存儲(chǔ)里保存的資源期望狀態(tài)與當(dāng)前環(huán)境中的實(shí)際資源狀態(tài)的差異來(lái)實(shí)現(xiàn)自動(dòng)控制和自動(dòng)糾錯(cuò)的高級(jí)功能。
Master
Kubernetes 里的 Master 指的是集群控制節(jié)點(diǎn),每個(gè) Kubernetes 集群里需要有一個(gè)Master 節(jié)點(diǎn)來(lái)負(fù)責(zé)整個(gè)集群的管理的控制,基本上 Kubernetes 所有的控制命令進(jìn)是發(fā)給Master,Master 負(fù)責(zé)具體的執(zhí)行過(guò)程,后面所有執(zhí)行的命令基本都是在 Master 節(jié)點(diǎn)上運(yùn)行的。Master 節(jié)點(diǎn)通常會(huì)占據(jù)一個(gè)獨(dú)立的 X86 服務(wù)器,一個(gè)主要的原因是它太重要了,它是整個(gè)集群的大腦,如果它宕機(jī)或者不可用,那么所有的控制命令都將失效。
Master 節(jié)點(diǎn)上運(yùn)行著以下一組關(guān)鍵進(jìn)程:
Kube-apiserver:提供了 HTTP Rest 接口的關(guān)鍵服務(wù)進(jìn)程,是 Kubernetes 里所有資源的增、刪、改、查等操作的唯一入口,也是集群控制入口進(jìn)程。Kube-controller-manager:是 Kubernetes 里所有資源對(duì)象的自動(dòng)化控制中心,可以理解為資源對(duì)象的管家。Kube-scheduler:負(fù)責(zé)資源調(diào)度的進(jìn)程,相當(dāng)于公交公司的調(diào)度室。

其實(shí) Master 節(jié)點(diǎn)上往往還啟動(dòng)了一個(gè) etcd server 進(jìn)程,因?yàn)?Kubernetes 里的所有資源對(duì)象的數(shù)據(jù)全部是保存在 etcd 中的。
Node
除了 Master、Kubernetes 集群中的其他機(jī)器被稱(chēng)為 Node 節(jié)點(diǎn),在較早的版本中也被稱(chēng)為 Minion。與 Master 一樣,Node 節(jié)點(diǎn)可以是一臺(tái)物理主機(jī),也可以是一臺(tái)虛擬機(jī)。Node節(jié)點(diǎn)才是 Kubernetes 集群中的工作負(fù)載節(jié)點(diǎn),每個(gè) Node 都會(huì)被 Master 分配一些負(fù)載。當(dāng)某個(gè) Node 宕機(jī)時(shí),其上的工作負(fù)載會(huì)被 Master 自動(dòng)轉(zhuǎn)移到其他節(jié)點(diǎn)上去。
每個(gè) Node 節(jié)點(diǎn)都運(yùn)行著以下一組關(guān)鍵進(jìn)程:
- Kubelet:負(fù)責(zé) Pod 對(duì)應(yīng)的容器的創(chuàng)建、啟停等任務(wù),同時(shí)與 Master 節(jié)點(diǎn)密切協(xié)作,實(shí)現(xiàn)集群管理的基本功能。
- Kube-proxy:實(shí)現(xiàn) Kubernetes Service 的通信與負(fù)載均衡機(jī)制的重要組件。

Pod:是kubernetes最重要也是最基本的概念。每個(gè)Pod都會(huì)包含一個(gè) “根容器”,還會(huì)包含一個(gè)或者多個(gè)緊密相連的業(yè)務(wù)容器。

Kubernetes為每個(gè)Pod都分配了唯一的IP地址,稱(chēng)之為PodIP,一個(gè)Pod里的多個(gè)容器共享PodIP地址。要求底層網(wǎng)絡(luò)支持集群內(nèi)任意兩個(gè)Pod之間的直接通信,通常采用虛擬二層網(wǎng)絡(luò)技術(shù)來(lái)實(shí)現(xiàn)(Flannel)。
k8s集群部署方案
如下是我的集群部署策略,1個(gè)master + 2個(gè)node(minion1.2之前的叫法)。我的存儲(chǔ)集群etcd是單點(diǎn)集群,不推薦此做法。網(wǎng)絡(luò)使用的是flannel虛擬二次網(wǎng)絡(luò)。

Kubernetes具有完備的集群管理能力:
- 包括多層次的安全防護(hù)和準(zhǔn)入機(jī)制
- 多租戶(hù)應(yīng)用支撐能力
- 透明的服務(wù)注冊(cè)和服務(wù)發(fā)現(xiàn)機(jī)制
- 內(nèi)建智能負(fù)載均衡器
- 強(qiáng)大的故障發(fā)現(xiàn)和自我修復(fù)能力
- 服務(wù)滾動(dòng)升級(jí)和在線(xiàn)擴(kuò)容能力
- 可擴(kuò)展的資源自動(dòng)調(diào)度機(jī)制
- 以及多粒度的資源管理能力
同時(shí),kubernetes提供了完善的管理工具,這些工具涵蓋了包括開(kāi)發(fā)、部署測(cè)試、運(yùn)維監(jiān)控在內(nèi)的各個(gè)環(huán)節(jié)。
在kubernetes中,service(服務(wù))是分布式集群架構(gòu)的核心,一個(gè)service對(duì)象擁有如下關(guān)鍵特征:
- 擁有一個(gè)唯一指定的名字(比如mysql-service)。
- 擁有一個(gè)虛擬IP(Cluster IP、service IP或VIP)和端口號(hào)。
- 能夠提供某種遠(yuǎn)程服務(wù)能力。
- 被映射到了提供這種服務(wù)能力的一組容器應(yīng)用上。
Kubernetes.io開(kāi)發(fā)了一個(gè)交互式教程,通過(guò)WEB瀏覽器就能使用預(yù)先部署好的一個(gè)Kubernetes集群,快速體驗(yàn)kubernetes的功能和應(yīng)用場(chǎng)景。
鏈接:https://kubernetes.io/docs/tutorials/kubernetes-basics/
K8s官方下載地址:https://github.com/kubernetes

環(huán)境準(zhǔn)備工作
- 主機(jī)名 操作系統(tǒng) IP地址
- master Centos 7.4-x86_64 192.168.2.102
- node1 Centos 7.4-x86_64 192.168.2.108
- node2 Centos 7.4-x86_64 192.168.2.228
關(guān)閉CentOS7自帶的防火墻服務(wù)
- systemctl disable firewalld
- systemctl stop firewalld
修改主機(jī)名
- [root@localhost ~]# hostnamectl master //192.168.2.102
- [root@localhost ~]# hostnamectl node1 //192.168.2.108
- [root@localhost ~]# hostnamectl node2 //192.168.2.228
更改Hostname為 master、node1、node2,配置IP地址,配置3臺(tái)測(cè)試機(jī)的/etc/hosts文件(在三臺(tái)服務(wù)器上同步)
- [root@master ~]# cat /etc/hosts
- 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
- ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
- 192.168.2.102 master
- 192.168.2.108 node1
- 192.168.2.228 node2
- [root@master ~]#
時(shí)間校對(duì)(三臺(tái)機(jī)器都做時(shí)間校對(duì))
- [root@master ~]# ntpdate ntp1.aliyun.com
- 13 Sep 14:48:02 ntpdate[1596]: adjust time server 120.25.115.20 offset -0.015854 sec
- [root@master ~]# hwclock
- 2018年09月13日 星期四 14時(shí)49分51秒 -0.646898 秒
安裝Kubernetes,配置dockers鏡像
[root@master ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
配置kubernetes倉(cāng)庫(kù)
- [root@master yum.repos.d]# vim kubernetes.repo
- [kubernetes]
- name=kubernetes Repo
- baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
- gpgcheck=1
- gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
- enabled=1
- [root@master ~]# wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
- [root@master ~]# rpm --import rpm-package-key.gpg
- [root@master yum.repos.d]# yum repolist
- [root@master yum.repos.d]# scp CentOS-Base.repo docker-ce.repo kubernetes.repo node1:/etc/yum.repos.d/
安裝docker和kubelet
- [root@master ~]# yum -y install docker-ce kubelet kubeadm kubectl
環(huán)境變量
- [root@master ~]# vim /usr/lib/systemd/system/docker.service
- 手動(dòng)添加一行
- Environment="HTTPS_PROXY=http://www.ik8s.io:10080"
- Environment="NO_PROXY=127.0.0.0/8,172.0.0.0/16"
- [root@master ~]# systemctl daemon-reload
- 啟動(dòng)docker
- [root@master ~]# systemctl start docker
- 設(shè)置開(kāi)機(jī)啟動(dòng)
- [root@master ~]# systemctl enable docker
- [root@master ~]# docker info
- 保證輸出的都是1
- [root@master ~]# cat /proc/sys/net/bridge/bridge-nf-call-ip6tables
- 1
- [root@master ~]# cat /proc/sys/net/bridge/bridge-nf-call-iptables
- 1
- [root@master ~]# rpm -ql kubelet
- /etc/kubernetes/manifests #清單目錄
- /etc/sysconfig/kubelet #配置文件
- /etc/systemd/system/kubelet.service
- /usr/bin/kubelet #主程序
- 設(shè)置開(kāi)機(jī)啟動(dòng)
- [root@master ~]# systemctl enable kubelet
初始化
- [root@master ~]# kubeadm init --kubernetes-version=v1.11.1 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
報(bào)錯(cuò)信息,解決辦法:
- [root@master ~]# vim /etc/sysconfig/kubelet
- KUBELET_EXTRA_ARGS="--fail-swap-on=false"
- [root@master ~]# kubeadm init --kubernetes-version=v1.11.1 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
注意這一條命令需要保存好(添加集群使用)
- kubeadm join 192.168.2.102:6443 --token ns4kps.j8cuqwf78emp5a5b --discovery-token-ca-cert-hash sha256:b71b7e52c318959bab3f05f02f6fe51d6396d8c54ea6849ec7556927d1c6c88a
- [root@master ~]# docker image ls
- [root@master ~]# ss –ntl
- [root@master ~]# mkdir -p $HOME/.kube
- [root@master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
- 檢測(cè)組件運(yùn)行是否正常
- [root@master ~]# kubectl get cs
查看并驗(yàn)證節(jié)點(diǎn)信息是否成功
- [root@master ~]# kubectl get nodes
- NAME STATUS ROLES AGE VERSION
- master NotReady master 44m v1.11.3
安裝flannel
- [root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- [root@master ~]# curl -sSL "https://github.com/coreos/flannel/blob/master/Documentation/kube-flannel.yml?raw=true" | kubectl create -f -
- [root@master ~]# docker image ls
查看并驗(yàn)證節(jié)點(diǎn)信息是否成功
- [root@master ~]# kubectl get nodes
- NAME STATUS ROLES AGE VERSION
- master Ready master 2h v1.11.3
查看pod運(yùn)行情況
- [root@master ~]# kubectl get pods -n kube-system
配置文件傳到node1、node2
- [root@master ~]# scp /usr/lib/systemd/system/docker.service node1:/usr/lib/systemd/system/docker.service
- [root@master ~]# scp /etc/sysconfig/kubelet node1:/etc/sysconfig/
- [root@master ~]# scp /usr/lib/systemd/system/docker.service node2:/usr/lib/systemd/system/docker.service
- [root@master ~]# scp /etc/sysconfig/kubelet node2:/etc/sysconfig/
node1服務(wù)器配置
- [root@node1 ~]# wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
- [root@node1 ~]# rpm --import rpm-package-key.gpg
安裝docker、kubelet
- [root@node1 ~]# yum -y install docker-ce kubelet kubeadm
啟動(dòng)docker
- [root@node1 ~]# systemctl start docker
- [root@node1 ~]# systemctl enable docker kubelet
- [root@node1 ~]# docker info
添加主集群里
- [root@node1 ~]# kubeadm join 192.168.2.102:6443 --token ns4kps.j8cuqwf78emp5a5b --discovery-token-ca-cert-hash sha256:b71b7e52c318959bab3f05f02f6fe51d6396d8c54ea6849ec7556927d1c6c88a --ignore-preflight-errors=Swap
查看下載鏡像
- [root@node1 ~]# docker image ls
在master服務(wù)器上可以查節(jié)點(diǎn)信息
- [root@master ~]# kubectl get nodes
- NAME STATUS ROLES AGE VERSION
- master Ready master 3h v1.11.3
- node1 Ready 7m v1.11.3
- [root@master ~]# kubectl get pods -n kube-system -o wide
node2服務(wù)器配置
- [root@node2 ~]# wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
- [root@node2 ~]# rpm --import rpm-package-key.gpg
安裝docker、kubelet
- [root@node2 ~]# yum -y install docker-ce kubelet kubeadm

啟動(dòng)docker
- [root@node2 ~]# systemctl start docker
- [root@node2 ~]# systemctl enable docker kubelet
- [root@node2 ~]# docker info

添加主集群里
- [root@node2 ~]# kubeadm join 192.168.2.102:6443 --token ns4kps.j8cuqwf78emp5a5b --discovery-token-ca-cert-hash sha256:b71b7e52c318959bab3f05f02f6fe51d6396d8c54ea6849ec7556927d1c6c88a --ignore-preflight-errors=Swap

在master服務(wù)器上可以查節(jié)點(diǎn)信息
- [root@master ~]# kubectl get nodes

- [root@master ~]# kubectl get pods -n kube-system -o wide
