Kubernetes 云管理控制器

2022-06-06 10:48 更新

Kubernetes 云管理控制器

FEATURE STATE: Kubernetes v1.11 [beta]

由于云驅(qū)動(dòng)的開(kāi)發(fā)和發(fā)布的步調(diào)與 Kubernetes 項(xiàng)目不同,將服務(wù)提供商專(zhuān)用代碼抽象到 ?cloud-controller-manager? 二進(jìn)制中有助于云服務(wù)廠(chǎng)商在 Kubernetes 核心代碼之外獨(dú)立進(jìn)行開(kāi)發(fā)。

?cloud-controller-manager? 可以被鏈接到任何滿(mǎn)足 cloudprovider.Interface 約束的云服務(wù)提供商。為了兼容舊版本,Kubernetes 核心項(xiàng)目中提供的 cloud-controller-manager 使用和 ?kube-controller-manager? 相同的云服務(wù)類(lèi)庫(kù)。 已經(jīng)在 Kubernetes 核心項(xiàng)目中支持的云服務(wù)提供商預(yù)計(jì)將通過(guò)使用 in-tree 的 cloud-controller-manager 過(guò)渡為非 Kubernetes 核心代碼。

管理

需求

每個(gè)云服務(wù)都有一套各自的需求用于系統(tǒng)平臺(tái)的集成,這不應(yīng)與運(yùn)行 ?kube-controller-manager? 的需求有太大差異。作為經(jīng)驗(yàn)法則,你需要:

  • 云服務(wù)認(rèn)證/授權(quán):你的云服務(wù)可能需要使用令牌或者 IAM 規(guī)則以允許對(duì)其 API 的訪(fǎng)問(wèn)
  • kubernetes 認(rèn)證/授權(quán):cloud-controller-manager 可能需要 RBAC 規(guī)則以訪(fǎng)問(wèn) kubernetes apiserver
  • 高可用:類(lèi)似于 kube-controller-manager,你可能希望通過(guò)主節(jié)點(diǎn)選舉(默認(rèn)開(kāi)啟)配置一個(gè)高可用的云管理控制器。

運(yùn)行云管理控制器

你需要對(duì)集群配置做適當(dāng)?shù)男薷囊猿晒Φ剡\(yùn)行云管理控制器:

  • 一定不要為 ?kube-apiserver? 和 ?kube-controller-manager? 指定 ?--cloud-provider? 標(biāo)志。 這將保證它們不會(huì)運(yùn)行任何云服務(wù)專(zhuān)用循環(huán)邏輯,這將會(huì)由云管理控制器運(yùn)行。未來(lái)這個(gè)標(biāo)記將被廢棄并去除。
  • ?kubelet ?必須使用 ?--cloud-provider=external? 運(yùn)行。 這是為了保證讓 kubelet 知道在執(zhí)行任何任務(wù)前,它必須被云管理控制器初始化。

請(qǐng)記住,設(shè)置集群使用云管理控制器將用多種方式更改集群行為:

  • 指定了 ?--cloud-provider=external? 的 kubelet 將被添加一個(gè) ?node.cloudprovider.kubernetes.io/uninitialized? 的污點(diǎn),導(dǎo)致其在初始化過(guò)程中不可調(diào)度(?NoSchedule?)。 這將標(biāo)記該節(jié)點(diǎn)在能夠正常調(diào)度前,需要外部的控制器進(jìn)行二次初始化。 請(qǐng)注意,如果云管理控制器不可用,集群中的新節(jié)點(diǎn)會(huì)一直處于不可調(diào)度的狀態(tài)。 這個(gè)污點(diǎn)很重要,因?yàn)檎{(diào)度器可能需要關(guān)于節(jié)點(diǎn)的云服務(wù)特定的信息,比如他們的區(qū)域或類(lèi)型 (高端 CPU、GPU 支持、內(nèi)存較大、臨時(shí)實(shí)例等)。
  • 集群中節(jié)點(diǎn)的云服務(wù)信息將不再能夠從本地元數(shù)據(jù)中獲取,取而代之的是所有獲取節(jié)點(diǎn)信息的 API 調(diào)用都將通過(guò)云管理控制器。這意味著你可以通過(guò)限制到 kubelet 云服務(wù) API 的訪(fǎng)問(wèn)來(lái)提升安全性。 在更大的集群中你可能需要考慮云管理控制器是否會(huì)遇到速率限制, 因?yàn)樗F(xiàn)在負(fù)責(zé)集群中幾乎所有到云服務(wù)的 API 調(diào)用。

云管理控制器可以實(shí)現(xiàn):

  • 節(jié)點(diǎn)控制器 - 負(fù)責(zé)使用云服務(wù) API 更新 kubernetes 節(jié)點(diǎn)并刪除在云服務(wù)上已經(jīng)刪除的 kubernetes 節(jié)點(diǎn)。
  • 服務(wù)控制器 - 負(fù)責(zé)在云服務(wù)上為類(lèi)型為 LoadBalancer 的 service 提供負(fù)載均衡器。
  • 路由控制器 - 負(fù)責(zé)在云服務(wù)上配置網(wǎng)絡(luò)路由。
  • 如果你使用的是 out-of-tree 提供商,請(qǐng)按需實(shí)現(xiàn)其余任意特性。

示例

如果當(dāng)前 Kubernetes 內(nèi)核支持你使用的云服務(wù),并且想要采用云管理控制器,請(qǐng)參見(jiàn) kubernetes 內(nèi)核中的云管理控制器。

對(duì)于不在 Kubernetes 核心代碼庫(kù)中的云管理控制器,你可以在云服務(wù)廠(chǎng)商或 SIG 領(lǐng)導(dǎo)者的源中找到對(duì)應(yīng)的項(xiàng)目。

對(duì)于已經(jīng)存在于 Kubernetes 內(nèi)核中的提供商,你可以在集群中將 in-tree 云管理控制器作為守護(hù)進(jìn)程運(yùn)行。請(qǐng)使用如下指南:

# 這是一個(gè)如何將 cloud-controller-manager 安裝為集群中的 Daemonset 的示例。
# 本例假定你的主控節(jié)點(diǎn)可以運(yùn)行 pod 并具有角色 node-role.kubernetes.io/master
# 請(qǐng)注意,這里的 Daemonset 不能直接在你的云上工作,此例只是一個(gè)指導(dǎo)。

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: cloud-controller-manager
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: system:cloud-controller-manager
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: cloud-controller-manager
  namespace: kube-system
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    k8s-app: cloud-controller-manager
  name: cloud-controller-manager
  namespace: kube-system
spec:
  selector:
    matchLabels:
      k8s-app: cloud-controller-manager
  template:
    metadata:
      labels:
        k8s-app: cloud-controller-manager
    spec:
      serviceAccountName: cloud-controller-manager
      containers:
      - name: cloud-controller-manager
        # 對(duì)于樹(shù)內(nèi)驅(qū)動(dòng),我們使用 k8s.gcr.io/cloud-controller-manager,
        # 鏡像可以替換為其他樹(shù)外驅(qū)動(dòng)的鏡像
        image: k8s.gcr.io/cloud-controller-manager:v1.8.0
        command:
        - /usr/local/bin/cloud-controller-manager
        - --cloud-provider=[YOUR_CLOUD_PROVIDER]  # 在此處添加你自己的云驅(qū)動(dòng)!
        - --leader-elect=true
        - --use-service-account-credentials
        # 這些標(biāo)志因每個(gè)云驅(qū)動(dòng)而異
        - --allocate-node-cidrs=true
        - --configure-cloud-routes=true
        - --cluster-cidr=172.17.0.0/16
      tolerations:
      # 這一設(shè)置是必需的,為了讓 CCM 可以自行引導(dǎo)
      - key: node.cloudprovider.kubernetes.io/uninitialized
        value: "true"
        effect: NoSchedule
      # 這些容忍度使得守護(hù)進(jìn)程能夠在控制平面節(jié)點(diǎn)上運(yùn)行
      # 如果你的控制平面節(jié)點(diǎn)不應(yīng)該運(yùn)行 pod,請(qǐng)刪除它們
      - key: node-role.kubernetes.io/control-plane
        operator: Exists
        effect: NoSchedule
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      # 這是為了限制 CCM 僅在主節(jié)點(diǎn)上運(yùn)行
      # 節(jié)點(diǎn)選擇器可能因你的集群設(shè)置而異
      nodeSelector:
        node-role.kubernetes.io/master: ""

限制 

運(yùn)行云管理控制器會(huì)有一些可能的限制。雖然以后的版本將處理這些限制,但是知道這些生產(chǎn)負(fù)載的限制很重要。

對(duì) Volume 的支持

云管理控制器未實(shí)現(xiàn) ?kube-controller-manager? 中的任何 volume 控制器,因?yàn)楹?nbsp;volume 的集成還需要與 kubelet 協(xié)作。由于我們引入了 CSI (容器存儲(chǔ)接口,container storage interface) 并對(duì)彈性 volume 插件添加了更強(qiáng)大的支持,云管理控制器將添加必要的支持,以使云服務(wù)同 volume 更好的集成。請(qǐng)?jiān)?nbsp;這里 了解更多關(guān)于 out-of-tree CSI volume 插件的信息。

可擴(kuò)展性

在以前為云服務(wù)提供商提供的架構(gòu)中,我們依賴(lài) kubelet 的本地元數(shù)據(jù)服務(wù)來(lái)獲取關(guān)于它本身的節(jié)點(diǎn)信息。通過(guò)這個(gè)新的架構(gòu),現(xiàn)在我們完全依賴(lài)云管理控制器來(lái)獲取所有節(jié)點(diǎn)的信息。對(duì)于非常大的集群,你需要考慮可能的瓶頸,例如資源需求和 API 速率限制。

雞和蛋的問(wèn)題

云管理控制器的目標(biāo)是將云服務(wù)特性的開(kāi)發(fā)從 Kubernetes 核心項(xiàng)目中解耦。 不幸的是,Kubernetes 項(xiàng)目的許多方面都假設(shè)云服務(wù)提供商的特性同項(xiàng)目緊密結(jié)合。 因此,這種新架構(gòu)的采用可能導(dǎo)致某些場(chǎng)景下,當(dāng)一個(gè)請(qǐng)求需要從云服務(wù)提供商獲取信息時(shí), 在該請(qǐng)求沒(méi)有完成的情況下云管理控制器不能返回那些信息。

Kubelet 中的 TLS 引導(dǎo)特性是一個(gè)很好的例子。 目前,TLS 引導(dǎo)認(rèn)為 kubelet 有能力從云提供商(或本地元數(shù)據(jù)服務(wù))獲取所有的地址類(lèi)型(私有、公用等), 但在被初始化之前,云管理控制器不能設(shè)置節(jié)點(diǎn)地址類(lèi)型,而這需要 kubelet 擁有 TLS 證書(shū)以和 API 服務(wù)器通信。

隨著整個(gè)動(dòng)議的演進(jìn),將來(lái)的發(fā)行版中將作出改變來(lái)解決這些問(wèn)題。


以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)