Pod是能夠建立和管理Kubernetes計算的最小可部署單元。一個Pod表明着集羣中運行的一個進程。每一個pod都有一個惟一的ip。html
一個pod相似一個豌豆莢,包含一個或多個容器(一般是docker),多個容器間共享IPC、Network和UTC namespacenode
Deployment爲Pod和ReplicaSet提供了一個聲明式定義(declarative)方法,用來替代之前的ReplicationController來方便的管理應用。典型的應用場景包括:nginx
kubectl run -h 查看run命令的用法docker
master01 # kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 --record
控制器名稱 容器鏡像 容器的端口 pod的數量 在Deployment revision中能夠查看到執行的歷史命令
查看後端
[master01 ]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-deploy-55d8d67cf-kckf9 1/1 Running 0 2m55s 10.244.1.3 node01 <none> <none>
能夠看到pod已經運行在一個工做節點上, 這裏的ip是cni0橋的ip
[node01] # ifconfig cni0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450 inet 10.244.1.1 netmask 255.255.255.0 broadcast 0.0.0.0
在集羣內部任意的節點能夠訪問pod。集羣外部沒法直接訪問podapp
刪除pods 查看會看到自動起來另外一個,由於 replicas個數爲1ide
# kubectl delete pod nginx-deploy-55d8d67cf-kckf9 pod "nginx-deploy-55d8d67cf-kckf9" deleted # kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-deploy-55d8d67cf-lf5xb 1/1 Running 0 2m55s 10.244.1.3 node01 <none> <none>
舉個例子:a服務運行3個pod,b服務怎麼訪問a服務的pod,pod的ip都不是持久化的重啓以後就會有變化。
這時候b服務能夠訪問跟a服務綁定的service,service信息是固定的提早告訴b就好了,service經過Label Selector跟a服務的pod綁定,不管a的pod如何變化對b來講都是透明的。微服務
kubectl expose -h 查看命令的用法spa
# kubectl expose deployment nginx-deploy --name=nginx80 --port=80 --target-port=80 --protocol=TCP
service_name service_port pod_port service/nginx exposed
查看service3d
# kubectl get svc -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 26d <none> nginx80 ClusterIP 10.105.125.134 <none> 80/TCP 118s run=nginx-deploy
pod客戶端訪問可使用 service_name:service_port 訪問pod。 說明service能夠爲pod提供固定訪問端點。
# kubectl run client --image=busybox --replicas=1 -it --restart=Never
\# wget -O - -q http://nginx:80 能夠訪問到pod
kubectl describe svc nginx 查看service詳細信息
實踐:
建立兩個pod
# kubectl run myapp --image=ikubernetes/myapp:v1 --replicas=2
# kubectl get pods -o wide
建立一個service
# kubectl expose deployment myapp --port=8000 --target-port=80
查看svc
# kubectl describe svc myapp Name: myapp Namespace: default Labels: run=myapp Annotations: <none> Selector: run=myapp Type: ClusterIP IP: 10.99.71.37 Port: <unset> 8000/TCP TargetPort: 80/TCP Endpoints: 10.244.1.35:80,10.244.1.36:80 #service後端的兩個pod Session Affinity: None Events: <none>
建立一個pod客戶端訪問service_name:service_port,能夠看到service是隨機的將請求分發到後端的兩個pod的
# kubectl run client --image=busybox -it
/ # wget -O - -q http://myapp:8000/hostname.html
若是端口暴露類型爲NodePort,那麼能夠經過集羣內任意一臺主機ip加暴露的端口進行訪問
1. # kubectl edit svc myapp 修改service的type爲NodePort
ClusterIP: 默認類型,自動分配一個僅集羣內部能夠訪問的虛擬IP
NodePort: 在ClusterIP基礎上爲Service在每臺機器上綁定一個端口,這樣就能夠經過 NodeIP:NodePort 來訪問該服務
2. 也能夠在建立service時指定type
kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --
type
=NodePort
# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 26d <none> nginx80 NodePort 10.105.125.134 <none> 80:32441/TCP 35m run=nginx-deploy
使用集羣外客戶端訪問,須要使用集羣任意一個節點的IP地址加上暴露的端口號
kubectl scale --replicas=5 deployment nginx-deploy # replicas指定pod數便可
將鏡像升級爲1.16-alpine:
# kubectl set image deployment nginx-deploy nginx-deploy=nginx:1.16-alpine --record deployment.extensions/nginx-deploy image updated
另開一個窗口監控升級過程:
# kubectl get pod -w
升級完成後查看:
# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deploy-56457775df-ptx9f 1/1 Running 0 2m25s
# kubectl get deployment -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR nginx-deploy 1/1 1 1 23d nginx-deploy nginx:1.16-alpine run=nginx-deploy
# kubectl describe pod nginx-deploy-56457775df-ptx9f
# kubectl rollout undo deployment/nginx-deploy
deployment.extensions/nginx-deploy rolled back
--to-revision 參數能夠指定回退的版本
# kubectl rollout undo deploy/nginx-deploy --to-revision=1
# kubectl rollout history deployment/nginx-deploy #查看歷史版本
這裏CHANGE-CAUSE顯示爲空是由於操做deployment的時候沒有加--record。若是加上應該顯示: