溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

K8S高級應(yīng)用的實例分析

發(fā)布時間:2022-01-05 10:03:27 來源:億速云 閱讀:202 作者:柒染 欄目:云計算

K8S高級應(yīng)用的實例分析,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

一 滾動更新鏡像

1 通過命令直接指定鏡像更新

命令: kubectl set image deployment [x.deployment] 鏡像名稱=鏡像版本

例:創(chuàng)建一個nginx deployment nginx鏡像版本為1.10

cat nginx-deployment.yaml

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
      metadata:
        labels:
          app: nginx
      spec:
        containers:
        - name: nginx
          image: nginx:1.10
          ports:
          - containerPort: 80


kubectl create -f nginx-deployment.yaml

使用curl 訪問pod IP 查看nginx版本

curl -I  podIP

執(zhí)行更新鏡像操作 將nginx鏡像版本更新到nginx:1.11

kubectl set image deployment/nginx-deployment nginx=nginx:1.11

查看實時更新狀態(tài)

kubectl rollout status deployment/x.deployment

注:x.deployment請自行匹配你自己的deployment

也可以從描述信息中查看,描述信息里面會記錄完整的替換記錄

kubectl describe deploy/x.deployment

值得注意的是:更新完鏡像pod的IP 也會發(fā)生變化

2 修改配置更新鏡像版本

命令: kubectl edit deploy [x-deployment]

修改:image: nginx:1.10 的版本即可

然后通過訪問去驗證。

3 通過打補丁方式滾動更新

例擴容為5個副本
kubectl patch deployment [x-deployment]  -p '{"spec":{"replicas":5}}'

4 通過打補丁方式更新滾動更新策略

改變更新策略: 最大增加一個  最多不可用0個
kubectl pacth deployment [x-deployment] -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}'

5 金絲雀發(fā)布(即更新暫停)

以set image 為例子更新過程中暫停中
kubectl set image deploy x-deployment 鏡像名稱=鏡像版本 && kubectl pause deployment x-deployment 

繼續(xù)更新
kubectl rollout resume deployment x-deployment

6 查看 rs

kubectl get rs -o wide

二 查看歷史版本

命令 :kubectl rollout history deployment [x-deployment]

查看指定版本號查看詳細(xì)的image信息

命令:kubectl rollout history deployment [x-deployment] --revision=nu

--revisoin 指定歷史版本序號
三 版本回滾
1 回滾上一個版本
 命令:kubectl rollout undo deployment [x-deployment]

可以使用describe 查看回滾信息

2 回滾到指定版本

命令:kubectl rollout undo deployment [x-deployment]  --to-revision=n
n 是使用 kubectl rollout undo history deployment [x-deployment] 查看出來的版本序號,如果你不知道需要回滾的版本徐使用命令查看

同樣可以使用describe 查看回滾信息

四 自動擴容與縮容

自動擴容與縮容:是通過CPU閾值來控制:可以指定最小的數(shù)量和最多的數(shù)量

命令:kubectl autoscale deployment x-deployment --min=n --max=n --cpu-percent=n

x-deployment  需要自動擴容的deployment
--min         最小pod數(shù)量
--max         最大pod數(shù)量
--cpu-percent cpu閾值百分比

獲取 autoscale
kubectl delete hpa 


刪除 autoscale
kubectl delete hpa x-deployment

五 service 與pod

服務(wù)發(fā)布是通過標(biāo)簽進行關(guān)聯(lián),通常創(chuàng)建了pod外部是無法訪問的只能通過Podip進行訪問,服務(wù)發(fā)布是將Pod暴露的端口映射到宿主機上面可以實現(xiàn)外部通過宿主機ip進行訪問,能將兩者關(guān)聯(lián)到一起的便是標(biāo)簽的作用了。

類型     ExternalName, ClusterIP, NodePort, and LoadBalancer  

ExternalName  訪問外部應(yīng)用通過此方式,內(nèi)部dns能夠解析
ClusterIP      service IP 也是vip  service后面跟著 pod集群
NodePort       暴露node節(jié)點端口  k8s集群node可以訪問 
LoadBalancer    云服務(wù)的vlbaabs 可以通過 云原生負(fù)載均衡訪問到servie 和 pods
ClusterIP hanldless 模式  : 直接設(shè)置 ClusterIP 為 none

1 創(chuàng)建一個nginx deployment 在發(fā)布一個服務(wù)將nginx端口暴漏出去

pod deployment:

cat nginx-deployment.yaml 

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
      metadata:
        labels:
          app: nginx
      spec:
        containers:
        - name: nginx
          image: nginx:1.10
          ports:
          - containerPort: 80




kubectl create -f nginx-deployment.yaml
cat nginx-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx
spec:
  ports:
  - port: 88
    targetPort: 80
  selector:
    app: nginx



kubectl create -f nginx-service.yaml

2 查看與驗證

kubectl get svc  or  kubectl get svc nginx-service

會發(fā)現(xiàn)服務(wù)會生成一個虛擬VIP即是集群IP 和VIP的訪問端口,在容器節(jié)點上訪問 VIP:端口測試

3 查看服務(wù)相關(guān)聯(lián)的Pod和Pod暴漏的端口

kubectl get ep x-service

4 還可以設(shè)置同一源地址訪問到同一個pod上面

kubectl pacth svc myapp -p '{"spec:{"sessionAffinity":"ClientIp"}"}'

5 資源記錄如果有CoreDns

SVC_NAME.NS_NAME.DOMAIN.LTD.
svc.cluster.local.
示例: redis svc 記錄
redis.default.svc.cluster.local.

六 重啟策略

三種策略:

Always:當(dāng)容器終止退出后,總是重啟容器,默認(rèn)策略。

OnFailure:當(dāng)容器異常退出(退出狀態(tài)碼非0)時,才重啟容器。

Never:當(dāng)容器終止退出,從不重啟容器。

使用restartPolicy 字段定義

例:創(chuàng)建一個deployment 區(qū)循環(huán)運行一個命令,進去容器手動kill掉進程,觀察是否重啟

cat testrestart.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-test
  labels:
    test: centos
spec:
  containers:
  - name: hello
    image: centos:6
    command: ["bash","-c","while true;do date;sleep 1;done"]
  restartPolicy: OnFailure


kubectl create -f testrestart.yaml

測試步驟:

1 找到pod所在節(jié)點

kubectl get pod -o wide

2 在節(jié)點查看進程

 ps -ef | grep bash

3 手動kill

kill -9 進程ID

4 查看重啟次數(shù)

kubectl get pod -o wide  查看RESTART那一欄的重啟統(tǒng)計
或者
kubectl describe pod/pod-test 查看Restart Count 字段

注意:在使用describe時后面跟 pod 還是 deployment 是由yaml文件中 kind 決定的

七 Pod管理-健康檢查

1  Pod健康檢機制

提供Probe機制,有以下兩種類型:

livenessProbe

如果檢查失敗,將殺死容器,然后根據(jù)Pod的重啟策略來決定是否重啟。

readinessProbe

如果檢查失敗,Kubernetes會把Pod從服務(wù)代理的分發(fā)后端剔除

Probe支持以下三種檢查方法:

httpGet  發(fā)送HTTP請求,返回200-400范圍狀態(tài)碼為成功。

 exec  執(zhí)行Shell命令返回狀態(tài)碼是0為成功。

tcpSocket   發(fā)起TCP Socket建立成功。

例: HttpGET 為健康檢查的示例

vim health-httpget-test.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.10
    ports:
    - containerPort: 80
    livenessProbe:
      httpGet:
        path: /index.html
        port: 80

kubectl create -f health-httpget-test.yaml

測試單容器返回404 時容器是否重啟

1 進入容器刪除index.html文件

kubectl exec nginx-pod -it bash 
cd /usr/share/nginx/html/
rm -rf index.html

2 查看描述信息

kubectl describe pod/nginx-pod

K8S高級應(yīng)用的實例分析

從描述信息中可以看出,容器被檢查出404健康檢查機制kill原來的容器重新創(chuàng)建了一個,但是我們通過kubectl get pod -o wide 查看發(fā)現(xiàn)容器雖然被重新創(chuàng)建但是他的IP卻沒有變.

八  Pod Nodeport 管理

K8S 的Port 分為: port ,targetPort , nodePort

Port: 供給集群其他的Container訪問的端口

TargetPort:Pod中container 暴露的端口

nodePort:節(jié)點暴露端口

可以將宿主機的端口 映射個pod 從而進行訪問

例:將容器的pod端口映射到宿主機節(jié)點的20088端口

創(chuàng)建Pod:

cat port.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx10-pod
  labels:
    app: nginx10
spec:
  containers:
  - name: nginx10
    image: nginx:1.10
    ports:
    - name: http
      containerPort: 80
      hostIP: 0.0.0.0
      protocol: TCP
    - name: https
      containerPort: 443
      hostIP: 0.0.0.0
      protocol: TCP


kubectl create -f port.yaml

創(chuàng)建Service:

cat nginx-pod-service.yaml

kind: Service
apiVersion: v1
metadata:
  name: nginx-pod-service
spec:
  type: NodePort 
  selector:
    app: nginx10
  ports:
    - port: 8080 
      targetPort: 80 
      nodePort: 20088
      protocol: TCP 
      name: http
    - port: 8443
      targetPort: 443
      nodePort: 28443 
      protocol: TCP
      name: https

kubectl create -f nginx-pod-service.yaml

示例中的yaml文件定義了 宿主機的20088端口和28443端口 分別映射了Pod的80和443 端口,8080端口是進群內(nèi)的VIP

測試: 

1 找到容器所在容器

kubectl get pod -o wide

2 查看svc

kubectl get svc

3 訪問宿主機IP:20088

九 給集群設(shè)置固定IP

一個集群是需要一個vip做負(fù)載均衡的,在默認(rèn)不指定的時候會自動生成一個dhcp的進群ip,手動設(shè)置只需要修改ymal文件,增加clusterIP 字段即可,要設(shè)置為apiserver配置文件指定的IP段,最好不好與集群中其他的地址段相同。

創(chuàng)建一組web pod

cat nginx-deployment.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
      metadata:
        labels:
          app: nginx
      spec:
        containers:
        - name: nginx
          image: nginx:1.10
          ports:
          - containerPort: 80

創(chuàng)建服務(wù)并設(shè)置集群IP  10.1.110.111

cat nginx-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx
spec:
  ports:
  - port: 88
    targetPort: 80
  selector:
    app: nginx
  clusterIP: "10.1.110.111"

kubectl create -f nginx-service.yaml

查看集群IP是否設(shè)置成功

kubectl get svc

節(jié)點上測試通過集群IP是否能夠訪問到WEB

curl -I 10.1.110.111:88

通過查看日志查看都反問道那些節(jié)點

kubectl logs -l app=nginx   通過標(biāo)簽名字

十 查看Pod的環(huán)境變量

命令: kubectl exec [Pod名稱] env

十一 數(shù)據(jù)卷的使用

K8S的數(shù)據(jù)卷有十幾種支持,比如emptyDir ,hostPath 網(wǎng)絡(luò)數(shù)據(jù)卷包括nsf,iSCSI,Flocker glusterfs RBD cephfs gitRepo secret persistentVolumeClaim projected 等等。

今天簡單介紹一下emptyDir ,hostPath和nfs在k8s中的使用

1  emptyDir

當(dāng) Pod分配到Node時,首先創(chuàng)建一個空卷,并掛載到Pod中的容器,Pod中的容器可以讀寫數(shù)據(jù)卷中文件,當(dāng)Pod從節(jié)點中刪除emptyDir,該數(shù)據(jù)也會被刪除

cat emptyDir.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
  namespace: kube-system
spec:
  containers:
  - image: gcr.io/google_containers/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}

kubectl create -f emptyDir.yaml 

查看volume信息使用
kubectl describe pods test-pd -n kube-system

描述信息顯示 已經(jīng)創(chuàng)建了一個名為cache-volume的卷,卷的類型為EmptyDir 并且它的生命周期是依據(jù)pod的生命周期

2  hostPath

一個hostpath卷掛載Node文件系統(tǒng)上的文件或者目錄到Pod中的容器,掛在此類型目錄需要宿主機已經(jīng)存在的目錄(可以是 文件 ,文件夾,或者 socket )

cat hostPath.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: nginx:1.12
    name: test-container
    volumeMounts:
    - mountPath: /data
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      path: /home/test
      type: Directory
      # directory location on host
      #       path: /data 


kubectl create -f hostPath.yaml

/home/test  宿主機的目錄(需要已經(jīng)存在)
/data       容器的需要掛在的地方

詳細(xì)信息可以使用describe查看

驗證:

 容器中/data 目錄下創(chuàng)建文件

kubectl exec test-pd -it -- touch  /data/a.txt

 到容器宿主機相應(yīng)的目錄查看

ls /home/test/

3 網(wǎng)絡(luò)數(shù)據(jù)卷NFS

安裝NFS 

yum install -y nfs*&&systemctl start nfs

創(chuàng)建NFS共享目錄

mkdir /home/data

設(shè)置NFS共享 /home/data

vim /etc/exports
寫入 :/home/data    *(rw)

啟動nfs

systemctl start nfs

授權(quán)

chmod 777 -R  /home/data/

客戶端測試 (需要安裝showmount)

yum install -y showmount 

showmount -e nfs服務(wù)器IP

如果可以看到共享的目錄說明nfs網(wǎng)絡(luò)目錄可以使用

編輯yaml文件

cat nfs.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata: 
  name: nginx-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec: 
      containers:
      - name: nginx
        image: nginx:1.10
        volumeMounts:
        - name: wwwroot
          mountPath: /var/www/html
        ports:
        - containerPort: 80
      volumes:
      - name: wwwroot
        nfs: 
          server: 10.10.25.149
          path: /home/data

kubectl create -f nfs.yaml

驗證

進入到nfs目錄創(chuàng)建測試文件

cd /home/data/
touch index.html

查看pod是否掛在了目錄

kubectl exec nginx-deployment-8669f48cd4-4lvwd -it -- ls /var/www/html

編輯 index.html 文件

echo 'hello world' > /home/data/index.html

查看容器內(nèi)部的index.html文件和我們編輯的內(nèi)容是否相同

kubectl exec nginx-deployment-8669f48cd4-4lvwd -it -- cat /var/www/html/index.html

驗證銷毀Pod 數(shù)據(jù)時候存在

kubectl delete -f nfs.yaml
然后查看這個文件
cat /home/data/index.html

十二 externalIPs

externalIPs 通過svc創(chuàng)建,在指定的node上監(jiān)聽端口

創(chuàng)建 deployment

# cat nginx10-deployment.yaml 

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
      metadata:
        labels:
          app: nginx
      spec:
        containers:
        - name: nginx
          image: nginx:1.10
          ports:
          - containerPort: 80



kubectl create -f nginx10-deployment.yaml

創(chuàng)建service并設(shè)置externalIPs:

cat nginx-service.yaml 

kind: Service
apiVersion: v1
metadata:
  name: nginx-deploy-service
spec:
  type: NodePort 
  selector:
    app: nginx
  ports:
    - port: 8080 
      targetPort: 80 
      protocol: TCP 
      name: http
  externalIPs: 
      - 10.10.25.150

查看svc

kubectl get svc

此時即可通過制定node節(jié)點的IP和端口訪問.當(dāng)然集群內(nèi)serviceIP訪問不受影響.

十三 Pod資源限制

定義yaml文件pod的資源限制

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

關(guān)于K8S高級應(yīng)用的實例分析問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

k8s
AI