原创 如何優雅的關閉channel?

一、channel使用存在的不方便地方 1、在不改變channel自身狀態的情況下,無法獲知一個channnel是否關閉。 2、關閉一個已經關閉的channel,會導致panic。因此,如果關閉channel的一方在不知道channel是否

原创 從0到1使用kubebuiler開發operator

介紹 假設一個Nginx的QPS(服務器一秒內處理的請求數)上限爲500,如果外部訪問的QPS達到了600,爲了保證服務質量,必須擴容一個Nginx來分攤請求。 在Kubernetes環境中,如果外部請求超過了單個Pod的處理極限,我們則可

原创 【轉載】controller-runtime之manager的實現

介紹 在controller-runtime中使用一個 Manager 的接口來管理 Controller,除了控制器其實還可以管理A dmission Webhook,也包括訪問資源對象的client、cache、scheme等,如下圖所

原创 【轉載】Controller-runtime控制器的實現

介紹 controller-runtime框架實際上是社區幫我們封裝的一個控制器處理的框架,底層核心實現原理和我們自定義一個controller控制器邏輯是一樣的,只是在這個基礎上新增了一些概念,開發者直接使用這個框架去開發控制器會更加簡單

原创 手摸手教你從生成CRD到編寫自定義控制器

介紹 我們可以使用code-generator 以及controller-tools來進行代碼自動生成,通過代碼自動生成可以幫我們自動生成 CRD 資源對象,以及客戶端訪問的 ClientSet、Informer、Lister 等工具包,接

原创 controller-tool的簡單使用

介紹 在上一篇code-generator簡單介紹中重點介紹瞭如何使用code-generator來自動生成代碼,通過自動生成的代碼可以幫助我們像訪問k8s內置資源那樣來操作我們的CRD,其實就是幫助我們生成ClientSet、Inform

原创 CRD的簡單介紹

介紹 Custom Resource Define 簡稱 CRD,是 Kubernetes(v1.7+)爲提高可擴展性,讓開發者去自定義資源的一種方式。 CRD 資源可以動態註冊到集羣中,註冊完畢後,用戶可以通過 kubectl 來創建訪問

原创 code-generator的簡單介紹

代碼生成器 介紹 client-go爲每種k8s內置資源提供了對應的clientset和informer。那麼我們要監聽和操作自定義資源對象,應該如何做呢? 方式一:使用client-go提供的dynamicClient來操作自定義資源對象

原创 controller的簡單介紹

介紹 Kubernetes控制器是一個主動調諧的過程,它會watch一些對象的期望狀態,也會watch實際的狀態,然後控制器會發送一些指令嘗試讓對象的當前狀態往期望狀態遷移。 控制器最簡單的實現就是一個循環: for{ desired

原创 使用client-go實現自定義控制器

使用client-go實現自定義控制器 介紹 我們已經知道,Service對集羣之外暴露服務的主要方式有兩種:NodePort和LoadBalancer,但是這兩種方式,都有一定的缺點: NodePort方式的缺點是會佔用很多集羣機器的端

原创 【轉載】Indexer 源碼分析

Indexer 源碼分析 介紹 我們知道DeltaFIFO 中的元素通過 Pop 函數彈出後,在指定的回調函數中將元素添加到了 Indexer 中。 Indexer 是什麼?字面意思是索引器,它就是 Informer 中的 LocalSto

原创 【轉載】DeltaFIFO源碼分析

DeltaFIFO源碼分析 介紹 我們已經知道 Reflector 中通過 ListAndWatch 獲取到數據後傳入到了本地的存儲中,也就是 DeltaFIFO 中。從 DeltaFIFO 的名字可以看出它是一個 FIFO,也就是一個先進

原创 重新認識Clientset

重新認識Clientset 1、介紹 Clientset 是調用 Kubernetes 資源對象最常用的客戶端,可以操作所有的資源對象。 那麼在 Clientset 中使如何用這些資源的呢? 因爲在 staging/src/k8s.io/a

原创 資源類型Scheme

資源類型Scheme 1、介紹 當我們操作資源和 apiserver 進行通信的時候,需要根據資源對象類型的 Group、Version、Kind 以及規範定義、編解碼等內容構成 Scheme 類型,然後 Clientset 對象就可以來訪

原创 Informer架構以及簡單使用

Informer架構以及簡單使用 介紹 我們知道可以使用 Clientset 來獲取所有的原生資源對象,那麼如果我們想要去一直獲取集羣的資源對象數據呢?豈不是需要用一個輪詢去不斷執行 List() 操作?這顯然是不合理的,實際上除了常用的