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

kubernetesAdmissionController原理介紹-創(chuàng)新互聯(lián)

Admission Controller介紹

Apiserver干的最重要的三個(gè)事就是:

為鹽邊等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及鹽邊網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作、鹽邊網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
  1. 認(rèn)證 : 看是否是合法用戶
  2. 授權(quán) : 看用戶具備哪些權(quán)限
  3. admission controller : 一個(gè)調(diào)用鏈,對(duì)請(qǐng)求進(jìn)行控制或修改,比如是否允許這個(gè)請(qǐng)求。

admission controller非常有用,也是經(jīng)常會(huì)用到的k8s的一個(gè)擴(kuò)展方式,今天在源碼級(jí)別對(duì)其做一下介紹,以及如何自己去開發(fā)一個(gè)admission controller.

我們的應(yīng)用場(chǎng)景是:我們希望把所有需要?jiǎng)?chuàng)建的pod都加上一個(gè)注解,因?yàn)槲覀冊(cè)缙谑峭ㄟ^podpreset給pod注入lxcfs的配置的,但是用戶在寫yaml文件時(shí)很容易忘記加上,所以需要在apiserver上來個(gè)自動(dòng)處理

metadata:
  name: test-net
  annotations:
    initializer.kubernetes.io/lxcfs: "true"   # 就是在pod的metadata里加上這個(gè)配置

默認(rèn)admission controller

已經(jīng)有很多默認(rèn)非常有用的admission插件,這里挑幾個(gè)介紹一下:

名稱 作用
AlwaysPullImages把所有鏡像策略都調(diào)整成alwaysPull, 多租戶安全時(shí)比較有用
DefaultStorageClass默認(rèn)存儲(chǔ)類型
DefaultTolerationSeconds節(jié)點(diǎn)notready:NoExecute時(shí)的容忍時(shí)間,比如有時(shí)我們升級(jí)kubelet,希望升級(jí)時(shí)pod不要漂移就會(huì)用到
DenyEscalatingExec拒絕遠(yuǎn)程連接容器
ExtendedResourceToleration比如我有擴(kuò)展資源,那么我可以通過它來玷污節(jié)點(diǎn),防止不需要該資源的pod到我的機(jī)器上來,如GPU
LimitRanger在多租戶配額時(shí)相當(dāng)有用,如果pod沒配額,那么我可以默認(rèn)給個(gè)很低的配額
NamespaceAutoProvision這個(gè)也非常有用,資源的namespace不存在時(shí)就創(chuàng)建一個(gè)
PodPreset可以對(duì)pod進(jìn)行一些預(yù)處理設(shè)置
ResourceQuota多租戶配額時(shí)比較重要,看資源是否滿足resource quota中的配置

alwaysPullImages 介紹

多租戶時(shí)經(jīng)常會(huì)開啟這個(gè),強(qiáng)制所有的鏡像必須去拉取,因?yàn)槿绻贿@樣,那么別的租戶如果知道了你的鏡像名就可以寫一個(gè)yaml去啟動(dòng)你的鏡像,強(qiáng)制拉時(shí)猶豫需要image pull secret所以無法拉取你的鏡像。

所以這個(gè)admission干的事就是把鏡像拉取策略都改成alwaysPull:

代碼位置:

kubernetes/plugin/pkg/admission/alwayspullimages/admission.go

func (a *AlwaysPullImages) Admit(attributes admission.Attributes, o admission.ObjectInterfaces) (err error) {
    // 你可以在attibutes里獲取到對(duì)象的一切信息,用戶信息等
    if shouldIgnore(attributes) { // 檢查一下是不是你關(guān)注的object, 比如創(chuàng)建的一個(gè)configmap 那么顯然可以忽視
        return nil
    }
    pod, ok := attributes.GetObject().(*api.Pod)

    // 這里把initContainer和Container的拉取策略都給改了
    for i := range pod.Spec.InitContainers {
        pod.Spec.InitContainers[i].ImagePullPolicy = api.PullAlways
    }

    for i := range pod.Spec.Containers {
        pod.Spec.Containers[i].ImagePullPolicy = api.PullAlways
    }

    return nil
}

# 還提供一個(gè)校驗(yàn)接口,看是不是真的都已經(jīng)被改了
func (a *AlwaysPullImages) Validate(attributes admission.Attributes, o admission.ObjectInterfaces) (err error) {
    pod, ok := attributes.GetObject().(*api.Pod)
    for i := range pod.Spec.InitContainers {
        if pod.Spec.InitContainers[i].ImagePullPolicy != api.PullAlways {
            return admission.NewForbidden(attributes,
                field.NotSupported(field.NewPath("spec", "initContainers").Index(i).Child("imagePullPolicy"),
                    pod.Spec.InitContainers[i].ImagePullPolicy, []string{string(api.PullAlways)},
                ),
            )
        }
    }

    ...

    return nil
}

然后實(shí)現(xiàn)一個(gè)注冊(cè)函數(shù):

func Register(plugins *admission.Plugins) {
    plugins.Register(PluginName, func(config io.Reader) (admission.Interface, error) {
        return NewAlwaysPullImages(), nil
    })
}

type AlwaysPullImages struct {
    *admission.Handler
}

最后需要在plugin里面把其注冊(cè)進(jìn)去:

kubernetes/pkg/kubeapiserver/options/plugins.go

func RegisterAllAdmissionPlugins(plugins *admission.Plugins) {
    imagepolicy.Register(plugins)
    ...
}

所以實(shí)現(xiàn)一個(gè)admission非常簡(jiǎn)單,主要就是實(shí)現(xiàn)兩個(gè)接口即可。

admission control webhooks

很多情況下我們并不希望大動(dòng)干戈去改apiserver代碼,所以apiserver提供了一種動(dòng)態(tài)擴(kuò)展admission的方式,非常推薦。

有兩種類型:

  1. validating admission Webhook 只作校驗(yàn),比如檢測(cè)到某個(gè)特殊字段就不讓請(qǐng)求通過
  2. mutating admission webhook 可以對(duì)請(qǐng)求體進(jìn)行修改(patch)

比較重要的是這個(gè)AdmissionReview結(jié)構(gòu)體,包含一個(gè)請(qǐng)求一個(gè)響應(yīng)

請(qǐng)求:有Object的詳細(xì)信息,用戶信息
響應(yīng): 最重要的是 1. 是否允許 2. 修改(patch)的類型 3. 修改(patch)的值, 這個(gè)符合json patch標(biāo)準(zhǔn) (kubectl patch)

可在此 找到一個(gè)webhook server的例子

看一個(gè)具體例子,labelpatch,是給對(duì)象的元數(shù)據(jù)里加一些label的。

const (
    // 特定的json patch格式
    addFirstLabelPatch string = `[
         { "op": "add", "path": "/metadata/labels", "value": {"added-label": "yes"}}
     ]`
    addAdditionalLabelPatch string = `[
         { "op": "add", "path": "/metadata/labels/added-label", "value": "yes" }
     ]`
)

// Add a label {"added-label": "yes"} to the object
func addLabel(ar v1beta1.AdmissionReview) *v1beta1.AdmissionResponse {
    obj := struct {
        metav1.ObjectMeta
        Data map[string]string
    }{}
    raw := ar.Request.Object.Raw
    err := json.Unmarshal(raw, &obj)
    if err != nil {
        klog.Error(err)
        return toAdmissionResponse(err)
    }

    reviewResponse := v1beta1.AdmissionResponse{}
    reviewResponse.Allowed = true
    if len(obj.ObjectMeta.Labels) == 0 {
        reviewResponse.Patch = []byte(addFirstLabelPatch) // 這里最需要注意的就是修改時(shí)是通過patch的方式
    } else {
        reviewResponse.Patch = []byte(addAdditionalLabelPatch)
    }
    pt := v1beta1.PatchTypeJSONPatch
    reviewResponse.PatchType = &pt
    return &reviewResponse
}

把這個(gè)放到http handle里。

把這個(gè)HTTPS服務(wù)起一個(gè)service, 這樣apiserver就可以自動(dòng)發(fā)現(xiàn)它。

apiVersion: admissionregistration.k8s.io/v1beta1
kind: ValidatingWebhookConfiguration
metadata:
  name: <name of this configuration object>
webhooks:
- name: <webhook name, e.g., pod-policy.example.io>
  rules:                                            # 最好明確一下該hook關(guān)心哪些api,防止帶來不必要的額外開銷。
  - apiGroups:
    - ""
    apiVersions:
    - v1
    operations:
    - CREATE
    resources:
    - pods
    scope: "Namespaced"
  clientConfig:
    service:
      namespace: <namespace of the front-end service>  # webhook server的namespace
      name: <name of the front-end service>            # service name
    caBundle: <pem encoded ca cert that signs the server cert used by the webhook> # 因?yàn)樾枰ㄟ^https訪問,所以要給apiserver配置ca
  admissionReviewVersions:
  - v1beta1
  timeoutSeconds: 1

總結(jié)

adminssion control 是非常重要的APIserver擴(kuò)展的方式,掌握了其開發(fā)很多地方就能以比較優(yōu)雅的方式解決一些實(shí)際問題。是基于k8s開發(fā)PaaS平臺(tái)的利器

更多精彩: https://sealyun.com

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

文章標(biāo)題:kubernetesAdmissionController原理介紹-創(chuàng)新互聯(lián)
標(biāo)題網(wǎng)址:http://aaarwkj.com/article38/cogdsp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、動(dòng)態(tài)網(wǎng)站網(wǎng)站改版、App設(shè)計(jì)App開發(fā)、靜態(tài)網(wǎng)站

廣告

聲明:本網(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)

營(yíng)銷型網(wǎng)站建設(shè)
蜜桃av网站在线播放| 亚洲国产第一av导航| 精品视频在线观看传媒| 中文字幕一区二区精品人妻| 久久国产欧美日韩精品| 欧美日韩精品亚洲成人精品| 日韩美女毛片啪啪响| 91美女人妻精品久久| 亚洲一区二区三区精品日韩| 欧美日韩精品在线二区| 婷婷久久香蕉五综合加勒比| 国产精品黑丝美女91| 黄色av在线免费观看| 日韩av黄色制服在线网站| 精品日韩av高清一区二区三区| 日本一区二区中文字幕在线| 丰满少妇亚洲中文字幕| 欧美精品蜜桃激情一区久久| 久久亚洲精品中文字幕| 久久99国产综合精品女同| 久久婷婷综合激情亚洲| 亚洲综合偷拍欧美一区日韩| 日本国内一区二区三区四区视频| 在线国产丝袜自拍观看| 真实国产熟女一区二区三区| 国产精品毛片在线看不卡| 精品乱码一区二区三区四区| 色日韩在线观看视频| 欧美偷拍一区二区三区| 久久日韩人妻中文字幕| av毛片在线观看地址| 久久人妻一区二区三区免费密臀| 国产高清精品在线一区| 国产91精品成人在线观看| 亚洲欧美激情国产综合久久| 日韩成人在线高清视频| 清纯少妇激情四射网站| 国产精品亚洲在钱视频| 成人黄网站色大片免费| 亚洲一区在线观看蜜臀| 亚洲天堂av一区二区在线|