markdown-it
demo
Delete
Submit
clear
permalink
### 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
html
source
debug
Fork me on GitHub