欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

怎么部署一個(gè)webhook

這篇文章主要介紹“怎么部署一個(gè)webhook”,在日常操作中,相信很多人在怎么部署一個(gè)webhook問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”怎么部署一個(gè)webhook”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序設(shè)計(jì)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了平原免費(fèi)建站歡迎大家使用!

External Admission Webhooks工作機(jī)制

External Admission Webhooks有什么用

我們什么時(shí)候需要用External Admission Webhooks呢?當(dāng)集群管理員需要強(qiáng)制對(duì)某些請(qǐng)求或者所有請(qǐng)求都進(jìn)行校驗(yàn)或者修改的時(shí)候,就可以考慮使用ValidatingAdmissionWebhook或MutatingAdmissionWebhook,二者區(qū)別如下:

  • MutatingAdmissionWebhook允許你在webhook中對(duì)object進(jìn)行mutate修改;

  • ValidatingAdmissionWebhook(Kubernetes 1.9之前叫GenericAdmissionWebhook)不允許你在webhook中對(duì)Object進(jìn)行mutate修改,只是返回validate結(jié)果為true or false;

如何啟用External Admission Webhooks

  • 前面提到,需要在每個(gè)kube-apiserver實(shí)例(考慮到Kubernetes Master HA)中--admission-controll中添加ValidatingAdmissionWebhook,MutatingAdmissionWebhook 。

  • 另外,還需要在每個(gè)kube-apiserver實(shí)例的--runtime-config中添加admissionregistration.k8s.io/v1alpha1。disable的時(shí)候,也記得要從這里刪除。

MutatingAdmissionWebhook注意事項(xiàng)

  • beta in 1.9;

  • 需要注意,MutatingAdmissionWebhook是讓匹配的webhooks串行執(zhí)行的,因?yàn)槊總€(gè)webhook都可能會(huì)mutate object。

  • 同Initializers的使用類似,MutatingAdmissionWebhook是通過創(chuàng)建MutatingWebhookConfiguration來配置什么樣的request會(huì)觸發(fā)哪個(gè)webhook。

  • 注意apiserver調(diào)用webhook時(shí)一定是通過TLS認(rèn)證的,所以MutatingWebhookConfiguration中一定要配置caBundle。

ValidatingAdmissionWebhook注意事項(xiàng)

  • alpha in 1.8,beta in 1.9;

  • 需要注意,ValidatingAdmissionWebhook是讓匹配的webhooks并發(fā)執(zhí)行的,因?yàn)槊總€(gè)webhook只會(huì)進(jìn)行validate操作,而不會(huì)mutate object。

  • 同Initializers的使用類似,ValidatingAdmissionWebhook是通過創(chuàng)建ValidatingWebhookConfiguration來配置什么樣的request會(huì)觸發(fā)哪個(gè)webhook。

  • 注意apiserver調(diào)用webhook時(shí)一定是通過TLS認(rèn)證的,所以ValidatingWebhookConfiguration中一定要配置caBundle。

Sample

我們以ValidatingAdmissionWebhook為例子,看看怎么玩。

  1. 部署ValidatingWebhook,比如我們就簡(jiǎn)單的以Pod部署一個(gè)webhook,并創(chuàng)建對(duì)應(yīng)的Service:

apiVersion: v1
kind: Pod
metadata:
  labels:
    role: webhook
  name: webhook
spec:
  containers:
    - name: webhook
      image: example-webhook:latest
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
  labels:
    role: webhook
  name: webhook
spec:
  ports:
    - port: 443
      targetPort: 8000
  selector:
    role: webhook

其中example-webhook為github的項(xiàng)目caesarxuchao/example-webhook-admission-controller,通過github repo根目錄下的Dockerfile制作example-webhook鏡像。

FROM golang:1.8

WORKDIR /go/src
RUN mkdir -p github.com/caesarxuchao/example-webhook-admission-controller
COPY . ./github.com/caesarxuchao/example-webhook-admission-controller
RUN go install github.com/caesarxuchao/example-webhook-admission-controller
CMD ["example-webhook-admission-controller","--alsologtostderr","-v=4","2>&1"]
  1. 創(chuàng)建ValidatingWebhookConfiguration Object,比如:

apiVersion: admissionregistration.k8s.io/v1alpha1
kind: ValidatingWebhookConfiguration
metadata:
  name: config1
externalAdmissionHooks:
  - name: podimage.k8s.io
    rules:
      - operations:
          - CREATE
        apiGroups:
          - ""
        apiVersions:
          - v1
        resources:
          - pods
    failurePolicy: Ignore
    clientConfig:
      caBundle: xxxx
      service:
        namespace: default
        name: webhook
- 注意failurePolicy可以為Ignore或者Fail,意味著如果和webhook通信出現(xiàn)問題導(dǎo)致調(diào)用失敗,那么將根據(jù)failurePolicy進(jìn)行抉擇,是忽略失敗(admit)還是認(rèn)為準(zhǔn)入失敗(reject)。在Kubernetes 1.7中,該值只允許配置為Ignore。
- 對(duì)比initializerConfiguration,ValidatingWebhookConfiguration和MutatingWebhookConfiguration在rule的定義時(shí),增加了operations field,在resources定義時(shí)候可以指定subresource,格式為resource/subresource。
  1. ExternalAdmissionHookConfiguration創(chuàng)建后,你需要等待幾秒,然后通過通過Deployment或者直接創(chuàng)建Pod,這時(shí)創(chuàng)建Pod的請(qǐng)求就會(huì)被apiserver攔住,調(diào)用ValidatingAdmissionWebhook進(jìn)行檢查是否Admit通過。比如,上面的example-webhook是檢查容器鏡像是否以"gcr.io"為前綴的。

如何開發(fā)一個(gè)Externel Admission Webhook

admission controller實(shí)際上發(fā)送一個(gè)admissionReview請(qǐng)求給webhook server,然后webhook server從admissionReview.spec中獲取object,oldobject,userInfo等信息,進(jìn)行mutate或者validate后再發(fā)回一個(gè)admissionReview作為返回,其中返回的admissionReivew.status中有admission決定。

AdmissionReview

下面是AdmissionReview結(jié)構(gòu)體的定義:

type AdmissionReview struct {
	metav1.TypeMeta `json:",inline"`
	// Request describes the attributes for the admission request.
	// +optional
	Request *AdmissionRequest `json:"request,omitempty" protobuf:"bytes,1,opt,name=request"`
	// Response describes the attributes for the admission response.
	// +optional
	Response *AdmissionResponse `json:"response,omitempty" protobuf:"bytes,2,opt,name=response"`
}

// AdmissionRequest describes the admission.Attributes for the admission request.
type AdmissionRequest struct {
	// UID is an identifier for the individual request/response. It allows us to distinguish instances of requests which are
	// otherwise identical (parallel requests, requests when earlier requests did not modify etc)
	// The UID is meant to track the round trip (request/response) between the KAS and the WebHook, not the user request.
	// It is suitable for correlating log entries between the webhook and apiserver, for either auditing or debugging.
	UID types.UID `json:"uid" protobuf:"bytes,1,opt,name=uid"`
	// Kind is the type of object being manipulated.  For example: Pod
	Kind metav1.GroupVersionKind `json:"kind" protobuf:"bytes,2,opt,name=kind"`
	// Resource is the name of the resource being requested.  This is not the kind.  For example: pods
	Resource metav1.GroupVersionResource `json:"resource" protobuf:"bytes,3,opt,name=resource"`
	// SubResource is the name of the subresource being requested.  This is a different resource, scoped to the parent
	// resource, but it may have a different kind. For instance, /pods has the resource "pods" and the kind "Pod", while
	// /pods/foo/status has the resource "pods", the sub resource "status", and the kind "Pod" (because status operates on
	// pods). The binding resource for a pod though may be /pods/foo/binding, which has resource "pods", subresource
	// "binding", and kind "Binding".
	// +optional
	SubResource string `json:"subResource,omitempty" protobuf:"bytes,4,opt,name=subResource"`
	// Name is the name of the object as presented in the request.  On a CREATE operation, the client may omit name and
	// rely on the server to generate the name.  If that is the case, this method will return the empty string.
	// +optional
	Name string `json:"name,omitempty" protobuf:"bytes,5,opt,name=name"`
	// Namespace is the namespace associated with the request (if any).
	// +optional
	Namespace string `json:"namespace,omitempty" protobuf:"bytes,6,opt,name=namespace"`
	// Operation is the operation being performed
	Operation Operation `json:"operation" protobuf:"bytes,7,opt,name=operation"`
	// UserInfo is information about the requesting user
	UserInfo authenticationv1.UserInfo `json:"userInfo" protobuf:"bytes,8,opt,name=userInfo"`
	// Object is the object from the incoming request prior to default values being applied
	// +optional
	Object runtime.RawExtension `json:"object,omitempty" protobuf:"bytes,9,opt,name=object"`
	// OldObject is the existing object. Only populated for UPDATE requests.
	// +optional
	OldObject runtime.RawExtension `json:"oldObject,omitempty" protobuf:"bytes,10,opt,name=oldObject"`
}

// AdmissionResponse describes an admission response.
type AdmissionResponse struct {
	// UID is an identifier for the individual request/response.
	// This should be copied over from the corresponding AdmissionRequest.
	UID types.UID `json:"uid" protobuf:"bytes,1,opt,name=uid"`

	// Allowed indicates whether or not the admission request was permitted.
	Allowed bool `json:"allowed" protobuf:"varint,2,opt,name=allowed"`

	// Result contains extra details into why an admission request was denied.
	// This field IS NOT consulted in any way if "Allowed" is "true".
	// +optional
	Result *metav1.Status `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`

	// The patch body. Currently we only support "JSONPatch" which implements RFC 6902.
	// +optional
	Patch []byte `json:"patch,omitempty" protobuf:"bytes,4,opt,name=patch"`

	// The type of Patch. Currently we only allow "JSONPatch".
	// +optional
	PatchType *PatchType `json:"patchType,omitempty" protobuf:"bytes,5,opt,name=patchType"`
}

example-webhook

下面是前面提到的example-webhook的main文件,可以借鑒它來開發(fā)自己的AdmissionWebhook。

// only allow pods to pull images from specific registry.
func admit(data []byte) *v1alpha1.AdmissionReviewStatus {
	ar := v1alpha1.AdmissionReview{}
	if err := json.Unmarshal(data, &ar); err != nil {
		glog.Error(err)
		return nil
	}
	// The externalAdmissionHookConfiguration registered via selfRegistration
	// asks the kube-apiserver only sends admission request regarding pods.
	podResource := metav1.GroupVersionResource{Group: "", Version: "v1", Resource: "pods"}
	if ar.Spec.Resource != podResource {
		glog.Errorf("expect resource to be %s", podResource)
		return nil
	}

	raw := ar.Spec.Object.Raw
	pod := v1.Pod{}
	if err := json.Unmarshal(raw, &pod); err != nil {
		glog.Error(err)
		return nil
	}
	reviewStatus := v1alpha1.AdmissionReviewStatus{}
	for _, container := range pod.Spec.Containers {
		// gcr.io is just an example.
		if !strings.Contains(container.Image, "gcr.io") {
			reviewStatus.Allowed = false
			reviewStatus.Result = &metav1.Status{
				Reason: "can only pull image from grc.io",
			}
			return &reviewStatus
		}
	}
	reviewStatus.Allowed = true
	return &reviewStatus
}

func serve(w http.ResponseWriter, r *http.Request) {
	var body []byte
	if r.Body != nil {
		if data, err := ioutil.ReadAll(r.Body); err == nil {
			body = data
		}
	}

	// verify the content type is accurate
	contentType := r.Header.Get("Content-Type")
	if contentType != "application/json" {
		glog.Errorf("contentType=%s, expect application/json", contentType)
		return
	}

	reviewStatus := admit(body)
	ar := v1alpha1.AdmissionReview{
		Status: *reviewStatus,
	}

	resp, err := json.Marshal(ar)
	if err != nil {
		glog.Error(err)
	}
	if _, err := w.Write(resp); err != nil {
		glog.Error(err)
	}
}

func main() {
	flag.Parse()
	http.HandleFunc("/", serve)
	clientset := getClient()
	server := &http.Server{
		Addr:      ":8000",
		TLSConfig: configTLS(clientset),
	}
	go selfRegistration(clientset, caCert)
	server.ListenAndServeTLS("", "")
}

思考

我們發(fā)現(xiàn),MutatingAdmissionWebhook其實(shí)跟Initializers的目的都是一樣的,都是對(duì)object做修改,只是實(shí)現(xiàn)的方式不同而已。那為什么兩者要并存呢?深度剖析Kubernetes動(dòng)態(tài)準(zhǔn)入控制之Initializers中提到,Initializers具有如下缺陷:

  • 如果你部署的Initializers Controllers不能正常工作了或者性能很低,在高并發(fā)場(chǎng)景下會(huì)導(dǎo)致大量的相關(guān)對(duì)象停留在uninitialized狀態(tài),無(wú)法進(jìn)行后續(xù)的調(diào)度。這可能會(huì)影響你的業(yè)務(wù),比如你使用了HPA對(duì)相關(guān)Deployment對(duì)象進(jìn)行彈性擴(kuò)容,當(dāng)負(fù)載上來的時(shí)候,你的Initializers Controllers不能正常工作了,會(huì)導(dǎo)致你的應(yīng)用不能彈性伸縮,后果可想而知!

所以我個(gè)人的理解是,MutatingAdmissionWebhook是mutate object的一種比Initializers更優(yōu)雅的、性能更好的實(shí)現(xiàn)方式。而且從Kubernetes 1.9發(fā)布的情況來看,MutatingAdmissionWebhook是Beta,而Initializers還停留在Alpha,并且前面提到的Kubernetes 1.9中官方推薦的--adminssion-control配置中推薦的是MutatingAdmissionWebhook,而不是Initializers。因此我覺得社區(qū)其實(shí)是想用MutatingAdmissionWebhook替代Initializers。

到此,關(guān)于“怎么部署一個(gè)webhook”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

分享名稱:怎么部署一個(gè)webhook
本文URL:http://aaarwkj.com/article30/igodso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、品牌網(wǎng)站建設(shè)搜索引擎優(yōu)化、ChatGPT、網(wǎng)站導(dǎo)航虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
日本成人午夜电影网站| 日本熟妇一区二区三区在线视频| 蜜臀视频在线观看免费| 婷婷色中文字幕综合在线| 精品国产综合一区二区三区| 国产精品精品国产一区二区| 欧美一级黄色免费电影| 中文字幕av日韩在线| 欧美熟妇精品一级视频| 麻豆视频在线观看传媒| 人妻久久一区二区三区精品99 | 国产日产精品一区二区三区四区 | 日韩欧美亚洲福利在线| 日韩一区中文字幕久久| 午夜理论片在线观看有码| 免费在线观看成人av| 视频一区视频二区在线| 丰满人妻视频一二三区| 国产亚洲香蕉精彩视频| 国产激情视频一区二区三区| 亚洲一区二区在线视频在线观看| 国产三级三级三级三级| 欧美日韩亚洲一区在线| 国产精品青青草原在线| 亚洲中国av一区二区| 久久中文字幕人妻熟av| 中文字幕在线一级色视频| 雪白肥臀视频一区二区三区| 日韩精品一区二区在| 99热视频在线观看免费| 91成人国产综合久久精品| 蜜臀av网站在线播放| 亚洲国产自拍偷拍视频| 日韩欧美国产麻豆一区精品| 国产一区二区三区区别| 爱高潮www亚洲精品| 热久久这里只有精品视频| 免费亚洲网站在线观看视频| 国产一区二区精品日韩| 中文字幕在线五月婷婷| 欧美一级午夜欧美午夜视频|