文章目錄
- 一、優化命令列
- 二、kubernetes帶來的變革
- 1.對于開發人員
- 2.對于運維人員
- 3.Pod
- 1>Pod生命周期
- 2>Pod是如何管理多個容器的
- 3>Pod中資料持久性
- 4>Pod的狀態
- 5>Pod的資源清單詳解
- 6>Pod的重啟策略
- 三、名詞介紹
- 1.k8s中的名稱空間
- 2、namespace
- 3、Label標簽
- 3.k8s中常用命令
- 4.控制器
- 1)deployment(部署長期運行、無狀態應用)
- 1>彈性擴容的3種方法
- 2>更新(首先要存在低版本才可以更新)
- 3>回滾
- 2)DaemonSet(一般用來監控、收集日志)
- 3)擴展
一、優化命令列
yum install -y -completion
source /usr/share/-completion/_completion
source <(kubectl completion )
echo "source <(kubectl completion )" >> ~/.rc
二、kubernetes帶來的變革
k8s與docker的關系:
k8s是一個容器化管理平臺,docker是容器
1.對于開發人員
由于公司業務多,開發環境、測驗環境、預生產環境和生產環境都是隔離的,而且除了生產環境,為了節省成本,其他環境可能是沒有日志收集的,在沒有用 k8s 的時候,查看線下測驗的日志,需要開發或者測驗人員,找到對應的機器,在找到對應的容器,然后才能查看日志,在用了 k8s 之后,開發和測驗可以直接在 k8s 的dashboard 到對應的 namespace,即可定位到業務的容器,然后可以直接通過控制臺查看到對應的日志,大大降低了操作時間,
目前我們使用 jenkins、gitrunner 進行發版或者回滾等,從開發環境到測驗環境,到生產環境,完全遵守一次構建,多集群、多環境部署,通過不同的啟動引數、不同的環境變數、不同的組態檔實作區分不同的環境,目前已經實作 Python、Java、PHP、NodeJS、Go、.NET Core、Python等多種語言的一鍵式發版、一鍵式回滾,大大提高了開發人員的開發效率,
2.對于運維人員
如果你是一名運維人員,可能經常因為一些重復、繁瑣的作業感覺厭倦,比如:這個需要一套新的測驗環境,那個需要一套新的測驗環境,之前可能需要裝系統、裝依賴環境、開通權限等等,而如今,可以直接用鏡像直接部署一套新的測驗環境,甚至全程無需自己干預,開發人員通過 jenkins 或者自動化運維平臺即可一鍵式創建,大大降低了運維成本,
一開始,公司業務故障,可能是因為基礎環境不一致、依賴不一致、埠沖突等等問題,現在實作 Docker鏡像部署,k8s 編排,所有的依賴、基礎都是一樣的,并且環境的自動化擴容、健康檢查、容災、恢復都是全自動的,大大減少了因為這類基礎問題引發的故障,也有可能公司業務是由于服務器宕機、網路等問題,造成服務不可用,此類情況均需要運維人員及時去修復,而如今,可能在你收到告警資訊的時候,k8s 已經幫你恢復了,
在沒有使用 k8s 時,業務應用的擴容和縮容,都需要人工去處理,從采購服務器、上架、到部署依賴環境,不僅需要大量的人力物力,而且非常容易在中間程序出現問題,又要花費大量的時間去查找問題,成功上架后,還需要在前端反代端添加或該服務器,而如今,可以利用 k8s 的彈性計算,一鍵式進行擴容和縮容,不僅大大提高了運維效率,而且還節省了不少的服務器資源,提高了資源利用率,
- 對于反代配置方面,比如可能你并不會,或者對 nginx 的配置規則并不熟悉,一些高級的功能你也不會實作,而如今,利用 k8s 的 ingress 即可簡單的實作那些復雜的邏輯,并且也不會在遇到 nginx 少加一個斜杠和多加一個斜杠的問題,
- 對于負載均衡方面,之前負載均衡可能是 Nginx、LVS、HAProxy、F5 等,云上可能是云服務商提供的不在均衡機制,每次添加洗掉節點時,都需要手動去配置前端負載均衡,手動去匹配后端節點,而如今,使用 k8s內部的 service 可以動態發現實作自動管理節點,并且支持自動擴容縮容,之前遇到高峰流量時,經常服務器性能不夠,需要臨時加服務器面對高峰流量,而如今對于高性能 k8s 集群加上 serverless,基本實作無需管理,自動擴容,
- 對于高可用方面,k8s 天生的高可用功能,徹底釋放了雙手,無需再去創建各類高可用工具、檢測檢查腳本,k8s 支持行程介面級別的健康檢查,如發現介面超時或者回傳值不正確,會自動處理該問題,
- 對于中間件搭建方面,根據定義好的資源檔案,可以實作秒級搭建各類中間件高可用集群,并且支持一鍵式擴縮容,如 Redis、RabbitMQ、Zookeeper 等,并且大大減少了出錯的概率,
- 對于應用埠方面,傳統行業中,一個服務器可能跑了很多行程,每個行程都有一個埠,需要人為的去配置埠,并且還需要考慮埠沖突的問題,如果有防火墻的話,還需要配置防火墻,在 k8s 中,埠統一管理統一配置,每個應用的埠都可設定成一樣的,之后通過 service 進行負載均衡,大大降低了埠管理的復雜度和埠沖突,
3.Pod
1、k8s集群中部署的最小單元,Pod最主要的功能管理是將一個業務或者一個呼叫鏈的所有服務(容器)
2、pod是k8s中最小部署單元,用來管理一個呼叫鏈的容器,它之中的主容器(pause)為整個呼叫鏈的容器提供基礎網路,共享存盤,監控業務容器的運行狀態,
Pod是在集群中運行部署應用或服務的最小單元,他是可以支持很多容器的,Pod的設計理念是支持多個容器在一個Pod中共享網路地址和檔案系統,可以通過行程間通信和檔案共享這種簡單高效的方式組合完成服務,
比如:你運行一個作業系統發行版的軟體倉庫,一個nginx容器用來發布軟體,另一個容器專門用來從源倉庫做同步,這兩個容器的鏡像不太可能是一個團隊開發的,但是他們一塊作業才能提供一個微服務,這種情況下,不同的團隊各自開發構建自己的容器鏡像,在部署的時候組合成一個微服務對外提供服務,這就是k8s中的Pod,
# 目前k8s中業務主要可以分為長期伺服型(long-running)、批處理型(batch)、節點后臺支撐型(node-daemon)和有狀態應用型(stateful application);分別對應的小機器人控制器為Deployment、Job、DaemonSet 和 StatefulSet,
1>Pod生命周期

2>Pod是如何管理多個容器的
Pod中可以同時運行多個行程(作為容器運行)協同作業,
同一個 Pod 中的容器會自動的分配到同一個 node上,同一個 Pod 中的容器共享資源、網路環境和依賴,所以它們總是被同時調度,在一個 Pod 中同時運行多個容器是一種比較高級的用法,只有當你的容器需要緊密配合協作的時候才考慮用這種模式,
3>Pod中資料持久性
Pod 在設計?持就不是作為持久化物體的,在調度失敗、節點故障、缺少資源或者節點維護的狀態下都會死
掉會被驅逐,通常,我們是需要借助類似于 Docker 存盤卷這樣的資源來做 Pod 的資料持久
4>Pod的狀態
# 1、掛起(Pending):
API Server 創建了 pod 資源物件已存入 etcd 中,但它尚未被調度完成,或者仍處于從倉庫下載鏡像的程序中,
# 2、運行中(Running):
Pod 已經被調度至某節點,并且所有容器都已經被 kubelet 創建完成
# 3、成功(Succeeded):
Pod 中的所有容器都已經成功終止并且不會被重啟,
# 4、失敗(Failed):
Pod 中的所有容器都已終止了,并且至少有一個容器是因為失敗終止,即容器以非 0 狀態退出或者被系統禁止,
# 5、未知(Unknown):
Api Server 無法正常獲取到 Pod 物件的狀態資訊,通常是由于無法與所在作業節點的kubelet 通信所致,
# 6、ImgPullErr :
鏡像拉取失敗
# 7、ContainerCreating :
容器創建中
5>Pod的資源清單詳解
apiVersion:v1 #必選,指定K8s部署的API的版本號
kind:Pod #必選,資源型別Pod
metadata: # 必選,記錄部署應用的元資料
name: nginx # 必選,符合 RFC 1035 規范的 Pod 名稱
namespace: web-testing # 可選,不指定默認為 default,Pod 所在的命名空間
labels: # 可選,標簽選擇器,一般用于 Selector
- app: nginx
annotations: # 可選,注釋串列
- app: nginx
spec: # 必選,用于部署容器的詳細資訊
containers: # 必選,容器串列
- name: nginx # 必選,符合 RFC 1035 規范的容器名稱
image: nginx:v1 # 必選,容器所用的鏡像的地址
imagePullPolicy: Always # 可選,鏡像拉取策略
workingDir: /usr/share/nginx/html # 可選,容器的作業目錄
volumeMounts: # 可選,存盤卷配置
- name: webroot # 存盤卷名稱
mountPath: /usr/share/nginx/html # 掛載目錄
readOnly: true # 只讀
ports: # 可選,容器需要暴露的埠號串列
- name: http # 埠名稱
containerPort: 80 # 埠號
protocol: TCP # 埠協議,默認 TCP
env: # 可選,環境變數配置
- name: TZ # 變數名
value: Asia/Shanghai
- name: LANG
value: en_US.utf8
resources: # 可選,資源限制和資源請求限制
limits: # 最大限制設定
cpu: 1000m
memory: 1024MiB
requests: # 啟動所需的資源
cpu: 100m
memory: 512MiB
readinessProbe: # 可選,容器狀態檢查
httpGet: # 檢測方式
path: / # 檢查路徑
port: 80 # 監控埠
timeoutSeconds: 2 # 超時時間
initialDelaySeconds: 60 # 初始化時間
livenessProbe: # 可選,監控狀態檢查
exec: # 檢測方式
command:
- cat
- /health
httpGet: # 檢測方式
path: /_health
port: 8080
httpHeaders:
- name: end-user
value: jason
tcpSocket: # 檢測方式
port: 80
initialDelaySeconds: 60 # 初始化時間
timeoutSeconds: 2 # 超時時間
periodSeconds: 5 # 檢測間隔
successThreshold: 2 # 檢查成功為 2 次表示就緒
failureThreshold: 1 # 檢測失敗 1 次表示未就緒
securityContext: # 可選,限制容器不可信的行為
provoleged: false
restartPolicy: Always # 可選,默認為 Always
nodeSelector: # 可選,指定 Node 節點
region: subnet7
imagePullSecrets: # 可選,拉取鏡像使用的 secret
- name: default-dockercfg-86258
hostNetwork: false # 可選,是否為主機模式,如是,會占用主機埠
volumes: # 共享存盤卷串列
- name: webroot # 名稱,與上述對應
emptyDir: {} # 共享卷型別,空
hostPath: # 共享卷型別,本機目錄
path: /etc/hosts
secret: # 共享卷型別,secret 模式,一般用于密碼
secretName: default-token-tf2jp # 名稱
defaultMode: 420 # 權限
configMap: # 一般用于組態檔
name: nginx-conf
defaultMode: 420
================================================================================================
[root@k8s-m-01 ~]# kubectl explain pod.spec #查看引數
string : 跟字串
Object :
[]Object :
- name
案例:
# 實體1:部署nginx、tomcat容器
# kubectl explain Pod #查apiVersion版本號 v1
[root@k8s-m-01 ~]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: nginx
image: nginx
- name: tomcat
image: tomcat
# 實體2:部署wordpress
# 1、nginx PHP MySQL
# 2、 制作鏡像
# 3、創建nginx組態檔,然后構建鏡像
# 4、撰寫配置清單,部署
[root@k8s-m-01 ~]# vim wordpress.yaml
apiVersion: v1
kind: Pod
metadata:
name: wordpress
spec:
containers:
- name: nginx
image: nginx
- name: php
image: alvinos/php:v2-fpm-mysql
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: "123"
# k8s部署一個yaml的應用:kubectl apply -f [配置清單]
[root@k8s-m-01 ~]# kubectl apply -f pod.yaml
pod/test-pod create
ImgPullErr : 鏡像拉取失敗
ContainerCreating : 容器創建中
6>Pod的重啟策略
Pod 重啟策略( RestartPolicy )應用于 Pod 內的所有容器,井且僅在 Pod 所處的 Node 上由 kubelet 進行判斷和重啟操作,
當某個容器例外退出或者健康檢查失敗時, kubelet 將根據 RestartPolicy 設定來進行相應的操作,Pod 的重啟策略包括:Always、OnFailure 和 Never,默認值為 Always
# 1. Always: (默認)
當容器失效時,由 kubelet 自動重啟該容器,
# 2. OnFailure:
當容器終止運行且退出碼不為 0 時,由 kubelet 自動重啟該容器
# 3. Never:
不論容器運行狀態如何,kubelet 都不會重啟該容器,
kubelet 重啟失效容器的時間間隔以 sync-frequency 乘以 2n 來計算;例如 1、2、4、8 倍等,最長延時5min ,并且在成功重啟后的 10 min 后重置該時間,
Pod 的重啟策略與控制方式息息相關,當前可用于管理 Pod 的控制器包括 ReplicationController、Job、DaemonSet 及直接通過 kubelet 管理(靜態 Pod),每種控制器對 Pod 的重啟策略要求如下:
# 1.RC 和 DaemonSet:必須設定為 Always,需要保證該容器持續運行,
# 2.Job 和 CronJob:OnFailure 或 Never,確保容器執行完成后不再重啟,
# 3.kubelet:在 Pod 失效時自動重啟它,不論將 RestartPolicy 設定為什么值,也不會對 Pod 進行健康檢查,
三、名詞介紹
1.k8s中的名稱空間
k8s中名稱空間是用來隔離集群資源,而k8s中的資源也分為名稱空間級資源以及集群級資源,
mysql 客戶端 kubectl
mysqld 服務端 kubernetes
# kubectl是k8s客戶端,它跟k8s沒有任何關系,
# kubectl get [資源名稱] 獲取集群資源的命令
# 1、獲取名稱空間
[root@k8s-m-01 ~]# kubectl get namespaces
NAME STATUS AGE
default Active 8d
kube-node-lease Active 8d
kube-public Active 8d
kube-system Active 8d
[root@k8s-m-01 ~]# kubectl get ns #簡寫
NAME STATUS AGE
default Active 8d
kube-node-lease Active 8d
kube-public Active 8d
kube-system Active 8d
# 注:部署應用一般是部署在自己的名稱空間之內
# 2、k8s中的命名規范
1、必須小寫
2、必須以字母開頭
3、名稱當中只能夠包含字母、數字和中劃線(-)
[root@k8s-m-01 ~]# kubectl create namespace wordpress # 創建命名空間
namespace/wordpress created
2、namespace
namespace是命名空間,用來做集群資源隔離的(業內默認的標準,一個微服務一個namespace)
k8s集群中:
1、集群級資源:所有命名空間都能夠使用
2、命名空間級資源:只能在同一個命名空間內使用
3、Label標簽
標簽可以稱之為資源的標示,一般用于發現資源
一個Label是一個key=value的鍵值對,其中key與value由用戶自己指定,
Label可以附加到各種資源物件上,例如Node、Pod、Service、RC 等,一個資源物件可以定義任意數量的 Label,同一個 Label 也可以被添加到任意數量的資源物件上去,Label 通常在資源物件定義時確定,也可以在物件創建后動態添加或者洗掉,
- 1、版本標簽:“release” : “stable” , “release” : “canary”
- 2、環境標簽:“environment” : “dev” , “environment” : “production”
- 3、架構標簽:“tier” : “frontend” , “tier” : “backend” , “tier” : “middleware”
- 4、磁區標簽:“partition” : “customerA” , “partition” : “customerB”
- 5、質量管控標簽:“track” : “daily” , “track” : “weekly”
# docker中的TAG = 倉庫URL/名稱空間/倉庫名稱:版本號
# k8s當做標簽是用來管理(識別一系列)容器,方便與管理和監控擁有同一標簽的所有容器 #標簽是指pod,但是pod是管理容器的
[root@k8s-m-01 ~]# vim tag.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-tag
labels:
release: stable
spec:
containers:
- name: nginx
image: nginx
# 1、查看label
[root@k8s-m-01 ~]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
test-tag 1/1 Running 0 67s release=stable
# 2、增加標簽
kubectl label pod(資源型別) test-tag app=tag
[root@k8s-m-01 ~]# kubectl label pod test-tag app=tag
pod/test-tag labeled
[root@k8s-m-01 ~]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
test-tag 0/1 ImagePullBackOff 0 2m15s app=tag,release=stable
# 3、洗掉標簽
[root@k8s-m-01 ~]# kubectl label pod test-tag app-
pod/test-tag labeled
# 4、查看標簽
[root@k8s-m-01 ~]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
test-tag 1/1 Running 0 7m53s release=stable
# 5、修改標簽
## 先洗掉后增加
kubectl label pod test-tag app=tag release-
kubectl label pod test-tag app=tag release=bate
# 6、版本
stable 穩定版本
beta 公測版本
alpha 內測版本
=================================================================================
# 查看資源標簽標簽
kubectl get deployment --show-labels
# 創建標簽
kubectl label [資源型別] [資源名] [key=value]
# 洗掉標簽
kubectl label [資源型別] [資源名] key-
3.k8s中常用命令
# 1.獲取資源
kubectl get [資源名稱]
[root@k8s-m-01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
test 1/1 Running 1 6d
# 2.創建資源
kubectl apply [資源型別] [資源名稱]
kubectl apply -f [資源清單的路徑]
[root@k8s-m-01 ~]# vim tag.yaml
[root@k8s-m-01 ~]# kubectl apply -f tag.yaml
4.控制器
k8s中控制器分為:deployment、DaemonSet、Statufluset
控制器是用來管理Pod
# 1、Deployment:一般用來部署長期運行的、無狀態的應用
特點:集群之中,隨機部署
# 2、DaemonSet:每一個節點上部署一個Pod,洗掉節點自動洗掉對應的POD(zabbix-agent)
特點:每一臺上有且只有一臺
# 3、StatudfluSet: 部署有狀態應用
特點:有啟動順序
控制器使用來做什么的?
- 管理Pod
# Deploymnet:
在Deployment物件中描述所需的狀態,然后Deployment控制器將實際狀態以受控的速率更改為所需的狀態,
1)deployment(部署長期運行、無狀態應用)
# 1、deployment:在deployment物件中描述所需狀態,然后deployment控制器將實際狀態以受控的速率更改為所需的狀態(自愈)
一般用來部署長期運行的,無狀態的應用(對啟動順序沒有要求的(php nginx))
總結:主要功能是保證有足夠的Pod正常對外提供服務
特點:集群之中,隨機部署
# 2、創建deployment.yaml
[root@k8s-m-01 ~]# vim deployment.yaml
apiVersion: apps/v1 # kubectl explain deployment查看deployment版本號:apps/v1
kind: Deployment #型別
metadata: #元資料
name: deployment #deployment的名稱
spec: #定義容器的詳細資訊
replicas: 1 #創建Pod的副本數(默認)
selector: #標簽選擇器:定義Deployment 如何找到要管理的 Pod,與 template 的 label(標簽)對應
matchLabels: #精確匹配
release: stable #對應Pod標簽
template: #創建Pod的模板---------以下是Pod資訊
metadata: #Pod元資料
name: test-tag #Pod名稱(可不定義,隨機生成)
labels: #標簽
release: stable
spec: #定義容器詳細資訊
containers: #容器串列
- name: nginx
image: nginx
# 3、創建deployment
[root@k8s-m-01 ~]# kubectl apply -f deployment.yaml #創建deployment
deployment.apps/deployment created
[root@k8s-m-01 ~]# kubectl get deployment #查看deployment
NAME READY UP-TO-DATE AVAILABLE AGE
deployment 1/1 1 1 51s
# 4、查看pods
[root@k8s-m-01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
deployment-7bf4d6cd75-nxsjg 1/1 Running 0 2m24s
test-tag 1/1 Running 0 41m
# 5、洗掉deployment
[root@k8s-m-01 ~]# kubectl delete pod deployment-7bf4d6cd75-nxsjg
# 6、重新查看pods
[root@k8s-m-01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
deployment-7bf4d6cd75-cm2jn 1/1 Running 0 21s
test-tag 1/1 Running 0 42m
# 7、查看部署詳情
[root@k8s-m-01 ~]# kubectl describe deployments.apps
Name: deployment
Namespace: default
CreationTimestamp: Sat, 24 Jul 2021 10:52:32 +0800
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 1
Selector: release=stable
Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: release=stable
Containers:
nginx:
Image: nginx
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: deployment-7bf4d6cd75 (1/1 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 75s deployment-controller Scaled up replica set deployment-7bf4d6cd75 to 1
1>彈性擴容的3種方法
# 1.修改配置清單
[root@k8s-m-01 ~]# kubectl edit deployments deployment #推薦
# deployments是資源型別 資源名稱是deployment
spec:
progressDeadlineSeconds: 600
replicas: 10 # 修改這個引數
revisionHistoryLimit: 10
selector:
matchLabels:
release: stable
[root@k8s-m-01 ~]# kubectl get pods -w #監控pod狀態(自動創建10個)
NAME READY STATUS RESTARTS AGE
deployment-7bf4d6cd75-cm2jn 1/1 Running 0 6m59s
test-tag 1/1 Running 0 48m
deployment-7bf4d6cd75-c25tl 0/1 Pending 0 0s
deployment-7bf4d6cd75-c25tl 0/1 Pending 0 0s
deployment-7bf4d6cd75-vvgff 0/1 Pending 0 0s
deployment-7bf4d6cd75-ghlvr 0/1 Pending 0 0s
deployment-7bf4d6cd75-j7zpk 0/1 Pending 0 0s
deployment-7bf4d6cd75-ck57d 0/1 Pending 0 0s
deployment-7bf4d6cd75-tk6sw 0/1 Pending 0 0s
deployment-7bf4d6cd75-8kljt 0/1 Pending 0 0s
deployment-7bf4d6cd75-vvgff 0/1 Pending 0 0s
deployment-7bf4d6cd75-ghlvr 0/1 Pending 0 0s
#2.命令列打標簽
[root@k8s-m-01 ~]# kubectl patch deployments.apps deployment -p '{"spec":{"replicas":4}}' #自動縮容到4臺-
# deployments.apps 資源全稱
deployment.apps/deployment patched
[root@k8s-m-01 ~]# kubectl get pods -w #實時監控
NAME READY STATUS RESTARTS AGE
deployment-7bf4d6cd75-cm2jn 1/1 Running 0 11m
deployment-7bf4d6cd75-j7zpk 1/1 Running 0 4m21s
deployment-7bf4d6cd75-mrlj7 1/1 Running 0 4m21s
deployment-7bf4d6cd75-tk6sw 1/1 Running 0 4m21s
test-tag 1/1 Running 0 53m
[root@k8s-m-01 ~]# kubectl patch deployments.apps deployment -p '{"spec":{"replicas":40}}' #自動擴容到40臺
deployment.apps/deployment patched
# 3.scale
[root@k8s-m-01 ~]# kubectl scale deployment/deployment --replicas=2
# 資源型別/資源名稱
deployment.apps/deployment scaled
[root@k8s-m-01 ~]# kubectl get pods #查看pods
NAME READY STATUS RESTARTS AGE
deployment-7bf4d6cd75-cm2jn 1/1 Running 0 14m
deployment-7bf4d6cd75-j7zpk 1/1 Running 0 7m36s
test-tag 1/1 Running 0 56m
2>更新(首先要存在低版本才可以更新)
# 1.編輯django.yaml(基礎版本)
[root@k8s-m-01 ~]# vi djiaogo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: django
spec:
replicas: 1
selector:
matchLabels:
app: stable
template:
metadata:
labels:
app: stable
spec:
containers:
- name: nginx1
image: nginx:1.17.10
#2.創建Pod
[root@k8s-m-01 ~]# kubectl apply -f django.yaml
deployment.apps/django created
# 1—監控中 (獲取podid)
[root@k8s-m-01 ~]# kubectl get pods -w
NAME READY STATUS RESTARTS AGE
deployment-7bf4d6cd75-cm2jn 1/1 Running 0 18m
test-tag 1/1 Running 0 60m
django-54bb9d4cd6-m6pgm 0/1 Pending 0 0s
django-54bb9d4cd6-m6pgm 0/1 Pending 0 0s
django-54bb9d4cd6-m6pgm 0/1 ContainerCreating 0 0s
# 2-進入容器查看版本號
[root@k8s-m-01 ~]# kubectl exec -it django-54bb9d4cd6-m6pgm --
root@django-54bb9d4cd6-m6pgm:/# nginx -v
nginx version: nginx/1.17.10
# 3.更新鏡像
方式一:打標簽
## 打標簽
[root@k8s-m-01 ~]# kubectl patch deployments.apps django -p '{"spec":{"template":{"spec":{"containers":[{"image":"nginx:1.18.0", "name":"nginx"}]}}}}'
deployment.apps/django patched
# 驗證
[root@k8s-m-01 ~]# kubectl exec -it django-6c5b55f69f-qnb6d --
Defaulted container "nginx" out of: nginx, nginx1
root@django-6c5b55f69f-qnb6d:/# nginx -v
nginx version: nginx/1.18.0
方式二:修改配置清單
# 修改配置清單
[root@k8s-m-01 ~]# vim django.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: django
spec:
replicas: 1
selector:
matchLabels:
app: stable
template:
metadata:
labels:
app: stable
spec:
containers:
- name: nginx
image: nginx:1.19.9
##驗證
[root@k8s-m-01 ~]# kubectl exec -it deployment-5849786498-6zpws --
root@deployment-5849786498-6zpws:/# nginx -v
nginx version: nginx/1.19.9
方式三:
##設定鏡像(重點)
[root@k8s-m-01 ~]# kubectl set image deployment/django nginx=nginx:1.16.0
##驗證
[root@k8s-m-01 ~]# kubectl exec -it django-65b6bd487f-qtrv9 --
Defaulted container "nginx" out of: nginx, nginx1
root@django-65b6bd487f-qtrv9:/# nginx -v
nginx version: nginx/1.16.0
方式四:
## edit
[root@k8s-m-01 ~]# kubectl edit deployment.apps django
template:
metadata:
creationTimestamp: null
labels:
app: stable
spec:
containers:
- image: nginx:1.19.0 #修改版本號
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
##驗證
[root@k8s-m-01 ~]# kubectl exec -it django-65c9b58dfb-zwg6z --
Defaulted container "nginx" out of: nginx, nginx1
root@django-65c9b58dfb-zwg6z:/# nginx -v
nginx version: nginx/1.19.0
3>回滾
# 1、查看資源歷史
[root@k8s-m-01 ~]# kubectl rollout history deployment django
deployment.apps/django
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 <none>
4 <none>
5 <none>
6 <none>
7 <none>
# 2、回滾到上一級
[root@k8s-m-01 ~]# kubectl rollout undo deployment django
deployment.apps/django
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 <none>
4 <none>
5 <none>
8 <none>
9 <none>
注:目前是到第7級,回滾是回滾到6,回滾后7不顯示,顯示成6,6與7內容一樣
# 3、回滾指定版本
[root@k8s-m-01 ~]# kubectl rollout undo deployment django --to-revision=1
deployment.apps/django rolled back
[root@k8s-m-01 ~]# kubectl rollout history deployment django
deployment.apps/django
REVISION CHANGE-CAUSE
2 <none>
3 <none>
4 <none>
5 <none>
8 <none>
9 <none>
10 <none>
注:回滾到1版本,1不展示,變成10
2)DaemonSet(一般用來監控、收集日志)
在集群中所有的節點上部署只部署一個Pod
# 在集群中所有的節點上部署只部署一個Pod,洗掉節點自動洗掉對應得Pod
# 特點:每臺上有且只有一個
[root@k8s-m-01 ~]# vim zabbix-agent.yaml
apiVersion: apps/v1 #kubectl explain DaemonSet 查看版本號
kind: DaemonSet
metadata:
name: zabbix-agent
spec:
selector:
matchLabels:
app: zabbix-agent
template:
metadata:
labels:
app: zabbix-agent
spec:
containers:
- name: zabbix-agent
image: zabbix/zabbix-agent:5.2.6-centos
[root@k8s-m-01 ~]# kubectl apply -f zabbix-agent.yaml
# 更新
1、修改組態檔
[root@k8s-m-01 ~]# kubectl edit daemonsets.apps zabbix-agent
spec:
containers:
- image: zabbix/zabbix-agent:centos-5.2.5 #修改版本
daemonset.apps/zabbix-agent edited
2、打標簽的方式
[root@k8s-m-01 ~]# kubectl patch daemonsets.apps zabbix-agent -p '{"spec":{"template":{"spec":{"containers":[{"image":"zabbix/zabbix-agent:centos-5.2.4", "name":"zabbix-agent"}]}}}}'
daemonset.apps/zabbix-agent patched
3、設定鏡像
[root@k8s-m-01 ~]# kubectl set image daemonset/zabbix-agent zabbix-agent=zabbix/zabbix-agent:centos-5.2.3
daemonset.apps/zabbix-agent image updated
4、查看記錄
[root@k8s-m-01 ~]# kubectl rollout history daemonset zabbix-agent
daemonset.apps/zabbix-agent
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 <none>
4 <none>
## 回滾到上一個版本
[root@k8s-m-01 ~]# kubectl rollout history daemonset zabbix-agent
daemonset.apps/zabbix-agent
REVISION CHANGE-CAUSE
1 <none>
2 <none>
4 <none>
5 <none>
## 回滾到指定版本
[root@k8s-m-01 ~]# kubectl rollout undo daemonset zabbix-agent --to-revision=1
daemonset.apps/zabbix-agent rolled back
3)擴展
# 1、k8s-m-01節點執行
[root@k8s-m-01 ~]# kubectl get nodes # master監控
NAME STATUS ROLES AGE VERSION
k8s-m-01 Ready control-plane,master 8d v1.21.2
k8s-n-01 Ready <none> 8d v1.21.2
k8s-n-02 Ready <none> 11s v1.21.2
[root@k8s-m-01 ~]# kubectl delete nodes k8s-n-02 #洗掉k8s-n-02節點
node "k8s-n-02" deleted
[root@k8s-m-01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-m-01 Ready control-plane,master 8d v1.21.2
k8s-n-01 Ready <none> 8d v1.21.2
# 2、k8s-n-2節點執行
[root@k8s-n-02 ~]# kubeadm reset
[root@k8s-n-02 ~]# rm -rf /etc/kubernetes/
# 3、k8s-m-01節點生成token
[root@k8s-m-01 ~]# kubeadm token create --print-join-command
kubeadm join 192.168.15.111:6443 --token uqvjwm.lr9e35a0brzl1r9f --discovery-token-ca-cert-hash sha256:e9a22201e9fb0575a7281b42c53377c119880e0aca5217a7134fe474e5cd7422
# 4、k8s-n-02節點重新加入集群
[root@k8s-n-02 ~]# kubeadm join 192.168.15.111:6443 --token uqvjwm.lr9e35a0brzl1r9f --discovery-token-ca-cert-hash sha256:e9a22201e9fb0575a7281b42c53377c119880e0aca5217a7134fe474e5cd7422
# 5、重新查看master節點監控
[root@k8s-m-01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-m-01 Ready control-plane,master 8d v1.21.2
k8s-n-01 Ready <none> 8d v1.21.2
k8s-n-02 Ready <none> 11s v1.21.2
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/290411.html
標籤:其他
上一篇:nginx服務器的下載安裝與使用
下一篇:python網路基礎
