一、 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。

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

先創建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.yaml
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
查看創建的資源

3. 進入pod
進入pod kubia-66c8b6d4fc-cdzzg
[root@master ~]# kubectl exec -it kubia-66c8b6d4fc-cdzzg bash
類似docker,使用kubectl exec命令進入容器

容器的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

通過--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

將pod http-label-7cf498876f-rhqxf的標簽env由prod更改為debug
刪除標簽
[root@master ~]# kubectl label pod http-label-7cf498876f-rhqxf env-
pod/http-label-7cf498876f-rhqxf labeled

將pod http-label-7cf498876f-rhqxf的標簽env刪除
2. 通過標簽指定pod創建的節點
給node節點打標簽

分別給節點打上標簽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

四、命名空間
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

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並新建資源

新建deployment nginx-scale,pod副本數為3
文件方式

通過修改文件中參數replicas的值並重新執行kubectl apply命令即可實現pod的擴縮容
命令方式
[root@master ~]# kubectl scale deployment nginx-scale --replicas=1
deployment.extensions/nginx-scale scaled

通過命令將pod副本數縮容為1
六、failover
1. pod節點分布查看

2. failover測試
節點node02關機
[root@node02 ~]# init 0
查看node狀態和pod分布

node02狀態為NotReady且之前在該節點的pod被遷移至master或者node01
當node02恢復后,運行在該節點的Pod會被刪除,且遷移至master和node01的Pod不會重新調度回到node02
注意,本節有個前提:所有pod需綁定到replication controller上,'裸奔的 pod'(沒有綁定到任何replication controller)不會被重新調度
七、升級及回滾
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

查看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 --record
deployment.apps/nginx-roll configured
將nginx-roll.yaml中nginx鏡像版本修改為1.17並重新執行kubectl apply命令

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

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具體版本信息

回滾至上一個版本
[root@master ~]# kubectl rollout undo deployment -n test02-namespace nginx-roll
deployment.extensions/nginx-roll rolled back

回滾至指定版本
[root@master ~]# kubectl rollout undo deployment -n test02-namespace nginx-roll --to-revision=1
deployment.extensions/nginx-roll rolled back

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

可以看到在升級過程中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

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

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

九、日志查看
使用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行的日志,

2. 查看前一個容器的日志
[root@master ~]# kubectl logs kubernetes-dashboard-7b87f5bdd6-m62r6 -n kube-system --previous
'--previous':當容器重啟時,該參數可以查看前一個容器的日志。

3. 通過標簽查看日志
[root@master ~]# kubectl logs -lapp=web
查看標簽為'app=web'的日志

'-lapp=web'該日志是標簽為'app=web'的合集
十、刪除pod
1. 通過刪除deployment刪除pod
通過deployment創建的pod可以直接刪除deployment
[root@master ~]# kubectl delete deployments kubia
deployment.extensions "kubia" deleted

2. 通過刪除namespace刪除pod
刪除namespace中所有資源
[root@master ~]# kubectl delete all --all -n test02-namespace

直接刪除namespace
[root@master ~]# kubectl delete ns test01-namespace

總結:
- 直接刪除pod會重建一個新的不同名的pod;
- 直接刪除replicasets會重建同名replicasets,其下所有pod則會刪除重建且名字不同;
- 直接刪除deployments則其下的replicasets和pod將一起被刪除;
轉自https://www.toutiao.com/a6798896814020887052/?timestamp=1583280974&app=news_article&group_id=6798896814020887052&req_id=2020030408161301001404009326C90FD3
喜歡這篇文章?歡迎打賞~~