久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Kubernetes核心概念是什么

195次閱讀
沒有評論

共計 6512 個字符,預計需要花費 17 分鐘才能閱讀完成。

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

容器技術是微服務技術的核心技術之一,并隨著微服務的流行而迅速成為主流。Docker 是容器技術的先驅和奠基者,它出現之后迅速占領市場,幾乎成了容器的代名詞。但它在開始的時候并沒有很好地解決容器的集群問題。Kubernetes 抓住了這個機遇,以容器編排者(Container Orchestration)的身份出現,對容器集群進行管理和調度,現在已經打敗了 Docker 成為了容器技術事實上的標準。當然 K8s 內部還是需要 Docker 的,但它的功能范圍被大大壓縮了,只是負責底層的容器引擎和鏡像(Docker Image)管理,成為了容器體系中不可缺少, 但沒有存在感的一部分。而絕大部分的對外接口都是由 k8s 來負責。

K8s 核心對象:

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

Windows 安裝環境:

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

容器鏡像(Docker Image):

任何程序都在容器中運行,k8s 支持多種容器,其中 Docker 是最流行的。容器鏡像(Docker Image)是一個以文件形式存在的運行環境,它的里面是分層的,每一層都在上一層的基礎上不斷疊加新的功能。容器鏡像是由 Dockerfile 創建的。Dockerfile 是一個文件,里面包含一組已經定義好的 Docker 命令(與 Linux 命令比較相似)。當運行 Dockerfile 時,里面的命令被依次執行,最后生成需要的容器鏡像。你再調用 Docker 命令(Docker run)運行容器鏡像來生成 Docker 容器,完成之后,應用程序就已經在容器里部署好了。這種方式能夠保證每次得到的環境都是一樣的。容器比虛擬機強的地方在于,它占用系統資源更少,生成時間更短。創建一個容器的耗時一般是秒級的,而虛擬機是分鐘級的。容器鏡像的創建效率取決于它的大小,一般來講容器鏡像越小,它的生成時間越短。下面就是一個“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。。。”,就是要創建一個 Linux 的運行環境。一般有以下幾種:

FROM ubuntu:18.04:按照 Linux 的具體版本來創建鏡像,這樣的 Linux 運行環境是比較完整的,鏡像的大小是百兆級別的。

FROM alpine:latest : alpine 是一個 精簡了的 Linux 運行環境,它的大小是十兆級別的。

FROM scratch : scratch 是最小 Linux 運行環境,創建非常快,但它的問題是你不能通過 shell 登錄到容器內部,因此我一般不用它。

當用 Vagrant 管理虛擬機時,可以先用 Vagrant 命令啟動虛擬機,然后敲入 vagrant ssh,進入虛擬機,系統顯示:

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”運行 Nginx 鏡像。docker-nginx 是容器的名字,“–name”是名字的參數選項。“-p”表示端口映射,把虛擬機的“8001”端口映射到容器的“80”端口(Nginx 的缺省端口)。“nginx”是鏡像的名字,如果本地沒有找到“Nginx”鏡像,系統會自動從 Docker 鏡像庫里下載 Nginx 鏡像到本地,然后再運行,這個鏡像有比較完整的 Linux 系統,因此文件比較大(100M),但也可以湊活著用。命令運行之后,顯示:

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

這時 Nginx 已經運行,但還沒有任何請求,控制臺沒有輸出。如果名字為“docker-nginx”的容器以前已經被運行,那么你需要刪除原來的,再運行上面命令。可以先敲入“docker ps -a”找到所有運行過的容器,再敲入“docker rm 1ec2e3d63537”進行刪除,其中“1ec2e3d63537”是容器 ID.

切換到另一個虛擬機窗口,敲入 curl localhost:8001,顯示:

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

這時就出現了 Nginx 的首頁,表示 Docker 容器中的 Nginx 已經正常運行。

換回原容器顯示窗口,這時有了請求,控制臺輸出 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   - 

這時已驗證 Docker 鏡像是好的,敲入“CTRL-C”退出。

Pod:

Pod 是 k8 是的最基本概念,你可以把它看成是對容器(container)的一個封裝,用來管理容器。一個 Pod 里可以管理有一個或多個容器,但一般是一個。Pod 里的所有容器都共享 Pod 的資源和網絡。當一個 Pod 不能滿足用戶需求時,你可以把 Pod 作為復制的最小單元來復制出一個同樣的 Pod 來處理用戶請求。Pod 支持多種容器,不過一般是用 Docker。你可以用單獨的 Pod 配置文件創建 Pod, 也可以把 Pod 的配置信息放在其他的對象(例如 Deployment)的配置文件里面,并與其他對象一起創建,后者更為常見。每一個 Pod 都有一個唯一的 IP 地址,Pod 一旦生成就可以通過 IP 地址進行訪問。但一般不這么做,而是通過服務(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 對象(Object)中的 Pod 的配置說明,例如 Replication Controllers, Jobs, 和 DaemonSets. 這時,Pod 不是單獨創建的,而是由其它對象來創建,其中最常用的是 Deployment。

部署(Deployment):

Deployment 是比 Pod 更高一層的對象,它的主要作用是管理 Pod 集群,它里面可以有一個或多個 Pod, 每一個 Pod 在功能上都是等同的。一般在 Deployment 里配置多個 Pod 以實現負載均衡和容錯。在配置 Deployment 時,你需要指定 Pod 拷貝的個數,Deployment 會自動管理它里面的 Pod。當某個 Pod 宕機時,Deployment 能自動復制一個新的 Pod 并替換宕機的 Pod,

下面就是 Deployment 的配置文件(nginx-deployment.yaml)。在正方形灰框內(從 template 開始)的是嵌入在 Deployment 里的 Pod 的設置,灰框上面的是部署(Deployment)的設置。當你運行這個配置文件時,它會創建一個 Deployment,同時也會創建嵌入在里面的 Pod。這就是為什么我們一般不需要單獨的 Pod 的配置文件,因為已經把它嵌入在了 Deployment 里了。

鍵入“kubectl create -f nginx-deployment.yaml”來運行這個部署,顯示:

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

這時部署已經成功,現在就可以訪問它了。每個 Pod 都有自己的 k8s 集群內部 IP 地址,我們這時只能在 K8s 內部用 IP 地址進行訪問。鍵入下面命令查看 Pod 地址,里面有兩個“Nginx”Pod,因為 Deployment 里面是兩個 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

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

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

服務(Service):

Service 是最上層的 k8s 的對象,可以看成我們平常說的微服務。對服務來講最重要的就是服務注冊和發現。在 k8s 中,Service 就是用來實現這個功能的。下面就是 Service 的配置文件(nginx-service.yaml)。一般來說調用服務需要知道三個東西,IP 地址,協議和端口,例如 http://10.0.2.1:80 . 但我們不想用 IP,而是用名字來尋址,這就需要 DNS。DNS 在 k8s 集群內部實現了基于服務名的尋址。下面是 Service 的配置文件。Service 通過“selector”來與 Pod 進行綁定,這里它把請求轉發給標簽“app”是“nginx-app”的 Pod。“nodePort”給服務創建了一個外部可以訪問的端口,這樣在虛擬機上就可以直接訪問服務,而不必登錄到 k8s 集群里。

運行以下命令“kubectl create -f nginx-service.yaml”創建服務。

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

服務創建完成之后,調用以下命令顯示當前的所有服務,現在就有了“nginx-service”服務。“80”是服務的內部端口,“30163”是服務的外部端口。

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

因為已經通過“NodePort”對外開放了端口,現在不必登錄到 k8s 內部,在虛擬機上就可以訪問服務了. 你可以鍵入“localhost”

curl localhost:30163

Service 和 Deployment 的區別:

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

# curl nginx-service

節點(Node):

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

圖片來源

k8s 核心概念之間的關系:對象間關系:

下面是 k8s 的一個簡單結構圖:

圖片來源

圖中每個菱形是一個 Node,中間的 Node 是 Master Node,其余三個是 Worker Node。Master Node 負責管理 Worker Node。Worker Node 是真正干活的 Node。Master Node 里有各種控制器,Deployment 就是由控制器來管理的,它在中間的管理 Node 里,他里面有兩個部署,A 和 B,分別對應服務 A 和服務 B。“服務 A”部署在最下面的 Node 里,它里面只有一個 Pod。“服務 B”部署在上面的兩個 Node 里,左邊的 Node 只有一個 Pod,右邊的 Node 有兩個 Pod,這是一個有三個 Pod 的集群。當一個部署里有多個 Pod 時,一般是把它們部署在不同的 Node 上,這樣即使一個 Node 宕機,Deployment 仍然可用。

對象綁定:

下圖是介紹對象之間如何綁定的關系圖。

圖片來源

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

以上就是“Kubernetes 核心概念是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,丸趣 TV 小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注丸趣 TV 行業資訊頻道。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-04發表,共計6512字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 长垣县| 桓仁| 石门县| 朔州市| 海兴县| 永寿县| 乌拉特后旗| 汝州市| 普兰店市| 万州区| 五指山市| 耿马| 马尔康县| 宁海县| 永川市| 桦甸市| 临湘市| 庄河市| 弋阳县| 屏山县| 边坝县| 兰考县| 秭归县| 昌宁县| 临潭县| 顺义区| 泰来县| 桃园县| 若尔盖县| 青岛市| 靖江市| 灌南县| 塔河县| 朝阳市| 桓台县| 洛阳市| 罗城| 旬邑县| 大竹县| 贡觉县| 台北县|