### Kubernetes (K8S)
[參考此內容](https://ithelp.ithome.com.tw/articles/10192401)
#### Ready
1. [Install and Set Up kubectl on Linux](https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/)
3. Install VirtualBox
```bash
sudo apt-get update
sudo apt-get install virtualbox
```
3. [Install minikube](https://minikube.sigs.k8s.io/docs/start/)
```bash
minikube start
```
4. Install kubectl
```bash
sudo apt-get install kubectl
```
### [Hello Minikube](https://kubernetes.io/docs/tutorials/hello-minikube/)
```bash
kubectl run hello-minikube --image=gcr.io/google_containers/echoserver:1.8 --port=8080
kubectl expose deployment hello-minikube --type=NodePort
minikube service hello-minikube --url
# minikube 操作界面
minikube dashboard
# Open Dashboard with URL
minikube dashboard --url
# Create a Deployment
kubectl create deployment hello-node --image=k8s.gcr.io/echoserver:1.4
# 取得所有的狀態內容
kubectl get all
# Create a Service
kubectl expose deployment hello-node --type=LoadBalancer --port=8080
# 開啟 hello-note 頁面
minikube service hello-node
```
### [Node](https://ithelp.ithome.com.tw/articles/10193248)
在Kubernetes(k8s)中,Node是指Kubernetes集群中的一個工作節點,通常代表一個實際的物理機器或虛擬機器。每個Node都有一個kubelet服務運行,該服務負責管理Node上的Pods(容器的集合)。Node上的Pods由Kubernetes控制平面分配和調度。
Node主要負責以下事項:
1. 執行Pods中運行的容器
2. 通過kubelet向Kubernetes主管控制平面通報自己的狀態
3. 使用容器運行時(如Docker或containerd)管理容器的生命週期
4. 與其他Node上的Pods進行網絡通信,實現容器之間的溝通
Kubernetes中的Node扮演著很重要的角色,它們是Kubernetes工作負載運行的實際主體,需要保證Node的穩定運行和高可用性,以確保應用程序的正常運行。
```bash
# 可以看到目前擁有的所有工作節點 e.g. minikube
kubectl get nodes
```
### [Pod](https://ithelp.ithome.com.tw/articles/10193232)
在Kubernetes中,Pod是最小的可部署單位,是由一個或多個容器組成的一個抽象概念。一個Pod內的容器共享相同的網路空間、環境變數和資源,它們一起運行在同一個工作節點,可以進行通信和共享資料。
Pod通常包含應用程式容器、資料庫容器、邊緣網路代理等相關容器。Pod的作用是為了確保這些容器可以協同運作,共同完成某項任務或提供特定的服務。Pod的生命週期由Kubernetes管理,Kubernetes會確保Pod的健康運行,並在需要時重新創建或調整Pod的個數。
值得注意的是,Pod內的容器一般會綁定在同一個工作節點上運行,但Pod本身是可遷移的,可以在不同的節點上運行,這樣可以實現高可用性和擴展性。Pod是Kubernetes中非常重要的概念,通過Pod來實現應用程式的容器化部署和管理。
```yaml
# my-first-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod # Pod 的名稱
labels:
app: webserver
spec:
containers:
- name: pod-demo # container 的名稱
image: nginx
ports:
- containerPort: 80
```
```bash
kubectl create -f my-first-pod.yaml
# describe 指令可以看到更多關於 my-pod 這個物件的資訊
kubectl describe pods my-pod
# port-forward 能將pod中的某個port number,與本機端的port做mapping
# 將本地的 8000 mapping 至 pod 的 80,當結束指令時會恢復
kubectl port-forward my-pod 8000:80
# 透過 kubectl expose 指令幫我們在Kubernetes建立一個 Service 物件
kubectl expose pod my-pod --type=NodePort --name=my-pod-service
# 利用 minikube 取得 service my-pod-service 的 url
minikube service my-pod-service --url
# 刪除 pod/my-pod
kubectl delete pod/my-pod
# 取得Deployment/Replication Set/Pod 基本資訊
kubectl get all
kubectl get nodes
kubectl get pods
kubectl describe nodes
kubectl describe pods $pod_name
kubectl delete pods $pod-name
kubectl cluster-info
minikube service wordpress-service --url
kubectl rollout history
kubectl expose deploy hello-deployment --type=NodePort --name=my-deployment-service
kubectl set image deploy/hello-deployment my-pod=zxcvbnius/docker-demo:v2.0.0
kubectl rollout status deploy hello-deployment
kubectl edit deploy hello-deployment
kubectl rollout history
kubectl set image deploy/hello-deployment my-pod=zxcvbnius/docker-demo --record
kubectl rollout undo deployment hello-deployment
kubectl rollout undo deploy hello-deployment --to-revision=3
# 列出符合 namespace 及 continaerName 的最後 1000 筆 log
kubectl logs -l "name=containerName" -n "namespace" --tail 1000
```
### [Deployment](https://ithelp.ithome.com.tw/articles/10194152)
在 Kubernetes 中,Deployment 是一種資源物件(Resource Object),用於管理應用程式的部署和擴展。Deployment 用於定義應用程式的運行配置,並確保應用程式一直保持在所需的狀態下運行。
具體來說,Deployment 可以指示 Kubernetes 創建和管理 Pod(一個或多個容器的群集)的 Replica Set(副本集)。Deployment 可以配置 Pod 的副本數量、部署策略、容器映像、資源需求等。當應用程式需要擴展或收縮時,Deployment 可以方便地調整 Pod 的副本數量。
此外,Deployment 還具有滾動升級和版本回滾的功能,從而確保在應用程式更新或出現問題時能夠輕鬆地進行管理。Deployment 還提供了其他功能,如健康檢查、自動重啟、自我修復等,以確保應用程式的穩定運行。
總的來說,Deployment 是 Kubernetes 中用於管理應用程式部署和擴展的重要工具,可以幫助用戶更有效地管理容器化應用程式的運行和更新。
```yml
# my-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-deployment
spec:
# 定義Pod的數量
replicas: 3
# 選擇哪些 pods 應該被管理
selector:
matchLabels:
app: my-deployment
template:
metadata:
labels:
app: my-deployment
spec:
containers:
- name: my-pod
image: zxcvbnius/docker-demo:latest
ports:
- containerPort: 3000
```
```bash
kubectl create -f ./my-deployment.yaml
# 取得目前Kubernetes中的deployments的資訊
kubectl get deployments
# 取得特定deployment的詳細資料
kubectl describe deploy <deployment-name>
# 編輯特定deployment物件
kubectl edit deploy <deployment-name>
# 將 hello-deployment 的 my-pod 升級到 v2.0.0 版本
kubectl set image deploy/hello-deployment my-pod=zxcvbnius/docker-demo:v2.0.0
# --record 表示將此升級指令描述加到 history 中
kubectl set image deploy/hello-deployment my-pod=zxcvbnius/docker-demo:v2.0.0 --record
# 查詢目前某deployment升級的歷史紀錄
kubectl rollout history deploy <deployment-name>
# 回滾Pod到先前一個版本
kubectl rollout undo deploy <deployment-name>
# 回滾Pod到某個特定版本
kubectl rollout undo deploy <deployment-name> --to-revision=n
```
### [Service](https://ithelp.ithome.com.tw/articles/10194344)
在 Kubernetes 中,Service 是一個用來定義一組具有相同功能的 Pod 的抽象概念。它提供了一個單一的點來訪問這些 Pod,而不需要知道它們的具體位置。
具體來說,Service 可以幫助使用者實現以下功能:
1. 負載均衡:Service 可以將流量分發到該組 Pod 中的不同實例,從而實現負載均衡。
2. 服務發現:Service 可以為 Pod 提供穩定的 DNS 名稱或 IP 地址,使其他應用程序可以輕鬆地找到和連接到它們。
3. 會話規模調整:當 Pod 的數量增加或減少時,Service 可以動態地調整其配置,以確保流量能夠正確地路由到正在運行的 Pod。
總的來說,Kubernetes 中的 Service 是一個非常重要的元件,可以幫助用戶管理和控制他們的應用程序。
```yml
apiVersion: v1
kind: Service
metadata:
name: hello-service
spec:
type: NodePort
ports:
- port: 3000
nodePort: 30390
protocol: TCP
targetPort: 3000
selector:
app: my-deployment
```
```bash
# port-forward 能將pod中的某個port number,與本機端的port做mapping
# 將本地的 8964 mapping 至 pod 的 80,當結束指令時會恢復
kubectl port-forward hello-service 8964:80
```
### TODO To be completed