# Kubernetes 初階
> [name=翁維甫]
> [time=Thur, Sep 22, 2020 4:00 PM]
---
# Agenda
* Kubernetes 介紹
* Kubernetes 架構
* Kubernetes CLI
* Demo
---
## Kubernetes 介紹

---
### 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

---
### Worker Node
* K8s 運作的最小硬體單位,內有三個組件:
* kubelet
* 管理員,負責管理該 Node 上的所有 Pods 的狀態並負責與 Master 溝通
* kube-proxy
* 傳訊員,負責將訪問 Service 的 TCP/UDP 流量轉發到後端的容器
* 目前推薦的 Proxy mode 為 ipvs
* Container Runtime
* 該 Node 真正負責容器執行的程式,處理所有跟 Pod 有關的操作
---
#### Node overview

---
### 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

---
### 基本運作

---
## 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}]"}