Kubernetes核心概念是什么

今天小編給大家分享一下Kubernetes核心概念是什么的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

在金華等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站建設(shè)、成都做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需定制設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),營銷型網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站制作,金華網(wǎng)站建設(shè)費(fèi)用合理。

容器技術(shù)是微服務(wù)技術(shù)的核心技術(shù)之一,并隨著微服務(wù)的流行而迅速成為主流。Docker是容器技術(shù)的先驅(qū)和奠基者,它出現(xiàn)之后迅速占領(lǐng)市場(chǎng),幾乎成了容器的代名詞。但它在開始的時(shí)候并沒有很好地解決容器的集群?jiǎn)栴}。Kubernetes抓住了這個(gè)機(jī)遇,以容器編排者(Container Orchestration)的身份出現(xiàn),對(duì)容器集群進(jìn)行管理和調(diào)度,現(xiàn)在已經(jīng)打敗了Docker成為了容器技術(shù)事實(shí)上的標(biāo)準(zhǔn)。當(dāng)然K8s內(nèi)部還是需要Docker的,但它的功能范圍被大大壓縮了,只是負(fù)責(zé)底層的容器引擎和鏡像(Docker Image)管理,成為了容器體系中不可缺少, 但沒有存在感的一部分。而絕大部分的對(duì)外接口都是由k8s來負(fù)責(zé)。

K8s核心對(duì)象:

相對(duì)于簡(jiǎn)單易學(xué)的Docker來說,k8s系統(tǒng)龐雜而且概念眾多,同一個(gè)功能有很多不同方法來完成,讓你無所適從,學(xué)習(xí)起來要困難的多。對(duì)于普通碼農(nóng)來講不需要建立完整的生產(chǎn)環(huán)境,只需要搭建一個(gè)本地開發(fā)環(huán)境,這時(shí)你只需要了解k8s的核心概念就夠了,這樣可以大大縮短學(xué)習(xí)時(shí)間。k8s的一切都是對(duì)象(Object),它的核心概念一共只有4個(gè),Pod,部署(Deployment),服務(wù)(Service)和節(jié)點(diǎn)(Node)。另外再加上一個(gè)容器鏡像(Docker Image),這個(gè)是Docker引擎的核心。掌握了這五個(gè)核心概念,就對(duì)容器技術(shù)有了基本了解,打下了扎實(shí)的基礎(chǔ)。

Windows安裝環(huán)境:

Windows10的Windows 10企業(yè)版, 專業(yè)版, 和教育版是可以支持直接安裝K8s的,但電腦是要支持Hyper-V的, 詳見這里。由于我的Windows是家庭版,只能先安裝虛擬機(jī)(VirtualBox),再在虛擬機(jī)上安裝k8s。我用的k8s是Minikube,是k8s的簡(jiǎn)化版。另外還安裝了Vagrant(它是管理虛擬機(jī)的一個(gè)軟件)作為界面來管理VirtualBox。

容器鏡像(Docker Image):

任何程序都在容器中運(yùn)行,k8s支持多種容器,其中Docker是最流行的。容器鏡像(Docker Image)是一個(gè)以文件形式存在的運(yùn)行環(huán)境,它的里面是分層的,每一層都在上一層的基礎(chǔ)上不斷疊加新的功能。容器鏡像是由Dockerfile創(chuàng)建的。Dockerfile是一個(gè)文件,里面包含一組已經(jīng)定義好的Docker命令(與Linux命令比較相似)。當(dāng)運(yùn)行Dockerfile時(shí),里面的命令被依次執(zhí)行,最后生成需要的容器鏡像。你再調(diào)用Docker命令(Docker run)運(yùn)行容器鏡像來生成Docker容器,完成之后,應(yīng)用程序就已經(jīng)在容器里部署好了。這種方式能夠保證每次得到的環(huán)境都是一樣的。容器比虛擬機(jī)強(qiáng)的地方在于,它占用系統(tǒng)資源更少,生成時(shí)間更短。創(chuàng)建一個(gè)容器的耗時(shí)一般是秒級(jí)的,而虛擬機(jī)是分鐘級(jí)的。容器鏡像的創(chuàng)建效率取決于它的大小,一般來講容器鏡像越小,它的生成時(shí)間越短。 下面就是一個(gè)“nginx”的Dockerfile示例。

FROM alpine:3.2
EXPOSE 80 443
RUN apk add --update nginx && \
rm -rf /var/cache/apk/* && \
mkdir -p /tmp/nginx/client-body
COPY ./nginx.conf /etc/nginx/nginx.conf
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d"]
CMD ["nginx", "-g", "daemon off;"]

任何Dockerfile的第一句總是“FROM 。。?!?,就是要?jiǎng)?chuàng)建一個(gè)Linux的運(yùn)行環(huán)境。一般有以下幾種:

  • FROM ubuntu:18.04: 按照Linux的具體版本來創(chuàng)建鏡像,這樣的Linux運(yùn)行環(huán)境是比較完整的,鏡像的大小是百兆級(jí)別的。

  • FROM alpine:latest : alpine是一個(gè) 精簡(jiǎn)了的Linux運(yùn)行環(huán)境,它的大小是十兆級(jí)別的。

  • FROM scratch : scratch是最小Linux運(yùn)行環(huán)境,創(chuàng)建非???,但它的問題是你不能通過shell登錄到容器內(nèi)部,因此我一般不用它。

當(dāng)用Vagrant管理虛擬機(jī)時(shí),可以先用Vagrant命令啟動(dòng)虛擬機(jī),然后敲入vagrant ssh,進(jìn)入虛擬機(jī),系統(tǒng)顯示:

PS E:\app2\kub> vagrant ssh
Last login: Sat Sep 28 06:56:11 2019 from 10.0.2.2

然后鍵入“docker run --name docker-nginx -p 8001:80 nginx”運(yùn)行Nginx鏡像。"docker-nginx"是容器的名字,“--name”是名字的參數(shù)選項(xiàng)?!?p”表示端口映射,把虛擬機(jī)的“8001”端口映射到容器的“80”端口(Nginx的缺省端口)?!皀ginx”是鏡像的名字,如果本地沒有找到“Nginx”鏡像,系統(tǒng)會(huì)自動(dòng)從Docker鏡像庫里下載Nginx鏡像到本地,然后再運(yùn)行,這個(gè)鏡像有比較完整的Linux系統(tǒng),因此文件比較大(100M),但也可以湊活著用。命令運(yùn)行之后,顯示:

vagrant@ubuntu-xenial:~$ docker run --name docker-nginx -p 8001:80 nginx

這時(shí)Nginx已經(jīng)運(yùn)行,但還沒有任何請(qǐng)求,控制臺(tái)沒有輸出。如果名字為“docker-nginx”的容器以前已經(jīng)被運(yùn)行,那么你需要?jiǎng)h除原來的,再運(yùn)行上面命令??梢韵惹萌搿癲ocker ps -a”找到所有運(yùn)行過的容器,再敲入“docker rm 1ec2e3d63537”進(jìn)行刪除,其中“ 1ec2e3d63537”是容器ID.

切換到另一個(gè)虛擬機(jī)窗口,敲入curl localhost:8001,顯示:

vagrant@ubuntu-xenial:/usr/bin$ curl localhost:8001
...
<h2>Welcome to nginx!</h2>
...

這時(shí)就出現(xiàn)了Nginx的首頁,表示Docker容器中的Nginx已經(jīng)正常運(yùn)行。

換回原容器顯示窗口,這時(shí)有了請(qǐng)求,控制臺(tái)輸出Nginx日志。

vagrant@ubuntu-xenial:~$ docker run --name docker-nginx -p 8001:80 nginx
172.17.0.1 - - [28/Sep/2019:07:02:25 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-"

這時(shí)已驗(yàn)證Docker鏡像是好的,敲入“CTRL-C”退出。

Pod:

Pod是k8是的最基本概念,你可以把它看成是對(duì)容器(container)的一個(gè)封裝,用來管理容器。一個(gè)Pod里可以管理有一個(gè)或多個(gè)容器,但一般是一個(gè)。Pod里的所有容器都共享Pod的資源和網(wǎng)絡(luò)。當(dāng)一個(gè)Pod不能滿足用戶需求時(shí),你可以把Pod作為復(fù)制的最小單元來復(fù)制出一個(gè)同樣的Pod來處理用戶請(qǐng)求。Pod支持多種容器,不過一般是用Docker。你可以用單獨(dú)的Pod配置文件創(chuàng)建Pod, 也可以把Pod的配置信息放在其他的對(duì)象(例如Deployment)的配置文件里面,并與其他對(duì)象一起創(chuàng)建,后者更為常見。每一個(gè)Pod都有一個(gè)唯一的IP地址,Pod一旦生成就可以通過IP地址進(jìn)行訪問。但一般不這么做,而是通過服務(wù)(Service)去間接地去訪問。下面就是Pod的配置文件。它的解釋放在后面的Deployment里面。

kind: Pod
apiVersion: v1
metadata:
  labels:
        app: nginx-app
spec:
  containers:
    - name: nginx-container
      image: nginx:latest
  restartPolicy: Never
Pod模板(Pod Templates)

Pod模板是嵌入在其他K8s對(duì)象(Object)中的Pod的配置說明,例如Replication Controllers, Jobs, 和DaemonSets. 這時(shí),Pod不是單獨(dú)創(chuàng)建的,而是由其它對(duì)象來創(chuàng)建,其中最常用的是Deployment。

部署(Deployment):

Deployment是比Pod更高一層的對(duì)象,它的主要作用是管理Pod集群,它里面可以有一個(gè)或多個(gè)Pod, 每一個(gè)Pod在功能上都是等同的。一般在Deployment里配置多個(gè)Pod以實(shí)現(xiàn)負(fù)載均衡和容錯(cuò)。在配置Deployment時(shí),你需要指定Pod拷貝的個(gè)數(shù),Deployment會(huì)自動(dòng)管理它里面的Pod。當(dāng)某個(gè)Pod宕機(jī)時(shí),Deployment能自動(dòng)復(fù)制一個(gè)新的Pod并替換宕機(jī)的Pod,

下面就是Deployment的配置文件(nginx-deployment.yaml)。在正方形灰框內(nèi)(從template開始)的是嵌入在Deployment里的Pod的設(shè)置,灰框上面的是部署(Deployment)的設(shè)置。當(dāng)你運(yùn)行這個(gè)配置文件時(shí),它會(huì)創(chuàng)建一個(gè)Deployment,同時(shí)也會(huì)創(chuàng)建嵌入在里面的Pod。這就是為什么我們一般不需要單獨(dú)的Pod的配置文件,因?yàn)橐呀?jīng)把它嵌入在了Deployment里了。

Kubernetes核心概念是什么

鍵入“kubectl create -f nginx-deployment.yaml”來運(yùn)行這個(gè)部署,顯示:

vagrant@ubuntu-xenial:~/dockerimages/kubernetes/nginx$ kubectl create -f nginx-deployment.yaml
deployment.apps/nginx-deployment created

這時(shí)部署已經(jīng)成功,現(xiàn)在就可以訪問它了。每個(gè)Pod都有自己的k8s集群內(nèi)部IP地址,我們這時(shí)只能在K8s內(nèi)部用IP地址進(jìn)行訪問。鍵入下面命令查看Pod地址,里面有兩個(gè)“Nginx”Pod,因?yàn)镈eployment里面是兩個(gè)Pod的集群。

vagrant@ubuntu-xenial:~/nginx$ kubectl get pods -o=custom-columns=NAME:.metadata.name,IP:.status.podIP
NAME                                IP
hello-minikube-856979d68c-74c65     172.17.0.3
nginx-deployment-77fff558d7-bhbbt   172.17.0.10
nginx-deployment-77fff558d7-v6zqw   172.17.0.9

打開另一個(gè)窗口,連入虛擬機(jī),然后鍵入以下命令“kubectl exec -ti hello-minikube-856979d68c-74c65 -- /bin/sh”登錄到k8s集群內(nèi)部,就能訪問Nginx了。這里“hello-minikube-856979d68c-74c65”是"Minikube"Pod的名字?!?72.17.0.10”是其中一個(gè)Pod的內(nèi)部IP地址。

vagrant@ubuntu-xenial:~$ kubectl exec -ti hello-minikube-856979d68c-74c65 -- /bin/sh
# curl 172.17.0.10

服務(wù)(Service):

Service是最上層的k8s的對(duì)象,可以看成我們平常說的微服務(wù)。對(duì)服務(wù)來講最重要的就是服務(wù)注冊(cè)和發(fā)現(xiàn)。在k8s中,Service就是用來實(shí)現(xiàn)這個(gè)功能的。下面就是Service的配置文件(nginx-service.yaml)。一般來說調(diào)用服務(wù)需要知道三個(gè)東西,IP地址,協(xié)議和端口,例如"http://10.0.2.1:80". 但我們不想用IP,而是用名字來尋址,這就需要DNS。DNS在k8s集群內(nèi)部實(shí)現(xiàn)了基于服務(wù)名的尋址。下面是Service的配置文件。Service通過“selector”來與Pod進(jìn)行綁定,這里它把請(qǐng)求轉(zhuǎn)發(fā)給標(biāo)簽“app”是“nginx-app”的Pod。“nodePort”給服務(wù)創(chuàng)建了一個(gè)外部可以訪問的端口,這樣在虛擬機(jī)上就可以直接訪問服務(wù),而不必登錄到k8s集群里。 Kubernetes核心概念是什么

運(yùn)行以下命令“kubectl create -f nginx-service.yaml”創(chuàng)建服務(wù)。

vagrant@ubuntu-xenial:~/$ kubectl create -f nginx-service.yaml
service/nginx-service created

服務(wù)創(chuàng)建完成之后,調(diào)用以下命令顯示當(dāng)前的所有服務(wù), 現(xiàn)在就有了“nginx-service”服務(wù)?!?0”是服務(wù)的內(nèi)部端口,“30163”是服務(wù)的外部端口。

vagrant@ubuntu-xenial:~/$ kubectl get services
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.96.0.1      <none>        443/TCP        35d
nginx-service   NodePort    10.109.7.249   <none>        80:30163/TCP   18s

因?yàn)橐呀?jīng)通過“NodePort”對(duì)外開放了端口,現(xiàn)在不必登錄到k8s內(nèi)部,在虛擬機(jī)上就可以訪問服務(wù)了. 你可以鍵入“l(fā)ocalhost”

curl localhost:30163

Service 和Deployment的區(qū)別:

Deployment是用來管理集群的,與Pod綁定,但你不能直接訪問Deployment。服務(wù)(Service)是為了方便用名字(而不是IP地址)訪問。但這也只是在集群內(nèi)部。你可以登錄k8s集群內(nèi)部,然后鍵入下面命令訪問服務(wù),但在虛擬機(jī)上(k8s外面)就不行, 這時(shí)只能用IP地址。因?yàn)镈NS只是在k8s內(nèi)部才起作用。

# curl nginx-service

節(jié)點(diǎn)(Node):

Node剛開始接觸時(shí)容易和Pod搞混,但它相當(dāng)于虛擬機(jī)或物理機(jī),而Pod相當(dāng)于容器。所有的的Pod或容器都是部署在Node上面。Minikube只支持單Node,但你可以在它里面部署多個(gè)Pod。下面是Node示意圖。

Kubernetes核心概念是什么

圖片來源

k8s核心概念之間的關(guān)系:

對(duì)象間關(guān)系:

下面是k8s的一個(gè)簡(jiǎn)單結(jié)構(gòu)圖:

Kubernetes核心概念是什么

圖片來源

圖中每個(gè)菱形是一個(gè)Node,中間的Node是Master Node,其余三個(gè)是Worker Node。Master Node負(fù)責(zé)管理Worker Node。 Worker Node是真正干活的Node。Master Node里有各種控制器,Deployment就是由控制器來管理的,它在中間的管理Node里,他里面有兩個(gè)部署,A和B,分別對(duì)應(yīng)服務(wù)A和服務(wù)B。“服務(wù)A”部署在最下面的Node里,它里面只有一個(gè)Pod?!胺?wù)B”部署在上面的兩個(gè)Node里,左邊的Node只有一個(gè)Pod,右邊的Node有兩個(gè)Pod,這是一個(gè)有三個(gè)Pod的集群。當(dāng)一個(gè)部署里有多個(gè)Pod時(shí),一般是把它們部署在不同的Node上,這樣即使一個(gè)Node宕機(jī),Deployment仍然可用。

對(duì)象綁定:

下圖是介紹對(duì)象之間如何綁定的關(guān)系圖。

Kubernetes核心概念是什么

圖片來源

每個(gè)對(duì)象都有多個(gè)標(biāo)簽(Label),“app”就是一個(gè)用來標(biāo)識(shí)Pod對(duì)象的標(biāo)簽。圖里有兩個(gè)Pod,它們的“app”標(biāo)簽的值分別為“A”和“B”,其中Pod “B”是集群,而Pod “A”不是。服務(wù)(Service)和部署(Deployment)都通過標(biāo)簽選擇器(Label Selector)來綁定與之匹配的Pod。

以上就是“Kubernetes核心概念是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當(dāng)前名稱:Kubernetes核心概念是什么
網(wǎng)站地址:http://muchs.cn/article30/gppcso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、響應(yīng)式網(wǎng)站、品牌網(wǎng)站建設(shè)標(biāo)簽優(yōu)化、微信小程序ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)