Kubernetes是什么? 首先,它是一個全新的基于容器技術(shù)的分布式架構(gòu)領(lǐng)先方案。這個方案盡然很新,但它是谷歌十幾年以來大規(guī)模應(yīng)用容器技術(shù)的經(jīng)驗積累和升華的一個重要成果。確切地說,kubernetes是谷歌嚴(yán)格保密十幾年的秘密武器Borg的一個開源版本。Borg是谷歌的一個久負盛名的內(nèi)部使用的大規(guī)模集群管理系統(tǒng),它基于容器技術(shù),目的是實現(xiàn)資源管理的自動化,以及跨多個數(shù)據(jù)中心的資源利用率的最大化。 2015年4月,傳聞許久的Borg論文伴隨kubernetes(K8S)的高調(diào)宣傳被谷歌首次公開,大家才得以了解它的更多內(nèi)幕。正是由于站在Borg這個前輩的肩膀上,吸取了Borg過去十年間的經(jīng)驗與教訓(xùn),所以kubernetes一經(jīng)開源就一鳴驚人,并迅速稱霸了容器技術(shù)領(lǐng)域。 如果我們的系統(tǒng)設(shè)計遵循了kubernetes的設(shè)計思想,那么傳統(tǒng)系統(tǒng)架構(gòu)中哪些和業(yè)務(wù)沒有多大關(guān)系的底層代碼或功能模塊,都可以立刻從我們的視線中消失,我們不必再費心于負載均衡的選型和部署實施問題,不必再考慮引入或自己開發(fā)一個復(fù)雜的服務(wù)治理框架,不必再頭疼與服務(wù)監(jiān)控和故障處理模塊的開發(fā)。總之,使用kubernetes提供的解決方案,我們節(jié)約了不少于30%的開發(fā)成本,同時可以將精力更加集中于業(yè)務(wù)本身,而且由于kubernetes提供了強大的自動化機制,所以系統(tǒng)后期的運維難度和運維成本大幅降低。 Kubernetes概述隨著 Docker 技術(shù)的發(fā)展和廣泛流行,云原生應(yīng)用和容器調(diào)度管理系統(tǒng)也成為 IT 領(lǐng)域大熱的詞匯。事實上,在 Docker 技術(shù)火爆之前,云原生應(yīng)用的思想已經(jīng)由云計算技術(shù)的領(lǐng)導(dǎo)者和分布式系統(tǒng)架構(gòu)的推廣者廣泛傳播。例如早在 2011 年 Heroku 的工程師提出了云原生應(yīng)用的 12 要素,只不過以虛擬機技術(shù)作為云原生應(yīng)用的基礎(chǔ)實施。由于虛擬機鏡像大、鏡像標(biāo)準(zhǔn)不統(tǒng)一以及打包流程和工具不統(tǒng)一,導(dǎo)致了業(yè)界無法廣泛接受的云原生應(yīng)用標(biāo)準(zhǔn),限制了云原生應(yīng)用的流行。而 Docker 的出現(xiàn)正好解決了這些限制云原生應(yīng)用構(gòu)建、交付和運行的瓶頸,使得構(gòu)建云原生應(yīng)用成為了使用 Docker 的開發(fā)者自然而然的選擇。 Kubernetes 是為生產(chǎn)環(huán)境而設(shè)計的容器調(diào)度管理系統(tǒng),對于負載均衡、服務(wù)發(fā)現(xiàn)、高可用、滾動升級、自動伸縮等容器云平臺的功能要求有原生支持。由于 Kubernetes 在K和s間有8個字母,因此常簡稱 k8s。事實上,隨著對 k8s 系統(tǒng)架構(gòu)與設(shè)計理念的了解深入,會發(fā)現(xiàn) K8s 系統(tǒng)正是處處為運行云原生應(yīng)用而設(shè)計考慮;同時,隨著對 k8s 系統(tǒng)使用的加深和推廣,也會有越來越多有關(guān)云原生應(yīng)用的設(shè)計模式產(chǎn)生出來,使得基于 k8s 系統(tǒng)設(shè)計和開發(fā)生產(chǎn)級的復(fù)雜云原生應(yīng)用變得像啟動一個單機版容器服務(wù)那樣簡單易用。 為什么要用 Kubernetes使用 Kubernetes 的理由有很多,最基本的一個理由就是:IT 是新技術(shù)驅(qū)動行業(yè)。Docker 這個新興的容器化技術(shù)當(dāng)前已經(jīng)被很多公司所采用,其從單機走向集群已成必然,而云計算的蓬勃發(fā)展正在加速這一進程。Kubernetes 作為當(dāng)前唯一被業(yè)界廣泛認可和看好的 Docker 分布式系統(tǒng)解決方案??梢灶A(yù)見,在未來幾年內(nèi),會有大量的新系統(tǒng)選擇它,不管是運行在企業(yè)本地服務(wù)器上還是被托管到公有云上。 使用 Kubernetes 又會收獲哪些好處呢? 首先,使用 Kubernetes 就是在全面擁抱微服務(wù)架構(gòu)。微服務(wù)架構(gòu)的核心就是將一個巨大的單體應(yīng)用分解為很多小的互相連接的微服務(wù),一個微服務(wù)背后可能有多個實例副本在支撐,副本的數(shù)量可能會隨著系統(tǒng)的負荷變化而進行調(diào)整,內(nèi)嵌的負載均衡器在 k8s 平臺中有多個實例副本在支撐,副本的數(shù)量可能會隨著系統(tǒng)的負荷變化而進行調(diào)整,內(nèi)嵌的負載均衡器 k8s 平臺中發(fā)揮了重要的作用。微服務(wù)架構(gòu)使得每個服務(wù)都可以由專門的開發(fā)團隊來開發(fā),開發(fā)者可以自由選擇開發(fā)技術(shù),這對于大規(guī)模團隊來說很有價值。另外,每個微服務(wù)獨立開發(fā)、升級、擴展,使得系統(tǒng)具備很高的穩(wěn)定性和快速迭代進化能力。 其次,Kubernetes 系統(tǒng)架構(gòu)具備了超強的橫向擴容能力。對于互聯(lián)網(wǎng)公司來說,用戶規(guī)模就等價于資產(chǎn),誰擁有更多的用戶,誰就能在競爭中勝出,因此超強的橫向擴容能力是互聯(lián)網(wǎng)業(yè)務(wù)系統(tǒng)的關(guān)鍵指標(biāo)之一。不用修改代碼,一個 Kubernetes 集群即可從只包含幾個Node 的小集群平滑擴展到擁有成百上千 Noder 大規(guī)模集群,利用 Kubernetes 提供的工具,甚至可以在線完成集群的擴容。只要微服務(wù)設(shè)計的得好,結(jié)合硬件或者公有云資源的線性增加,系統(tǒng)就能夠承受大量用戶并發(fā)訪問所帶來的壓力。 Kubernetes 基本概念和術(shù)語Kubernetes中的大部分概念如Node、Pod、Replication Controller、Server、Deploymeng、Job、DaemonSet 等都可以看作一種資源對象,幾乎所有的資源對象都可以通過 Kubernetes提供的 kubectl 工具執(zhí)行增、刪、改、查等操作,并將其保存在 etcd 中持久化存儲。從這個角度來看,Kubernets 其實是一個高度自動化的資源控制系統(tǒng),它通過跟蹤對比 etcd 存儲里保存的資源期望狀態(tài)與當(dāng)前環(huán)境中的實際資源狀態(tài)的差異來實現(xiàn)自動控制和自動糾錯的高級功能。 MasterKubernetes 里的 Master 指的是集群控制節(jié)點,每個 Kubernetes 集群里需要有一個Master 節(jié)點來負責(zé)整個集群的管理的控制,基本上 Kubernetes 所有的控制命令進是發(fā)給Master,Master 負責(zé)具體的執(zhí)行過程,后面所有執(zhí)行的命令基本都是在 Master 節(jié)點上運行的。Master 節(jié)點通常會占據(jù)一個獨立的 X86 服務(wù)器,一個主要的原因是它太重要了,它是整個集群的大腦,如果它宕機或者不可用,那么所有的控制命令都將失效。 Kube-apiserver:提供了 HTTP Rest 接口的關(guān)鍵服務(wù)進程,是 Kubernetes 里所有資源的增、刪、改、查等操作的唯一入口,也是集群控制入口進程。 Kube-controller-manager:是 Kubernetes 里所有資源對象的自動化控制中心,可以理解為資源對象的管家。 Kube-scheduler:負責(zé)資源調(diào)度的進程,相當(dāng)于公交公司的調(diào)度室。 其實 Master 節(jié)點上往往還啟動了一個 etcd server 進程,因為 Kubernetes 里的所有資源對象的數(shù)據(jù)全部是保存在 etcd 中的。 Node除了 Master、Kubernetes 集群中的其他機器被稱為 Node 節(jié)點,在較早的版本中也被稱為 Minion。與 Master 一樣,Node 節(jié)點可以是一臺物理主機,也可以是一臺虛擬機。Node節(jié)點才是 Kubernetes 集群中的工作負載節(jié)點,每個 Node 都會被 Master 分配一些負載。當(dāng)某個 Node 宕機時,其上的工作負載會被 Master 自動轉(zhuǎn)移到其他節(jié)點上去。 每個 Node 節(jié)點都運行著以下一組關(guān)鍵進程: Kubelet:負責(zé) Pod 對應(yīng)的容器的創(chuàng)建、啟停等任務(wù),同時與 Master 節(jié)點密切協(xié)作,實現(xiàn)集群管理的基本功能。 Kube-proxy:實現(xiàn) Kubernetes Service 的通信與負載均衡機制的重要組件。 Pod:是kubernetes最重要也是最基本的概念。每個Pod都會包含一個 “根容器”,還會包含一個或者多個緊密相連的業(yè)務(wù)容器。 Kubernetes為每個Pod都分配了唯一的IP地址,稱之為PodIP,一個Pod里的多個容器共享PodIP地址。要求底層網(wǎng)絡(luò)支持集群內(nèi)任意兩個Pod之間的直接通信,通常采用虛擬二層網(wǎng)絡(luò)技術(shù)來實現(xiàn)(Flannel)。 k8s集群部署方案如下是我的集群部署策略,1個master 2個node(minion1.2之前的叫法)。我的存儲集群etcd是單點集群,不推薦此做法。網(wǎng)絡(luò)使用的是flannel虛擬二次網(wǎng)絡(luò)。 Kubernetes具有完備的集群管理能力: 包括多層次的安全防護和準(zhǔn)入機制 多租戶應(yīng)用支撐能力 透明的服務(wù)注冊和服務(wù)發(fā)現(xiàn)機制 內(nèi)建智能負載均衡器 強大的故障發(fā)現(xiàn)和自我修復(fù)能力 服務(wù)滾動升級和在線擴容能力 可擴展的資源自動調(diào)度機制 以及多粒度的資源管理能力 同時,kubernetes提供了完善的管理工具,這些工具涵蓋了包括開發(fā)、部署測試、運維監(jiān)控在內(nèi)的各個環(huán)節(jié)。 在kubernetes中,service(服務(wù))是分布式集群架構(gòu)的核心,一個service對象擁有如下關(guān)鍵特征: 擁有一個唯一指定的名字(比如mysql-service)。 擁有一個虛擬IP(Cluster IP、service IP或VIP)和端口號。 能夠提供某種遠程服務(wù)能力。 被映射到了提供這種服務(wù)能力的一組容器應(yīng)用上。 Kubernetes.io開發(fā)了一個交互式教程,通過WEB瀏覽器就能使用預(yù)先部署好的一個Kubernetes集群,快速體驗kubernetes的功能和應(yīng)用場景。 鏈接:https:///docs/tutorials/kubernetes-basics/ K8s官方下載地址:https://github.com/kubernetes 主機名 操作系統(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修改主機名 [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臺測試機的/etc/hosts文件(在三臺服務(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 ~]#時間校對(三臺機器都做時間校對) [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時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 [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/ [root@master ~]# yum -y install docker-ce kubelet kubeadm kubectl [root@master ~]# vim /usr/lib/systemd/system/docker.service 手動添加一行 Environment="HTTPS_PROXY=http://www.:10080" Environment="NO_PROXY=127.0.0.0/8,172.0.0.0/16" [root@master ~]# systemctl daemon-reload 啟動docker [root@master ~]# systemctl start docker 設(shè)置開機啟動 [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è)置開機啟動 [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 報錯信息,解決辦法: [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 檢測組件運行是否正常 [root@master ~]# kubectl get cs [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./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 [root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready master 2h v1.11.3查看pod運行情況 [root@master ~]# kubectl get pods -n kube-system [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 [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 [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 [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 [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 [root@master ~]# kubectl get nodes [root@master ~]# kubectl get pods -n kube-system -o wide |
|