文章目錄
- 第一章 k8s 介紹
- 應用部署方式的演變
- K8s 簡介
- k8s 組件
- k8s 中的一些概念
- k8s 安裝
- k8s 集群介紹
- k8s 安裝方式
- k8s 部署應用
- k8s 資源管理
- 資源管理介紹
- 資源管理方式
- 命令式物件管理
- k8s 中的資源型別
- 命令式物件配置
- 宣告式物件配置
- k8s 實戰入門
- Namespace
- Pod
- K8s 官網互動環境應用指南
- K8s 基礎模塊
第一章 k8s 介紹
應用部署方式的演變
傳統部署: app 直接在作業系統之上進行部署,
虛擬化部署: 一臺物理機上虛擬化多個虛擬機, 每個虛擬機都是獨立的環境,
容器化部署: 與虛擬化相似,但共享了作業系統,

虛擬化部署,與容器化部署程式直接相互隔離,但是虛擬化每個隔離之間都需要作業系統,比較消耗系統的資源,
容器化部署可以跨云服務商,跨linux 作業系統進行發布,且每個容器擁有自己的檔案系統,cpu,記憶體,行程空間,app 所需要的資源由容器來提供,
容器存在的問題:
1 一個容器故障宕機了,如何讓另外一個容器去替補停機的容器,
2 當并發量增大的時候,如何去橫向擴展容器的數量,
容器管理的問題可以統稱為容器的編排問題,k8s: google開源的容器編排工具,
SWarm : docker 自己的編排工具,
K8s 簡介
k8s 的本質是一組服務器集群,在集群的每一個節點上運行特定的程式,對節點中的容器進行管理,目的是實作資源管理的自動化,
k8s 組件
一個k8s 集群是由控制節點(master)和 作業節點(node ),每個節點上都會安裝不同的組件,

舉例說明,向ApiServer 發送請求,請求運行一個nginx,則通過Scheduler 進行計算,Controller-manager進行調度,假設nginx 服務運行在pod 節點上了,Etecd 記錄nginx 服務相關元資料,
一旦k8s環境啟動之后,master 和node 都會將自身的資訊存盤到etcd 資料庫中
Node 節點正真干活的(作業負載節點,node 節點上的docker 負責容器的運行), kubelet 接受控制節點發送過來的資訊,將資訊發送給相應的docker,來執行各種操作,
kube-proxy 客戶端訪問介面,一個nginx 服務運行了,如果要訪問nginx ,就需要kube-proxy 來對pod 產生訪問的代理,

k8s 中的一些概念
pod 是k8s 中的最小控制單元, 容器必須跑到pod 中,pod 中至少要有一個容器 k8s 是通過控制pod,然后再去控制容器的,
Controller: k8s 中有各種型別的 Controller,
Label 標簽: 用于對pod 進行分類,同一類pod 會擁有相同的標簽,
Service: pod 對外服務的統一入口
NameSpace: 命名空間,用來隔離pod 的運行環境,Docker 也使用namspce 來隔離環境
k8s 安裝
如果無法啟動多個集群,建議使用官網的互動式環境,
k8s 集群介紹
k8s 集群一般分為兩類,一主多從,和多主多從,
一主多從: 一個Master 節點,多個Node 節點,但存在單點故障等問題,常用于測驗環境,
多主多從: 多個Mater節點,多個Node節點,搭建麻煩,但是安全性高,常用于生產環境,

k8s 安裝方式
k8s 有多種部署方式,目前比較主流的方式有: kubeadm ,Minkube 二進制包
官網采用的是Minikube 部署方式

Minbikube: 用于快速搭建單節點的k8s 集群工具,
kubeadm: 一個用于快速搭建k8s集群工具,
二進制包: 從官網下載每個組件的二進制包,依次去安裝,此方式對理解k8的組件更為有效,但操作起來比較麻煩,
Minikube 進行部署集群:
這里使用Minikube 進行部署集群,
下載minikube之后,輸入下面命令,
1 minikube version
2 minikube start 啟動k8s 集群
3 kubectl version
4 kubectl cluster-info
5 kubectl get nodes
kubeadm 安裝 k8s 集群:
1 查看作業系統的版本,使用kubeadm 安裝k8s集群,要求centos 的版本要在7.5 及以上,
? cat /etc/redhat-release
2 主機名決議
? 編輯三套服務器的 /etc/hosts 檔案,添加服務器對應的ip地址和 主機名
3 時間同步
k8s 要求節點的時間要精確一致,這里使用chronyd 服務從網路中同步時間,
? 3.1 啟動 chronyd 服務命令 : systemctl start chronyd
? 3.2 設定chronyd 服務開機自啟動 : systemctl enable chronyd
4 禁用iptables 和firewalld 服務(生產環境才能做)(k8s 和docker 在運行中會產生大量iptables 規則,為了不跟系統的iptables 進行混淆,直接關閉系統的iptables)
? systemctl stop firewalld
? systemctl disable firewalld
? systemctl stop iptables
? systemctl disable iptables
?
k8s 部署應用
1 kubectl get nodes 獲取節點資訊(當前只有一個節點)

2 kubectl create deployment 命令部署k8s 應用
kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
該命令部署的是 kubernetes-bootcamp應用,We need to provide the deployment name and app image location (include the full repository url for images hosted outside Docker hub).
3 kubectl get deployments 查看部署的應用

在單節點上的一個應用,
4 查看應用
Pods that are running inside Kubernetes are running on a private, isolated network.By default they are visible from other pods and services within the same kubernetes cluster, but not outside that network.
翻譯: Kubernetes內部運行的pod運行在一個專用的隔離網路上,默認情況下,它們可以從同一Kubernetes集群內的其他pod和 service 中看到,但不能從該網路外部看到,
Thekubectlcommand can create a proxy that will forward communications into the cluster-wide, private network. The proxy can be terminated by pressing control-C and won't show any output while its running.
4.1 `“kubectl”命令可以創建一個代理,將通信轉發到集群范圍的專用網路,可以通過按control-C終止代理,并且在代理運行時不會顯示任何輸出,下面命令來生成一個代理,
echo -e “\n\n\n\e[92mStarting Proxy. After starting it will not output a response. Please click the first Terminal Tab\n”; kubectl proxy
4.2 通過代理我們的主機與k8s 集群產生了聯系,代理的節點提供了一些api 可以通過下面命令看到,
curl http://localhost:8001/version

- 3暴露介面
默認情況下,所有 Pod 只能在集群內部訪問,因此要想在外部訪問的話,需要做一個映射,
把容器的8080埠映射到節點的埠
kubectl expose deployment/kubernetes-bootcamp \
–type=“NodePort” \
–port 8080
NodePort 的意思是可以集群外部的網路進行訪問,
4.4 查看服務的狀態 命令 :kubectl get pods service
k8s 資源管理
資源管理介紹
在k8s 中,所有內容都抽象為資源,用戶需要通過操作資源來管理k8s,
k8s本質就是一個集群系統,用戶可以在集群中部署各種服務,所謂部署服務就是在k8s 集群中運行一個個容器,并將指定的程式跑到容器中,
k8s 中最小的管理單位是pod 而不是容器,所以只能將容器放到pod 中,但是k8s一般不直接管理pod,而是通過
pod 管理器 (Controller)來管理pod 的,Pod 可以提供服務之后,就要考慮如何訪問Pod 中的服務,K8s 提供了Service 資源實作了這個功能,
當然,pod中的程式的資料需要持久化,K8s 還提供了各種存盤系統,

學習K8s的核心 就是學習如何對集群上的Pod,Pod控制器,Service,存盤等各種資源進行操作,
資源管理方式
1 命令式物件管理: 直接使用命令去操作k8s 的各種資源

2 命令式物件配置:通過命令配置和組態檔去操作k8s 資源,

3 宣告式物件配置: 通過apply 命令和組態檔去操作k8s 資源,

apply 命令有資源就更新,沒有就創建,
比較:

命令式物件管理
kubectl 命令
? kubectl 命令是 k8s 集群的命令列工具,可以通過它對集群本身進行管理,并且能在集群上進行容器化應用的安裝部署, kubectl 在 $HOME/.kube 目錄中查找一個名為 config 的組態檔,kubectll 命令語法如下:

command 指對資源執行的操作 如 create get delet
type 指資源的型別,比如 deployment,pod,service
name 指資源的名稱,注意名稱大小寫敏感,
flags 指定額外的可選引數,
常見命令
kubectl get pod # 查看所有的pod
kubectl get pod pod_name 查看某個pod
kubectl get pod pod_name -o yaml 查看某個pod,以yaml的格式進行展示
kubectl --help 查看kubectl 的所有命令


k8s 中的資源型別
k8s 中所有的內容都抽象為資源,可以通過下面命令查看k8s 中的各種資源型別,
kubectl api-resources

常用的資源有一下內容:
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ZRbgv3jD-1636892471039)(D:\java workstation\筆記\浪潮\images\image-20211113213547905.png)]](https://img.uj5u.com/2021/11/15/2846381517515732.png)

kubectl describe pods 命令運行結果
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-fsn5ABkX-1636892471054)(D:\java workstation\筆記\浪潮\images\image-20211113215426816.png)]](https://img.uj5u.com/2021/11/15/2846381517515734.png)
命令式物件配置
命令式物件配置就是使用命令配合組態檔一起來操作k8s 資源,
ymal 檔案宣告要操作資源的具體資訊, 比如說創建pod 的時候,要宣告創建pod 容器鏡像版本,所要預留的一些埠,
1 創建一個nginxpod.xml ,內容如下:

解釋: 上面的是namespace 宣告,kind 對應資源型別,metadata 元資料,只給了name 為dev, 創建一個名為dev 的namespace, 下面Pod的創建使用了這個namespace, spec 詳情描述, containers 對應相應的容器細節,name 為容器名設定的是nginx-container,image 為對應的鏡像名使用的是nginx:1.17.1 版本,
2 執行create 命令 ,創建資源
kubectl create -f nginxpod.xml
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-PvylhX9u-1636892471061)(D:\java workstation\筆記\浪潮\images\image-20211113214445809.png)]](https://img.uj5u.com/2021/11/15/284638151751579.png)
此時創建了兩個資源,分別是namespace 和pod, 顯示格式為 資源型別/資源名稱
洗掉 kubectl delete -f nginxpod.xml
宣告式物件配置
宣告式物件配置和命令式物件配置很類似,但是它只需要一個apply 命令,
k8s 實戰入門
Namespace
Namespace 是k8s 中非常重要的一種資源,它的主要作用是用來實作多套環境的資源隔離或多租戶的資源隔離,
默認情況下,K8s 集群中所有的pod 都可以互相訪問,但是在實際中,可能不想讓兩個pod 之間相互訪問,這個時候就需要將這兩個pod 劃分到不同的namespace 之下,K8s 通過將集群內部的資源分配到不同的Namespace中,可以形成邏輯上的“組”, 以方便不同組的資源進行隔離使用和管理,
可以根據K8s 授權機制,將不同的namespace 交給不同的租戶進行管理,這樣就實作了多租戶的資源隔離,此時還可以結合K8s 的資源配額機制,限定不同的租戶能占用的資源,如cpu 使用量, 記憶體使用量等等, 來實作租戶可用資源的管理,

K8s 集群啟動之后,會默認創建幾個namespace ,
使用命令式物件管理 查看:
kubectl get namespace
運行結果:
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-oooHPdQh-1636892471069)(D:\java workstation\筆記\浪潮\images\image-20211114182734278.png)]](https://img.uj5u.com/2021/11/15/2846381517515710.png)
default 指的是未指定namespace 的物件都會被分配在default 命名空間
kube-node-lease 集群節點之間的心跳維護,v1.13 開始引入
kube-public 此命名空間下的資源可以被所有人訪問(包括未認證用戶)
kube-system 所有由k8s系統創建的資源都處于這個命名空間
獲得指定名稱空間下的所有pods
kubectl get pods -n kube-system

這些pods 都是集群組件,
**對Namespace資源的具體操作 **:
? 1 命令列操作
1.1 查詢
kubectl get ns
注意 :ns(namespace 的簡寫)

STATUS 為狀態, Active 表示為此名稱空間正在使用, AGE 表示該名稱空間已經作業的時間,
1.2 查看具體名稱空間的描述
kubectl describe ns default
該命令查看的是 default 命名空間的描述
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-uMrQ3ml4-1636892471081)(D:\java workstation\筆記\浪潮\images\image-20211114184802788.png)]](https://img.uj5u.com/2021/11/15/2846381517515713.png)
Name : 名稱空間的名字
Label 名稱空間的標簽,
Annotations 名稱空間的注釋
Status 名稱空間的狀態 Active 表示此名稱空間正在使用, Terminating 表示正在洗掉名稱空間 (洗掉名稱空間的話,其下的pods 也會被洗掉,洗掉pods 需要時間,)
ResourceQuota 針對namespace 做的資源配額, No resource quota 沒有限制
LimitRange 針對namespace 中的每個組件做的資源配額, No LimitRange resource 表示沒有限制,
1.3 名稱空間的創建
kubectl create ns dev

1.4 名稱空間的洗掉
洗掉dev 名稱空間
kubectl delete ns dev
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-txj54I5W-1636892471091)(D:\java workstation\筆記\浪潮\images\image-20211114190127702.png)]](https://img.uj5u.com/2021/11/15/2846381517515715.png)
2 配置的形式創建與洗掉
準備一個ns-dev.yaml 檔案
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-sX3OQPKc-1636892471095)(D:\java workstation\筆記\浪潮\images\image-20211114190330751.png)]](https://img.uj5u.com/2021/11/15/2846381517515716.png)
apiVersion 對應版本,Kind 對應要操作資源的型別 metadata 相關元資料
執行對應的創建與洗掉命令即可
創建 kubectl create -f ns-dev.yaml
洗掉 kubectl delete -f ns-dev.yaml
Pod
Pod 是 Kubernetes 抽象出來的,表示一組一個或多個應用程式容器(如 Docker),以及這些容器的一些共享資源,這些資源包括:
- 共享存盤,當作卷
- 網路,作為唯一的集群 IP 地址
- 有關每個容器如何運行的資訊,例如容器映像版本或要使用的特定埠,
Pod 可以認為是容器的封裝,一個Pod 可以存在一個或多個容器,
?
1 查看集群組件pod
K8s 集群啟動之后,集群中各個組件都是以Pod 的形式運行,可以通過下面命令查看
kubectl get pods -n kube-system

kube-apiserver-minikube : ApiServer 組件
還有一些組件, ControllerManager 組件, Scheduler 組件,etcd 組件,proxy 組件 這些在第一章中的k8s 組件中進行了介紹,
coredns 是用來做DNS 的,
2 命令列操作
? 2.1 創建并運行Pod
? k8s并沒有提供單獨運行pod 的命令,都是通過Pod 控制器來實作的,
? 命令格式: kubectl run (pod 控制器名稱) [引數]
> 引數介紹
>
> --image 指定pod 的鏡像
>
> --port 指定埠
>
> --namespace 指定名稱空間
kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=80
2.2 查看pod 是否運行
kubectl get pod

NAME : pod 的名稱
READY : 當前pod 有幾個容器,容器里面有幾個正在運行的,(計算不會將根容器計算在內)
RESTARTS: 重啟次數, 在pod運行程序中如果出現問題會嘗試重啟,
查看更多詳細資訊可以加上 -o wide 引數
kubectl get pod -o wide

多出來的資訊包括:
IP: 當前pod 的ip
Node: 當前pod 被調度到哪個結點上運行
查看描述資訊
kubectl describe pod kubernetes-bootcamp
運行結果


還有很多詳細資訊,這里不進行顯示,
kubectl describe 命令十分重要, 當pod 出現錯誤的時候,可以使用該命令查看錯誤的具體細節
2.3 洗掉pod
Pod 是由pod 控制器來進行創建的,控制器會監控Pod 的狀態,一旦發現Pod 死亡,會立即重啟,所以想要洗掉Pod,必須要洗掉Pod 控制器
查詢當前命名空間(當前為default)的Pod 控制器
kubectl get deploy
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-QT5W10jS-1636892471117)(D:\java workstation\筆記\浪潮\images\image-20211114200300357.png)]](https://img.uj5u.com/2021/11/15/2846381517515721.png)
洗掉此Pod 控制器
kubectl delete deploy kubernetes-bootcamp
只要洗掉Pod 控制器, 對應的Pod 也會被洗掉,
3 組態檔操作
注意使用命令列運行無法啟動單獨的Pod,但是使用 yaml 可以創建一個pod, 如下是使用yaml檔案啟動一個nginx pod
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-sBTiiyoz-1636892471119)(D:\java workstation\筆記\浪潮\images\image-20211114201549799.png)]](https://img.uj5u.com/2021/11/15/2846381517515738.png)
注意這里的name 名 為pod 對應的name ,不是pod 控制器,
K8s 官網互動環境應用指南
互動式環境網址: https://kubernetes.io/zh/docs/tutorials/kubernetes-basics/
K8 官網互動式應用可以學習到
- 在集群上部署容器化應用程式
- 彈性部署
- 使用新的軟體版本,更新容器化應用程式
- 除錯容器化應用程式
K8s 能做什么:
現代的Web 服務,用戶希望應用程式能夠 24/7 全天候使用,開發人員希望每天可以多次發布部署新版本的應用程式, 容器化可以幫助軟體包達成這些目標,使應用程式能夠以簡單快速的方式發布和更新,而無需停機,Kubernetes 幫助您確保這些容器化的應用程式在您想要的時間和地點運行,并幫助應用程式找到它們需要的資源和工具,Kubernetes 是一個可用于生產的開源平臺,根據 Google 容器集群方面積累的經驗,以及來自社區的最佳實踐而設計,
K8s 基礎模塊

處理生產級別流量的K8s 集群至少具備三個Node
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/357276.html
標籤:其他

