首先,它是一個全新的基於容器技術的分佈式架構領先方案。這個方案盡然很新,但它是谷歌十幾年以來大規模應用容器技術的經驗積累和昇華的一個重要成果。確切地說,kubernetes是谷歌嚴格保密十幾年的祕密武器Borg的一個開源版本。Borg是谷歌的一個久負盛名的內部使用的大規模集羣管理系統,它基於容器技術,目的是實現資源管理的自動化,以及跨多個數據中心的資源利用率的最大化。
2015年4月,傳聞許久的Borg論文伴隨kubernetes(K8S)的高調宣傳被谷歌首次公開,你們才得以瞭解它的更多內幕。正是因爲站在Borg這個前輩的肩膀上,吸收了Borg過去十年間的經驗與教訓,因此kubernetes一經開源就一舉成名,並迅速稱霸了容器技術領域。
若是咱們的系統設計遵循了kubernetes的設計思想,那麼傳統系統架構中哪些和業務沒有多大關係的底層代碼或功能模塊,均可以馬上從咱們的視線中消失,咱們沒必要再費心於負載均衡的選型和部署實施問題,沒必要再考慮引入或本身開發一個複雜的服務治理框架,沒必要再頭疼與服務監控和故障處理模塊的開發。總之,使用kubernetes提供的解決方案,咱們節約了很多於30%的開發成本,同時能夠將精力更加集中於業務自己,並且因爲kubernetes提供了強大的自動化機制,因此係統後期的運維難度和運維成本大幅下降。
node
隨着 Docker 技術的發展和普遍流行,雲原生應用和容器調度管理系統也成爲 IT 領域大熱的詞彙。事實上,在 Docker 技術火爆以前,雲原生應用的思想已經由雲計算技術的領導者和分佈式系統架構的推廣者普遍傳播。例如早在 2011 年 Heroku 的工程師提出了雲原生應用的 12 要素,只不過以虛擬機技術做爲雲原生應用的基礎實施。因爲虛擬機鏡像大、鏡像標準不統一以及打包流程和工具不統一,致使了業界沒法普遍接受的雲原生應用標準,限制了雲原生應用的流行。而 Docker 的出現正好解決了這些限制雲原生應用構建、交付和運行的瓶頸,使得構建雲原生應用成爲了使用 Docker 的開發者天然而然的選擇。
Kubernetes 是爲生產環境而設計的容器調度管理系統,對於負載均衡、服務發現、高可用、滾動升級、自動伸縮等容器雲平臺的功能要求有原生支持。因爲 Kubernetes 在K和s間有8個字母,所以常簡稱 k8s。事實上,隨着對 k8s 系統架構與設計理念的瞭解深刻,會發現 K8s 系統正是到處爲運行雲原生應用而設計考慮;同時,隨着對 k8s 系統使用的加深和推廣,也會有愈來愈多有關雲原生應用的設計模式產生出來,使得基於 k8s 系統設計和開發生產級的複雜雲原生應用變得像啓動一個單機版容器服務那樣簡單易用。
mysql
使用 Kubernetes 的理由有不少,最基本的一個理由就是:IT 是新技術驅動行業。Docker 這個新興的容器化技術當前已經被不少公司所採用,其從單機走向集羣已成必然,而云計算的蓬勃發展正在加速這一進程。Kubernetes 做爲當前惟一被業界普遍承認和看好的 Docker 分佈式系統解決方案。能夠預見,在將來幾年內,會有大量的新系統選擇它,不論是運行在企業本地服務器上仍是被託管到公有云上。
linux
首先,使用 Kubernetes 就是在全面擁抱微服務架構。微服務架構的核心就是將一個巨大的單體應用分解爲不少小的互相鏈接的微服務,一個微服務背後可能有多個實例副本在支撐,副本的數量可能會隨着系統的負荷變化而進行調整,內嵌的負載均衡器在 k8s 平臺中有多個實例副本在支撐,副本的數量可能會隨着系統的負荷變化而進行調整,內嵌的負載均衡器 k8s 平臺中發揮了重要的做用。微服務架構使得每一個服務均可以由專門的開發團隊來開發,開發者能夠自由選擇開發技術,這對於大規模團隊來講頗有價值。另外,每一個微服務獨立開發、升級、擴展,使得系統具有很高的穩定性和快速迭代進化能力。
其次,Kubernetes 系統架構具有了超強的橫向擴容能力。對於互聯網公司來講,用戶規模就等價於資產,誰擁有更多的用戶,誰就能在競爭中勝出,所以超強的橫向擴容能力是互聯網業務系統的關鍵指標之一。不用修改代碼,一個 Kubernetes 集羣便可從只包含幾個Node 的小集羣平滑擴展到擁有成百上千 Noder 大規模集羣,利用 Kubernetes 提供的工具,甚至能夠在線完成集羣的擴容。只要微服務設計的得好,結合硬件或者公有云資源的線性增長,系統就可以承受大量用戶併發訪問所帶來的壓力。
git
Kubernetes中的大部分概念如Node、Pod、Replication Controller、Server、Deploymeng、Job、DaemonSet 等均可以看做一種資源對象,幾乎全部的資源對象均可以經過 Kubernetes提供的 kubectl 工具執行增、刪、改、查等操做,並將其保存在 etcd 中持久化存儲。從這個角度來看,Kubernets 實際上是一個高度自動化的資源控制系統,它經過跟蹤對比 etcd 存儲裏保存的資源指望狀態與當前環境中的實際資源狀態的差別來實現自動控制和自動糾錯的高級功能。
1) Master
Kubernetes 裏的 Master 指的是集羣控制節點,每一個 Kubernetes 集羣裏須要有一個Master 節點來負責整個集羣的管理的控制,基本上 Kubernetes 全部的控制命令進是發給Master,Master 負責具體的執行過程,後面全部執行的命令基本都是在 Master 節點上運行的。Master 節點一般會佔據一個獨立的 X86 服務器,一個主要的緣由是它過重要了,它是整個集羣的大腦,若是它宕機或者不可用,那麼全部的控制命令都將失效。
Master 節點上運行着如下一組關鍵進程:
github
其實 Master 節點上每每還啓動了一個 etcd server 進程,由於 Kubernetes 裏的全部資源對象的數據所有是保存在 etcd 中的。
2) Node
除了 Master、Kubernetes 集羣中的其餘機器被稱爲 Node 節點,在較早的版本中也被稱爲 Minion。與 Master 同樣,Node 節點能夠是一臺物理主機,也能夠是一臺虛擬機。Node節點纔是 Kubernetes 集羣中的工做負載節點,每一個 Node 都會被 Master 分配一些負載。當某個 Node 宕機時,其上的工做負載會被 Master 自動轉移到其餘節點上去。
每一個 Node 節點都運行着如下一組關鍵進程:
sql
Pod:是kubernetes最重要也是最基本的概念。每一個Pod都會包含一個 「根容器」,還會包含一個或者多個緊密相連的業務容器。
docker
Kubernetes爲每一個Pod都分配了惟一的IP地址,稱之爲PodIP,一個Pod裏的多個容器共享PodIP地址。要求底層網絡支持集羣內任意兩個Pod之間的直接通訊,一般採用虛擬二層網絡技術來實現(Flannel)。
vim
以下是個人集羣部署策略,1個master + 2個node(minion1.2以前的叫法)。個人存儲集羣etcd是單點集羣,不推薦此作法。網絡使用的是flannel虛擬二次網絡。
centos
Kubernetes具備完備的集羣管理能力:
設計模式
同時,kubernetes提供了完善的管理工具,這些工具涵蓋了包括開發、部署測試、運維監控在內的各個環節。
在kubernetes中,service(服務)是分佈式集羣架構的核心,一個service對象擁有以下關鍵特徵:
Kubernetes.io開發了一個交互式教程,經過WEB瀏覽器就能使用預先部署好的一個Kubernetes集羣,快速體驗kubernetes的功能和應用場景。
連接:https://kubernetes.io/docs/tutorials/kubernetes-basics/
K8s官方下載地址:https://github.com/kubernetes
主機名 | 操做系統 | 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 |
關閉CentOS7自帶的防火牆服務
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、node一、node2,配置IP地址,配置3臺測試機的/etc/hosts文件(在三臺服務器上同步)
[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 秒
配置dockers鏡像
[root@master ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
配置kubernetes倉庫
[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
手動添加一行
12 Environment="HTTPS_PROXY=http://www.ik8s.io:10080"
13 Environment="NO_PROXY=127.0.0.0/8,172.0.0.0/16"
[root@master ~]# systemctl daemon-reload
啓動docker
[root@master ~]# systemctl start docker
設置開機啓動
[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 #主程序
設置開機啓動
[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.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
查看並驗證節點信息是否成功
[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/
[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
啓動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服務器上能夠查節點信息
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 3h v1.11.3
node1 Ready <none> 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
啓動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服務器上能夠查節點信息
[root@master ~]# kubectl get nodes
[root@master ~]# kubectl get pods -n kube-system -o wide