自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

簡單了解一下Kubernetes,并搭建自己的集群

云計算
這篇博客的本意是帶大家從零開始搭建Kubernetes集群的。但是我后面一想,如果是我看了這篇文章,會收獲什么?就是跟著步驟一步一走嗎?是我的話我會選擇拒絕,所以我加了關(guān)于Kubernetes的簡單介紹,每一步的步驟都添加了解釋。由于篇幅和時間原因,我只介紹了Kubernetes中較為核心的Pod和Service。

這篇博客的本意是帶大家從零開始搭建Kubernetes集群的。但是我后面一想,如果是我看了這篇文章,會收獲什么?就是跟著步驟一步一走嗎?是我的話我會選擇拒絕,所以我加了關(guān)于Kubernetes的簡單介紹,每一步的步驟都添加了解釋。由于篇幅和時間原因,我只介紹了Kubernetes中較為核心的Pod和Service。

[[399050]]

文章前半段會簡單的介紹一下Kubernetes,后半段會介紹如何從零開始慢慢的搭建集群。

Kubernetes是什么

Kubernetes是由Google在2014年開源的生產(chǎn)級別的容器編排系統(tǒng),或者說是微服務和云原生平臺。雖說14年才開源,但實際上Kubernetes是Google內(nèi)部的容器編排系統(tǒng)Borg的開源版本,在Google內(nèi)部已經(jīng)用了十多年了。下面是一個關(guān)于Kubernetes的Logo來源的小插曲。

Kubernetes由谷歌在2014年首次對外宣布 。它的開發(fā)和設(shè)計都深受谷歌的Borg系統(tǒng)的影響,它的許多頂級貢獻者之前也是Borg系統(tǒng)的開發(fā)者。在谷歌內(nèi)部,Kubernetes的原始代號曾經(jīng)是Seven,即星際迷航中友好的Borg(博格人)角色。Kubernetes標識中舵輪有七個輪輻就是對該項目代號的致意。

不過也有一個說法是,Docker的Logo是一個馱著集裝箱的鯨魚,也就是運輸船,Kubernetes的Logo是一個船舵,旨在引領(lǐng)著Docker(或者說容器技術(shù))走向遠方。

簡單了解Kubernetes

看了很多官方文章,是真官方。官方什么意思呢,就是有可能看完了約等于沒有看,一樣的啥都不知道。

所以我想寫這樣一篇文章,給那些看完文檔仍然不太理解或者說完全沒了解過Kubernetes的老鐵一點小幫助。那么讓我們回到最初對Kubernetes的定義,它是一個微服務框架。

說到微服務框架,我們就不得不提一下目前業(yè)界十分主流的微服務框架,與這些你十分熟悉的框架進行對比,你就會很清晰的知道Kubernetes能做什么了。目前很主流的微服務框架和平臺有Spring Cloud、Dubbo和Kubernetes。

Spring Cloud來自Netflix,Dubbo來自阿里,而Kubernetes則來自Google。說的直觀一點,這三個框架都是針對微服務的解決方案。可能有人會說,Kubernetes不是一個容器編排系統(tǒng)嗎?怎么跟Spring Cloud這種軟件層面上的微服務框架做起了對比呢?

老鐵別慌,等我們慢慢深入這個概念。

我們都知道,如果我們需要使用微服務,那么肯定少不了一些底層的基礎(chǔ)設(shè)施的支撐,例如服務注冊與發(fā)現(xiàn)、負載均衡、日志監(jiān)控、配置管理、集群自愈和容錯、彈性伸縮……等等。我沒有列舉完,如其實這些組件都可以統(tǒng)稱為微服務的公共關(guān)注點。那我們是不是可以說,只要能夠提供的這些功能,它就算一個微服務框架呢?

以上的大多數(shù)功能,Kubernetes都是內(nèi)置的。故我們可以說Kubernetes是一個與Docker Swarm相類似的容器編排系統(tǒng),但是由于Kubernetes內(nèi)置了微服務的解決方案,它同時也是一個功能完備的微服務框架。

Pod的概念

在Docker Swarm中,調(diào)度的最小單位是容器,而在Kubernetes中,調(diào)度的最小是Pod,那啥是Pod呢?

Pod是Kubernetes設(shè)計的一個全新的概念,在英文中的原意是表達一群鯨魚或者是一個豌豆莢的意思。換句話說,一個Pod中可以運行一個或者多個容器。

在一個集群中,Kubernetes會為每個Pod都分配一個集群內(nèi)唯一的IP地址。因為Kubernetes要求底層網(wǎng)絡支持集群內(nèi)的任意節(jié)點之間的兩個Pod能夠直接通信。這些容器共享當前Pod的文件系統(tǒng)和網(wǎng)絡。而這些容器之所以能夠共享,是因為Pod中有一個叫Pause的根容器,其余的用戶業(yè)務容器都是共享這個根容器的IP和Volume。所以這些容器之間都可以通過localhost進行通信。

有人可能會問,為什么要引入根容器這個概念?那是因為如果沒有根容器的話,當一個Pod中引入了多個容器的時候,我們應該用哪一個容器的狀態(tài)來判斷Pod的狀態(tài)呢?所以才要引入與業(yè)務無關(guān)且不容易掛掉的Pause容器作為根容器,用根容器的狀態(tài)來代表整個容器的狀態(tài)。

熟悉Spring Cloud或者微服務的都知道,微服務中最忌諱的就是出現(xiàn)單點的情況。

所以針對同一個服務我們一般會部署2個或者更多個實例。在Kubernetes中,則是會部署多個Pod副本,組成一個Pod集群來對外提供服務。

而我們前面提過,Kubernetes會為每一個Pod提供一個唯一的IP地址,客戶端就需要通過每個Pod的唯一IP+容器端口來訪問到具體的Pod,這樣一來,如果客戶端把調(diào)用地址寫死,服務器就沒有辦法做負載均衡,而且,Pod重啟之后IP地址是會變的,難道每次重啟都要通知客戶端IP變更嗎?

為了解決這個問題,就要引出Service的概念了。

Service

Service是Kubernetes中最核心的資源對象之一,就是用于解決上面提到的問題。我個人認為與Swarm中的Service概念沒有太大的區(qū)別。

一旦Service被創(chuàng)建,Kubernetes會為其分配一個集群內(nèi)唯一的IP,叫做ClusterIP,而且在Service的整個生命周期中,ClusterIP不會發(fā)生變更,這樣一來,就可以用與Docker Swarm類似的操作,建立一個ClusterIP到服務名的DNS域名映射即可。

值得注意的是,ClusterIP是一個虛擬的IP地址,無法被Ping,僅僅只限于在Kubernetes的集群內(nèi)使用。

而Service對客戶端,屏蔽了底層Pod的尋址的過程。并且由kube-proxy進程將對Service的請求轉(zhuǎn)發(fā)到具體的Pod上,具體到哪一個,由具體的調(diào)度算法決定。這樣以來,就實現(xiàn)了負載均衡。

而Service是怎么找到Pod的呢?這就需要繼續(xù)引入另外一個核心概念Label了。

Label

Lable本質(zhì)上是一個鍵值對,具體的值由用戶決定。Lable就是標簽,可以打在Pod上,也可以打到Service上??偨Y(jié)來說,Label與被標記的資源是一個一對多的關(guān)系。

例如,我們給上面所描述的Pod打上了role=serviceA的標簽,那么只需要在Service中的Label Selector中加入剛剛那個標簽,這樣一來,Service就可以通過Label Selector找到打了同一Label的Pod副本集了。

接下來,再簡單的介紹一下其他的Kubernetes核心概念。

Replica Set

上面提到過部署多個Pod,是怎么一回事呢?Kubernetes最開始有一個概念叫Replication Controller,不過現(xiàn)在已經(jīng)慢慢的被Replica Set所替代,RS也叫下一代的RC。簡單來說Replica Set定義了一種期望的場景,即讓任何時候集群內(nèi)的Pod副本數(shù)量都符合預期的值。

一旦被創(chuàng)建,集群就會定期的檢測當前存活的Pod數(shù)量,如果多了,集群就會停掉一些Pod。相反,如果少了就會創(chuàng)建一些Pod。這樣一來可以避免什么問題呢?假設(shè)某個服務有兩個實例在運行,其中一個意外掛掉了,如果我們設(shè)置了副本數(shù)量是2,那么集群就會自動創(chuàng)建一個Pod,以保證集群內(nèi)始終有兩個Pod在運行。

Kubernetes的東西就簡單的介紹這么多,接下來讓我們進入集群的搭建環(huán)節(jié)。

搭建Kubernetes的準備工作

不知道從哪篇博客開始,不是很愿意寫這種純TODO類的博文,但是我自己躺坑之后發(fā)現(xiàn),我自己這個還真是我目前見過最簡單的。

我看到的有些安裝分了很多種情況,但是當一個初學者來看的時候,可能反而會讓他看懵逼。所以接下來的安裝會有些硬核。不分情況,就只有一種情況,一把梭安裝就完事。

  • 系統(tǒng) 版本 Ubuntu 18.04
  • Kubernetes 版本 v1.16.3
  • Docker 版本 v19.03.5
  • Flannel 版本 v0.11.0

如果你問我,如果沒有機器看了你的文章也能的擁有自己的集群嗎?

準備工作

我們先假設(shè)以下的情況成立。

機器:有2-3臺物理機或虛擬機

系統(tǒng):Ubuntu 18.04且已換好國內(nèi)的源

如果以上基本不成立,本篇文章到此結(jié)束,謝謝觀看……

[[399051]]

 

安裝Docker

我也不需要介紹各種情況了,直接登上機器,創(chuàng)建一個shell腳本,例如叫install_docker.sh,一把梭代碼如下。

 

  1. sudo apt-get update 
  2. sudo apt-get install -y apt-transport-https ca-certificates  
  3. curl gnupg-agent software-properties-common 
  4. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 
  5. sudo apt-key fingerprint 0EBFCD88 
  6. sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" 
  7. sudo apt-get update 
  8. sudo apt-get -y install docker-ce docker-ce-cli containerd.io 

然后執(zhí)行sh install_docker.sh,等待命令跑完,驗證Docker是否安裝好即可。直接敲docker +回車。

安裝Kubernetes

同理,新建一個shell腳本,例如install_k8s.sh。一把梭代碼如下:

 

  1. sudo curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - 
  2. sudo apt-get update 
  3. cat <<EOF >/etc/apt/sources.list.d/kubernetes.list 
  4. deb https://apt.kubernetes.io/ kubernetes-xenial main 
  5. EOF 
  6. sudo apt-get install -y kubelet kubeadm kubectl --allow-unauthenticated 

然后執(zhí)行sh install_k8s.sh,等待命令跑完,驗證Kubernetes是否安裝好即可。直接敲kubectl +回車。

關(guān)閉Swap

先給出一把梭,不要耽誤了正在安裝的老鐵。為什么要關(guān)閉后面再說。

  • 暫時關(guān)閉,直接使用命令sudo swapoff -a,但是重啟之后會生效。會導致Kubernetes無法正常運行。
  • 永久關(guān)閉,建議一勞永逸,sudo vim /etc/fstab將有swap.img那行注釋掉,保存即可。

那么,swap是啥呢?它是系統(tǒng)的交換分區(qū),你可以理解為虛擬內(nèi)存。當系統(tǒng)內(nèi)存不足的時候,會將一部分硬盤空間虛擬成內(nèi)存使用。那為什么Kubernetes需要將其關(guān)掉呢?可以從下圖看看訪問內(nèi)存和訪問硬盤速度上的差異就知道了。

總的來說是為了性能考慮,所以就需要避免開啟swap交換,Kubernetes希望所有的服務都不應該超過集群或節(jié)點CPU和內(nèi)存的限制。

初始化Master節(jié)點

到這,準備工作就完成了,可以開始安裝Kubernetes的Master節(jié)點了,登上要作為Master節(jié)點的機器。

設(shè)置HostName

老規(guī)矩,先上命令,再說為什么要設(shè)置。

sudo hostnamectl set-hostname master-node

自定義修改了主機名,在之后查看集群內(nèi)節(jié)點時,每個節(jié)點的名字就不會顯示Kubernetes自動生成的名字,便于查看和記憶。例如,在其他的Node節(jié)點你可以將master-node改為slave-node-1或worker-node-2,效果如下:

初始化集群

在機器上執(zhí)行如下命令:

  1. sudo kubeadm init --pod-network-cidr=10.244.0.0/16 

然后,抱起吉他,等待命令執(zhí)行完。

這里需要特別注意一下。這個命令執(zhí)行完成之后,會打印一個有kubeadm join的命令,需要保存下來。

大概長這樣:

  • kubeadm join你的IP地址:6443 --token 你的TOKEN --discovery-token-ca-cert-hash sha256:你的CA證書哈希

顧名思義,這個命令用于其他節(jié)點加入到集群中,而且Token是有時效性的,過期時間一般是86400000毫秒。

如果失效,就需要重新生成。如果你真的又沒有保存,又失效了…我還是給你準備了兩個補救措施。如果命令保存下來了,那么請直接跳過這兩個補救措施。

token. 通過命令Kubeadm token list找回。

ca-cert. 執(zhí)行命令

  1. openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' 

找回。

普通用戶可執(zhí)行

把下面的指令一把梭即可:

 

  1. mkdir -p $HOME/.kube 
  2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config 
  3. sudo chown $(id -u):$(id -g) $HOME/.kube/config 

主要是,為了不那么麻煩,在控制節(jié)點上執(zhí)行kubectl這類的命令時,不用每次都sudo。

安裝網(wǎng)絡通信插件

執(zhí)行如下命令,安裝網(wǎng)絡插件Flannel。

  1. sudo kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 

可以看到,如果不安裝Flannel,我們剛剛Init好的Master節(jié)點會處于NOT_READY的狀態(tài)。安裝好之后,可以通過命令kubectl get nodes來查看所有的節(jié)點的狀態(tài)。也可以通過kubectl get pods --all-namespaces來查看當前集群中所有Pod的狀態(tài)。這里需要注意的是,只有在master節(jié)點是READY,所有Pod的狀態(tài)是RUNNING之后,才可以進行下一步。

為什么要裝網(wǎng)絡插件呢?

那是因為Kubernetes要求集群內(nèi)的所有節(jié)點之間的Pod網(wǎng)絡是互通的。換句話說,F(xiàn)lannel可以讓集群內(nèi)不同節(jié)點上的容器都有一個在當前集群內(nèi)唯一的虛擬IP地址。這樣以來,就可以實現(xiàn),跨節(jié)點的Pod與Pod直接通信。

這樣一來,將復雜的網(wǎng)絡通信,簡單的變成了兩個IP地址之間的通信。這主要是通過虛擬二層網(wǎng)絡實現(xiàn)的??此剖沁@個節(jié)點的Pod直接和另一個節(jié)點上的Pod進行了通信,最終還是通過節(jié)點的物理網(wǎng)卡流出的。

Slave節(jié)點加入集群

到此,一個單點的集群就已經(jīng)搭建好了?,F(xiàn)在我們要做的是,登錄準備好的另一臺(我只有兩臺,如果你有3臺或者4天,把這個章節(jié)反復走幾次就好了)服務器。

設(shè)置HostName

執(zhí)行如下命令:

  1. sudo hostnamectl set-hostname slave-node 

因為當前節(jié)點不是Master了,所以主機名設(shè)置成了slave-node。

加入集群

重點來了,執(zhí)行上一章節(jié)生成的kubeadm join命令即可。等待執(zhí)行完畢之后,就可以在master節(jié)點上通過命令kubectl get nodes看到slave-node已經(jīng)加入了集群。

對于Slave節(jié)點的操作就沒了。

責任編輯:未麗燕 來源: 知乎
相關(guān)推薦

2021-07-27 11:31:29

運維架構(gòu)技術(shù)

2022-12-31 08:36:12

部署Zookeeper集群

2020-02-10 14:26:10

GitHub代碼倉庫

2019-12-26 15:33:57

RedisHash架構(gòu)

2020-12-10 08:44:35

WebSocket輪詢Comet

2022-03-24 13:36:18

Java悲觀鎖樂觀鎖

2020-03-01 17:53:38

Excel大數(shù)據(jù)微軟

2009-11-17 11:14:25

Oracle擴展

2019-02-20 14:16:43

2018-06-05 17:40:36

人工智能語音識別

2024-04-11 12:19:01

Rust數(shù)據(jù)類型

2018-04-25 06:46:52

2019-03-11 14:33:21

Redis內(nèi)存模型數(shù)據(jù)庫

2023-03-02 08:00:55

包管理工具pnpm 包

2021-10-28 14:30:19

K8S Kubernetes數(shù)據(jù)持久化

2022-03-07 06:34:22

CQRS數(shù)據(jù)庫數(shù)據(jù)模型

2011-07-20 16:13:03

SQL Profile數(shù)據(jù)庫

2018-07-17 14:42:50

2023-11-18 09:09:08

GNUBSD協(xié)議

2024-02-28 18:22:13

AI處理器
點贊
收藏

51CTO技術(shù)棧公眾號