Kubernetes實戰(八)-防止k8s namespace被誤刪除

1 背景

運維新同學在預發環境操作刪除pod的時候,不知道什么原因把kubectl delete pod命令敲成了kubectl delete ns pre把預發環境刪了,幾十個模塊,將近一個小時才恢復。幸虧是測試環境啊,如果是生產可以可以跑路了。

2?解決方案

通過kubectl操作k8s資源把數據發給apiserver,在apiserver把數據持久化到etcd之前我們可以通過MutatingWebhook修改、攔截相關資源的變更。

所以我們可以通過實現MutatingWebhook機制,控制高危的操作。

方案一:自己實現MutatingWebhook保護k8s資源不被刪除,這個具體實現大家參考作者之前寫的文章實現。

方案二:阿里開源的OpenKruise已經幫我們實現相關資源的刪除保護。他的實現原理也是基于webhook實現。

下面我們重點實踐基于OpenKruise資源刪除保護。

2.1?OpenKruise 刪除保護實踐

2.1.1?OpenKruise架構

  • API:所有 OpenKruise 的功能都是通過 Kubernetes API 來提供

  • Manager:Kruise-manager 是一個運行 controller 和 webhook 中心組件,它通過 Deployment 部署在 kruise-system 命名空間中。資源保護主要是kruise-controller-manager的實現的webhook功能。

  • Daemon:DaemonSet 部署到每個 Node 節點上,提供鏡像預熱、容器重啟等功能。

2.1.2 k8s集群在線部署OpenKruise

建議采用 helm v3.5+ 來安裝 Kruise,,helm 是一個簡單的命令行工具可以從?這里?獲取。

#?Firstly?add?openkruise?charts?repository?if?you?haven't?do?this.
$?helm?repo?add?openkruise?https://openkruise.github.io/charts/#?[Optional]
$?helm?repo?update#?Install?the?latest?version.
$?helm?install?kruise?openkruise/kruise?--version?1.5.0

通過上述辦法可以在線部署OpenKruise

大部分同學的線上環境是沒有外網的,下面我們看看離線部署方式。

2.1.3?k8s集群離線部署OpenKruise

下載最新穩定版OpenKruise,作者沒有大家helm倉庫,這里使用gitlab管理kruise

#?Firstly?add?openkruise?charts?repository?if?you?haven't?do?this.
$?helm?repo?add?openkruise?https://openkruise.github.io/charts/#?[Optional]
$?helm?repo?update#?download?the?latest?version.
$?helm?pull?openkruise/kruise?--version?1.5.0

在當前目錄下有kruise-1.5.0.tgz解壓縮,并修改鏡像地址為你倉庫地址

tar?kruise-1.5.0.tgz
cd?kruisevim?values.yaml
image:repository:?yourharbor.domain.com/openkruise/kruise-managertag:?v1.5.0

注意:作者這里kruise?上傳到gitlab管理,如果你有helm倉庫可以放到自己的helm倉庫。

下載鏡像,并上傳自己的harbor倉庫

docker?pull?openkruise/kruise-manager:v1.5.0docker?tag?openkruise/kruise-manager:v1.5.0?yourharbor.domain.com/openkruise/kruise-manager:v1.5.0?docker?push?yourharbor.domain.com/openkruise/kruise-manager:v1.5.0?

在master節點上部署OpenKruise

git?clone?yourgit.domain.com/kruise.githelm?install?kruise?kruise/

至此,離線版安裝OpenKruise就完成了。

部署完后,效果如下有kruise-controller-managerkruise-daemon

kubectl??get?pod?-n?kruise-system
NAME?????????????????????????????????????????READY???STATUS????RESTARTS???AGE
kruise-controller-manager-6d7bfd75wf-4s6jk???1/1?????Running???0??????????4h23m
kruise-controller-manager-6d7bfd75wf-dstl5???1/1?????Running???0??????????6h21m
kruise-daemon-tnfd8??????????????????????????1/1?????Running???0??????????6h21m

2.2 保護的資源類型

2.2.1?保護的資源都有哪些?

目前支持的資源如下:

KindGroupVersionCascading judgement
Namespacecorev1namespace
CustomResourceDefinitionapiextensions.k8s.iov1beta1, v1CRD下是否還有存量的 CR
Deploymentappsv1replicas 是否為 0
StatefulSetappsv1replicas 是否為 0
ReplicaSetappsv1replicas 是否為 0
CloneSetapps.kruise.iov1alpha1replicas 是否為 0
StatefulSetapps.kruise.iov1alpha1, v1beta1replicas 是否為 0
UnitedDeploymentapps.kruise.iov1alpha1replicas 是否為 0

2.2.2?怎么開啟資源保護?

在以上資源上加上標簽policy.kruise.io/delete-protection=Always?或?policy.kruise.io/delete-protection=Cascading,即實現了對相應資源的的保護.

Always:?這個對象禁止被刪除,除非上述?label?被去掉
Cascading:?這個對象如果還有可用的下屬資源,則禁止被刪除

2.2.3 案例實戰

2.2.3.1?Always(對象禁止被刪除)

test?namespace 打上label?policy.kruise.io/delete-protection=Cascading后,不管test?namespace下是否有資源都不允許刪除test,除非把標簽去掉。

kubectl??label?ns?nohost?policy.kruise.io/delete-protection=Always
kubectl??delete?ns?testError?from?server:?admission?webhook?"vnamespace.kb.io"?denied?the?req

2.2.4 Cascading(當刪除對象還有其他資源是不讓刪)

test?namespace下還有一個pod,所以當設置label是policy.kruise.io/delete-protection=Cascading,刪除test?不允許刪除,這樣就對test?namespace 起到保護的作用。

kubect?label?ns?test?policy.kruise.io/delete-protection=Cascading?--overwrite
kubectl??delete?ns?testError?from?server:?admission?webhook?"vnamespace.kb.io"?denied?the?request:?forbidden?by?ResourcesProtectionDeletion?for?policy.kruise.io/delete-protection=Cascading?and?active?pods?1>0

如果把test?namespace 下的所有pod都刪掉,test?可以被delete掉。

2.3 OpenKruise 資源保護缺點

支持的資源有限,通過 webhook configuration 的 objectSelector 字段, Kruise webhook 只會攔截處理帶有?policy.kruise.io/delete-protection?標簽的?Namespace/CustomResourceDefinition/Deployment/StatefulSet/ReplicaSet?資源。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/215895.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/215895.shtml
英文地址,請注明出處:http://en.pswp.cn/news/215895.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

jsonpath:使用Python處理JSON數據

使用Python處理JSON數據 25.1 JSON簡介 25.1.1 什么是JSON JSON全稱為JavaScript Object Notation,一般翻譯為JS標記,是一種輕量級的數據交換格式。是基于ECMAScript的一個子集,采用完全獨立于編程語言的文本格式來存儲和表示數據。簡潔和清…

java對二維數組進行排序

一、按行排序&#xff1a; 對二維數組按進行排序&#xff0c;直接調用Arrays.sort就行&#xff1a; private static int [][] sortRows(int[][] arr) {//行排序for (int i 0; i < arr.length; i) {Arrays.sort(arr[i]);}return arr;}二、按列排序&#xff1a; 1.使用比較…

計算機網絡:應用層(一)

我最近開了幾個專欄&#xff0c;誠信互三&#xff01; > |||《算法專欄》&#xff1a;&#xff1a;刷題教程來自網站《代碼隨想錄》。||| > |||《C專欄》&#xff1a;&#xff1a;記錄我學習C的經歷&#xff0c;看完你一定會有收獲。||| > |||《Linux專欄》&#xff1…

鴻蒙開發之狀態管理@Observed和@ObjectLink

一、使用場景 當對象內引用對象&#xff0c;改變內部對象屬性的時候其他狀態管理如State、Provide、Consume等是無法觸發更新的。同樣&#xff0c;在數組內如果有對象&#xff0c;改變對象的屬性也是無法更新的。在這種情況下就可以采用Observed和ObjectLink裝飾器了。 二、使…

C# WPF上位機開發(簡易圖像處理軟件)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】 圖像處理是工業生產重要的環節。不管是定位、測量、檢測還是識別&#xff0c;圖像處理在工業生產中扮演重要的角色。而c#由于自身快速開發的特點&a…

玩轉 Go 語言并發編程:Goroutine 實戰指南

一、goroutine 池 本質上是生產者消費者模型在工作中我們通常會使用可以指定啟動的 goroutine 數量-worker pool 模式&#xff0c;控制 goroutine 的數量&#xff0c;防止 goroutine 泄漏和暴漲一個簡易的 work pool 示例代碼如下&#xff1a; package mainimport ("fmt…

小程序跳轉tabbar,tabbar頁面不刷新

文章地址&#xff1a;12.小程序 之切換到tabBar頁面不刷新問題_360問答 解決辦法備份&#xff1a; wx.switchTab&#xff1a;跳轉到 tabBar 頁面&#xff0c;并關閉其他所有非 tabBar 頁面 wx.reLaunch&#xff1a;關閉所有頁面&#xff0c;打開到應用內的某個頁面。 wx.reLa…

解決微信小程序中 ‘nbsp;‘ 空格不生效的問題

在微信小程序開發中&#xff0c;我們經常會使用 來表示一個空格。這是因為在 HTML 中&#xff0c;空格會被解析為一個普通字符&#xff0c;而不會產生實際的空白間距。而 是一種特殊的字符實體&#xff0c;它被解析為一個不可見的空格&#xff0c;可以在頁面上產生真正的空…

力扣70. 爬樓梯

動態規劃 思路&#xff1a; 使用遞歸比較容易理解&#xff0c; f(n) f(n - 1) f(n - 2)&#xff1b; 到剩余1級臺階有 f(n - 1)&#xff0c;到剩余2級臺階有 f(n-2)&#xff1b;邊界情況是 n 0, f(0) 1n 1, f(1) 1n 2, f(2) 2 遞歸代碼實現&#xff1a; class Soluti…

Axure RP 9 入門教程

1. Axure簡介 Axure 是一個交互式原型設計工具&#xff0c;可以幫助用戶創建復雜的交互式應用程序和網站。Axure 能夠讓用戶快速構建出具有高度可交互性的原型&#xff0c;可以在團隊中進行協作、分享和測試。 使用 Axure 可以設計出各種不同類型的原型&#xff0c;包括網站、移…

系列十五、搭建redis集群

一、概述 上篇文章介紹了redis集群的相關知識&#xff0c;本章實戰演示redis的集群環境的詳細搭建步驟。如果幫助到了你&#xff0c;請點贊 收藏 關注&#xff01;有疑問的話也可以評論區交流。 二、搭建步驟 2.1、預備知識 判斷一個集群中的節點是否可用&#xff0c;是集群…

【SpringBoot篇】詳解基于Redis實現短信登錄的操作

文章目錄 &#x1f970;前言&#x1f6f8;StringRedisTemplate&#x1f339;使用StringRedisTemplate?常用的方法 &#x1f6f8;為什么我們要使用Redis代替Session進行登錄操作&#x1f386;具體使用?編寫攔截器?配置攔截器&#x1f33a;基于Redis實現發送手機驗證碼操作&am…

EarCMS 前臺任意文件上傳漏洞復現

0x01 產品簡介 EarCMS是一個APP內測分發系統的平臺。 0x02 漏洞概述 EarCMS前臺put_upload.php中,存在pw參數硬編碼問題,同時sql語句pdo使用錯誤,沒有有效過濾sql語句,可以控制文件名和后綴,導致可以任意文件上傳。 0x03 復現環境 FOFA:app="EearCMS" 0x0…

Flutter實現自定義二級列表

在Flutter開發中&#xff0c;其實系統已經給我們提供了一個可靠的二級列表展開的API&#xff08;ExpansionPanelList&#xff09;&#xff0c;我們先看系統的二級列表展開效果&#xff0c;一次只能展開一個&#xff0c;用ExpansionPanelList.radio實現 由此可見&#xff0c;已經…

容器化升級對服務有哪些影響?

容器技術是近幾年計算機領域的熱門技術&#xff0c;特別是隨著各種云服務的發展&#xff0c;越來越多的服務運行在以 Docker 為代表的容器之內。 本文我們就來分享一下容器化技術相關的知識。 容器化技術簡介 相比傳統虛擬化技術&#xff0c;容器技術是一種更加輕量級的操作…

分治法求最大子列和

給定N個整數的序列{ A1, A2, …, AN}&#xff0c;其中可能有正數也可能有負數&#xff0c;找出其中連續的一個子數列&#xff08;不允許空序列&#xff09;&#xff0c;使它們的和盡可能大&#xff0c;如果是負數&#xff0c;則返回0。使用下列函數&#xff0c;完成分治法求最大…

CorelDRAW軟件2024版本好用嗎?有哪些功能優勢

CorelDRAW是一款綜合性強大的專業平面設計軟件&#xff0c;其功能覆蓋了矢量圖形設計、高級文字編輯、精細繪圖以及多頁文檔和頁面設計。該軟件不僅適用于廣告設計、包裝設計&#xff0c;還廣泛應用于出版、網頁設計和多媒體制作等多個領域。下面就給大家介紹一下CorelDRAW這款…

0012Java安卓程序設計-ssm記賬app

文章目錄 **摘要**目 錄系統設計5.1 APP端&#xff08;用戶功能&#xff09;5.2后端管理員功能模塊開發環境 編程技術交流、源碼分享、模板分享、網課分享 企鵝&#x1f427;裙&#xff1a;776871563 摘要 網絡的廣泛應用給生活帶來了十分的便利。所以把記賬管理與現在網絡相…

arkts編譯報錯-arkts-limited-stdlib錯誤【Bug已完美解決-鴻蒙開發】

文章目錄 項目場景:問題描述原因分析:解決方案:適配指導案例此Bug解決方案總結項目場景: arkts編譯報錯-arkts-limited-stdlib錯誤。 我用Deveco studio4.0 beta2開發應用,報arkts-limited-stdlib錯誤 報錯內容為: ERROR: ArKTS:ERROR File: D:/prRevivw/3792lapplica…

[Verilog]用Verilog實現串并轉換/并串裝換

用Verilog實現串并轉換/并串裝換 摘要 一、串并轉換模塊 串轉并就是將低3位信號和輸入信號一起賦值。因為經過轉換后&#xff0c;碼元速率會將為原來四分之一&#xff0c;所以設置4分頻時鐘&#xff0c;將其輸出。而并轉串就是不斷右移&#xff0c;取高位輸出。 module serial…