一、整體架構
kubernetes分為 master節點和工作節點,前者是管理節點,后者是容器運行的節點。其中master節點主要有3個重要組件,分別是APIServer,sheduler和controller manager。
工作節點 有兩個組件 kubelet 和 kubelet (有時候master節點也可以既是管理節點也是工作節點)
APIServer
APIServer組件負責響應用戶的管理請求、進行指揮協調工作
scheduler
scheduler組件是將待調度的pod按照一定的調度算法綁定到合適的工作節點上
controller manager
是一組控制器的合集,負責控制控制管理對應的資源,如副本(replication)和工作節點(node)等。
etcd
etcd 負責保存 Kubernetes Cluster 的配置信息和各種資源的狀態信息。當數據發生變化時,etcd 會快速地通知 Kubernetes 相關組件。
kubelet
管理維護pod運行的agent
kube-proxy
將service的流量轉發到對應endpoint
flannel網絡
維持各個節點上pod之間的通信。
kuernetes架構可以用下圖來簡單描述,mster節點上的APIServer將負責與master節點、工作節點上的各個組件之間交互,以及集群外用戶(如kubectl命令)
與集群的交互、在集群中處於消息收發的中心地位。其他各個組件各司其職,共同完成應用的分發,部署與運行的工作。
二、通過示例來理解
[root@k8s-master k8s]# kubectl run httpd-pod --image=httpd --replicas=2 kubectl run --generator=deployment/apps.v1beta1 is DEPRECATED and will be removed in a future version. Use kubectl create instead. deployment.apps/httpd-pod created [root@k8s-master k8s]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE httpd-pod 2 2 2 2 22s [root@k8s-master k8s]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE httpd-pod-7cdfc75664-4trb9 1/1 Running 0 32s 10.244.2.4 k8s-node1 <none> httpd-pod-7cdfc75664-mjm7f 1/1 Running 0 32s 10.244.1.4 k8s-node2 <none>
上面使用run命令在命令行創建pod的方式已經不被推薦使用
官方推薦使用如下的方式,其中第三種方式已經成為一種廣泛流傳的方式。
Examples: # Create a pod using the data in pod.json. kubectl create -f ./pod.json # Create a pod based on the JSON passed into stdin. cat pod.json | kubectl create -f - # Edit the data in docker-registry.yaml in JSON then create the resource using the edited data. kubectl create -f docker-registry.yaml --edit -o json
上面的命令 httpd-pod 是所要deployment的名稱
--image 是指定使用鏡像 --replicas 指定副本的數量
通過查看pod,發現pod分別被調度到 k8s-node1和k8s-node2節點上運行。
詳細過程:
1.kubectl發送部署的請求到API Server
2.API Server通知Controller Manager創建一個 deployment 資源
3.Scheduler執行調度任務,將兩個副本Pod分發到k8s-node和k8s-node2上。
4.k8s-node1和k8s-node2上的kubelet在各自的節點上創建並運行pod。
tips:
1.應用的配置和當前的狀態信息保存在etcd中,當執行kubectl get pod 等查詢操作時 API Server會從中讀取數據
2.flannel 會為每個Pod分配IP。因為沒有創建service,目前kube-proxy還沒有參與進來
為了下面的學習,需要刪除節點上的pod。刪除這個deployment時,pod的狀態會從running變為Terminating 直至清除。
root@k8s-master k8s]# kubectl delete deployment httpd-pod deployment.extensions "httpd-pod" deleted [root@k8s-master k8s]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE httpd-pod-7cdfc75664-4trb9 0/1 Terminating 0 12m 10.244.2.4 k8s-node1 <none> [root@k8s-master k8s]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE httpd-pod-7cdfc75664-4trb9 0/1 Terminating 0 12m 10.244.2.4 k8s-node1 <none> [root@k8s-master k8s]# kubectl get pod -o wide No resources found.