AdmissionController阻止一个已终止的Pod被完全删除。
创始人
2024-07-27 19:31:03
0

要解决AdmissionController阻止一个已终止的Pod被完全删除的问题,可以通过自定义Admission Webhook来进行处理。以下是一个示例的解决方案,代码使用Go语言编写:

  1. 创建一个名为admission-controller的文件夹,并在其中创建main.go文件。

  2. main.go中导入必要的包:

package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"os"
	"os/signal"
	"syscall"
)

  1. 创建一个名为PodDeleteHandler的结构体,用于处理Pod删除请求:
type PodDeleteHandler struct{}

  1. 实现PodDeleteHandler结构体的ServeHTTP方法,用于处理请求和响应:
func (h *PodDeleteHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	// 读取请求的Body
	body, err := ioutil.ReadAll(r.Body)
	if err != nil {
		http.Error(w, "Failed to read request body", http.StatusInternalServerError)
		return
	}

	// 解析请求的JSON数据
	var request AdmissionRequest
	if err := json.Unmarshal(body, &request); err != nil {
		http.Error(w, "Failed to unmarshal request body", http.StatusBadRequest)
		return
	}

	// 检查Pod是否已终止
	if request.Request.Object.Metadata.DeletionTimestamp != nil {
		// Pod已终止,阻止删除操作
		response := AdmissionResponse{
			APIVersion: "admission.k8s.io/v1",
			Kind:       "AdmissionReview",
			Response: AdmissionReviewResponse{
				Allowed: false,
				Result: &Result{
					Message: fmt.Sprintf("Pod %s is terminated and cannot be deleted", request.Request.Object.Metadata.Name),
				},
			},
		}

		// 返回响应的JSON数据
		responseJSON, err := json.Marshal(response)
		if err != nil {
			http.Error(w, "Failed to marshal response body", http.StatusInternalServerError)
			return
		}

		// 设置响应头部
		w.Header().Set("Content-Type", "application/json")
		// 写入响应的JSON数据
		w.Write(responseJSON)
		return
	}

	// 允许删除操作
	response := AdmissionResponse{
		APIVersion: "admission.k8s.io/v1",
		Kind:       "AdmissionReview",
		Response: AdmissionReviewResponse{
			Allowed: true,
		},
	}

	// 返回响应的JSON数据
	responseJSON, err := json.Marshal(response)
	if err != nil {
		http.Error(w, "Failed to marshal response body", http.StatusInternalServerError)
		return
	}

	// 设置响应头部
	w.Header().Set("Content-Type", "application/json")
	// 写入响应的JSON数据
	w.Write(responseJSON)
}

  1. 定义一个名为AdmissionRequest的结构体,用于解析请求的JSON数据:
type AdmissionRequest struct {
	APIVersion string          `json:"apiVersion"`
	Kind       string          `json:"kind"`
	Request    AdmissionReview `json:"request"`
}

type AdmissionReview struct {
	Object Object `json:"object"`
}

type Object struct {
	Metadata Metadata `json:"metadata"`
}

type Metadata struct {
	Name              string `json:"name"`
	DeletionTimestamp *string `json:"deletionTimestamp"`
}

  1. 定义一个名为AdmissionResponse的结构体,用于生成响应的JSON数据:
type AdmissionResponse struct {
	APIVersion string                  `json:"apiVersion"`
	Kind       string                  `json:"kind"`
	Response   AdmissionReviewResponse `json:"response"`
}

type AdmissionReviewResponse struct {
	Allowed bool   `json:"allowed"`
	Result  *Result `json:"result,omitempty"`
}

type Result struct {
	Message string `json:"message"`
}

  1. main函数中,创建一个http.Server并注册PodDeleteHandler处理器:
func main() {
	// 创建一个http.Server
	server := &http.Server{
		Addr: ":8080",
	}

	// 创建一个PodDeleteHandler实例
	podDeleteHandler := &PodDeleteHandler{}

	// 注册PodDeleteHandler处理器
	http.Handle("/pod-delete", podDeleteHandler)

	// 启动

相关内容

热门资讯

安卓换鸿蒙系统会卡吗,体验流畅... 最近手机圈可是热闹非凡呢!不少安卓用户都在议论纷纷,说鸿蒙系统要来啦!那么,安卓手机换上鸿蒙系统后,...
app安卓系统登录不了,解锁登... 最近是不是你也遇到了这样的烦恼:手机里那个心爱的APP,突然就登录不上了?别急,让我来帮你一步步排查...
安卓系统拦截短信在哪,安卓系统... 你是不是也遇到了这种情况:手机里突然冒出了很多垃圾短信,烦不胜烦?别急,今天就来教你怎么在安卓系统里...
安卓系统要维护多久,安卓系统维... 你有没有想过,你的安卓手机里那个陪伴你度过了无数日夜的安卓系统,它究竟要陪伴你多久呢?这个问题,估计...
windows官网系统多少钱 Windows官网系统价格一览:了解正版Windows的购买成本Windows 11官方价格解析微软...
安卓系统如何卸载app,轻松掌... 手机里的App越来越多,是不是感觉内存不够用了?别急,今天就来教你怎么轻松卸载安卓系统里的App,让...
怎么复制照片安卓系统,操作步骤... 亲爱的手机控们,是不是有时候想把自己的手机照片分享给朋友,或者备份到电脑上呢?别急,今天就来教你怎么...
安卓系统应用怎么重装,安卓应用... 手机里的安卓应用突然罢工了,是不是让你头疼不已?别急,今天就来手把手教你如何重装安卓系统应用,让你的...
iwatch怎么连接安卓系统,... 你有没有想过,那款时尚又实用的iWatch,竟然只能和iPhone好上好?别急,今天就来给你揭秘,怎...
iphone系统与安卓系统更新... 最近是不是你也遇到了这样的烦恼?手机更新系统总是失败,急得你团团转。别急,今天就来给你揭秘为什么iP...