# K8s (Kubernetes) K8s 是一個管理容器的應用程式,可提供 High availability、Scalaibity 的容器自動監控跟根據容器狀態提供擴展 K8s 就是好幾台不同機器 (可以是虛擬機或物理機),所組成的 Cluster,並且這些機器都有對應的職責與相同的溝通協定來達成服務管理。 ## K8s 名詞解釋 ![](https://i.imgur.com/QK5wvbN.png) ### kubectl 命令行介面,透過特定指令來打 Kubernetes API 到 Control Plane 並由 Control Plance 來與 Node 進行溝通 ### minikube 簡易的單一節點 Kubernetes 集群,兼具 Node 與 Contorl Place 的角色 ### Node 會是一個虛擬機或是物理機器,在 K8s 集群中擔任工作機器的角色。 ![](https://i.imgur.com/UTiFYej.png) **kubelet** 運行在 Node 中,確保 container 都運行在 Pods 中。 **kube-proxy** Node 中的網路代理,所有要與 Pod 溝通的網路請求都必須要透過這個 kube-proxy #### 新增 Node 到 k8s cluster 1. 新 Node 的 Kubelet 向 Control Plane 註冊 2. 手動向 Control Plane 註冊 ### Control Plane 基本上這也是一個 Node,Control Plane 可以跑在有運行其他服務的 Node 上,但通常為了避免其他服務影響 Control Plane 的功能,Control Plane 都會獨立自己一個 Node,Kubernetes 也有提供 [Control Plane 水平擴展](https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/high-availability/)的功能來達到整個集群的 HA。 主要的功能是負責管理集群,透過 Kubernetes API 來與外部進行溝通和控制 Node 在 Control Plane 會有以下組件 #### **kube-apiserver** 負責 Kubernetes API 的請求處理與轉發,apiserver 有設計過考慮水平擴展。 #### **etcd (記得設置備份計畫)** 分布式的 K-V Store,負責存 Cluster 的 Meta-Data #### **kube-scheduler** 調度 Pod 在 Node 上的決策者 #### **kube-controller-manager** 運行 control place 上的 controller #### **cloud-controller-manager** kubernetes 除了可以控制 VM 或者實體機器也可以接上 Cloud,這個 controller 提供給 control place 有能力接上到 Cloud ### Container 執行 Process 的最小單位 ### Pod K8s 中最小的運作單元,Pod 中可含一個以上的 Container,同一個 Pod 的 Container 則會共享相同的網路資源。 每個 Pod 都有自己的 yaml **注意**:Pod 中的 Container 在被初始化之後是無法隨意新增刪除,必須要刪除 Pod 重新建立新的 ##### Pod yaml 範例 ```yaml # my-first-pod.yaml apiVersion: v1 kind: Pod metadata: name: my-pod # pod 名稱 labels: # K8s 會透過這個 Labels 來將 Pod 分群管理 app: webserver spec: # 定義 Container containers: - name: pod-demo image: zxcvbnius/docker-demo ports: - containerPort: 3000 ``` **啟用 Pod 的指令** ```shell kubectl create -f {yaml} ``` #### Deployment 管理 Pod 或 Replica Set 的設定 ![Imgur](https://i.imgur.com/VJLrFZt.png) ## Service 將 Pod 連上網路的一個方法,利用 Service 的介面服務讓 Pod 可以用各種提供的方式連到網際網路,如果服務是用 HTTP,就可以用 ingress 來作為集群的入口點,ingress 能夠處理路由規則 ### K8s 基本操作 取得目前 K8s 狀態 ```sh kubectl get pods // 取得 pods 列表 kubectl get services // 取得目前對外服務的資訊 kubectl get deployment // 取得設定檔管理列表 ``` Pod 中 Container 資訊 ``` kubectl describe pods {pod_name} kubectl logs -p {pod_name} ``` K8s 刪除指令