linux12k8s --> 05實戰(zhàn)入門
文章目錄
一、優(yōu)化命令行
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
二、kubernetes帶來的變革
k8s與docker的關系:
docker是容器,k8s是一個容器化管理平臺
1、對于開發(fā)人員
由于公司業(yè)務多,開發(fā)環(huán)境、測試環(huán)境、預生產(chǎn)環(huán)境和生產(chǎn)環(huán)境都是隔離的,而且除了生產(chǎn)環(huán)境,為了節(jié)省成本,其他環(huán)境可能是沒有日志收集的,在沒有用 k8s 的時候,查看線下測試的日志,需要開發(fā)或者測試人員,找到對應的機器,在找到對應的容器,然后才能查看日志,在用了 k8s 之后,開發(fā)和測試可以直接在 k8s 的dashboard 到對應的 namespace,即可定位到業(yè)務的容器,然后可以直接通過控制臺查看到對應的日志,大大降低了操作時間。
目前我們使用 jenkins、gitrunner 進行發(fā)版或者回滾等,從開發(fā)環(huán)境到測試環(huán)境,到生產(chǎn)環(huán)境,完全遵守一次構建,多集群、多環(huán)境部署,通過不同的啟動參數(shù)、不同的環(huán)境變量、不同的配置文件實現(xiàn)區(qū)分不同的環(huán)境。目前已經(jīng)實現(xiàn) Python、Java、PHP、NodeJS、Go、.NET Core、Python等多種語言的一鍵式發(fā)版、一鍵式回滾,大大提高了開發(fā)人員的開發(fā)效率。
1、對于開發(fā)人員的作用
# 在用了 k8s 之后,開發(fā)和測試可以直接在 k8s 的dashboard 到對應的 namespace,即可定位到業(yè)務的容器,然后可以直接通過控制臺查看到對應的日志,大大降低了操作時間。
2、對于運維人員
如果你是一名運維人員,可能經(jīng)常因為一些重復、繁瑣的工作感覺厭倦。比如:這個需要一套新的測試環(huán)境,那個需要一套新的測試環(huán)境,之前可能需要裝系統(tǒng)、裝依賴環(huán)境、開通權限等等。而如今,可以直接用鏡像直接部署一套新的測試環(huán)境,甚至全程無需自己干預,開發(fā)人員通過 jenkins 或者自動化運維平臺即可一鍵式創(chuàng)建,大大降低了運維成本。
一開始,公司業(yè)務故障,可能是因為基礎環(huán)境不一致、依賴不一致、端口沖突等等問題,現(xiàn)在實現(xiàn) Docker鏡像部署,k8s 編排,所有的依賴、基礎都是一樣的,并且環(huán)境的自動化擴容、健康檢查、容災、恢復都是全自動的,大大減少了因為這類基礎問題引發(fā)的故障。也有可能公司業(yè)務是由于服務器宕機、網(wǎng)絡等問題,造成服務不可用,此類情況均需要運維人員及時去修復,而如今,可能在你收到告警信息的時候,k8s 已經(jīng)幫你恢復了。
在沒有使用 k8s 時,業(yè)務應用的擴容和縮容,都需要人工去處理,從采購服務器、上架、到部署依賴環(huán)境,不僅需要大量的人力物力,而且非常容易在中間過程出現(xiàn)問題,又要花費大量的時間去查找問題。成功上架后,還需要在前端反代端添加或該服務器,而如今,可以利用 k8s 的彈性計算,一鍵式進行擴容和縮容,不僅大大提高了運維效率,而且還節(jié)省了不少的服務器資源,提高了資源利用率。
1、對于運維人員的作用
# 1、對于反代配置方面
比如可能你并不會,或者對 nginx 的配置規(guī)則并不熟悉,一些高級的功能你也不會實現(xiàn),而如今,利用 k8s的ingress即可簡單的實現(xiàn)那些復雜的邏輯。并且也不會在遇到 nginx 少加一個斜杠和多加一個斜杠的問題。
# 2、對于負載均衡方面
之前負載均衡可能是 Nginx、LVS、HAProxy、F5 等,云上可能是云服務商提供的不在均衡機制。每次添加刪除節(jié)點時,都需要手動去配置前端負載均衡,手動去匹配后端節(jié)點,而如今,使用 k8s內(nèi)部的 service 可以動態(tài)發(fā)現(xiàn)實現(xiàn)自動管理節(jié)點,并且支持自動擴容縮容。之前遇到高峰流量時,經(jīng)常服務器性能不夠,需要臨時加服務器面對高峰流量,而如今對于高性能 k8s 集群加上 serverless,基本實現(xiàn)無需管理,自動擴容。
# 3、 對于高可用方面
k8s 天生的高可用功能,徹底釋放了雙手,無需再去創(chuàng)建各類高可用工具、檢測檢查腳本。k8s 支持進程接口級別的健康檢查,如發(fā)現(xiàn)接口超時或者返回值不正確,會自動處理該問題。
# 4、對于中間件搭建方面
根據(jù)定義好的資源文件,可以實現(xiàn)秒級搭建各類中間件高可用集群,并且支持一鍵式擴縮容,如Redis、Zookeeper 等,并且大大減少了出錯的概率。
# 5、對于應用端口方面
傳統(tǒng)行業(yè)中,一個服務器可能跑了很多進程,每個進程都有一個端口,需要人為的去配置端口,并且還需要考慮端口沖突的問題,如果有防火墻的話,還需要配置防火墻,在 k8s 中,端口統(tǒng)一管理統(tǒng)一配置,每個應用的端口都可設置成一樣的,之后通過 service 進行負載均衡,大大降低了端口管理的復雜度和端口沖突。
三、實戰(zhàn)入門
# k8s掌握的五部件
# 1、Namespace 命名空間
# 2、Pod kubernetes集群進行管理的最小單元
# 3、Label 標簽
# 4、控制器
deployment(部署長期運行、無狀態(tài)應用)
DaemonSet(一般用來監(jiān)控、收集日志)
# 5、Service 負載均衡
k8s中的名稱空間(命名空間)
1、k8s中名稱空間是用來隔離集群資源,而k8s中的資源也分為名稱空間級資源以及集群級資源。
2、namespace是命名空間,用來做集群資源隔離的(業(yè)內(nèi)默認的標準,一個微服務一個namespace)
# 1、k8s中的命名規(guī)范
1、必須小寫
2、必須以字母開頭
3、名稱當中只能夠包含字母、數(shù)字和中劃線(-)
# 2、k8s集群中:
1、集群級資源:所有命名空間都能夠使用
2、命名空間級資源:只能在同一個命名空間內(nèi)使用
mysql 客戶端 kubectl
mysqld 服務端 kubernetes
# kubectl是k8s客戶端,它跟k8s沒有任何關系。
# kubectl get [資源名稱] 獲取集群資源的命令
# 注:部署應用一般是部署在自己的名稱空間之內(nèi)
1、namespace
Namespace是kubernetes系統(tǒng)中的一種非常重要資源,它的主要作用是用來實現(xiàn)多套環(huán)境的資源隔離或者多租戶的資源隔離。
默認情況下,kubernetes集群中的所有的Pod都是可以相互訪問的。但是在實際中,可能不想讓兩個Pod之間進行互相的訪問,那此時就可以將兩個Pod劃分到不同的namespace下。kubernetes通過將集群內(nèi)部的資源分配到不同的Namespace中,可以形成邏輯上的"組",以方便不同的組的資源進行隔離使用和管理。
可以通過kubernetes的授權機制,將不同的namespace交給不同租戶進行管理,這樣就實現(xiàn)了多租戶的資源隔離。此時還能結合kubernetes的資源配額機制,限定不同租戶能占用的資源,例如CPU使用量、內(nèi)存使用量等等,來實現(xiàn)租戶可用資源的管理。

kubernetes在集群啟動之后,會默認創(chuàng)建幾個namespace
[root@k8s-m-01 ~]# kubectl get namespace (縮寫ns)
NAME STATUS AGE
default Active 45h # 所有未指定Namespace的對象都會被分配在default命名空間
kube-node-lease Active 45h # 集群節(jié)點之間的心跳維護,v1.13開始引入
kube-public Active 45h # 此命名空間下的資源可以被所有人訪問(包括未認證用戶)
kube-system Active 45h # 所有由Kubernetes系統(tǒng)創(chuàng)建的資源都處于這個命名空間
1、查看
# 1 查看所有的ns
命令:kubectl get ns
[root@k8s-m-01 ~]# kubectl get ns
NAME STATUS AGE
default Active 45h
kube-node-lease Active 45h
kube-public Active 45h
kube-system Active 45h
# 2 查看指定的ns
命令:kubectl get ns ns名稱
[root@k8s-m-01 ~]# kubectl get ns default
NAME STATUS AGE
default Active 45h
[root@k8s-m-01 ~]# kubectl get ns -n default
NAME STATUS AGE
default Active 3d9h
kube-node-lease Active 3d9h
kube-public Active 3d9h
kube-system Active 3d9h
# 3 指定輸出格式
命令:kubectl get ns ns名稱 -o 格式參數(shù)
# kubernetes支持的格式有很多,比較常見的是wide、json、yaml
[root@k8s-m-01 ~]# kubectl get ns default -o yaml
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: "2021-05-08T04:44:16Z"
name: default
resourceVersion: "151"
selfLink: /api/v1/namespaces/default
uid: 7405f73a-e486-43d4-9db6-145f1409f090
spec:
finalizers:
- kubernetes
status:
phase: Active
# 4 查看ns詳情
命令:kubectl describe ns ns名稱
[root@k8s-m-01 ~]# kubectl describe ns default
Name: default
Labels: <none>
Annotations: <none>
Status: Active # Active 命名空間正在使用中 Terminating 正在刪除命名空間
# ResourceQuota 針對namespace做的資源限制
# LimitRange針對namespace中的每個組件做的資源限制
No resource quota.
No LimitRange resource.
2、創(chuàng)建
# 創(chuàng)建namespace
[root@k8s-m-01 ~]# kubectl create ns dev
namespace/dev created
3、 刪除
# 刪除namespace
[root@k8s-m-01 ~]# kubectl delete ns dev
namespace "dev" deleted
4、配置方式
首先準備一個yaml文件:ns-dev.yaml
[root@k8s-m-01 ~]# vim ns-dev.yaml
apiVersion: v1
kind: Namespace
metadata:
name: dev
然后就可以執(zhí)行對應的創(chuàng)建和刪除命令了:
# 創(chuàng)建:kubectl create -f ns-dev.yaml
# 刪除:kubectl delete -f ns-dev.yaml
2、Pod
1、k8s集群中部署的最小單元
2、Pod最主要的功能管理是將一個業(yè)務或者一個調(diào)用鏈的所有服務(容器)
3、包含多個容器(一組容器的集合)
4、一個Pod中容器共享網(wǎng)絡命名空間,Pod是短暫的
Pod是在集群中運行部署應用或服務的最小單元,他是可以支持很多容器的。Pod的設計理念是支持多個容器在一個Pod中共享網(wǎng)絡地址和文件系統(tǒng),可以通過進程間通信和文件共享這種簡單高效的方式組合完成服務。
比如:你運行一個操作系統(tǒng)發(fā)行版的軟件倉庫,一個nginx容器用來發(fā)布軟件,另一個容器專門用來從源倉庫做同步,這兩個容器的鏡像不太可能是一個團隊開發(fā)的,但是他們一塊工作才能提供一個微服務,這種情況下,不同的團隊各自開發(fā)構建自己的容器鏡像,在部署的時候組合成一個微服務對外提供服務。這就是k8s中的Pod。
目前k8s中業(yè)務主要可以分為長期伺服型(long-running)、批處理型(batch)、節(jié)點后臺支撐型(node-daemon)和有狀態(tài)應用型(stateful application);分別對應的小機器人控制器為Deployment、Job、DaemonSet 和 StatefulSet。
# Pod是k8s中最小部署單元,用來管理一個調(diào)用鏈的容器,它之中的主容器(pause)為整個調(diào)用鏈的容器提供基礎網(wǎng)絡,共享存儲,監(jiān)控業(yè)務容器的運行狀態(tài)

kubernetes在集群啟動之后,集群中的各個組件也都是以Pod方式運行的。可以通過下面命令查看:
[root@k8s-m-01 ~]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-978bbc4b6-rh2v6 1/1 Running 13 3d18h
coredns-978bbc4b6-sz8v2 1/1 Running 13 3d18h
etcd-k8s-m-01 1/1 Running 14 3d18h
kube-apiserver-k8s-m-01 1/1 Running 14 3d18h
kube-controller-manager-k8s-m-01 1/1 Running 16 3d18h
kube-flannel-ds-6l7w7 1/1 Running 14 3d18h
kube-flannel-ds-cqhqm 1/1 Running 13 3d18h
kube-flannel-ds-rtq5n 1/1 Running 12 3d18h
kube-proxy-2m7sg 1/1 Running 13 3d18h
kube-proxy-2v25n 1/1 Running 11 3d18h
kube-proxy-nc9j5 1/1 Running 12 3d18h
kube-scheduler-k8s-m-01 1/1 Running 15 3d18h
1、創(chuàng)建并運行
kubernetes沒有提供單獨運行Pod的命令,都是通過Pod控制器來實現(xiàn)的
# 命令格式: kubectl run (pod控制器名稱) [參數(shù)]
# --image 指定Pod的鏡像
# --port 指定端口
# --namespace 指定namespace
[root@k8s-m-01 ~]# kubectl create ns dev
namespace/dev created
[root@k8s-m-01 ~]# kubectl run nginx --image=nginx --port=80 --namespace dev
pod/nginx created
2、 查看pod信息
# 1、查看Pod基本信息
[root@k8s-m-01 ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 43s
# 2、查看Pod的詳細信息
[root@k8s-m-01 ~]# kubectl get pod -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 117s 10.244.2.9 k8s-n-02 <none> <none>
# 3、查看Pod的描述信息
[root@k8s-m-01 ~]# kubectl describe pod -n dev
Name: nginx
Namespace: dev
Priority: 0
Node: k8s-n-02/192.168.15.113
Start Time: Tue, 03 Aug 2021 08:50:05 +0800
Labels: run=nginx
Annotations: <none>
Status: Running
IP: 10.244.2.9
IPs:
IP: 10.244.2.9
Containers:
nginx:
Container ID: docker://1e04252e591895b3c195c957ea52d17946bcfc782c1cafa1259b903243d70f59
Image: nginx
Image ID: docker-pullable://nginx@sha256:8f335768880da6baf72b70c701002b45f4932acae8d574dedfddaf967fc3ac90
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Tue, 03 Aug 2021 08:50:26 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-rvwtl (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-rvwtl:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 4m4s default-scheduler Successfully assigned dev/nginx to k8s-n-02
Normal Pulling 4m2s kubelet Pulling image "nginx"
Normal Pulled 3m43s kubelet Successfully pulled image "nginx" in 18.954550282s
Normal Created 3m43s kubelet Created container nginx
3、 訪問Pod
# 1、獲取podIP
[root@k8s-m-01 ~]# kubectl get pod -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 5m16s 10.244.2.9 k8s-n-02 <none> <none>
# 2、訪問POD
[root@k8s-m-01 ~]# curl http://10.244.2.9:80 (默認是80端口)
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
</head>
<body>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
4、刪除指定Pod
# 1、刪除指定Pod
[root@k8s-m-01 ~]# kubectl delete pod nginx -n dev
pod "nginx" deleted
# 此時,顯示刪除Pod成功,但是再查詢,發(fā)現(xiàn)又新產(chǎn)生了一個
[root@k8s-m-01 ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 21s
# 這是因為當前Pod是由Pod控制器創(chuàng)建的,控制器會監(jiān)控Pod狀況,一旦發(fā)現(xiàn)Pod死亡,會立即重建
# 此時要想刪除Pod,必須刪除Pod控制器
# 2、先來查詢一下當前namespace下的Pod控制器
[root@k8s-m-01 ~]# kubectl get deploy -n dev
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 9m7s
# 3、 接下來,刪除此PodPod控制器
[root@k8s-m-01 ~]# kubectl delete deploy nginx -n dev
deployment.apps "nginx" deleted
# 4、 稍等片刻,再查詢Pod,發(fā)現(xiàn)Pod被刪除了
[root@k8s-m-01 ~]# kubectl get pods -n dev
No resources found in dev namespace.
# 5、刪除namespace
[root@k8s-m-01 ~]# kubectl delete ns dev
namespace "dev" deleted
5、配置操作
創(chuàng)建一個pod-nginx.yaml,內(nèi)容如下:
# 1、創(chuàng)建命名空間
[root@k8s-m-01 ~]# kubectl create ns dev
namespace/dev created
# 2、編寫yaml文件
[root@k8s-m-01 ~]# vi pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: dev
spec:
containers:
- image: nginx:latest
name: pod
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
# 3、生成pod
[root@k8s-m-01 ~]# kubectl create -f pod-nginx.yam
pod/nginx created
# 4、查看
[root@k8s-m-01 ~]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 38s
然后就可以執(zhí)行對應的創(chuàng)建和刪除命令了:
# 創(chuàng)建:kubectl create -f pod-nginx.yaml
# 刪除:kubectl delete -f pod-nginx.yaml
3、Label標簽
標簽可以稱之為資源的標示,一般用于發(fā)現(xiàn)資源
Label是kubernetes系統(tǒng)中的一個重要概念。
# 它的作用就是在資源上添加標識,用來對它們進行區(qū)分和選擇。
1、Label的特點:
- 一個Label會以key/value鍵值對的形式附加到各種對象上,如Node、Pod、Service等等
- 一個資源對象可以定義任意數(shù)量的Label ,同一個Label也可以被添加到任意數(shù)量的資源對象上去
- Label通常在資源對象定義時確定,當然也可以在對象創(chuàng)建后動態(tài)添加或者刪除
可以通過Label實現(xiàn)資源的多維度分組,以便靈活、方便地進行資源分配、調(diào)度、配置、部署等管理工作。
2、 一些常用的Label 示例如下
- 1、版本標簽:“release” : “stable” , “release” : “canary”
- 2、環(huán)境標簽:“environment” : “dev” , “environment” : “production”
- 3、架構標簽:“tier” : “frontend” , “tier” : “backend” , “tier” : “middleware”
- 4、分區(qū)標簽:“partition” : “customerA” , “partition” : “customerB”
- 5、質(zhì)量管控標簽:“track” : “daily” , “track” : “weekly”
標簽定義完畢之后,還要考慮到標簽的選擇,這就要使用到Label Selector,即:
Label用于給某個資源對象定義標識
Label Selector用于查詢和篩選擁有某些標簽的資源對象
- 當前有兩種Label Selector:
1、基于等式的Label Selector
2、基于集合的Label Selector
- 1、基于等式的Label Selector
name = slave: 選擇所有包含Label中key="name"且value="slave"的對象
env != production: 選擇所有包括Label中的key="env"且value不等于"production"的對象
- 2、基于集合的Label Selector
name in (master, slave): 選擇所有包含Label中的key="name"且value="master"或"slave"的對象
name not in (frontend): 選擇所有包含Label中的key="name"且value不等于"frontend"的對象
標簽的選擇條件可以使用多個,此時將多個Label Selector進行組合,使用逗號","進行分隔即可。例如:
name=slave,env!=production
name not in (frontend),env!=production
1、命令方式
# docker中的TAG = 倉庫URL/名稱空間/倉庫名稱:版本號
# k8s當做標簽是用來管理(識別一系列)容器,方便與管理和監(jiān)控擁有同一標簽的所有容器 #標簽是指pod,但是pod是管理容器的
# 1、為pod資源打標簽
[root@k8s-m-01 ~]# kubectl label pod nginx-pod version=1.0 -n dev
pod/nginx-pod labeled
# 2、為pod資源更新標簽
[root@k8s-m-01 ~]# kubectl label pod nginx-pod -n dev version-
pod/nginx-6799fc88d8-mdgbc labeled
[root@k8s-m-01 ~]# kubectl label pod nginx-pod version=2.0 -n dev --overwrite
pod/nginx-pod labeled
# 3、查看標簽
[root@k8s-m-01 ~]# kubectl get pod nginx-pod -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 1/1 Running 0 10m version=2.0
# 4、篩選標簽
[root@k8s-m-01 ~]# kubectl get pod -n dev -l version=2.0 --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 1/1 Running 0 17m version=2.0
[root@k8s-m-01 ~]# kubectl get pod -n dev -l version!=2.0 --show-labels
No resources found in dev namespace.
# 5、刪除標簽
[root@k8s-m-01 ~]# kubectl label pod nginx-pod version- -n dev
pod/nginx-pod labeled
# 6、版本
stable 穩(wěn)定版本
beta 公測版本
alpha 內(nèi)測版本
2、配置方式
# 1、編寫yaml文件
[root@k8s-m-01 ~]# vi pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: dev
labels:
version: "3.0"
env: "test"
spec:
containers:
- image: nginx:latest
name: pod
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
# 2、然后就可以執(zhí)行對應的更新命令了
[root@k8s-m-01 ~]# kubectl apply -f pod-nginx.yam
pod/nginx configured
# 3、查看標簽
[root@k8s-m-01 ~]# kubectl get pod -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 1 39m env=test,version=3.0
4、控制器
k8s中控制器分為:deployment、DaemonSet、Statufluset
控制器的作用是用來管理Pod
# 1、Deployment:一般用來部署長期運行的、無狀態(tài)的應用
特點:集群之中,隨機部署(每一次請求都不依賴歷史數(shù)據(jù),也無數(shù)據(jù)持久化需求)
# 2、DaemonSet:每一個節(jié)點上部署一個Pod,刪除節(jié)點自動刪除對應的POD(zabbix-agent)
特點:每一臺上有且只有一臺
# 3、StatudfluSet: 部署有狀態(tài)應用
特點:有啟動順序 (依賴歷史數(shù)據(jù),且具有數(shù)據(jù)持久化需求,擴容后續(xù)工作復雜)
# Deploymnet:
在Deployment對象中描述所需的狀態(tài),然后Deployment控制器將實際狀態(tài)以受控的速率更改為所需的狀態(tài)。
1、deployment(部署長期運行、無狀態(tài)應用)
在kubernetes中,Pod是最小的控制單元,但是kubernetes很少直接控制Pod,一般都是通過Pod控制器來完成的。Pod控制器用于pod的管理,確保pod資源符合預期的狀態(tài),當pod的資源出現(xiàn)故障時,會嘗試進行重啟或重建pod。

1、 命令操作
# 命令格式: kubectl create deployment 名稱 [參數(shù)]
--image 指定pod的鏡像
--port 指定端口
--replicas 指定創(chuàng)建pod數(shù)量
--namespace 指定namespace
# 1、創(chuàng)建deployment
[root@k8s-m-01 ~]# kubectl create deploy nginx --image=nginx:latest --port=80 --replicas=3 -n dev
deployment.apps/nginx created
# 2、查看創(chuàng)建的Pod
[root@k8s-m-01 ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
nginx-585449566-jsjx4 1/1 Running 0 58s
nginx-585449566-mfhcr 1/1 Running 0 58s
nginx-585449566-w2rtm 1/1 Running 0 58s
# 3、查看deployment的信息
[root@k8s-m-01 ~]# kubectl get deploy -n dev
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 3/3 3 3 2m42s
# UP-TO-DATE:成功升級的副本數(shù)量
# AVAILABLE:可用副本的數(shù)量
[root@k8s-m-01 ~]# kubectl get deploy -n dev -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx 3/3 3 3 2m51s nginx nginx:latest run=nginx
# 4、查看deployment的詳細信息
[root@k8s-m-01 ~]# kubectl describe deploy nginx -n dev
Name: nginx
Namespace: dev
CreationTimestamp: Wed, 08 May 2021 11:14:14 +0800
Labels: run=nginx
Annotations: deployment.kubernetes.io/revision: 1
Selector: run=nginx
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
# 5、查看標簽
[root@k8s-m-01 ~]# kubectl get pods -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-585449566-jsjx4 1/1 Running 0 6m39s app=nginx,pod-template-hash=585449566
nginx-585449566-mfhcr 1/1 Running 0 6m39s app=nginx,pod-template-hash=585449566
nginx-585449566-w2rtm 1/1 Running 0 6m39s app=nginx,pod-template-hash=585449566
# 6、刪除
[root@k8s-m-01 ~]# kubectl delete deploy nginx -n dev
deployment.apps "nginx" deleted
2、配置操作
[root@k8s-m-01 ~]# vim deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: dev
spec:
replicas: 3
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
containers:
- image: nginx:latest
name: nginx
ports:
- containerPort: 80
protocol: TCP
# 創(chuàng)建:kubectl create -f deploy-nginx.yaml
# 刪除:kubectl delete -f deploy-nginx.yaml
3、deployment詳解
1、主要功能是保證有足夠的Pod正常對外提供服務
2、集群之中,隨機部署
# 1、deployment:在deployment對象中描述所需狀態(tài),然后deployment控制器將實際狀態(tài)以受控的速率更改為所需的狀態(tài)(自愈)
一般用來部署長期運行的,無狀態(tài)的應用(對啟動順序沒有要求的(php nginx))
總結:主要功能是保證有足夠的Pod正常對外提供服務
特點:集群之中,隨機部署
# 2、創(chuàng)建deployment.yaml
[root@k8s-m-01 ~]# vim deployment.yaml
apiVersion: apps/v1 # kubectl explain deployment查看deployment版本號:apps/v1
kind: Deployment #類型
metadata: #元數(shù)據(jù)
name: deployment #deployment的名稱
spec: #定義容器的詳細信息
replicas: 1 #創(chuàng)建Pod的副本數(shù)(默認)
selector: #標簽選擇器:定義Deployment如何找到要管理的Pod,與template的label(標簽)對應
matchLabels: #精確匹配
release: stable #對應Pod標簽
template: #創(chuàng)建Pod的模板---------以下是Pod信息
metadata: #Pod元數(shù)據(jù)
name: test-tag #Pod名稱(可不定義,隨機生成)
labels: #標簽
release: stable
spec: #定義容器詳細信息
containers: #容器列表
- name: nginx
image: nginx
# 3、創(chuàng)建deployment
[root@k8s-m-01 ~]# kubectl apply -f deployment.yaml #創(chuàng)建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
4、彈性擴容的3種方法
# 1.修改配置清單
[root@k8s-m-01 ~]# kubectl edit deployments deployment #推薦
# deployments是資源類型 資源名稱是deployment
spec:
progressDeadlineSeconds: 600
replicas: 10 # 修改這個參數(shù)
revisionHistoryLimit: 10
selector:
matchLabels:
release: stable
[root@k8s-m-01 ~]# kubectl get pods -w #監(jiān)控pod狀態(tài)(自動創(chuàng)建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 #實時監(jiān)控
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
5、更新(首先要存在低版本才可以更新)
# 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.創(chuàng)建Pod
[root@k8s-m-01 ~]# kubectl apply -f django.yaml
deployment.apps/django created
# 1—監(jiān)控中 (獲取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 -- bash
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 -- bash
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 -- bash
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 -- bash
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 -- bash
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內(nèi)容一樣
# 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(一般用來監(jiān)控、收集日志)
在集群中所有的節(jié)點上部署只部署一個Pod
# 在集群中所有的節(jié)點上部署只部署一個Pod,刪除節(jié)點自動刪除對應得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節(jié)點執(zhí)行
[root@k8s-m-01 ~]# kubectl get nodes # master監(jiān)控
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節(jié)點
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節(jié)點執(zhí)行
[root@k8s-n-02 ~]# kubeadm reset
[root@k8s-n-02 ~]# rm -rf /etc/kubernetes/
# 3、k8s-m-01節(jié)點生成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節(jié)點重新加入集群
[root@k8s-n-02 ~]# kubeadm join 192.168.15.111:6443 --token uqvjwm.lr9e35a0brzl1r9f --discovery-token-ca-cert-hash sha256:e9a22201e9fb0575a7281b42c53377c119880e0aca5217a7134fe474e5cd7422
# 5、重新查看master節(jié)點監(jiān)控
[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
5 、Service
雖然每個Pod都會分配一個單獨的Pod IP,然而卻存在如下兩問題:
# 1、Pod IP 會隨著Pod的重建產(chǎn)生變化
# 2、Pod IP 僅僅是集群內(nèi)可見的虛擬IP,外部無法訪問
這樣對于訪問這個服務帶來了難度。因此,kubernetes設計了Service來解決這個問題。
Service可以看作是一組同類Pod對外的訪問接口。借助Service,應用可以方便地實現(xiàn)服務發(fā)現(xiàn)和負載均衡

1、 操作一:創(chuàng)建集群內(nèi)部可訪問的Service
# 1、暴露Service
[root@k8s-m-01 ~]# kubectl expose deploy nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev
service/svc-nginx1 exposed
# 2、查看service
[root@k8s-m-01 ~]# kubectl get svc svc-nginx1 -n dev -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
svc-nginx1 ClusterIP 10.104.69.173 <none> 80/TCP 3m51s run=nginx
# 這里產(chǎn)生了一個CLUSTER-IP,這就是service的IP,在Service的生命周期中,這個地址是不會變動的
# 可以通過這個IP訪問當前service對應的POD
[root@k8s-m-01 ~]# curl 10.104.69.173:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
</head>
<body>
<h1>Welcome to nginx!</h1>
.......
</body>
</html>
2、操作二:創(chuàng)建集群外部也可訪問的Service
# 上面創(chuàng)建的Service的type類型為ClusterIP,這個ip地址只用集群內(nèi)部可訪問
# 如果需要創(chuàng)建外部也可以訪問的Service,需要修改type為NodePort
[root@k8s-m-01 ~]# kubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev
service/svc-nginx2 exposed
# 此時查看,會發(fā)現(xiàn)出現(xiàn)了NodePort類型的Service,而且有一對Port(80:31928/TC)
[root@k8s-m-01 ~]# kubectl get svc -n dev
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc-nginx1 ClusterIP 10.104.69.173 <none> 80/TCP 7m27s
svc-nginx2 NodePort 10.104.249.148 <none> 80:30593/TCP 4s
# 接下來就可以通過集群外的主機訪問 節(jié)點IP:31928訪問服務了
# 例如在的電腦主機上通過瀏覽器訪問下面的地址
http://192.168.15.111:30593/
3、 刪除Service
# 1、刪除service
[root@k8s-m-01 ~]# kubectl delete svc svc-nginx-1 -n dev
service "svc-nginx-1" deleted
# 2、刪除namespace
[root@k8s-m-01 ~]# kubectl delete ns dev
namespace "dev" deleted
4、配置方式
創(chuàng)建一個svc-nginx.yaml,內(nèi)容如下:
apiVersion: v1
kind: Service
metadata:
name: svc-nginx
namespace: dev
spec:
clusterIP: 10.109.179.231 #固定svc的內(nèi)網(wǎng)ip
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: nginx
type: ClusterIP
# 創(chuàng)建:kubectl create -f svc-nginx.yaml
# 刪除:kubectl delete -f svc-nginx.yaml
5、擴展(刪除默認空間及yam已創(chuàng)建的文件)
# 1、查看默認空間的服務
[root@k8s-m-01 ~]# kubectl get pod -n default
NAME READY STATUS RESTARTS AGE
django-54bb9d4cd6-nw4rn 1/1 Running 0 6s
nginx-6799fc88d8-mdgbc 1/1 Running 1 10h
zabbix-agent-bpnmj 1/1 Running 0 6m26s
zabbix-agent-p5lck 1/1 Running 0 23m
# 2、查看控制器
[root@k8s-m-01 ~]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
django 1/1 1 1 35m
nginx 1/1 1 1 2d22h
[root@k[root@k8s-m-01 ~]# kubectl get daemonsets
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
# 3、刪除服務所對應的控制器
[root@k8s-m-01 ~]# kubectl delete deployment nginx
deployment.apps "nginx" deleted
[root@k8s-m-01 ~]# kubectl delete deployment django
deployment.apps "django" deleted
[root@k8s-m-01 ~]# kubectl delete daemonsets.apps zabbix-agent
daemonset.apps "zabbix-agent" deleted
# 4、重新查看 (已刪除)
[root@k8s-m-01 ~]# kubectl get pod
6、小結
至此,已經(jīng)掌握了Namespace、Pod、Deployment、Service資源的基本操作,有了這些操作,就可以在kubernetes集群中實現(xiàn)一個服務的簡單部署和訪問了,但是如果想要更好的使用kubernetes,就需要深入學習這幾種資源的細節(jié)和原理。
浙公網(wǎng)安備 33010602011771號