---
lang: zh-tw
title: Kubernetes Architecture
tags: K8s
---
# Kubernetes Architecture

1. Cluster至少包含一個Master跟一個Node
2. Master(Control Plane):調度整個Cluster,負責控制所有Node執行必要的容器、調度哪些Pods要排安到哪個Nodes運作、儲存Cluster運作過程的所有狀態
## Kubernetes Control Plane(Master)
|||
| -------- | -------- |
|kube-apiserver|管理K8s API接口,也負責Node之間溝通 |
|etcd |Key-Value資料庫,存放Cluster所有資料 |
|kube-scheduler|負責Pod調度,安排Pod到適合的Node運行|
|kube-controller-manager|管理並運行Controller|
1. Master 指的是Cluster控制節點,負責整個Cluster的管理和控制
2. Kubernetes所有控制指令都發給Master,它來負責實際的執行過程
3. kube-apiserver:管理Kubernetes API接口,kubectl的指令就會把指令送到這裡;負責Node之間溝通,每個Node不能直接溝通,必須透過apiserver
4. etcd:Key-Value資料庫,存放Cluster的資料作為備份,當Master因為某些原因而故障時,可以透過etcd還原Kubernetes的狀態
5. kube-scheduler:Kubernetes的Pods調度員,會監視新建立但尚未被指定要在哪個Node上執行的Pod,並選擇最適合放置的Node,讓該Pod在上面運行
6. kube-controller-manager:負責管理並運行controller
6-1. Node Controller:Node故障時進行通知和回應
6-2. Replication Controller:維護正確數量的Pod
6-3. Endpoints Controller:加入Service與Pod
6-4. Service Account & Token Controllers:為新的Namespace建立預設帳戶和API Token
## Kubernetes Node(Minions)
|||
| -------- | -------- |
|kubelet|管理Pod狀態並與Master溝通|
|kube-proxy|實現Service的通訊與負載平衡機制的元件|
|Container Runtime|負責本機容器建立與管理,ex: Docker, containerd, cri-o, rktlet|
1. 早期版本也被稱為 Minion
2. 可以是實體機也可以是虛擬機
3. Node才是Kubernetes Cluster中的工作節點
4. 每個Node都會被Master分配一些Pod
5. 當某個Node當機,上面的Pod會被Master自動傳輸到其它Node
## Kubernetes Cluster

## Node

Node是K8s中負責容器運行的機器,多個Pod可以在一個Node上運行
## Pod

一組(一個或多個)容器,容器共用Storage, Network,以及如何運行的Sepc
## Architecture Summary
+ Cluster至少包含一個Master(Control-Plane)跟一個Worker(Node, Minions)
+ Master包含:api-server, etcd, scheduler, controller-manager
+ Master會調度Pods要到哪個Node運作,儲存叢集運作過程的狀態
+ Node提供K8s運行的環境、管理所有容器運行,並監控運行的Pod狀態
+ 每個Node都包含:kubelet, kube-proxy, Container Runtime
+ Pod是一組(一個或多個)容器,容器共用Storage與Network,以及容器如何運行的Spec
## 實作 Create a Cluster
使用 WSL2 + KinD 建立學習環境叢集
Note:
Google Cloud SDK [官網](https://cloud.google.com/sdk/docs/quickstarts?hl=zh-tw)
安裝kubectl工具
sudo apt-get install kubectl
# or
gcloud components install kubectl
查看kubectl 工具版本
kubectl version --short
更新Client版本
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.17.0/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
KinD [官網](https://kind.sigs.k8s.io/docs/user/quick-start/)
建立Single Node叢集
kind create cluster --name k8s-cluster
確認安裝kubectl
kubectl version
查看Cluster資訊
kubectl cluster-info
查看Node資訊
kubectl get nodes
提供worker label
kubectl label node kind-worker node-role.kubernetes.io/worker=worker
查看Node描述,列出所有可用host
kubectl describe nodes $NODE_NAME