新四季網

我們為什麼不用k8s(搞不明白為什麼大家都在學習)

2023-04-14 03:42:46 1

作者 | 小明菜市場

來源 | 小明菜市場(ID:fileGeek)

頭圖 | CSDN 下載自東方IC

前言

都2020年了,你還不知道Kubernetes就真的真的真的out啦。(販賣焦慮體) 什麼是k8s,k8s這個詞來自於希臘語,有主管,舵手,船長的意思,我們從圖標中能看出來。

在k8s的網站上,描述是這樣的

生產級別的容器編排系統

從定義中可以提煉出三個關鍵字,分別是

生產級別

容器

編排系統

1、生產級別

說k8s是生產級別的有如下的幾個原因:

k8s 是谷歌的開源系統,基於谷歌的系統設計,並且已經在谷歌系統上平穩運行的很久。

k8s 是CNCF的首個畢業項目。

2、容器

容器有以下幾個特點

可移植性,容器可以被任何類型的作業系統安裝使用。

包容性:支持多種類型的軟體,這些軟體都可以打包在容器內。

標準格式。

共存,多個容器可以運行在同一個物理機上。

隔離,不同的容器的軟體彼此隔離。

最重要的一句話:沒有容器就沒有微服務。

容器和微服務化後,帶來了一些好處,比如:

模塊間更加獨立,可以獨立的部署和發布,加快了發布和更新的速度

隔離的運行環境,可以為不同模塊定製不同的運行環境

3、編排系統

容器的編排系統可以有效的管理在宿主機上的容器。

管理網絡和訪問

跟蹤容器的狀態

增大或縮小服務的規模

實現負載平衡

宿主機無響應後實現容器的重新分配

服務發現

管理容器的存儲 等等…

主要功能

1、數據卷

pod中容器之間共享數據,可以使用數據卷。

2、應用程式健康檢查

容器內服務可能進程阻塞無法處理請求,可以設置監控檢查的策略

3、複製應用程式實例

控制器維護者pod副本數量,保證一個pod或一組同類prod數量始終可用

4、彈性伸縮

根據設定的指標,自動縮放pod副本數

5、服務發現

使用環境變量或DNS插件保證容器中程序發現pod入口訪問地址。

6、負載均衡

一組pod副本分配一個私有的集群ip地址,負載均衡轉發請求到後端容器,在集群類其他pod可以通過clusterIP訪問應用。

7、滾動更新

更新服務不中斷,一次更新一個pod,而不是同時刪除整個服務。

8、服務編排

通過文件描述部署服務,使得應用程式部署變得高效。

9、資源監控

Node節點組件集成cAdvisor資源收集工具,通過Heapster匯總,並保存到influxDB時序資料庫,最後由Grafana展示。

10、提供認證授權

支持RBAC認證授權機制。

11、設計架構

功能組件

k8s 集群中有管理節點,Master與工作節點,Node兩種類型。

管理節點Master主要負責k8s集群管理,集群中各個節點之間信息交互,任務調度,還負責容器,pod, namespaces , pv 等生命周期的管理。

工作節點node主要為容器和pod提供計算資源,pod及其容器全部運行在工作節點上,工作節點通過kubelet服務與管理節點通信以管理容器的生命周期,並與集群其他節點進行通信。

1、master組件

kube-apiserver

kubernetes api 資源操作的唯一入口,各種組件的協調者,以HTTP API 提供接口服務,並提供相關的認證,授權等機制,

kube-controller-manager

處理集群中常規的後臺任務,一個資源對應一個控制器,而ControllerManager負責管理這些控制器,並維護集群的狀態。

kube-scheduler

負責資源的調度,按照預定的策略把pod調度到對應的Node節點上。

2、Node組件

kubelet

kubelet是Master在Node節點上的agent,管理本機運行容器的生命周期,同時也負責Volume和網絡的管理。例如創建容器,掛載數據卷,下載secret,獲取容器和節點的狀態等工作。

kube-proxy

在Node節點上實現Pod/serviced網絡代理,提供cluster內部的服務發現和四層負載均衡。

docker

真正運行容器的地方

etcd集群

分布式鍵值對儲存系統,用於保存集群狀態,比如pod,service等對象信息。

分層架構

核心層:最核心的功能,對外提供api 應用層,部署無狀態應用,等,和路由。管理層:系統度量,自動化,以及RBAC等 接口層:kubectl命令行工具,以及客戶端sdk 生態系統:分為外部的日誌,監控等,內部的鏡像倉庫等。

安裝

創建集群

首先,查看所使用的 minikube 版本:

$ minikube versionminikube version: v0.25.0

啟動 minikube:

$ minikube startStarting local Kubernetes v1.9.0 cluster...Starting VM...Getting VM IP address...Moving files into cluster...Setting up certs...Connecting to cluster...Setting up kubeconfig...Starting cluster components...Kubectl is now configured to use the cluster.Loading cached images from config file.

minikube 啟動之後,會創建一個單節點 Kubernetes 集群。

查看集群版本:

$ kubectl versionClient Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2017-12-15T21:07:38Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"}Server Version: version.Info{Major:"", Minor:"", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2018-01-26T19:04:38Z", GoVersion:"go1.9.1", Compiler:"gc", Platform:"linux/amd64"}

這裡有兩個版本,client version 指的是 kubectl 命令行工具的版本,而 server version 才是 Kubernetes 的版本。

查看更詳細的版本信息:

$ kubectl cluster-infoKubernetes master is running at https://172.17.0.77:8443To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

集群所在主機的 ip 為 172.17.0.77。

注意:這裡的 master 指的是 Kubernetes 集群的 master 節點(在 Kubernetes 集群中,節點分為兩類,一類是 master 節點,一類是 node 節點)。那怎麼看到 node 節點呢?

$ kubectl get nodeNAME STATUS ROLES AGE VERSIONhost01 Ready 20m v1.9.0

host01 就是 node 節點,在當前環境中,實際上只有一臺主機。這臺主機既作為 master 節點,也作為 node 節點。

部署應用

下面以部署一個 nginx 為例來演示部署應用的過程:

$ kubectl run first-app --image=nginx --port=80deployment "first-app" created

通過 run 命令創建一個名為 first-app 的 deployment,使用的是 docker hub 上最新的 nginx 鏡像,並指定了應用埠為 80。deployment 是幹嘛的呢?別急,往下看:

查看當前的 deployment:

$ kubectl get deploymentNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEfirst-app 1 1 1 1 1m

查看當前的 pod:

$ kubectl get podNAME READY STATUS RESTARTS AGEfirst-app-6db44b474-dbbtp 1/1 Running 0 4m

查看更詳細的 pod 內容:

$ kubectl describe pod first-app-6db44b474-dbbtpName: first-app-6db44b474-dbbtpNamespace: defaultNode: host01/172.17.0.77Start Time: Fri, 02 Mar 2018 06:48:02 0000Labels: pod-template-hash=286006030 run=first-appAnnotations: Status: RunningIP: 172.18.0.4Controlled By: ReplicaSet/first-app-6db44b474Containers: first-app: Container ID: docker://54eacc7ff536d7181fa366883f7ed4cf632492ad6ed391207fea436d22d219a9 Image: nginx Image ID: docker-pullable://nginx@sha256:4771d09578c7c6a65299e110b3ee1c0a2592f5ea2618d23e4ffe7a4cab1ce5de Port: 80/TCP State: Running Started: Fri, 02 Mar 2018 06:48:14 0000 Ready: True Restart Count: 0 Environment: Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-zkqw6 (ro)Conditions: Type Status Initialized True Ready True PodScheduled TrueVolumes: default-token-zkqw6: Type: Secret (a volume populated by a Secret) SecretName: default-token-zkqw6 Optional: falseQoS Class: BestEffortNode-Selectors: Tolerations: Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 7m default-scheduler Successfully assigned first-app-6db44b474-dbbtp to host01 Normal SuccessfulMountVolume 7m kubelet, host01 MountVolume.SetUp succeeded for volume "default-token-zkqw6" Normal Pulling 7m kubelet, host01 pulling image "nginx" Normal Pulled 7m kubelet, host01 Successfully pulled image "nginx" Normal Created 7m kubelet, host01 Created container Normal Started 7m kubelet, host01 Started container

對外發布服務

已經部署好了一個 nginx 應用,那麼要怎麼去訪問呢?這時候就需要用到 service。創建一個 service:

$ kubectl expose deployment/first-app --port=80service "first-app" exposed

查看創建好的名為 first-app 的 service :

$ kubectl get svc first-appNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEfirst-app NodePort 10.102.0.12 80:30491/TCP 1m

在 PORT(S) 一欄中,除了 80 埠,後面還有一個 30491 埠。這是使用了「NodePort」類型創建 service 分配的埠,通過主機 ip 和這個埠,就可以訪問到這個 service 了。可以使用 curl 工具進行訪問:

$ curl 172.17.0.77:30491Welcome to nginx! body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; }Welcome to nginx!If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.For online documentation and support please refer tonginx.org.Commercial support is available atnginx.com.Thank you for using nginx.

擴縮應用

剛剛已經成功訪問到 nginx 應用,但有些時候,可能需要多個 nginx 來橫向擴展,那麼在 Kubernetes 中怎麼實現呢?

$ kubectl scale deployment/first-app --replicas=3deployment "first-app" scaled

再查看當前的 pod,可以看到當前已經有了 3 個 first-app 了。

$ kubectl get podNAME READY STATUS RESTARTS AGEfirst-app-6db44b474-6vlrj 1/1 Running 0 39sfirst-app-6db44b474-dbbtp 1/1 Running 0 19mfirst-app-6db44b474-gjzgg 1/1 Running 0 39s

如果覺得 3 個太浪費資源了,想減少 pod 的數量,那麼可以使用同樣的命令,把 replicas 參數的值改為需要的值就可以了。

更新應用

最常用的就是更新鏡像。之前使用的是 docker hub 上最新的 nginx,現在用 1.10.3 這個比較老的版本來替代最新版本。先查看當前使用的 nginx 版本。這裡有一個很簡單的方法,訪問一個不存在的頁面,如下:

$ curl 172.17.0.77:30491/abc404 Not Found404 Not Foundnginx/1.13.9

當前使用的 nginx 版本是 1.13.9,接下來進行更新操作:

$ kubectl set image deployment/first-app first-app=nginx:1.10deployment "first-app" image updated

再查看當前 nginx 的版本:

$ curl 172.17.0.77:30491/abc404 Not Found404 Not Foundnginx/1.10.3

nginx 版本已經成功更新為 1.10.3。

刪除應用

最後來講講刪除應用,之前是通過 deployment 來創建應用,所以只需要刪除 deployment 就可以刪除對應的應用了。

$ kubectl delete deployment/first-appdeployment "first-app" deleted

再查看一下當前的 pod:

$ kubectl get podNo resources found.

所有的 pod 都已經刪除了。

點分享

,
同类文章
葬禮的夢想

葬禮的夢想

夢見葬禮,我得到了這個夢想,五個要素的五個要素,水火只好,主要名字在外面,職業生涯良好,一切都應該對待他人治療誠意,由於小,吉利的冬天夢想,秋天的夢是不吉利的
找到手機是什麼意思?

找到手機是什麼意思?

找到手機是什麼意思?五次選舉的五個要素是兩名士兵的跡象。與他溝通很好。這是非常財富,它擅長運作,職業是仙人的標誌。單身男人有這個夢想,主要生活可以有人幫忙
我不怎麼想?

我不怎麼想?

我做了什麼意味著看到米飯烹飪?我得到了這個夢想,五線的主要土壤,但是Tu Ke水是錢的跡象,職業生涯更加真誠。他真誠地誠實。這是豐富的,這是夏瑞的巨星
夢想你的意思是什麼?

夢想你的意思是什麼?

你是什​​麼意思夢想的夢想?夢想,主要木材的五個要素,水的跡象,主營業務,主營業務,案子應該抓住魅力,不能疏忽,春天夢想的吉利夢想夏天的夢想不幸。詢問學者夢想
拯救夢想

拯救夢想

拯救夢想什麼意思?你夢想著拯救人嗎?拯救人們的夢想有一個現實,也有夢想的主觀想像力,請參閱週宮官方網站拯救人民夢想的詳細解釋。夢想著敵人被拯救出來
2022愛方向和生日是在[質量個性]中

2022愛方向和生日是在[質量個性]中

[救生員]有人說,在出生88天之前,胎兒已經知道哪天的出生,如何有優質的個性,將走在什麼樣的愛情之旅,將與生活生活有什么生活。今天
夢想切割剪裁

夢想切割剪裁

夢想切割剪裁什麼意思?你夢想切你的手是好的嗎?夢想切割手工切割手有一個真正的影響和反應,也有夢想的主觀想像力。請參閱官方網站夢想的細節,以削減手
夢想著親人死了

夢想著親人死了

夢想著親人死了什麼意思?你夢想夢想你的親人死嗎?夢想有一個現實的影響和反應,還有夢想的主觀想像力,請參閱夢想世界夢想死亡的親屬的詳細解釋
夢想搶劫

夢想搶劫

夢想搶劫什麼意思?你夢想搶劫嗎?夢想著搶劫有一個現實的影響和反應,也有夢想的主觀想像力,請參閱週恭吉夢官方網站的詳細解釋。夢想搶劫
夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂什麼意思?你夢想缺乏異常藥物嗎?夢想缺乏現實世界的影響和現實,還有夢想的主觀想像,請看官方網站的夢想組織缺乏異常藥物。我覺得有些東西缺失了