日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

k8s之pod管理

發(fā)布時間:2024/9/3 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 k8s之pod管理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Pod是可以創(chuàng)建和管理Kubernetes計算的最小可部署單元,一個Pod代表著集群中運(yùn)行的一個進(jìn)程,每個pod都有一個唯一的ip。

一個pod類似一個豌豆莢,包含一個或多個容器(通常是docker),多個容器間共享IPC、Network和UTC namespace。

參考地址:pod命令行管理

一、創(chuàng)建和刪除pod應(yīng)用

實驗環(huán)境:
server1作為本地倉庫,server2作為master,server3,server4作為node節(jié)點(diǎn)
實驗前要保證保證倉庫正常運(yùn)行

[root@server1 harbor]# docker-compose ps


節(jié)點(diǎn)狀態(tài)ready

[root@server2 ~]# kubectl get nod


1 創(chuàng)建pod

此時要保證你所使用的鏡像myapp,在本地倉庫存在才行。

[root@server2 ~]# kubectl run nginx --image=myapp:v1 [root@server2 ~]# kubectl get pod

當(dāng)出現(xiàn)下圖狀態(tài)時說明創(chuàng)建成功。

2 查看pod運(yùn)行在哪個節(jié)點(diǎn)上,且查看分配的ip地址

[root@server2 ~]# kubectl get pod -o wide

3 訪問分配的ip

集群內(nèi)部任意節(jié)點(diǎn)可以訪問Pod,但集群外部無法直接訪問。

[root@server2 ~]# curl 10.244.2.21


測試:
這時我們再創(chuàng)建一個pod,到容器內(nèi)進(jìn)行訪問

[root@server2 ~]# kubectl run demo --image=busyboxplus -it If you don't see a command prompt, try pressing enter. / # ip addr

[root@server2 ~]# kubectl get pod -o wide

這時我們發(fā)現(xiàn)容器內(nèi)的ip和容器外的ip相同

再次進(jìn)入容器我們訪問剛才myapp的ip,查看結(jié)果

[root@server2 ~]# kubectl attach demo -i -t / # curl 10.244.2.21

4 刪除pod

刪除pod的命令

[root@server2 ~]# kubectl delete pod nginx

使用下面命令可以查看正在運(yùn)行的pod的詳細(xì)信息

[root@server2 ~]# kubectl describe pod demo

5.查看日志的命令

[root@server2 ~]# kubectl logs demo

6 通過控制器創(chuàng)建pod

一般我們不會使用剛才演示的那種單獨(dú)創(chuàng)建的方式

[root@server2 ~]# kubectl create deployment nginx --image=myapp:v1 [root@server2 ~]# kubectl get all

這里如果我們進(jìn)行刪除的話,它是不會直接被刪除的,他會刪除之后,自動重新創(chuàng)建出來一個新的副本。只是隨機(jī)id發(fā)生變化

二、Pod擴(kuò)容與縮容

[root@server2 ~]# kubectl scale deployment --replicas=2 nginx [root@server2 ~]# kubectl get pod -o wide

三、 service(微服務(wù))

service是一個抽象概念,定義了一個服務(wù)的多個pod邏輯合集和訪問pod的策略,一般把service稱為微服務(wù)。

1.創(chuàng)建service

[root@server2 ~]# kubectl expose deployment nginx --port=80 [root@server2 ~]# kubectl get svc [root@server2 ~]# curl 10.100.138.138

此時pod客戶端可以通過service的名稱訪問后端的兩個Pod
ClusterIP: 默認(rèn)類型,自動分配一個僅集群內(nèi)部可以訪問的虛擬IP


2 查看svc詳細(xì)信息

[root@server2 ~]# kubectl describe svc nginx

這里的ip對應(yīng)pod的副本ip

會根據(jù)副本數(shù)自動實現(xiàn)副本負(fù)載均衡

3.修改暴露類型

NodePort: 在ClusterIP基礎(chǔ)上為Service在每臺機(jī)器上綁定一個端口,這樣就可以通過 NodeIP:NodePort 來訪問該服務(wù)

[root@server2 ~]# kubectl edit svc nginx

將類型改成NodePort

[root@server2 ~]# kubectl get svc


在外部訪問時,用的是節(jié)點(diǎn)ip+端口訪問

[root@Sun_s Desktop]# curl 172.25.1.2:30224/hostname.html

4 更新及回滾pod鏡像

[root@server2 ~]# kubectl set image deployment nginx myapp=myapp:v2 --record #更新 [root@server2 ~]# kubectl rollout undo deployment nginx --to-revision=1 #回滾 [root@server2 ~]# kubectl rollout history deployment nginx //查看歷史版本 [root@server2 ~]# curl 10.100.138.138

四、資源清單

1.清單格式

清單格式
apiVersion: group/version  //指明api資源屬于哪個群組和版本,同一個組可以有多個版本
$ kubectl api-versions //查詢命令
kind: //標(biāo)記創(chuàng)建的資源類型,k8s主要支持以下資源類別
Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob
metadata: //元數(shù)據(jù)
name: //對像名稱
namespace: //對象屬于哪個命名空間
labels: //指定資源標(biāo)簽,標(biāo)簽是一種鍵值數(shù)據(jù)
spec: //定義目標(biāo)資源的期望狀態(tài)

2. 參數(shù)信息





3 查看幫助

[root@server2 ~]# kubectl api-versions ## 查看所有api的版本信息 [root@server2 ~]# kubectl explain pod.spec.containers ## pod清單幫助 一層一層看

4 刪除之前創(chuàng)建的

[root@server2 ~]# kubectl delete deployments.apps nginx [root@server2 ~]# kubectl delete svc nginx

5 編寫創(chuàng)建pod 的api文件

[root@server2 ~]# vim pod.yml apiVersion: v1 kind: Pod metadata:name: nginxnamespace: default spec:containers:- name: nginximage: myapp:v1imagePullPolicy: IfNotPresent [root@server2 ~]# kubectl apply -f pod.yml [root@server2 ~]# kubectl get pod

6 刪除

[root@server2 ~]# kubectl delete -f pod.yml

7.編寫創(chuàng)建deployment api文件

[root@server2 ~]# vim deployment.yml apiVersion: apps/v1 kind: Deployment metadata:name: nginxnamespace: default spec:replicas: 3selector:matchLabels:run: nginxtemplate:metadata:labels:run: nginxspec:containers:- name: nginximage: myapp:v1imagePullPolicy: IfNotPresent [root@server2 ~]# kubectl apply -f deployment.yml [root@server2 ~]# kubectl get pod

8.將運(yùn)行中的pod轉(zhuǎn)換成yml格式

[root@server2 ~]# kubectl get pod nginx-b5548c7c4-4phr9 -o yaml

9 優(yōu)化

[root@server2 ~]# vim deployment.yml apiVersion: apps/v1 kind: Deployment metadata:name: nginxnamespace: default spec:replicas: 2selector:matchLabels:run: nginxtemplate:metadata:labels:run: nginxspec:#nodeSelector:# kubernetes.io/hostname: server4 nodeName: server3 #增加標(biāo)簽選擇器#hostNetwork: true #使用主機(jī)網(wǎng)絡(luò),注意端口不能沖突containers:- name: nginximage: myapp:v1imagePullPolicy: IfNotPresentresources:requests:cpu: 100m #最小限制;十分之一cpu資源,也可以寫成0.1memory: 70Milimits: #上限,超出被控制器殺死cpu: 0.5memory: 512Mi [root@server2 ~]# kubectl apply -f deployment.yml [root@server2 ~]# kubectl get pod -o wide [root@server2 ~]# kubectl describe pod

全部在server3節(jié)點(diǎn)上

10.自主式Pod資源清單

在之前的基礎(chǔ)上再加一個容器進(jìn)來

containers:- name: nginximage: myapp:v1imagePullPolicy: IfNotPresentresources:requests:cpu: 100m #最小限制;十分之一cpu資源,也可以寫成0.1memory: 70Milimits: #上限,超出被控制器殺死cpu: 0.5memory: 512Mi- name: busyboxplusimage: busyboxplusimagePullPolicy: IfNotPresentstdin: truetty: true [root@server2 ~]# kubectl apply -f deployment.yml [root@server2 ~]# kubectl get pod

這時我們看到有兩個容器

運(yùn)行的時候使用-c 指定容器

[root@server2 ~]# kubectl attach nginx-585f596658-gcd89 -c busyboxplus -it If you don't see a command prompt, try pressing enter. / # curl localhost Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

11.標(biāo)簽

主要在控制器中使用,可以在節(jié)點(diǎn)上或pod打標(biāo)簽

[root@server2 ~]# kubectl get pod --show-labels #查看標(biāo)簽 [root@server2 ~]# kubectl label pod nginx-585f596658-gcd89 version=v1 ## 打標(biāo)簽 [root@server2 ~]# kubectl label pod nginx-585f596658-gcd89 version=v2 --overwrite ##更改標(biāo)簽 [root@server2 ~]# kubectl get pod -l version ##過濾標(biāo)簽



節(jié)點(diǎn)標(biāo)簽選擇器

$ kubectl label nodes server2 disktype=ssd node/server2 labeled $ kubectl get nodes -l disktype NAME STATUS ROLES AGE VERSION server2 Ready <none> 6d v1.17.2

在yaml文件中增加標(biāo)簽選擇器

nodeSelector:disktype: ssd

五、pod的生命周期


參考網(wǎng)站:kubernetes官網(wǎng)

(1)Pod 可以包含多個容器,應(yīng)用運(yùn)行在這些容器里面,同時 Pod 也可以有一個或多個先于應(yīng)用容器啟動的 Init 容器。

(2)Init 容器與普通的容器非常像,除了如下兩點(diǎn):

  • 它們總是運(yùn)行到完成。
  • Init 容器不支持 Readiness,因為它們必須在 Pod 就緒之前運(yùn)行完成,每個 Init 容器必須運(yùn)行成功,下一個才能夠運(yùn)行。

(3)如果 Pod 的 Init 容器失敗,Kubernetes 會不斷地重啟該 Pod,直到 Init 容器成功為止。然而,如果 Pod 對應(yīng)的 restartPolicy 值為 Never,它不會重新啟動。

Init 容器能做什么?

Init 容器可以包含一些安裝過程中應(yīng)用容器中不存在的實用工具或個性化代碼。
Init 容器可以安全地運(yùn)行這些工具,避免這些工具導(dǎo)致應(yīng)用鏡像的安全性降低。
應(yīng)用鏡像的創(chuàng)建者和部署者可以各自獨(dú)立工作,而沒有必要聯(lián)合構(gòu)建一個單獨(dú)的應(yīng)用鏡像。
Init 容器能以不同于Pod內(nèi)應(yīng)用容器的文件系統(tǒng)視圖運(yùn)行。因此,Init容器可具有訪問 Secrets 的權(quán)限,而應(yīng)用容器不能夠訪問。
由于 Init 容器必須在應(yīng)用容器啟動之前運(yùn)行完成,因此 Init 容器提供了一種機(jī)制來阻塞或延遲應(yīng)用容器的啟動,直到滿足了一組先決條件。一旦前置條件滿足,Pod內(nèi)的所有的應(yīng)用容器會并行啟動。

使用啟動探測器保護(hù)慢啟動容器

[root@server2 ~]# vim init.yml apiVersion: v1 kind: Pod metadata:name: myapp-podlabels:app: myapp spec:containers:- name: myapp-containerimage: myapp:v1initContainers:- name: init-myserviceimage: busyboxpluscommand: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"] [root@server2 ~]# vim service.yml --- apiVersion: v1 kind: Service metadata:name: myservice spec:ports:- protocol: TCPport: 80targetPort: 80 [root@server2 ~]# kubectl create -f init.yml [root@server2 ~]# kubectl get pod [root@server2 ~]# kubectl create -f service.yml [root@server2 ~]# kubectl get pod

initContainers檢測機(jī)制檢測到myservice.default.svc.cluster.local,才會run

探針

探針 是由 kubelet 對容器執(zhí)行的定期診斷:

  • ExecAction:在容器內(nèi)執(zhí)行指定命令。如果命令退出時返回碼為 0 則認(rèn)為診斷成功。
  • TCPSocketAction:對指定端口上的容器的 IP 地址進(jìn)行 TCP 檢查。如果端口打開,則診斷被認(rèn)為是成功的。
  • HTTPGetAction:對指定的端口和路徑上的容器的 IP 地址執(zhí)行 HTTP Get 請求。如果響應(yīng)的狀態(tài)碼大于等于200 且小于 400,則診斷被認(rèn)為是成功的。

每次探測都將獲得以下三種結(jié)果之一:

  • 成功:容器通過了診斷。
  • 失敗:容器未通過診斷。
  • 未知:診斷失敗,因此不會采取任何行動

Kubelet 可以選擇是否執(zhí)行在容器上運(yùn)行的三種探針執(zhí)行和做出反應(yīng):
livenessProbe:指示容器是否正在運(yùn)行。如果存活探測失敗,則 kubelet 會殺死容器,并且容器將受到其 重啟策略 的影響。如果容器不提供存活探針,則默認(rèn)狀態(tài)為 Success。

readinessProbe:指示容器是否準(zhǔn)備好服務(wù)請求。如果就緒探測失敗,端點(diǎn)控制器將從與 Pod 匹配的所有 Service 的端點(diǎn)中刪除該 Pod 的 IP 地址。初始延遲之前的就緒狀態(tài)默認(rèn)為 Failure。如果容器不提供就緒探針,則默認(rèn)狀態(tài)為 Success。

startupProbe: 指示容器中的應(yīng)用是否已經(jīng)啟動。如果提供了啟動探測(startup probe),則禁用所有其他探測,直到它成功為止。如果啟動探測失敗,kubelet 將殺死容器,容器服從其重啟策略進(jìn)行重啟。如果容器沒有提供啟動探測,則默認(rèn)狀態(tài)為成功Success。

定義存活命令

許多長時間運(yùn)行的應(yīng)用程序最終會過渡到斷開的狀態(tài),除非重新啟動,否則無法恢復(fù)。 Kubernetes 提供了存活探測器來發(fā)現(xiàn)并補(bǔ)救這種情況。

[root@server2 ~]# vim live.yml apiVersion: v1 kind: Pod metadata:labels:test: livenessname: liveness-exec spec:containers:- name: livenessimage: busyboxplusargs:- /bin/sh- -c- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600livenessProbe:exec:command:- cat- /tmp/healthyinitialDelaySeconds: 5periodSeconds: 5

這個容器生命的前 30 秒, /tmp/healthy 文件是存在的。 所以在這最開始的 30 秒內(nèi),執(zhí)行命令 cat /tmp/healthy 會返回成功代碼。 30 秒之后,執(zhí)行命令 cat /tmp/healthy 就會返回失敗代碼。

創(chuàng)建 Pod:

[root@server2 ~]# kubectl create -f live.yml

在 30 秒內(nèi),查看 Pod 的事件:

[root@server2 ~]# kubectl describe pod liveness-exec

35 秒之后,再來看 Pod 的事件:

[root@server2 ~]# kubectl describe pod liveness-exec

在輸出結(jié)果的最下面,有信息顯示存活探測器失敗了,這個容器被殺死并且被重建了。

再等另外 30 秒,檢查看這個容器被重啟了:

[root@server2 ~]# kubectl get pod liveness-exec

輸出結(jié)果顯示 RESTARTS 的值增加了 1。

定義就緒 存活探測器

[root@server2 ~]# kubectl delete -f live.yml [root@server2 ~]# kubectl create -f live.yml [root@server2 ~]# kubectl get pod

這里顯示沒有就緒


這時我們進(jìn)入到交互頁面創(chuàng)建發(fā)布頁面

[root@server2 ~]# kubectl exec -it liveness-exec -- sh / # cd /usr/share/nginx/ /usr/share/nginx # ls html /usr/share/nginx # cd html/ /usr/share/nginx/html # ls 50x.html index.html /usr/share/nginx/html # touch test.html

我們退出交互之后,再次查看,看到已經(jīng)準(zhǔn)備就緒

重啟策略

PodSpec 中有一個 restartPolicy 字段,可能的值為 Always、OnFailure 和 Never。默認(rèn)為 Always。

Pod 的生命

一般Pod 不會消失,直到人為銷毀他們,這可能是一個人或控制器。

建議創(chuàng)建適當(dāng)?shù)目刂破鱽韯?chuàng)建 Pod,而不是直接自己創(chuàng)建 Pod。因為單獨(dú)的 Pod 在機(jī)器故障的情況下沒有辦法自動復(fù)原,而控制器卻可以。

三種可用的控制器:
使用 Job 運(yùn)行預(yù)期會終止的 Pod,例如批量計算。Job 僅適用于重啟策略為 OnFailure 或 Never 的 Pod。
對預(yù)期不會終止的 Pod 使用 ReplicationController、ReplicaSet 和 Deployment ,例如 Web 服務(wù)器。 ReplicationController 僅適用于具有 restartPolicy 為 Always 的 Pod。
提供特定于機(jī)器的系統(tǒng)服務(wù),使用 DaemonSet 為每臺機(jī)器運(yùn)行一個 Pod 。

總結(jié)

以上是生活随笔為你收集整理的k8s之pod管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。