記錄
使用前建議使用Install and Set Up kubectl | Kubernetes
方便操作指令使用
小記知識
K8s 最小運算單原,一個 Pod 可以跑多個 Container。
- Pod
- Pod Controllers
一個 Pod 可以共享的有
- 網路( IP Address, Port , routing system)
- 儲存(可以選擇相同儲存空間)
- IPC(Inter Process Communication)
05:08 補圖(相同網路,內部是127.0.0.1)
Container 狀態
- Running
- Terminated 執行完成(成功或失敗)
- Waiting 還沒跑起來
Pod 狀態
- Pending 還沒有起來
- Running 程式運行中
- Successed 執行成功
- Failed 執行失敗
- Unknown
Pods 重啟機制
- Never
- Always 總是重啟
- OnFailure 失敗重啟
Node Affinity 靠近
Node taints 遠離
Control Plane 不能部屬 Pod (No Schedule)
kubeadm 預設情況下不能部屬 Pod 在 Control Plane
可以設定標籤(Label,NodeSelector)
建立 Pod(Imperative Commands)
Imperative Commands 通常測試開發才會使用。正式部屬不建議這樣使用。
1 | kubectl run kuard --generator=run-pod/v1 --image=gcr.io/kuar-demo/kuard-amd64:blue |
kubectl常用命令 | 好好学习的郝
kubectl –generator 参数被弃用问题解决_沧夜-CSDN博客
kubectl 的用法约定 | Kubernetes
啟動完會看到 pods 有成功
1 | kubectl get pods |
運行 Pod
1 | kubectl apply -f kuard-pod.yaml |
移除 Pod
1 | # 使用 |
轉發 port
1 | # 本地轉發 |
更多可參考kubectl Port-Forward - Kubernetes Port Forwarding Guide
http://IP
:8080
就能訪問環境頁面
查看 log
1 | kubectl logs kuard |
exec 執行程式
1 | kubectl exec kuard ifconfig |
跟 docker 操作方式差不多
我注意到kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
1 | kubectl exec kuard -- ls -l |
容器複製檔案
1 | kubectl cp <file-spec-src> <file-spec-dest> |
使用中有看到錯誤
1 | kubectl cp kuard:/kuard ./kuard ✔ 26 23:09:09 |
有看到tar錯誤,後來 ls 有看到檔案
修復kubectl cp出現tar: Removing leading `/‘ from member names - 雲+社區 - 騰訊雲
Kubectl cp gives “tar: removing leading ‘/‘ from member names” warning · Issue #58692 · kubernetes/kubernetes
原來是 bug …
健康檢查
1 | apiVersion: v1 |
在這個配置文件中,可以看到 Pod 中只有一個容器。
periodSeconds 字段指定了 kubelet 應該每 5 秒執行一次存活探測。
initialDelaySeconds 字段告訴 kubelet 在執行第一次探測前應該等待 5 秒。
kubelet 在容器內執行命令 cat /tmp/healthy 來進行探測。 如果命令執行成功並且返回值為 0,kubelet 就會認為這個容器是健康存活的。 如果這個命令返回非 0 值,kubelet 會殺死這個容器並重新啟動它。
有兩種 Liveness, Readiness
上面是配置存活、就绪和启动探测器 | Kubernetes範例
1 | kubectl apply -f https://k8s.io/examples/pods/probe/exec-liveness.yaml |
liveness,readiness 後面會在做整理
如果使用 Liveness Probe,當錯誤發生時 (無回應或回應錯誤),k8s 會嘗試重新建立 (kill then create) 一個新的容器。
如果使用 Readiness Probe,當錯誤發生時,對應的 Service 物件就會將該容器標示為不可使用,所以任何的需求都不會導向該容器。
可先看Day 24 - 常見問題與建議 (5) - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
Liveness Probe 啟動時候,web 可能會有延連時間。例如有些程式啟動不可能馬上出現內容
這時候 initialDelaySeconds
設定就很重要
Readiness Prob 啟動時候,Service 會算到 Pod 可用,會把當下 Container IP 加到 Service。
配置 Pod 的 liveness 和 readiness 探針 ‧ Kubernetes Handbook - Kubernetes中文指南/雲原生應用架構實踐手冊 by Jimmy Song(宋淨超)
資源限制
Request,Limit
为容器和 Pods 分配 CPU 资源 | Kubernetes
Minikube需要安裝 metrics-server
1 | minikube addons enable metrics-server |
創建一個 namespace
1 | kubectl create namespace cpu-example |
1 | apiVersion: v1 |
1 | kubectl apply -f https://k8s.io/examples/pods/resource/cpu-request-limit.yaml --namespace=cpu-example |
1 | kubectl delete namespace cpu-example |
Volumes
其他
相關 YAML API 文件
Kubernetes API Reference Docs
taint
1 | # 看Taints: 狀態 |
建立 Pod(Imperative Object)
使用 Yaml或 JSON 格式寫設定。
https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.22/
1 | kubectl create -f xxxx.yml |
建立 Pod(Declarative Object)
前面提到 Imperative Object
kubectl replace 會有當下資源不一致,原因kubectl create 不會計紀錄,但是kubectl apply 會記錄你每次傳指令yaml檔案內容,所以kubectl apply 不會有像 replace 一樣問題。
所以釐清kubectl apply 和 kubectl create 還是有差異的,書中提到用 kubectl apply
就對了XD
Pod & Pause Container
- 基於 network namespace 實作網路隔離化
- kubeadm 我發現 container 控制元件都是使用
host
network namespace,所以跟主機IP一樣
Pod 所有container 都是使用第一個建立 container,docker實作如下。
1 | docker run -d --name=ubuntu1 dersimn/netutils tail -f /dev/null |
也可用hwchiu/netutils: Docker image contains useful network tools
簡短的說,Container網路共用同網卡問題,砍掉1,2就會看不到。
這邊你看到刪除container1 後 container2 IP就會不見,依照這個狀況下,K8S網路連線這是一個很大問題,所以使用Pause Container
。
Pause Container
Pod 起來就會背景睡眠,CNI會掛載到Pause Container
讓你container 1 掛掉不會影響其他 container 2 網路
Workload/Pod Controller
kubectl plugin
kubectl 可以放置應用程式在usr/local/bin
放置kubectl-*
,這邊用 ls 看例子。
例如
放置 /usr/local/bin/kubectl-xxxx
可執行 kubectl xxxx
1 | sudo cp /bin/ls /usr/local/bin/ |
安裝 krew
- 安裝 Git
- 執行 Installing · Krew裡面指令
- 加入 krew 還境變數
- 重啟 bash/zsh
Krew 管理 Plugin 套件
1 | kubectl krew install tree |
1 | kubectl tree -n kube-system ds kindnet |
Deployment
Kubernetes 的 Deployment