Deployment是kubernetes 1.2引入的概念,用來解決Pod的編排問題。Deployment能夠理解爲RC的升級版(RC+Reolicat Set)。特色在於能夠隨時知道Pod的部署進度,即對Pod的建立、調度、綁定節點、啓動容器完整過程的進度展現。html
建立一個Deployment對象來生成對應的Replica Set並完成Pod副本的建立過程。
檢查Deployment的狀態來確認部署動做是否完成(Pod副本的數量是否達到預期值)。
更新Deployment以建立新的Pod(例如鏡像升級的場景)。
若是當前Deployment不穩定,回退到上一個Deployment版本。
掛起或恢復一個Deployment。前端
Service定義了一個服務的訪問入口地址,前端應用經過這個入口地址訪問其背後的一組由Pod副本組成的集羣實例,Service與其後端的Pod副本集羣之間是經過Label Selector來實現「無縫對接」。RC保證Service的Pod副本實例數目保持預期水平。node
IP類型 | 說明 |
---|---|
Node IP | Node節點的IP地址 |
Pod IP | Pod的IP地址 |
Cluster IP | Service的IP地址 |
主機 | IP地址 | 服務 |
---|---|---|
master | 192.168.1.21 | k8s |
node01 | 192.168.1.22 | k8s |
node02 | 192.168.1.23 | k8s |
基於https://blog.51cto.com/14320361/2464655 的實驗繼續進行web
[root@master ~]# vim xgp.yaml kind: Deployment apiVersion: extensions/v1beta1 metadata: name: xgp-web spec: replicas: 3 template: metadata: labels: app: xgp-server spec: containers: - name: web image: 192.168.1.21:5000/web:v1
[root@master ~]# kubectl apply -f xgp.yaml --record
[root@master ~]# kubectl get pod
[root@master ~]# curl 10.244.2.16
[root@master ~]# vim xgp.yaml kind: Deployment apiVersion: extensions/v1beta1 metadata: name: xgp-web spec: replicas: 4 template: metadata: labels: app: xgp-server spec: containers: - name: web image: 192.168.1.21:5000/web:v1
[root@master ~]# kubectl apply -f xgp.yaml --recore
[root@master ~]# kubectl get pod
副本數量加一,若是yaml文件的副本爲0,則副本數量仍是以前的狀態,並不會更新。apache
[root@master ~]# vim xgp-svc.yaml kind: Service apiVersion: v1 metadata: name: xgp-svc spec: selector: app: xgp-server ports: - protocol: TCP port: 80 targetPort: 80
[root@master ~]# kubectl apply -f xgp-svc.yaml
[root@master ~]# kubectl get svc
[root@master ~]# curl 10.107.119.49
[root@master ~]# vim xgp.yaml kind: Deployment apiVersion: extensions/v1beta1 metadata: name: xgp-web spec: replicas: 3 template: metadata: labels: app: xgp-server spec: containers: - name: web image: 192.168.1.21:5000/web:v1 ports: - containerPort: 80 #提示端口
注意:在Delpoyment資源對象中,能夠添加Port字段,但此字段僅供用戶查看,並不實際生效vim
[root@master ~]# kubectl apply -f xgp.yaml
[root@master ~]# vim xgp-svc.yaml kind: Service apiVersion: v1 metadata: name: xgp-svc spec: type: NodePort selector: app: xgp-server ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 30123
[root@master ~]# kubectl apply -f xgp-svc.yaml
[root@master ~]# kubectl get svc
[root@master ~]# curl 127.0.0.1:30123
[root@master ~]# kubectl get pod -o wide
[root@master ~]# kubectl exec -it xgp-web-8d5f9656f-8z7d9 /bin/bash //根據pod名稱進入pod之中
root@xgp-web-8d5f9656f-8z7d9:/usr/local/apache2# echo xgp-v1 > htdocs/index.html root@xgp-web-8d5f9656f-8z7d9:/usr/local/apache2# exit
[root@master ~]# curl 127.0.0.1:30123
[root@master ~]# kubectl get svc
[root@master ~]# iptables-save //查看已配置的規則
SNAT:Source NAT(源地址轉換) 後端
DNAT:Destination NAT(目標地址轉換)api
MASQ:動態的源地址轉換bash
[root@master ~]# iptables-save | grep 10.107.119.49
[root@master ~]# iptables-save | grep KUBE-SVC-ESI7C72YHAUGMG5S
[root@master ~]# iptables-save | grep KUBE-SEP-ZHDQ73ZKUBMELLJB
[root@master ~]# kubectl get pod -o wide
Service實現的負載均衡:默認使用的是iptables規則。IPVSapp
[root@master ~]# kubectl delete -f xgp.yaml [root@master ~]# kubectl delete -f xgp-svc.yaml
[root@master ~]# vim xgp1.yaml (三個文件名不相同) kind: Deployment apiVersion: extensions/v1beta1 metadata: name: xgp-web spec: revisionHistoryLimit: 10 replicas: 3 template: metadata: labels: app: xgp-server spec: containers: - name: web image: 192.168.1.21:5000/web:v1 (三臺版本不一樣) ports: - containerPort: 80
此處3個yaml文件 指定不一樣版本的鏡像
[root@master ~]# kubectl apply -f xgp-1.yaml --record [root@master ~]# kubectl apply -f xgp-2.yaml --record [root@master ~]# kubectl apply -f xgp-3.yaml --record
[root@master ~]# kubectl rollout history deployment xgp-web
[root@master ~]# kubectl apply -f xgp-svc.yaml
[root@master ~]# kubectl get svc
[root@master ~]# curl 127.0.0.1:30123
[root@master ~]# kubectl rollout undo deployment xgp-web --to-revision=1 //這裏指定的是版本信息的編號
[root@master ~]# curl 127.0.0.1:30123
[root@master ~]# kubectl rollout history deployment xgp-web
編號1已經被編號2替代,從而生的是一個新的編號4
默認狀況下,scheduler會將pod調度到全部可用的Node,不過有些狀況咱們但願將 Pod 部署到指定的 Node,好比將有大量磁盤 I/O 的 Pod 部署到配置了 SSD 的 Node;或者 Pod 須要 GPU,須要運行在配置了 GPU 的節點上。
kubernetes經過label來實現這個功能
label 是 key-value 對,各類資源均可以設置 label,靈活添加各類自定義屬性。好比執行以下命令標註 k8s-node1 是配置了 SSD 的節點
[root@master ~]# kubectl label nodes node02 disk=ssd
[root@master ~]# kubectl get nodes --show-labels | grep node02
[root@master ~]# kubectl delete -f xgp-1.yaml deployment.extensions "xgp-web" deleted [root@master ~]# kubectl delete svc xgp-svc
[root@master ~]# vim xgp-1.yaml kind: Deployment apiVersion: extensions/v1beta1 metadata: name: xgp-web spec: revisionHistoryLimit: 10 replicas: 3 template: metadata: labels: app: xgp-server spec: containers: - name: web image: 192.168.1.21:5000/web:v1 ports: - containerPort: 80 nodeSelector: #添加節點選擇器 disk: ssd #和標籤內容一致
[root@master ~]# kubectl apply -f xgp-1.yaml
[root@master ~]# kubectl get pod -o wide
如今pod都在node02上運行
[root@master ~]# kubectl label nodes node02 disk-
[root@master ~]# kubectl get nodes --show-labels | grep node02
沒有disk標籤了
[root@master ~]# kubectl label nodes node01 disk=ssd
[root@master ~]# vim xgp.yaml kind: Deployment apiVersion: extensions/v1beta1 metadata: name: xgp-web spec: replicas: 3 template: metadata: labels: app: xgp-server spec: containers: - name: web image: 192.168.1.21:5000/web:v1 ports: - containerPort: 80 nodeSelector: disk: ssd
[root@master ~]# vim xgp-svc.yaml kind: Service apiVersion: v1 metadata: name: xgp-svc spec: type: NodePort selector: app: xgp-server ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 30123
[root@master ~]# kubectl apply -f xgp.yaml --recore [root@master ~]# kubectl apply -f xgp-svc.yaml
[root@master ~]# kubectl get pod -o wide
[root@master ~]# kubectl rollout history deployment xgp-web > pod.txt
[root@master ~]# vim xgp.yaml kind: Deployment apiVersion: extensions/v1beta1 metadata: name: xgp-web spec: replicas: 3 template: metadata: labels: app: xgp-server spec: containers: - name: web image: 192.168.1.21:5000/web:v2 #修改版本爲二 ports: - containerPort: 80 nodeSelector: disk: ssd
[root@master ~]# kubectl apply -f xgp.yaml --record
[root@master ~]# kubectl rollout history deployment xgp-web > pod.txt
[root@master ~]# vim xgp.yaml kind: Deployment apiVersion: extensions/v1beta1 metadata: name: xgp-web spec: replicas: 3 template: metadata: labels: app: xgp-server spec: containers: - name: web image: 192.168.1.21:5000/web:v3 #修改版本爲二 ports: - containerPort: 80 nodeSelector: disk: ssd
[root@master ~]# kubectl apply -f xgp.yaml --record
Service實現的負載均衡:默認使用的是iptables規則。IPVS
[root@master ~]# iptables-save | grep 10.107.27.229 //根據service的暴露IP,查看對應的iptabes規則
[root@master ~]# iptables-save | grep KUBE-SVC-ESI7C72YHAUGMG5S
這裏顯示了各節點的負載比例
[root@master ~]# iptables-save | grep KUBE-SEP-VDKW5WQIWOLZMJ6G
[root@master ~]# kubectl get pod -o wide
[root@master ~]# kubectl rollout undo deployment xgp-web --to-revision=1 //這裏指定的是版本信息的編號
[root@master ~]# curl 127.0.0.1:30123
排錯思路
[root@master ~]# less /var/log/messages | grep kubelet [root@master ~]# kubectl logs -n kube-system kube-scheduler-master [root@master ~]# kubectl describe pod xgp-web-7d478f5bb7-bd4bj