【雲原生 | Kubernetes篇】Kubernetes基礎入門

文章目錄

Kubernetes基礎入門

一、基礎知識

二、部署一個應用

三、應用程序探索

1、瞭解Pod

2、瞭解Node

3、故障排除

4、kubectl run

四、應用外部可見

1、Kubernetes Service 總覽

2、Service 和 Label

3、kubectl expose

五、伸縮應用程序-擴縮容

六、執行滾動升級

七、使用配置文件方式

1、部署一個應用

2、暴露應用

3、擴縮容

4、滾動升級


Kubernetes基礎入門 一、基礎知識

以上展示瞭一個master(主節點)和6個worker(工作節點)的k8s集群

# docker run  --name hello-pod alpine  是跑一個容器,容器的粒度有點小kubectl run  hello-pod --image=alpine #跑一個Pod。Pod裡面其實也是容器 kubectl get pod  #以前的docker ps -a## 所有kubectl在master節點運行,把命令請求發給api-server。api-server一系列處理##  master隻負責調度,而worker node才是真正部署應用的。

docker是每一個worker節點的運行時環境

kubelet負責控制所有容器的啟動停止,保證節點工作正常,已經幫助節點交互master

master節點的關鍵組件:

  • kubelet(監工):所有節點必備的,控制這個節點所有pod的生命周期以及與api-server交互等工作

  • kube-api-server:負責接收所有請求,集群內對集群的任何修改都是通過命令行、ui把請求發給api-server才能執行的。api-server是整個集群操作對內、對外的唯一入口。不包含我們後來部署應用暴露端口的方式

  • kube-proxy:整個節點的網絡流量負責

  • cri:都有容器運行時環境

worker節點:

  • kubelet(監工):所有節點必備的,控制這個節點所有pod的生命周期以及與api-server交互等工作

  • kube-proxy:整個節點的網絡流量負責

  • cri:都有容器運行時環境

 

二、部署一個應用

創建一次部署工作(自愈機制)

  • kubectl create deploy xxxxxx :命令行會給api-server發送要部署xxx的請求

  • api-server把這個請求保存到etcd

# kubectl create 幫我們創建k8s集群中的一些對象kubectl create --helpkubectl create deployment 這次部署的名字 --image=應用的鏡像#Create a deployment named  my-nginx that runs the nginx imagekubectl create deployment my-nginx --image=nginx##最終在一個機器上有pod、這個pod其實本質裡面就是一個容器k8s_nginx_my-nginx-6b74b79f57-snlr4_default_dbeac79e-1ce9-42c9-bc59-c8ca0412674b_0### k8s_鏡像(nginx)_pod名(my-nginx-6b74b79f57-snlr4)_容器名(default_dbeac79e-1ce9-42c9-bc59-c8ca0412674b_0)# Create a deployment with commandkubectl create deployment my-nginx --image=nginx -- date# Create a deployment named my-nginx that runs the nginx image with 3 replicas.kubectl create deployment my-nginx --image=nginx --replicas=3# Create a deployment named my-nginx that runs the nginx image and expose port 80.kubectl create deployment my-nginx --image=nginx --port=80

Deployment(部署)

  • 在k8s中,通過發佈 Deployment,可以創建應用程序 (docker image) 的實例 (docker container),這個實例會被包含在稱為 Pod 的概念中,Pod 是 k8s 中最小可管理單元。

  • 在 k8s 集群中發佈 Deployment 後,Deployment 將指示 k8s 如何創建和更新應用程序的實例,master 節點將應用程序實例調度到集群中的具體的節點上。

  • 創建應用程序實例後,Kubernetes Deployment Controller 會持續監控這些實例。如果運行實例的 worker 節點關機或被刪除,則 Kubernetes Deployment Controller 將在群集中資源最優的另一個 worker 節點上重新創建一個新的實例。這提供瞭一種自我修復機制來解決機器故障或維護問題。

  • 在容器編排之前的時代,各種安裝腳本通常用於啟動應用程序,但是不能夠使應用程序從機器故障中恢復。通過創建應用程序實例並確保它們在集群節點中的運行實例個數,Kubernetes Deployment 提供瞭一種完全不同的方式來管理應用程序。

  • Deployment 處於 master 節點上,通過發佈 Deployment,master 節點會選擇合適的 worker 節點創建 Container(即圖中的正方體),Container 會被包含在 Pod (即藍色圓圈)裡。

自愈:針對使用Deployment等部署的應用。

kubectl run :直接啟動一個pod; 不會產生一次部署信息。所以刪除就沒

kubectl create deploy: 啟動一個Pod,以及記錄這次部署信息。所以,這個pod即使掛瞭,這次部署信息有,就會強制同步到這次部署信息期望的最終結果;kubectl get deploy,pod 都有內容

三、應用程序探索

  • 瞭解Kubernetes Pods(容器組)

  • 瞭解Kubernetes Nodes(節點)

  • 排查故障

創建 Deployment 後,k8s創建瞭一個 Pod(容器組) 來放置應用程序實例(container 容器)。

1、瞭解Pod

Pod (容器組) 是一個k8s中一個抽象的概念,用於存放一組 container(可包含一個或多個 container 容器,即圖上正方體),以及這些 container (容器)的一些共享資源。這些資源包括:

  • 共享存儲,稱為卷(Volumes),即圖上紫色圓柱

  • 網絡,每個 Pod(容器組)在集群中有個唯一的 IP,pod(容器組)中的 container(容器)共享該IP地址

  • container(容器)的基本信息,例如容器的鏡像版本,對外暴露的端口等

Pod(容器組)是 k8s 集群上的最基本的單元。當我們在 k8s 上創建 Deployment 時,會在集群上創建包含容器的 Pod (而不是直接創建容器)。每個Pod都與運行它的 worker 節點(Node)綁定,並保持在那裡直到終止或被刪除。如果節點(Node)發生故障,則會在群集中的其他可用節點(Node)上運行相同的 Pod(從同樣的鏡像創建 Container,使用同樣的配置,IP 地址不同,Pod 名字不同)。

TIP

重要:

  • Pod 是一組容器(可包含一個或多個應用程序容器),以及共享存儲(卷 Volumes)、IP 地址和有關如何運行容器的信息。

  • 如果多個容器緊密耦合並且需要共享磁盤等資源,則他們應該被部署在同一個Pod(容器組)中。

2、瞭解Node

Pod(容器組)總是在 Node(節點) 上運行。Node(節點)是 kubernetes 集群中的計算機,可以是虛擬機或物理機。每個 Node(節點)都由 master 管理。一個 Node(節點)可以有多個Pod(容器組),kubernetes master 會根據每個 Node(節點)上可用資源的情況,自動調度 Pod(容器組)到最佳的 Node(節點)上。

每個 Kubernetes Node(節點)至少運行:

  • Kubelet,負責 master 節點和 worker 節點之間通信的進程;管理 Pod(容器組)和 Pod(容器組)內運行的 Container(容器)。

  • kube-proxy,負責進行流量轉發

  • 容器運行環境(如Docker)負責下載鏡像、創建和運行容器等。

Kubelet啟動的Pod每個都有Ip,全集群任意位置均可訪問 

kubeadm init \--apiserver-advertise-address=10.170.11.8 \--image-repository registry.cn-hangzhou.aliyuncs.com/lanson_k8s_images \--kubernetes-version v1.21.0 \--service-cidr=10.96.0.0/16 \--pod-network-cidr=192.168.0.0/16--pod-network-cidr=192.168.0.0/16:pod 的ip范圍

calico:網絡組件:
【扁平化網絡】

 

3、故障排除

kubectl get – 顯示資源列表

# kubectl get 資源類型#獲取類型為Deployment的資源列表kubectl get deployments#獲取類型為Pod的資源列表kubectl get pods#獲取類型為Node的資源列表kubectl get nodes
# 查看所有名稱空間的 Deploymentkubectl get deployments -Akubectl get deployments --all-namespaces# 查看 kube-system 名稱空間的 Deploymentkubectl get deployments -n kube-system
#####並不是所有的對象都在名稱空間中# 在名稱空間裡kubectl api-resources --namespaced=true# 不在名稱空間裡kubectl api-resources --namespaced=false

 kubectl describe – 顯示有關資源的詳細信息

# kubectl describe 資源類型 資源名稱#查看名稱為nginx-XXXXXX的Pod的信息kubectl describe pod nginx-XXXXXX#查看名稱為nginx的Deployment的信息kubectl describe deployment my-nginx

kubectl logs – 查看pod中的容器的打印日志(和命令docker logs 類似)

# kubectl logs Pod名稱#查看名稱為nginx-pod-XXXXXXX的Pod內的容器打印的日志#本案例中的 nginx-pod 沒有輸出日志,所以您看到的結果是空的kubectl logs -f nginx-pod-XXXXXXX

kubectl exec – 在pod中的容器環境內執行命令(和命令docker exec 類似)

# kubectl exec Pod名稱 操作命令# 在名稱為nginx-pod-xxxxxx的Pod中運行bashkubectl exec -it nginx-pod-xxxxxx /bin/bash### 註意:新版1.21.0 提示這個命令會過期

4、kubectl run

也可以獨立跑一個Pod

## kubectl run --helpkubectl run nginx --image=nginx

總結:

kubectl create 資源  #創建任意資源kubectl create deploy #創建部署kubectl run #隻創建一個Podkubectl get 資源名(node/pod/deploy) -n xxx(指定名稱空間,默認是default) #獲取資源kubectl describe  資源名(node/pod/deploy)  xxx #描述某個資源的詳細信息kubectl logs 資源名 ##查看日志kubectl exec -it pod名 -- 命令  #進pod並執行命令kubectl delete 資源名(node/pod/deploy) xxx  #刪除資源

四、應用外部可見

  • 瞭解 Kubernetes 中的 Service

  • 瞭解 標簽(Label) 和 標簽選擇器(Label Selector) 對象如何與 Service 關聯

  • 在 Kubernetes 集群外用 Service 暴露應用

1、Kubernetes Service 總覽

  • Kubernetes Pod 是轉瞬即逝的。

  • Pod 實際上擁有生命周期 。 當一個工作 Node 掛掉後, 在 Node 上運行的 Pod 也會消亡。

  • ReplicaSet會自動地通過創建新的 Pod 驅動集群回到目標狀態,以保證應用程序正常運行。

  • Kubernetes 的 Service 是一個抽象層,它定義瞭一組 Pod 的邏輯集,並為這些 Pod 支持外部流量暴露、負載平衡和服務發現。

    • Service 使從屬 Pod 之間的松耦合成為可能。 和其他 Kubernetes 對象一樣, Service 用 YAML 或者 JSON 來定義. Service 下的一組 Pod 通常由 LabelSelector (請參閱下面的說明為什麼您可能想要一個 spec 中不包含selector的服務)來標記。

    • 盡管每個 Pod 都有一個唯一的 IP 地址,但是如果沒有 Service ,這些 IP 不會暴露在群集外部。Service 允許您的應用程序接收流量。Service 也可以用在 ServiceSpec 標記type的方式暴露

      • ClusterIP (默認) – 在集群的內部 IP 上公開 Service 。這種類型使得 Service 隻能從集群內訪問。

      • NodePort – 使用 NAT 在集群中每個選定 Node 的相同端口上公開 Service 。使用: 從集群外部訪問 Service。是 ClusterIP 的超集。

      • LoadBalancer – 在當前雲中創建一個外部負載均衡器(如果支持的話),並為 Service 分配一個固定的外部IP。是 NodePort 的超集。

      • ExternalName – 通過返回帶有該名稱的 CNAME 記錄,使用任意名稱(由 spec 中的externalName指定)公開 Service。不使用代理。這種類型需要kube-dns的v1.7或更高版本。

2、Service 和 Label

Service 通過一組 Pod 路由通信。Service 是一種抽象,它允許 Pod 死亡並在 Kubernetes 中復制,而不會影響應用程序。在依賴的 Pod (如應用程序中的前端和後端組件)之間進行發現和路由是由Kubernetes Service 處理的。

Service 匹配一組 Pod 是使用標簽(Label)和選擇器(Selector),它們是允許對 Kubernetes 中的對象進行邏輯操作的一種分組原語。標簽(Label)是附加在對象上的鍵/值對,可以以多種方式使用:

  • 指定用於開發,測試和生產的對象

  • 嵌入版本標簽

  • 使用 Label 將對象進行分類

3、kubectl expose

 kubectl expose deployment tomcat6 --port=8912 --target-port=8080 --type=NodePort  ## --port:集群內訪問service的端口 8912 ## --target-port: pod容器的端口 8080 ## --nodePort: 每個機器開發的端口 30403   ## 進行驗證 kubectl get svc  curl ip:port  kubectl expose  #暴露,成一個負載均衡網絡 ## kubectl exec 進去pod修改,並測試負載均衡

 

五、伸縮應用程序-擴縮容

  • 用 kubectl 擴縮應用程序

  • 擴縮一個 Deployment

我們創建瞭一個Deployment ,然後通過服務提供訪問 Pod 的方式。我們發佈的 Deployment 隻創建瞭一個 Pod 來運行我們的應用程序。當流量增加時,我們需要對應用程序進行伸縮操作以滿足系統性能需求。

## 擴容的Pod會自動加入到他之前存在的Service(負載均衡網絡)kubectl scale --replicas=3  deployment tomcat6#持續觀測效果watch kubectl get pods -o wide

 

六、執行滾動升級

  • 使用 kubectl 執行滾動更新

滾動更新允許通過使用新的實例逐步更新 Pod 實例從而實現 Deployments 更新,停機時間為零。

與應用程序擴展類似,如果暴露瞭 Deployment,服務(Service)將在更新期間僅對可用的 pod 進行負載均衡。可用 Pod 是應用程序用戶可用的實例。

滾動更新允許以下操作:

  • 將應用程序從一個環境提升到另一個環境(通過容器鏡像更新)

  • 回滾到以前的版本

  • 持續集成和持續交付應用程序,無需停機

#應用升級: tomcat:alpine、tomcat:jre8-alpine# kubectl set image deployment/my-nginx2  nginx=nginx:1.9.1##聯合jenkins 形成持續集成,灰度發佈功能kubectl set image deployment.apps/tomcat6 tomcat=tomcat:jre8-alpine #可以攜帶--record參數,記錄變更##回滾升級### 查看歷史記錄kubectl rollout history deployment.apps/tomcat6kubectl rollout history deploy tomcat6### 回滾到指定版本kubectl rollout undo deployment.apps/tomcat6 --to-revision=1kubectl rollout undo deploy tomcat6 --to-revision=1

 

七、使用配置文件方式 1、部署一個應用

apiVersion: apps/v1#與k8s集群版本有關,使用 kubectl api-versions 即可查看當前集群支持的版本kind: Deployment#該配置的類型,我們使用的是 Deploymentmetadata:        #譯名為元數據,即 Deployment 的一些基本屬性和信息  name: nginx-deployment#Deployment 的名稱  labels:    #標簽,可以靈活定位一個或多個資源,其中key和value均可自定義,可以定義多組,目前不需要理解    app: nginx#為該Deployment設置key為app,value為nginx的標簽spec:        #這是關於該Deployment的描述,可以理解為你期待該Deployment在k8s中如何使用  replicas: 1#使用該Deployment創建一個應用程序實例  selector:    #標簽選擇器,與上面的標簽共同作用,目前不需要理解    matchLabels: #選擇包含標簽app:nginx的資源      app: nginx  template:    #這是選擇或創建的Pod的模板    metadata:#Pod的元數據      labels:#Pod的標簽,上面的selector即選擇包含標簽app:nginx的Pod        app: nginx    spec:    #期望Pod實現的功能(即在pod中部署)      containers:#生成container,與docker中的container是同一種      - name: nginx#container的名稱        image: nginx:1.7.9#使用鏡像nginx:1.7.9創建container,該container默認80端口可訪問
kubectl apply -f xxx.yaml

2、暴露應用

apiVersion: v1kind: Servicemetadata:  name: nginx-service#Service 的名稱  labels:     #Service 自己的標簽    app: nginx#為該 Service 設置 key 為 app,value 為 nginx 的標簽spec:    #這是關於該 Service 的定義,描述瞭 Service 如何選擇 Pod,如何被訪問  selector:    #標簽選擇器    app: nginx#選擇包含標簽 app:nginx 的 Pod  ports:  - name: nginx-port#端口的名字    protocol: TCP    #協議類型 TCP/UDP    port: 80        #集群內的其他容器組可通過 80 端口訪問 Service    nodePort: 32600   #通過任意節點的 32600 端口訪問 Service    targetPort: 80#將請求轉發到匹配 Pod 的 80 端口  type: NodePort#Serive的類型,ClusterIP/NodePort/LoaderBalancer

3、擴縮容

修改deployment.yaml 中的 replicas 屬性即可

完成後運行

kubectl apply -f xxx.yaml

4、滾動升級

修改deployment.yaml 中的 imageName 屬性等

完成後運行

kubectl apply -f xxx.yaml

以上都可以直接 kubectl edit deploy/service 等,修改完成後自動生效


  • 博客主頁:https://lansonli.blog.csdn.net
  • 歡迎點贊 收藏 ⭐留言 如有錯誤敬請指正!
  • 本文由 Lansonli 原創,首發於 CSDN博客
  • 停下休息的時候不要忘瞭別人還在奔跑,希望大傢抓緊時間學習,全力奔赴更美好的生活✨
本文來自網絡,不代表程式碼花園立場,如有侵權,請聯系管理員。https://www.codegarden.cn/article/30454/
返回顶部