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)

	// 启动

相关内容

热门资讯

Android Recycle... 要在Android RecyclerView中实现滑动卡片效果,可以按照以下步骤进行操作:首先,在项...
安装apache-beam==... 出现此错误可能是因为用户的Python版本太低,而apache-beam==2.34.0需要更高的P...
Android - 无法确定任... 这个错误通常发生在Android项目中,表示编译Debug版本的Java代码时出现了依赖关系问题。下...
Android - NDK 预... 在Android NDK的构建过程中,LOCAL_SRC_FILES只能包含一个项目。如果需要在ND...
Alertmanager在pr... 首先,在Prometheus配置文件中,确保Alertmanager URL已正确配置。例如:ale...
Akka生成Actor问题 在Akka框架中,可以使用ActorSystem对象生成Actor。但是,当我们在Actor类中尝试...
Agora-RTC-React... 出现这个错误原因是因为在 React 组件中使用,import AgoraRTC from “ago...
Aksnginxdomainb... 在AKS集群中,可以使用Nginx代理服务器实现根据域名进行路由。以下是具体步骤:部署Nginx i...
AddSingleton在.N... 在C#中创建Singleton对象通常是通过私有构造函数和静态属性来实现,例如:public cla...
apache子目录二级域名 Apache是一款流行的Web服务器软件,它允许用户使用子目录作为二级域名。使用Apache作为服务...