1. 程式人生 > 其它 >kubernetes集群系列資料06--pod介紹

kubernetes集群系列資料06--pod介紹

一、pod介紹

二、pod全生命週期

三、pod案例

##########K8S案例1---pod#############
#####init容器使用案例---視訊19有講解。
vim myapp.yaml  #包含init C的POD模板,該initC會解析2個域名。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
apiVersion: v1          #內容格式為group/apiversion,如果沒有給定group名稱則預設為core;
kind: Pod               #資源類別;
metadata:               #資源元資料;
    name: myapp-pod
    labels:
        app: myapp
    # annotations:      #主要目的是方便使用者閱讀查詢。
spec:                   #期望的狀態;
    containers:
    - name: myapp-container     #mainC容器,主要目的時輸出“The app is running”,然後等待3600s;
      image: busybox            #mainC容器的使用映象busybox:是一個封裝很多小工具的映象。
      command: ['sh','-c','echo The app is running! && sleep 3600'] #mainC容器中的執行命令。
    initContainers:             #為myapp-container建立初始化容器。
    - name: init-myservice
      image: busybox
      command: ['sh','-c','until nslookup myservice;do echo waiting for myservice;sleep 2;done;']  #執行命令:解析myservice直至其成功為止。
    - name: init-mydb
      image: busybox
      command: ['sh','-c','until nslookup mydb;do echo waiting for mydb;sleep 2;done;']
# status:             #當前狀態,本欄位有k8s自身維護,使用者不能去定義;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kubectl apply -f myapp.yaml
kubectl get pod                 #myapp-pod狀態為Init:0/2;其故障原因:解析myservice、mydb不成功,導致執行initC一直在重啟而不能進入下一步;
kubectl logs myapp-pod          #檢視myapp-pod的日誌;
kubectl describe pod myapp-pod  #檢視myapp-pod的詳細資訊,定位錯誤點;
kubectl edit pod myapp-pod      #修改pod的內容;該yaml檔案有些內容時不可更改,有些內容更改了也不能觸發initC的重新執行,但可通過修改image欄位會觸發initC的重新執行。
kubectl logs myapp-pod -c init-myservice  #檢視pod下定義的init-myservice服務的日誌。


# ##在node節點上傳busybox至harbor
# docker tag busybox:latest hub.atguigu.com/library/busybox:latest
# docker push hub.atguigu.com/library/busybox

vim myservice.yaml  #將myservice域名寫入coreDNS伺服器的POD;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
apiVersion: v1
kind: Service
metadata:
    name: myservice
spec:
    ports:
    - protocol: TCP
      port: 80
      targetPort: 9376
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kubectl apply -f myservice.yaml
ubectl get svc          #檢視建立的服務;
kubectl get pod -w      #一直監測pod的執行過程;


vim mydb.yaml  #將mydb域名寫入coreDNS伺服器的POD;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
apiVersion: v1
kind: Service
metadata:
    name: mydb
spec:
    ports:
    - protocol: TCP
      port: 80
      targetPort: 9377
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kubectl apply -f mydb.yaml



####檢測探針---就緒檢測
docker pull mylandmarktech/myapp
docker tag mylandmarktech/myapp hub.atguigu.com/library/mylandmarktech/myapp:v1


vim readinessProbe-httpget.yaml  #通過確認容器是否能訪問index1.html來判斷容器nginx是否就緒。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
apiVersion: v1
kind: Pod
metadata:
    name: readiness-httpget-pod
    namespace: default
spec:
    containers:
    - name: readiness-httpget-container
      image: hub.atguigu.com/library/nginx
      imagePullPolicy: IfNotPresent   #若本地存在image則不需下載;
      readinessProbe:
        httpGet:
            port: 80
            path: /index1.html
        initialDelaySeconds: 1
        periodSeconds: 3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kubectl apply -f readinessProbe-httpget.yaml
kubectl exec -it readiness-httpget-pod -- /bin/sh   #進入pod的單一容器內部,進入互動式操作。
kubectl exec -it readiness-httpget-pod  -c k8s_readiness-httpget-container_readiness-httpget-pod_default_0c0c5c17-895c-4353-8930-fe4730aecaa7_0 -- /bin/sh  #若pod中只有一個容器則可不需使用“-c ”引數指定容器。
kubectl exec -it readiness-httpget-pod ls /usr/share/nginx/html  #無引數可省略--。
kubectl exec -it readiness-httpget-pod -- ls -l /usr/share/nginx/html  #要加-- 號,不然shell命令中的引數,不能識別;
kubectl exec -it readiness-httpget-pod -- echo "123" >/usr/share/nginx/html/index1.html  #無法實現直接建立檔案???



####檢測探針---存活檢測
vim livenessProbe-exec.yaml  #容器不斷建立檔案後刪除,通過檢測該檔案是否存在來確認容器為正常存活狀態,若不存在則重新建立pod;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
apiVersion: v1
kind: Pod
metadata:
    name: liveness-exec-pod
    namespace: default
spec:
    containers:
    - name: liveness-exec-container
      image: hub.atguigu.com/library/busybox
      imagePullPolicy: IfNotPresent
      command: ["/bin/sh","-c","touch /tmp/live;sleep 60;rm -rf /tmp/live;sleep 3600"]
      livenessProbe:
        exec:
            command: ["test","-e","/tmp/live"]
        initialDelaySeconds: 1
        periodSeconds: 3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kubectl apply -f livenessProbe-exec.yaml
kubectl exec -it liveness-exec-pod -- ls -l /tmp/live  #檢視檔案是否存活來判斷pod是否正常執行;
kubectl get pod -w #監控pod是否被反覆重啟,若pod退出會自動重啟。

vim livenessProbe-httpget.yaml  #
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
apiVersion: v1
kind: Pod
metadata:
    name: liveness-httpget-pod
    namespace: default
spec:
    containers:
    - name: liveness-httpget-container
      image: hub.atguigu.com/library/nginx
      imagePullPolicy: IfNotPresent
      ports:
      - name: http
        containerPort: 80
      livenessProbe:
        httpGet:
            port: http
            path: /index.html
        initialDelaySeconds: 1
        periodSeconds: 3
        timeoutSeconds: 10
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kubectl apply -f livenessProbe-httpget.yaml
kubectl exec -it liveness-httpget-pod -- rm -f /usr/share/nginx/html/index.html  #檢視檔案是否存活來判斷pod是否正常執行;
kubectl get pod -w #監控pod是否被重啟1次,若pod退出會自動重啟。





vim livenessProbe-tcp.yaml
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
apiVersion: v1
kind: Pod
metadata:
    name: liveness-tcp-pod
    namespace: default
spec:
    containers:
    - name: liveness-tcp-container
      image: hub.atguigu.com/library/nginx
      imagePullPolicy: IfNotPresent
      livenessProbe:
        tcpSocket:
            port: 80
        initialDelaySeconds: 5  #等5秒後開始存活檢測;
        periodSeconds: 3        #未成功檢測再過3秒後檢測;
        timeoutSeconds: 1       #存活檢測超時時間為1s,若仍不能檢測到埠,則重啟POD;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kubectl apply -f livenessProbe-tcp.yaml
docker stop k8s_liveness-tcp-container_liveness-tcp-pod_default_4794b8bf-4ddb-4e0b-b07b-cec04dfa99f0_0;docker ps -a #在工作節點停止容器後進行檢視容器是否被重啟;
kubectl get pod -w #監控pod是否被重啟1次。

####啟動、退出動作

vim start-stop.yaml
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
apiVersion: v1
kind: Pod
metadata:
    name: lifecycle-demo
    namespace: default
spec:
    containers:
    - name: lifecycle-demo-container
      image: hub.atguigu.com/library/nginx:latest
      lifecycle:
        postStart:
            exec:
                command: ["/bin/sh","-c","echo Hello from the postStart handler > /usr/share/message"]
        preStop:
            exec:
                command: ["/bin/sh","-c","echo Hello from the poststop handler > /usr/share/message"]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kubectl apply -f start-stop.yaml
kubectl exec -it lifecycle-demo -- exit && cat /usr/share/message #檢視容器啟動成功後輸出的日誌資訊。

##########K8S案例1---pod#############