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)

	// 启动

相关内容

热门资讯

安卓系统怎么连不上carlif... 安卓系统无法连接CarLife的原因及解决方法随着智能手机的普及,CarLife这一车载互联功能为驾...
iwatch怎么连接安卓系统,... 你有没有想过,那款时尚又实用的iWatch,竟然只能和iPhone好上好?别急,今天就来给你揭秘,怎...
oppo手机安卓系统换成苹果系... OPPO手机安卓系统换成苹果系统:现实吗?如何操作?随着智能手机市场的不断发展,用户对于手机系统的需...
安卓平板改windows 系统... 你有没有想过,你的安卓平板电脑是不是也能变身成Windows系统的超级英雄呢?想象在同一个设备上,你...
iphone系统与安卓系统更新... 最近是不是你也遇到了这样的烦恼?手机更新系统总是失败,急得你团团转。别急,今天就来给你揭秘为什么iP...
安卓系统上滑按键,便捷生活与高... 你有没有发现,现在手机屏幕越来越大,操作起来却越来越方便了呢?这都得归功于安卓系统上的那些神奇的上滑...
安卓系统连接耳机模式,蓝牙、有... 亲爱的手机控们,你们有没有遇到过这种情况:手机突然变成了“耳机模式”,明明耳机没插,声音却只从耳机孔...
希沃系统怎么装安卓系统,解锁更... 亲爱的读者们,你是否也像我一样,对希沃一体机上的安卓系统充满了好奇呢?想象在教室里,你的希沃一体机不...
安装了Anaconda之后找不... 在安装Anaconda后,如果找不到Jupyter Notebook,可以尝试以下解决方法:检查环境...
安卓换鸿蒙系统会卡吗,体验流畅... 最近手机圈可是热闹非凡呢!不少安卓用户都在议论纷纷,说鸿蒙系统要来啦!那么,安卓手机换上鸿蒙系统后,...