k8s實踐(三):pod常用操作

環境說明:

主機名 操作系統版本 ip docker version kubelet version 備註
master Centos 7.6.1810 172.27.9.131 Docker 18.09.6 V1.14.2 master主機
node01 Centos 7.6.1810 172.27.9.135 Docker 18.09.6 V1.14.2 node節點
node02 Centos 7.6.1810 172.27.9.136 Docker 18.09.6 V1.14.2 node節點

k8s集羣部署詳見:Centos7.6部署k8s(v1.14.2)集羣
k8s學習資料詳見:基本概念、kubectl命令和資料分享

一、 pod簡介

1. pod概覽

Pod是kubernetes中你可以創建和部署的最小也是最簡單位。一個Pod代表着集羣中運行的一個進程。
Pod中封裝着應用的容器(有的情況下是好幾個容器),存儲、獨立的網絡IP,管理容器如何運行的策略選項。Pod代表着部署的一個單位:kubernetes中應用的一個實例,可能由一個或者多個容器組合在一起共享資源

 

在Kubrenetes集羣中Pod有如下兩種使用方式:

  • 一個Pod中運行一個容器。“每個Pod中一個容器”的模式是最常見的用法:在這種使用方式中,你可以把Pod想象成是單個容器的封裝,kuberentes管理的是Pod而不是直接管理容器。
  • 在一個Pod中同時運行多個容器。一個Pod中也可以同時封裝幾個需要緊密耦合互相協作的容器,它們之間共享資源。這些在同一個Pod中的容器可以互相協作成爲一個service單位——一個容器共享文件,另一個“sidecar”容器來更新這些文件。Pod將這些容器的存儲資源作爲一個實體來管理。

2. pod網絡

由於一個pod中的容器運行於相同的Network命名空間中,因此它們共享相同的IP地址和端口空間。當兩個pod彼此之間發送網絡數據包時,它們都會將對方的實際IP地址看作數據包中的源IP。

k8s實踐(三):pod常用操作

pod 是邏輯主機,其行爲與非容器世界中的物理主機或虛擬機非常相似。此外,運行在同一個pod中的進程與運行在同一物理機或虛擬機上的進程相似,只是每個進程都封裝在一個容器之中。

二、創建pod的兩種方式

1. 命令方式

[root@master ~]# kubectl run kubia --image=luksa/kubia --replicas=3 
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/kubia created

kubia指定deployment名字(本文pod的創建不論命令還是文件方式都使用Controller deployment),--image=luksa/kubia顯示的是指定要運行的鏡像,--replicas=3指定副本數爲3

k8s實踐(三):pod常用操作

先創建deployment:nginx-deployment,再創建replicasets:kubia-66c8b6d4fc,最後創建三個pod:kubia-66c8b6d4fc-cdzzg、kubia-66c8b6d4fc-ff9f8和kubia-66c8b6d4fc-xtcmm,3個pod分別位於3個node節點上。

2. 文件方式

[root@master ~]# more nginx-master.yml 
apiVersion: extensions/v1beta1  #描述文件遵循extensions/v1beta1版本的Kubernetes API
kind: Deployment                                #創建資源類型爲Deployment
metadata:                                               #該資源元數據
  name: nginx-master                       #Deployment名稱
spec:                                                       #Deployment的規格說明
  replicas: 3                                       #指定副本數爲3
  template:                                         #定義Pod的模板
    metadata:                                   #定義Pod的元數據
      labels:                                       #定義label(標籤)
        app: nginx                          #label的key和value分別爲app和nginx
    spec:                                           #Pod的規格說明
      containers:               
      - name: nginx                   #容器的名稱
        image: nginx:latest     #創建容器所使用的鏡像

執行創建命令

[root@master ~]# kubectl create -f nginx-master.yaml 
deployment.extensions/nginx-master created

查看創建的資源

k8s實踐(三):pod常用操作

3. 進入pod

進入pod kubia-66c8b6d4fc-cdzzg

[root@master ~]# kubectl exec -it kubia-66c8b6d4fc-cdzzg bash

類似docker,使用kubectl exec命令進入容器

k8s實踐(三):pod常用操作

容器的ip和主機名同pod

三、標籤

標籤其實就一對 key/value,可以附加到資源的任意鍵值對,標籤可以用來劃分特定組的對象,用以選擇具有該確切標籤的資源。

1. pod使用標籤

pod指定標籤

[root@master ~]# kubectl run http-label --image=httpd --labels="app=web,env=prod"
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/http-label created

指定pod的標籤爲'app=web和env=prod'

 

查看pod的標籤

[root@master ~]# kubectl get pod --show-labels  

k8s實踐(三):pod常用操作

通過--show-labels參數可查看pod的標籤

 

通過標籤篩選pod

[root@master ~]# kubectl get pod -l app --show-labels 
NAME                           READY   STATUS    RESTARTS   AGE    LABELS
http-label-7cf498876f-rhqxf    1/1     Running   0          107s   app=web,env=prod,pod-template-hash=7cf498876f
nginx-master-9d4cf4f77-cg47g   1/1     Running   1          46h    app=nginx,pod-template-hash=9d4cf4f77
nginx-master-9d4cf4f77-lflck   1/1     Running   1          46h    app=nginx,pod-template-hash=9d4cf4f77
nginx-master-9d4cf4f77-w4xgb   1/1     Running   1          46h    app=nginx,pod-template-hash=9d4cf4f77

通過-l app參數可篩選所有標籤爲app的pod

 

修改現有標籤

[root@master ~]# kubectl label pod http-label-7cf498876f-rhqxf env=debug  --overwrite 
pod/http-label-7cf498876f-rhqxf labeled

k8s實踐(三):pod常用操作

將pod http-label-7cf498876f-rhqxf的標籤env由prod更改爲debug

 

刪除標籤

[root@master ~]#  kubectl label pod http-label-7cf498876f-rhqxf env-
pod/http-label-7cf498876f-rhqxf labeled

k8s實踐(三):pod常用操作

將pod http-label-7cf498876f-rhqxf的標籤env刪除

2. 通過標籤指定pod創建的節點

給node節點打標籤

k8s實踐(三):pod常用操作

分別給節點打上標籤node=master、node=node01、node=node02

 

指定node創建pod

[root@master ~]# more httpd-node.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: httpd-node
spec:
  template:
    metadata:
      labels:
        env: prod
    spec:
      containers:
      - name: httpd-node
        image: httpd:latest
      nodeSelector:
        node: master
[root@master ~]# kubectl apply -f httpd-node.yaml 

指定pod的label爲env:prod,node節點爲master

k8s實踐(三):pod常用操作

四、命名空間

Namespace是對一組資源和對象的抽象集合,比如可以用來將系統內部的對象劃分爲不同的項目組或用戶組。常見的pods, services, replication controllers和deployments等都是屬於某一個namespace的(默認是default)

1. 查看命名空間

[root@master ~]# kubectl  get ns
NAME              STATUS   AGE
default           Active   37d
kube-node-lease   Active   46h
kube-public       Active   37d
kube-system       Active   37d

其中命名空間kube-node-lease發佈於1.14的beta版本,被kubelet用作確定節點運行狀況。

2. 查看指定命名空間的pod

[root@master ~]# kubectl get po -n kube-system 
NAME                                    READY   STATUS    RESTARTS   AGE
busybox03-5b4cb76f96-jg8f8              1/1     Running   4          5d22h
coredns-fb8b8dccf-bxvrz                 1/1     Running   24         37d
coredns-fb8b8dccf-mqvd8                 1/1     Running   24         37d
etcd-master                             1/1     Running   26         37d
fluentd-elasticsearch-928nt             1/1     Running   21         29d
fluentd-elasticsearch-gw5tx             1/1     Running   30         29d
fluentd-elasticsearch-n4mc6             1/1     Running   26         29d
kube-apiserver-master                   1/1     Running   26         37d
kube-controller-manager-master          1/1     Running   31         37d
kube-flannel-ds-amd64-lkh5n             1/1     Running   30         35d
kube-flannel-ds-amd64-pv5ll             1/1     Running   24         36d
kube-flannel-ds-amd64-wnn5g             1/1     Running   36         36d
kube-proxy-42vb5                        1/1     Running   26         37d
kube-proxy-7nrfk                        1/1     Running   30         35d
kube-proxy-x7dmk                        1/1     Running   35         36d
kube-scheduler-master                   1/1     Running   32         37d
kubernetes-dashboard-7b87f5bdd6-7d5s8   1/1     Running   4          5d18h

該命令也可寫作爲:'kubectl get pod --namespace=kube-system'

3. 創建命名空間

文件方式
創建test01-namespace

[root@master ~]# more test01-namespace.yaml 
apiVersion: v1
kind: Namespace
metadata: 
  name: test01-namespace
[root@master ~]# kubectl apply -f test01-namespace.yaml 
namespace/test01-namespace created

kubectl apply和kubectl create命令類似,都可以根據文件創建相關資源。

 

命令方式
創建test02-namespace

[root@master ~]# kubectl create ns test02-namespace
namespace/test02-namespace created

k8s實踐(三):pod常用操作

4. pod指定命名空間

[root@master ~]# kubectl run httpd --image=httpd -n test01-namespace 
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/httpd created
[root@master ~]# kubectl get pod -o wide -n test01-namespace 
NAME                    READY   STATUS              RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES
httpd-6b77d6648-zqnv4   0/1     ContainerCreating   0          27s   <none>   node01   <none>           <none>

指定創建pod的命名空間爲test01-namespace,查詢pod是需帶上命名空間。

命名空間切換

[root@master ~]# alias kcd='kubectl config set-context $(kubectl config current-context) --namespace'
[root@master ~]# kcd test01-namespace
Context "kubernetes-admin@kubernetes" modified.
[root@master ~]# kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
httpd-6b77d6648-zqnv4   1/1     Running   0          5m6s

配置kcd,通過kcd namespace可切換命名空間。

五、擴容/縮容

創建文件nginx-scale.yaml並新建資源

k8s實踐(三):pod常用操作

新建deployment nginx-scale,pod副本數爲3

 

文件方式

k8s實踐(三):pod常用操作

通過修改文件中參數replicas的值並重新執行kubectl apply命令即可實現pod的擴縮容

 

命令方式

[root@master ~]# kubectl scale deployment nginx-scale --replicas=1
deployment.extensions/nginx-scale scaled

k8s實踐(三):pod常用操作

通過命令將pod副本數縮容爲1

六、failover

1. pod節點分佈查看

k8s實踐(三):pod常用操作

2. failover測試

節點node02關機

[root@node02 ~]# init 0

查看node狀態和pod分佈

k8s實踐(三):pod常用操作

node02狀態爲NotReady且之前在該節點的pod被遷移至master或者node01,當node02恢復後,運行在該節點的Pod會被刪除,且遷移至master和node01的Pod不會重新調度回到node02。

七、升級及回滾

1. 創建deployment

[root@master ~]# more nginx-roll.yaml                                             
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-roll
  namespace: test02-namespace
spec:
  selector:
    matchLabels:
      env: prod
  replicas: 3
  template:
    metadata:
      labels:
        env: prod
    spec:
      containers:
      - name: nginx-roll
        image: nginx:1.16
[root@master ~]# kubectl apply -f nginx-roll.yaml --record                        
deployment.apps/nginx-roll created

創建deployment nginx-roll,副本數爲3,namespace爲test02-namespace,nginx版本爲1.16,--record參數會記錄歷史版本號

  

Deployment apiVersion版本說明:

  • 1.6版本之前 apiVsersion:extensions/v1beta1
  • 1.6版本到1.9版本之間:apps/v1beta1
  • 1.9版本之後:apps/v1

   

查看部署狀態

[root@master ~]# kubectl rollout status deployment -n test02-namespace nginx-roll
Waiting for deployment "nginx-roll" rollout to finish: 0 of 3 updated replicas are available...
Waiting for deployment "nginx-roll" rollout to finish: 1 of 3 updated replicas are available...
Waiting for deployment "nginx-roll" rollout to finish: 2 of 3 updated replicas are available...
deployment "nginx-roll" successfully rolled out

k8s實踐(三):pod常用操作

 

查看pod

k8s實踐(三):pod常用操作

分別查看deployment、replicaset、pod

2. 升級

升級方式有多種,比如'kubectl edit deployments -n test02-namespace nginx-roll'方式、直接修改nginx-roll.yaml文件方式、kubectl set image方式等

 

修改文件方式

[root@master ~]# sed -i 's/image: nginx:1.16/image: nginx:1.17/g' nginx-roll.yaml
[root@master ~]# kubectl apply -f nginx-roll.yaml 
deployment.apps/nginx-roll configured

將nginx-roll.yaml中nginx鏡像版本修改爲1.17並重新執行kubectl apply命令

k8s實踐(三):pod常用操作

nginx升級爲1.17

 

kubectl set image方式

[root@master ~]# kubectl set image deployment -n test02-namespace nginx-roll nginx-roll=nginx:1.17.1
deployment.extensions/nginx-roll image updated

將nginx升級至1.17.1

k8s實踐(三):pod常用操作

3. 回滾

查看deployments版本

[root@master ~]# kubectl rollout history deployments -n test02-namespace nginx-roll
deployment.extensions/nginx-roll 
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=nginx-roll.yaml --record=true
2         kubectl apply --filename=nginx-roll.yaml --record=true
3         kubectl apply --filename=nginx-roll.yaml --record=true

 

查看deployment具體版本信息

k8s實踐(三):pod常用操作

 

回滾至上一個版本

[root@master ~]# kubectl rollout undo deployment -n test02-namespace nginx-roll 
deployment.extensions/nginx-roll rolled back

k8s實踐(三):pod常用操作

 

回滾至指定版本

[root@master ~]# kubectl rollout undo deployment -n test02-namespace nginx-roll --to-revision=1
deployment.extensions/nginx-roll rolled back

k8s實踐(三):pod常用操作

--to-revision=1指定回滾至1.16版本的nginx

 

查看ReplicasSet

[root@master ~]# kubectl get replicasets -n test02-namespace  -o wide
NAME                    DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES         SELECTOR
nginx-roll-5dbd6fbc49   0         0         0       11m   nginx-roll   nginx:1.17.1   env=prod,pod-template-hash=5dbd6fbc49
nginx-roll-7f76bd847d   0         0         0       13m   nginx-roll   nginx:1.17     env=prod,pod-template-hash=7f76bd847d
nginx-roll-8fd7f679     3         3         3       16m   nginx-roll   nginx:1.16     env=prod,pod-template-hash=8fd7f679

可以看到在升級過程中replicaset保留了修改的歷史版本信息

八、內外網訪問

1. 創建pod

[root@master ~]# more web-svc.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-svc
  namespace: test02-namespace
spec:
  selector:
    matchLabels:
      app: web-svc
  replicas: 3
  template:
    metadata:
      labels:
        app: web-svc
    spec:
      containers:
      - name: web-svc
        image: httpd:latest
[root@master ~]# kubectl apply -f web-svc.yaml
deployment.apps/web-svc created

創建pod,namespace爲test02,副本數爲3

k8s實踐(三):pod常用操作

2. 內網訪問

創建servcie

內網通過pod ip訪問沒什麼太大意義,因爲pod會隨時重建,每次ip會隨機分配

[root@master ~]#  cat >> web-svc.yaml  << EOF
---
apiVersion: v1
kind: Service
metadata:
  name: web-svc
  namespace: test02-namespace
spec:
  selector:
    app: web-svc
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 80
> EOF
[root@master ~]# kubectl apply -f web-svc.yaml
deployment.apps/web-svc unchanged
service/web-svc created

 

查看創建的service

[root@master ~]# kubectl get service -n test02-namespace
NAME      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
web-svc   ClusterIP   10.106.53.114   <none>        8080/TCP   5m12s

 

修改index.html

[root@master ~]# kubectl get po -o wide -n test02-namespace
NAME                        READY   STATUS    RESTARTS   AGE     IP             NODE     NOMINATED NODE   READINESS GATES
nginx-roll-8fd7f679-9h9ng   1/1     Running   2          2d17h   10.244.1.52    node01   <none>           <none>
nginx-roll-8fd7f679-b5clj   1/1     Running   2          2d17h   10.244.0.180   master   <none>           <none>
nginx-roll-8fd7f679-pwkbw   1/1     Running   2          2d17h   10.244.2.6     node02   <none>           <none>
web-svc-58956c55fc-7vnw5    1/1     Running   0          3m35s   10.244.1.59    node01   <none>           <none>
web-svc-58956c55fc-8wbst    1/1     Running   0          3m35s   10.244.2.14    node02   <none>           <none>
web-svc-58956c55fc-nxt4r    1/1     Running   0          3m35s   10.244.2.13    node02   <none>           <none>
[root@master ~]# kubectl exec -it web-svc-58956c55fc-7vnw5 -n test02-namespace bash 
root@web-svc-58956c55fc-7vnw5:/usr/local/apache2# cat > /usr/local/apache2/htdocs/index.html << EOF
> web-svc-58956c55fc-7vnw5
> EOF
root@web-svc-58956c55fc-7vnw5:/usr/local/apache2# exit
exit
[root@master ~]# kubectl exec -it web-svc-58956c55fc-8wbst -n test02-namespace bash     
root@web-svc-58956c55fc-8wbst:/usr/local/apache2# cat > /usr/local/apache2/htdocs/index.html << EOF
> web-svc-58956c55fc-8wbst
> EOF
root@web-svc-58956c55fc-8wbst:/usr/local/apache2# exit
exit
[root@master ~]# kubectl exec -it web-svc-58956c55fc-nxt4r -n test02-namespace bash 
root@web-svc-58956c55fc-nxt4r:/usr/local/apache2# cat > /usr/local/apache2/htdocs/index.html << EOF
>  web-svc-58956c55fc-nxt4r
> EOF
root@web-svc-58956c55fc-nxt4r:/usr/local/apache2# exit

分別進入pod,將訪問的主頁修改爲pod名

 

內網訪問pod

[root@master ~]# for i in {1..10};do sleep 1;curl 10.98.103.41:8080;done
web-svc-58956c55fc-8wbst
web-svc-58956c55fc-7vnw5
web-svc-58956c55fc-7vnw5
 web-svc-58956c55fc-nxt4r
 web-svc-58956c55fc-nxt4r
web-svc-58956c55fc-7vnw5
web-svc-58956c55fc-7vnw5
 web-svc-58956c55fc-nxt4r
web-svc-58956c55fc-8wbst
web-svc-58956c55fc-8wbst

通過service內網訪問pod

k8s實踐(三):pod常用操作

3. 外網訪問

修改servcie

apiVersion: v1
kind: Service
metadata:
  name: web-svc
  namespace: test02-namespace
spec:
  type: NodePort
  selector:
    app: web-svc
  ports:
  - protocol: TCP
    nodePort: 30002
    port: 8080
    targetPort: 80

新增'type: NodePort'和'nodePort: 30002',通過NodePort方式外網訪問pod,映射端口爲30002,重新kubectl apply

 

外網訪問pod

[root@master ~]# for i in {1..10};do sleep 1;curl 172.27.9.131:30002;done
web-svc-58956c55fc-7vnw5
web-svc-58956c55fc-8wbst
 web-svc-58956c55fc-nxt4r
web-svc-58956c55fc-7vnw5
web-svc-58956c55fc-7vnw5
 web-svc-58956c55fc-nxt4r
web-svc-58956c55fc-8wbst
web-svc-58956c55fc-7vnw5
 web-svc-58956c55fc-nxt4r
web-svc-58956c55fc-7vnw5

通過node ip + nodePort方式外網訪問pod

k8s實踐(三):pod常用操作

九、日誌查看

使用kubectl logs命令可獲取pod日誌

1. 查看最近的日誌

[root@master ~]# kubectl logs kubernetes-dashboard-7b87f5bdd6-m62r6 -n kube-system --tail=20

'--tail=20':查看命名空間kube-system下kubernetes-dashboard-7b87f5bdd6-m62r6最近20行的日誌

k8s實踐(三):pod常用操作

2. 查看前一個容器的日誌

[root@master ~]# kubectl logs kubernetes-dashboard-7b87f5bdd6-m62r6 -n kube-system  --previous 

'--previous':當容器重啓時,該參數可以查看前一個容器的日誌

k8s實踐(三):pod常用操作

3. 通過標籤查看日誌

[root@master ~]# kubectl logs -lapp=web

查看標籤爲'app=web'的日誌

k8s實踐(三):pod常用操作

'-lapp=web'該日誌是標籤爲'app=web'的合集

十、刪除pod

kubectl get all
kubectl delete all --all

1. 通過刪除deployment刪除pod

通過deployment創建的pod可以直接刪除deployment

[root@master ~]# kubectl delete deployments kubia 
deployment.extensions "kubia" deleted

k8s實踐(三):pod常用操作

2. 通過刪除namespace刪除pod

刪除namespace中所有資源

[root@master ~]# kubectl delete all --all -n test02-namespace 

k8s實踐(三):pod常用操作

直接刪除namespace

[root@master ~]# kubectl delete ns test01-namespace

k8s實踐(三):pod常用操作

 
總結:

  • 直接刪除pod會重建一個新的不同名的pod;
  • 直接刪除replicasets會重建同名replicasets,其下所有pod則會刪除重建且名字不同;
  • 直接刪除deployments則其下的replicasets和pod將一起被刪除;

 
 

本文所有腳本和配置文件已上傳github:https://github.com/loong576/k8s-in-action-for-pods.git

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章