# Kubernetes 初階 > [name=翁維甫] > [time=Thur, Sep 22, 2020 4:00 PM] --- # Agenda * Kubernetes 介紹 * Kubernetes 架構 * Kubernetes CLI * Demo --- ## Kubernetes 介紹 ![](https://i.imgur.com/kaIrZm7.png) --- ### K8s? * Kubernetes(K8s)是一個可以幫助我們管理微服務(microservices)的系統,他可以自動化地部署及管理多台機器上的多個容器(Container) --- ### 官網描述 * Automated container deployment, scaling, and management 1. 同時部署多個容器到多台機器上(Deployment) 2. 服務的乘載量有變化時,可以對容器做自動擴展(Scaling) 3. 管理多個容器的狀態,自動偵測並重啟故障的容器(Management) --- ## Kubernetes 架構 --- ### 四大元件 * Pod * Worker Node * Master Node * Cluster --- ### Pod * K8s 運作的最小單位 * 一個 Pod 裡面可以有一個或是多個 Container * 同一個 Pod 中的 Containers 共享相同資源及網路,彼此透過本地端連線 * 同一個 Pod 中的 Containers 是同時被調度 --- #### Pods overview ![](https://i.imgur.com/JalMtYw.png) --- ### Worker Node * K8s 運作的最小硬體單位,內有三個組件: * kubelet * 管理員,負責管理該 Node 上的所有 Pods 的狀態並負責與 Master 溝通 * kube-proxy * 傳訊員,負責將訪問 Service 的 TCP/UDP 流量轉發到後端的容器 * 目前推薦的 Proxy mode 為 ipvs * Container Runtime * 該 Node 真正負責容器執行的程式,處理所有跟 Pod 有關的操作 --- #### Node overview ![](https://i.imgur.com/x5n2l8P.png) --- ### Master Node * Kubernetes 運作的指揮中心,內有四個組件: * kube-apiserver * etcd * kube-controller-manager * kube-scheduler --- #### kube-apiserver * 管理整個 Kubernetes 所需 API 的接口(Endpoint) * 負責 Node 之間的溝通橋樑,每個 Node 彼此不能直接溝通,必須要透過 apiserver 轉介 * 負責 Kubernetes 中的請求的身份認證與授權 --- #### etcd * 用來存放 Kubernetes Cluster 的資料作為備份,當 Master 因為某些原因而故障時,我們可以透過 etcd 幫我們還原 Kubernetes 的狀態 --- #### kube-controller-manager * 負責管理並運行 Kubernetes controller 的組件,簡單來說 controller 就是 Kubernetes 裡一個個負責監視 Cluster 狀態的 Process * 這些 Process 會在 Cluster 與預期狀態(desire state)不符時嘗試更新現有狀態(current state) * controller-manager 的監控與嘗試更新也都需要透過訪問 kube-apiserver 達成 --- #### kube-controller-manager * controller 包含以下四種: * Node controller * 當節點有問題時負責通知與回應 * Replication controller * 用來管理 Pod 的數量及狀態,並可確保有指定數量的 Pod 正在運行 * Endpoints controller * 用來結合 Pod 和 Service 的物件 * Service Account & Token controllers * 建立預設的帳號、為新的 namespace 建立新的 API 存取 token --- #### cloud-controller-manager * 雲端服務使用的 kube-controller-manager,包含以下三種: * Node controller * Route controller * 配置路由,讓不同 Node 上的容器可以互相通信 * Service controller * 負責類型為 LoadBalancer 的 service 提供託管 LoadBalancer、IP addresses、network packet filtering、target health checking --- #### kube-scheduler * 整個 K8s 的 Pods 調度員,scheduler 會監視新建立但還沒有被指定要跑在哪個 Node 上的 Pod,並根據每個 Node 上面資源規定、硬體限制等條件去協調出一個最適合放置的 Node 讓該 Pod 跑 --- ### Cluster * Kubernetes 中多個 Node 與 Master 的集合,基本上可以想成在同一個環境裡所有 Node 集合在一起的單位 --- ### Kubernetes Cluster ![](https://i.imgur.com/yz0FtBn.png) --- ### 基本運作 ![](https://i.imgur.com/magjVOK.png) --- ## Kubernetes CLI --- ### 基本指令 * kubectl run * kubectl create * kubectl expose * kubectl get * kubectl logs * kubectl delete * kubectl exec * kubectl apply * kubectl version * kubectl cluster-info * kubectl describe --- ### Demo run 一個 nginx 試試 ```linux= kubectl run test-nginx --image=nginx --port=80 ``` 列出所有的 Pod ```linux= kubectl get pods ``` 將 Pod 對外暴露成為 Kubernetes Services ```linux= kubectl expose pod/test-nginx --port=80 --type=NodePort ``` 列出所有的 Service ```linux= kubectl get services ``` 查詢 Pod 的詳細資訊,可看到 Pod 起在哪個 Node ```linux= kubectl describe pod/test-nginx ``` ---
{"metaMigratedAt":"2023-06-15T13:50:42.084Z","metaMigratedFrom":"YAML","title":"Kubernetes 初階","breaks":true,"contributors":"[{\"id\":\"f7df1304-fff3-4f97-80d7-e2ae0a04d33f\",\"add\":3426,\"del\":18},{\"id\":\"4f5c5dc0-df78-40b6-8b4c-d0c83c7416cb\",\"add\":12,\"del\":12}]"}
    416 views
   Owned this note