新聞中心
自動(dòng)擴(kuò)縮集群 DNS 服務(wù)
本頁展示了如何在集群中啟用和配置 DNS 服務(wù)的自動(dòng)擴(kuò)縮功能。

在開始之前
- 你必須擁有一個(gè) Kubernetes 的集群,同時(shí)你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個(gè)節(jié)點(diǎn)的集群上運(yùn)行本教程,且這些節(jié)點(diǎn)不作為控制平面主機(jī)。 如果你還沒有集群,你可以通過 Minikube 構(gòu)建一個(gè)你自己的集群,或者你可以使用下面任意一個(gè) Kubernetes 工具構(gòu)建:
- Katacoda
- 玩轉(zhuǎn) Kubernetes
要檢查版本,請(qǐng)輸入 ?kubectl version?。
- 本指南假設(shè)你的節(jié)點(diǎn)使用 AMD64 或 Intel 64 CPU 架構(gòu)
- 確保已啟用 DNS 功能本身。
- 建議使用 Kubernetes 1.4.0 或更高版本。
確定 DNS 水平自動(dòng)擴(kuò)縮特性是否已經(jīng)啟用
在 kube-system 命名空間中列出集群中的 Deployments :
kubectl get deployment --namespace=kube-system
輸出類似如下這樣:
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
...
dns-autoscaler 1 1 1 1 ...
...如果在輸出中看到 “dns-autoscaler”,說明 DNS 水平自動(dòng)擴(kuò)縮已經(jīng)啟用,可以跳到 調(diào)優(yōu)自動(dòng)擴(kuò)縮參數(shù)。
獲取 DNS Deployment 的名稱
列出集群內(nèi) kube-system 名字空間中的 DNS Deployment:
kubectl get deployment -l K8S-app=kube-dns --namespace=kube-system
輸出類似如下這樣:
NAME READY UP-TO-DATE AVAILABLE AGE
...
coredns 2/2 2 2 ...
...如果看不到 DNS 服務(wù)的 Deployment,你也可以通過名字來查找:
kubectl get deployment --namespace=kube-system
并在輸出中尋找名稱為 ?coredns ?或 ?kube-dns? 的 Deployment。
你的擴(kuò)縮目標(biāo)為:
Deployment/
其中 ?? 是 DNS Deployment 的名稱。 例如,如果你的 DNS Deployment 名稱是 ?coredns?,則你的擴(kuò)展目標(biāo)是 Deployment/coredns。
Note: CoreDNS 是 Kubernetes 的默認(rèn) DNS 服務(wù)。CoreDNS 設(shè)置標(biāo)簽 ?
k8s-app=kube-dns?, 以便能夠在原來使用 ?kube-dns? 的集群中工作。
啟用 DNS 水平自動(dòng)擴(kuò)縮
在本節(jié),我們創(chuàng)建一個(gè) Deployment。Deployment 中的 Pod 運(yùn)行一個(gè)基于 ?cluster-proportional-autoscaler-amd64? 鏡像的容器。
創(chuàng)建文件 ?dns-horizontal-autoscaler.yaml?,內(nèi)容如下所示:
kind: ServiceAccount
apiVersion: v1
metadata:
name: kube-dns-autoscaler
namespace: kube-system
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: system:kube-dns-autoscaler
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["list", "watch"]
- apiGroups: [""]
resources: ["replicationcontrollers/scale"]
verbs: ["get", "update"]
- apiGroups: ["apps"]
resources: ["deployments/scale", "replicasets/scale"]
verbs: ["get", "update"]
# 待以下 issue 修復(fù)后,請(qǐng)刪除 Configmaps
# kubernetes-incubator/cluster-proportional-autoscaler#16
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["get", "create"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: system:kube-dns-autoscaler
subjects:
- kind: ServiceAccount
name: kube-dns-autoscaler
namespace: kube-system
roleRef:
kind: ClusterRole
name: system:kube-dns-autoscaler
apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: kube-dns-autoscaler
namespace: kube-system
labels:
k8s-app: kube-dns-autoscaler
kubernetes.io/cluster-service: "true"
spec:
selector:
matchLabels:
k8s-app: kube-dns-autoscaler
template:
metadata:
labels:
k8s-app: kube-dns-autoscaler
spec:
priorityClassName: system-cluster-critical
securityContext:
seccompProfile:
type: RuntimeDefault
supplementalGroups: [ 65534 ]
fsGroup: 65534
nodeSelector:
kubernetes.io/os: linux
containers:
- name: autoscaler
image: k8s.gcr.io/cpa/cluster-proportional-autoscaler:1.8.4
resources:
requests:
cpu: "20m"
memory: "10Mi"
command:
- /cluster-proportional-autoscaler
- --namespace=kube-system
- --configmap=kube-dns-autoscaler
# 應(yīng)該保持目標(biāo)與 cluster/addons/dns/kube-dns.yaml.base 同步
- --target=
#當(dāng)集群使用大節(jié)點(diǎn)(有更多核)時(shí),“coresPerReplica”應(yīng)該占主導(dǎo)地位。
#如果使用小節(jié)點(diǎn),“nodesPerReplica“ 應(yīng)該占主導(dǎo)地位。
- --default-params={"linear":{"coresPerReplica":256,"nodesPerReplica":16,"preventSinglePointFailure":true,"includeUnschedulableNodes":true}}
- --logtostderr=true
- --v=2
tolerations:
- key: "CriticalAddonsOnly"
operator: "Exists"
serviceAccountName: kube-dns-autoscaler
在文件中,將 ?? 替換成擴(kuò)縮目標(biāo)。
進(jìn)入到包含配置文件的目錄中,輸入如下命令創(chuàng)建 Deployment:
kubectl apply -f dns-horizontal-autoscaler.yaml
一個(gè)成功的命令輸出是:
deployment.apps/dns-autoscaler created
DNS 水平自動(dòng)擴(kuò)縮在已經(jīng)啟用了。
調(diào)優(yōu)自動(dòng)擴(kuò)縮參數(shù)
驗(yàn)證 dns-autoscaler ConfigMap 是否存在:
kubectl get configmap --namespace=kube-system
輸出類似于:
NAME DATA AGE
...
dns-autoscaler 1 ...
...修改該 ConfigMap 中的數(shù)據(jù):
kubectl edit configmap dns-autoscaler --namespace=kube-system
找到如下這行內(nèi)容:
linear: '{"coresPerReplica":256,"min":1,"nodesPerReplica":16}'
根據(jù)需要修改對(duì)應(yīng)的字段。“min” 字段表明 DNS 后端的最小數(shù)量。 實(shí)際后端的數(shù)量通過使用如下公式來計(jì)算:
replicas = max( ceil( cores * 1/coresPerReplica ) , ceil( nodes * 1/nodesPerReplica ) )
注意 ?coresPerReplica ?和 ?nodesPerReplica ?的值都是整數(shù)。
背后的思想是,當(dāng)一個(gè)集群使用具有很多核心的節(jié)點(diǎn)時(shí),由 ?coresPerReplica ?來控制。 當(dāng)一個(gè)集群使用具有較少核心的節(jié)點(diǎn)時(shí),由 ?nodesPerReplica ?來控制。
其它的擴(kuò)縮模式也是支持的,詳情查看 cluster-proportional-autoscaler。
禁用 DNS 水平自動(dòng)擴(kuò)縮
有幾個(gè)可供調(diào)優(yōu)的 DNS 水平自動(dòng)擴(kuò)縮選項(xiàng)。具體使用哪個(gè)選項(xiàng)因環(huán)境而異。
選項(xiàng) 1:縮容 dns-autoscaler Deployment 至 0 個(gè)副本
該選項(xiàng)適用于所有場(chǎng)景。運(yùn)行如下命令:
kubectl scale deployment --replicas=0 dns-autoscaler --namespace=kube-system
輸出如下所示:
deployment.apps/dns-autoscaler scaled
驗(yàn)證當(dāng)前副本數(shù)為 0:
kubectl get rs --namespace=kube-system
輸出內(nèi)容中,在 DESIRED 和 CURRENT 列顯示為 0:
NAME DESIRED CURRENT READY AGE
...
dns-autoscaler-6b59789fc8 0 0 0 ...
...
選項(xiàng) 2:刪除 dns-autoscaler Deployment
如果 dns-autoscaler 為你所控制,也就說沒有人會(huì)去重新創(chuàng)建它,可以選擇此選項(xiàng):
kubectl delete deployment dns-autoscaler --namespace=kube-system
輸出內(nèi)容如下所示:
deployment.apps "dns-autoscaler" deleted
選項(xiàng) 3:從主控節(jié)點(diǎn)刪除 dns-autoscaler 清單文件
如果 dns-autoscaler 在插件管理器 的控制之下,并且具有操作 master 節(jié)點(diǎn)的寫權(quán)限,可以使用此選項(xiàng)。
登錄到主控節(jié)點(diǎn),刪除對(duì)應(yīng)的清單文件。 dns-autoscaler 對(duì)應(yīng)的路徑一般為:
/etc/kubernetes/addons/dns-horizontal-autoscaler/dns-horizontal-autoscaler.yaml
當(dāng)清單文件被刪除后,插件管理器將刪除 dns-autoscaler Deployment。
理解 DNS 水平自動(dòng)擴(kuò)縮工作原理
- cluster-proportional-autoscaler 應(yīng)用獨(dú)立于 DNS 服務(wù)部署。
- autoscaler Pod 運(yùn)行一個(gè)客戶端,它通過輪詢 Kubernetes API 服務(wù)器獲取集群中節(jié)點(diǎn)和核心的數(shù)量。
- 系統(tǒng)會(huì)基于當(dāng)前可調(diào)度的節(jié)點(diǎn)個(gè)數(shù)、核心數(shù)以及所給的擴(kuò)縮參數(shù),計(jì)算期望的副本數(shù)并應(yīng)用到 DNS 后端。
- 擴(kuò)縮參數(shù)和數(shù)據(jù)點(diǎn)會(huì)基于一個(gè) ConfigMap 來提供給 autoscaler,它會(huì)在每次輪詢時(shí)刷新它的參數(shù)表, 以與最近期望的擴(kuò)縮參數(shù)保持一致。
- 擴(kuò)縮參數(shù)是可以被修改的,而且不需要重建或重啟 autoscaler Pod。
- autoscaler 提供了一個(gè)控制器接口來支持兩種控制模式:linear 和 ladder。
本文標(biāo)題:創(chuàng)新互聯(lián)kubernetes教程:Kubernetes自動(dòng)擴(kuò)縮集群DNS服務(wù)
網(wǎng)頁路徑:http://m.5511xx.com/article/coedsgi.html


咨詢
建站咨詢
