k8s是什么
Kubernetes是容器集群管理系統,是一個開源的平台,可以實現容器集群的自動化部署、自動擴縮容、維護等功能。
Kubernetes 具有如下特點:
便攜性: 無論公有雲、私有雲、混合雲還是多雲架構都全面支持
可擴展: 它是模塊化、可插拔、可掛載、可組合的,支持各種形式的擴展
自修復: 它可以自保持應用狀態、可自重啟、自復制、自縮放的,通過聲明式語法提供了強大的自修復能力
Kubernetes 是什么意思? K8s?
名稱 Kubernetes 源於希臘語,意為 “舵手” 或 “飛行員”, 且是英文 “governor” 和 “cybernetic”的詞根。 K8s 是通過將 8 個字母 “ubernete” 替換為 8 而導出的縮寫。另外,在中文里,k8s 的發音與 Kubernetes 的發音比較接近。
架構
每一個 Kubernetes 就集群都由一組 Master 節點和一系列的 Worker 節點組成,其中 Master 節點主要負責存儲集群的狀態並為 Kubernetes 對象分配和調度資源。
Master
- API Server 負責處理來自用戶的請求,其主要作用就是對外提供 RESTful 的接口,包括用於查看集群狀態的讀請求以及改變集群狀態的寫請求,也是唯一一個與 etcd 集群通信的組件。
- Controller 管理器運行了一系列的控制器進程,這些進程會按照用戶的期望狀態在后台不斷地調節整個集群中的對象,當服務的狀態發生了改變,控制器就會發現這個改變並且開始向目標狀態遷移。 集群故障檢測和恢復的自動化工作比如Replication Controller
- Scheduler 調度器其實為 Kubernetes 中運行的 Pod 選擇部署的 Worker 節點,它會根據用戶的需要選擇最能滿足請求的節點來運行 Pod,它會在每次需要調度 Pod 時執行。
主要用於收集和分析當前 Kubernetes 集群中所有 Minion / Node 節點的資源 (包括內存、CPU 等) 負載情況,然后依據資源占用情況分發新建的 Pod 到 Kubernetes 集群中可用的節點。
實時監測 Kubernetes 集群中未分發和已分發的所有運行的 Pod
Worker
- kubelet 負責 Node 節點上 Pod 的創建、修改、監控、刪除等全生命周期的管理,對pod進行各種操作和日志上報
- kube-proxy 負責宿主機的子網管理,同時也能將服務暴露給外部,其原理就是在多個隔離的網絡中把請求轉發給正確的 Pod 或者容器。
名詞解釋
- Pod 是 Kubernetes 中可部署的最小、最基本對象。一個 Pod 代表集群中正在運行的單個進程實例。 它們共享 PID、IPC、Network 和 UTS namespace
- Container docker容器
- Node 是 Pod 真正運行的主機,可以是物理機,也可以是虛擬機。
- Service 是應用服務的抽象,通過 labels 為應用提供負載均衡和服務發現。
- Label 是識別 Kubernetes 對象的標簽,以 key/value 的方式附加到對象上。Label 定義好后其他對象可以使用 Label Selector 來選擇一組相同 label 的對象。
如: app=nginx - Deployment 指不具有唯一標識的一組多個相同的 Pod。Deployment 運行應用的多個副本,並自動替換任何失敗或無響應的實例
部署
server.js
var http = require('http');
var handleRequest = function(request, response) {
console.log('Received request for URL: ' + request.url);
response.writeHead(200);
response.end('Hello World!');
};
var www = http.createServer(handleRequest);
www.listen(8080);
FROM node:6.9.2
EXPOSE 8080
COPY server.js .
CMD node server.js
eval $(minikube docker-env)
docker build -t hello-node:v1 .
創建 Deployment
kubectl run hello-node --image=hello-node:v1 --port=8080
查看 Deployment:
kubectl get deployments
查看pod
kubectl get pods
查看集群事件:
kubectl get events
查看 kubectl 配置:
kubectl config view
創建service
暴露到公網
kubectl expose deployment hello-node --type=LoadBalancer
kubectl get services
服務訪問
minikube service hello-node --url
查看log
kubectl logs <POD-NAME>
更新應用:
response.end('Hello World Again!');
構建v2鏡像
docker build -t hello-node:v2 .
修改鏡像
kubectl set image deployment/hello-node hello-node=hello-node:v2
再次訪問
清理
現在可以清理您在集群中創建的資源:
kubectl delete service hello-node
kubectl delete deployment hello-node
可以停止 Minikube VM:
minikube stop
eval $(minikube docker-env -u)
或者,刪除 Minikube VM:
minikube delete
通過yaml描述文件創建deployment
deployment.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2 # tells deployment to run 2 pods matching the template
template: # create pods using pod definition in this template
metadata:
# unlike pod-nginx.yaml, the name is not included in the meta data as a unique name is
# generated from the deployment name
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
將 kubectl 的 —record 的 flag 設置為 true 可以在 annotation 中記錄當前命令創建或者升級了該資源。這在未來會很有用,例如,查看在每個 Deployment revision 中執行了哪些命令。
kubectl create -f deployment.yaml --record
kubectl describe deployment nginx-deployment
kubectl get deployments
給這個nginx換個版本
kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
或手動改配置
kubectl edit deployment/nginx-deployment
查看狀態:
kubectl rollout status deployment/nginx-deployment
- deployment "nginx-deployment" successfully rolled out
通過record可以記錄命令
kubectl rollout history deployment/nginx-deployment
deployment.extensions/nginx-deployment
REVISION CHANGE-CAUSE
1 kubectl create --filename=deployment.yaml --record=true
2 kubectl create --filename=deployment.yaml --record=true
擴容/縮容
kubectl scale deployment nginx-deployment --replicas=4
查看歷史操作
kubectl rollout history deployment/nginx-deployment
回滾
kubectl rollout history deployment/nginx-deployment --revision=2
回滾到歷史版本
kubectl rollout undo deployment/nginx-deployment --to-revision=2
暫停/恢復
kubectl rollout pause deployment/nginx-deploymen
kubectl rollout resume deploy nginx-deployment
關於rollout/pasuse/回滾
rollout
.spec.strategy.rollingUpdate.maxSurge 可以為整數或者百分比,默認為desired Pods數的25%
.spec.strategy.rollingUpdate.maxUnavailable 可以為整數或者百分比,默認為desired Pods數的25%
在Deployment rollout時,需要保證Available(Ready) Pods數不低於 desired pods number - maxUnavailable; 保證所有的Pods數不多於 desired pods number + maxSurge。
rollout時,先創建maxSurge個Pods,這時達到pods數的上限值desired replicas + maxSurge,然后delete OldRS maxUnavailable個Pods,這時Ready的Pods number最差也能保證desired replicas - maxUnavailable個。直到刪除所有的pods。升級結束。
pasuse
kubectl rollout pause只會用來停止觸發下一次rollout。所以正在執行的滾動不會停止。但是下次滾動就會被暫停,直到用戶執行kubectl rollout resume
回滾
回滾的時候也是按照滾動的機制進行的,同樣要遵守maxSurge和maxUnavailable的約束。並不是一次性將所有的Pods刪除,然后再一次性創建新的Pods。
和docker swarm選型
docker swarm優點
- 跑的快,幾個命令部署應用
- 應用環境孤立,單獨運行。
- 版本控制和組件重用。
缺點: - 不提供存儲選項。 Docker Swarm不提供將容器連接到存儲的無障礙方式
- 監控不良 只能用Stats命令簡單的監控
Kubernetes優點:
- 維護容器的穩定
- 大規模部署和更新軟件: 水平基礎架構縮放,自動擴展,手動縮放,復制控制器。
- 自我修復
- 存儲問題。pod間數據共享,可以通過volume遠程存儲
缺點 - 安裝繁瑣
- 初始過程需要時間,創建新進程需要等很長時間
Kubernetes:
需要成熟的部署和監控選項
需要快速可靠的響應時間
需要開發復雜的應用程序,並且需要高資源計算而不受限制
有一個非常大的集群
Docker,
希望快速,方便的部署集群
啟動速度快
參考
https://juejin.im/post/5b63f4506fb9a04f8856f340
https://blog.csdn.net/WaltonWang/article/details/77461697
k8s service詳解:https://zhuanlan.zhihu.com/p/39909011