K8s随笔
1、常用命令
//查看所有ns下的cr: kubectl get application --all-namespaces//切換到指定的ns kubens <namespace-name>//刪除優雅退出失敗的terminating的pod kubectl?delete?pods <pod> --grace-period=0 --force//查看pod日志的最后10行 kubectl?logs <podname> -n <ns> --tail=10//更新鏡像 kubectl set image deployment <dploy-name> <容器名>=<image-name>//輸出yaml文件到本地 kubectl get deploy <deploy-name> -o yaml > <file-name>//持續觀察 kubectl get pod <pod-name> -w//查看端口占用 netstat -anp | grep 8080//scale kubectl scale --replicas=3 deploy <deployment-name>//重啟deployment kubectl rollout restart deploy <deployment-name>// 查看歷史版本 kubectl rollout history deploy <deployment-name>//回滾到歷史版本3 kubectl rollout undo daemonset/abc --to-revision=3//統計數目 kubectl get app -A | wc -l//vi查找關鍵字 進入vi中,先按下"ESC"跳轉成命令輸入模式; 輸入斜杠“/”,這時屏幕會跳轉到底部,輸入欄出現"/"; 輸入你需要查找的關鍵字,回車; 如果要繼續查找關鍵字,輸入n; 向前查找,輸入N(大寫);2、CRD.yaml編寫:
(1)CRD的type:integer類型--reconcile的int類型;
(2)CRD的format:float64 type:number類型--reconcile的float64類型;
(3)CRD的type: object ?x-kubernetes-preserve-unknown-fields: true類型--map[string]interface{}類型
// +kubebuilder:pruning:PreserveUnknownFields CompStatus runtime.RawExtension `json:"compStatus,omitempty"`對于map類型的CRUD,可以使用gjson和sjson進行操作,
參考鏈接:k8s之CRD定義map[string]interface{}類型_fourierr的博客-CSDN博客
3、k8s錯誤事件
1、back-off restarting failed container // 說明pod啟動成功后又退出了,一般是容器里沒有能持續運行的常駐進程。4、return ctrl.Result{},err?時如果err不為空則表示reconcile error,會打印堆棧信息,如果是自定義錯誤返回,則會打印出日志打印的堆棧
github.com/go-logr/zapr.(*zapLogger).Error sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).reconcileHandler sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).processNextWorkItem sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).worker k8s.io/apimachinery/pkg/util/wait.BackoffUntil.func1 k8s.io/apimachinery/pkg/util/wait.BackoffUntil k8s.io/apimachinery/pkg/util/wait.JitterUntil k8s.io/apimachinery/pkg/util/wait.UntilResourceQuota 用來限制 namespace 中所有的 Pod 占用的總的資源 request 和 limit。
LimitRange 用來限制 namespace 中 單個Pod 默認資源 request 和 limit
4、port、targetPort、nodePort
targetPort是pod上的端口;
port是service暴露在cluster ip上的端口,<cluster ip>:port?是提供給集群內部訪問service的入口;
nodePort是提供給集群外部訪問service的一種方式;
5、PV、PVC、StorageClass
PV是用來定義一個存儲卷的;
PV是用來描述或定義一個存儲卷的;
StorageClass作用是創建PV模板,用戶提交PVC指定StorageClass,對用的sc則會為其自動創建PV并進行綁定
6、serviceAccount
Kubernetes 內部的賬號系統有 User、Group、ServiceAccount,當我們通過 RBAC 授權獲得資源權限之后,其實這 3 個資源的權限能力是一樣的。因為使用場景的不同,針對人的權限一般會提供 User、Group 對象;當面對 Pod 之間或外部系統服務對 Kubernetes API 的調用一般會采用 ServiceAccount。
7、k8s的命名要求必須小寫字母開頭,且只能包含字母、數字、減號
8、k8s調度成功->pending,這時候會執行pod綁定到節點、拉取鏡像等;
pod里的容器進程都啟動成功->running,至少一個容器在運行或重啟。
9、pod內存占用超過80%,就有OOMKill和被驅逐的風險
10、kubevela主要是把workload和trait都抽象成crd,application統一管理這些crd,實現traid和workload解耦,可擴展性更強,一鍵式混合環境部署。
11、?Scheme用于提供GVK與對應Go?types?的映射關系,每一種Controller都需要一個scheme;
12、k8s event事件默認1小時自動刪除;
13、DiscoveryClient發現客戶端用于獲取Resource資源組、Version版本等信息;
14、RESTMapper用于管理所有對象的信息??梢灾苯油ㄟ^version,group獲取到RESTMapper,然后通過kind類型可以獲取到相對應的信息;
15、Terraform能在任意的基礎設施上管理維護任意資源,是HashCorp公司開源的,比如針對AWS,我們可以用它創建,修改,刪除S3 Bucket等各種資源,同時可以通過自定義terraform Provider來支持新的基礎設施,provider其實也是對crud和import的?rest api的一層抽象,有點類似于CNI,CSI這種。
16、不應該在一個reconciler邏輯中進行兩次資源的update(update status除外),否則會引發版本不一致的報錯。
17、FluxCD,GitOps——使用Git去管理Kubernetes集群:在GitOps中,一旦Git倉庫中的代碼被更改,CI/CD Pipeline也就會對Kubernetes集群進行更改,同時也應用了Kubernetes控制循環的思想,用Git管理的Kubernetes集群的期望狀態也會和Git倉庫中的實時狀態不斷地進行比較。
18、云原生三大開源項目OAM/KubeVela、OCM?、OpenKruise(Kubernetes 的擴展,CloneSet、UnitedDeployment、AdvancedStatefulSet)
19、metadata.generation是版本迭代的概念,表示這個資源的元配置數據被修改了多少次,每次修改generation都會增長1,而status.observedGeneration就是最近觀察到的可用的版本迭代。
20、配置漂移(Infrastructure/Configuration Drift)即當用戶聲明的應用部署計劃和生產環境實際運行的實例狀態發生不一致。
21、Finalizers是一種刪除攔截機制,能夠實現刪除前回調Pre-delete,比如資源a種創建了外部資源b,希望在刪除該資源a的同時級聯刪除關聯的外部資源。也就是說刪除存在Finalizers字段的資源時,不會立即刪除該資源,而是會首先設置deletionTimestamp值,deletionTimestamp值被設置后該資源就只能等待被刪除而不能進行其他操作,同時負責watch該對象的控制器會刪除級聯的資源,然后再更新清除對應的資源的對應的Finalizer值,之后apiserver會自動將該對象刪除。
22、ControllerRevision主要用來保存歷史版本信息,每一個ControllerRevision對應了資源的一個版本,通過ControllerRevision,控制器能夠管理資源的不同版本,并進行更新以及回滾操作。
對于資源的更新操作,會先查看有沒有對應的ControllerRevision,如果沒有說明資源已經更新過,Controller就會創建一個新版本的ControllerRevision及一個新的?ControllerRevision?hash?版本號。
23、k8s 對 API 訪問提供了三種安全訪問控制措施:認證、鑒權和準入控制Admission Control,其中認證是解決用戶是誰的問題,鑒權是解決用戶能做什么的問題,Admission Control 則是資源管理的作用。Admission webhooks是Admission的擴展,是一種HTTP回調,能夠接收Admission請求并對它們做一些事情,主要有MutatingAdmissionWebhook和ValidatingAdmissionWebhook,如果啟用了MutatingAdmissionWebhook,當開始創建一種k8s資源對象的時候,創建請求會發到你所編寫的controller中,然后我們就可以做一系列的操作,包括植入注解等;而ValidatingAdmissionWebhook 是按照你自定義的邏輯是否允許資源的創建。
總結
- 上一篇: 天才程序员的传奇人生:项目被总统抢走,在
- 下一篇: 我的常用软件大公开!