クラスター内のDNSサービスのオートスケール
このページでは、KubernetesクラスターでDNSサービスのオートスケールを有効にし、設定する方法を説明します。
始める前に
Kubernetesクラスターが必要、かつそのクラスターと通信するためにkubectlコマンドラインツールが設定されている必要があります。 このチュートリアルは、コントロールプレーンのホストとして動作していない少なくとも2つのノードを持つクラスターで実行することをおすすめします。 まだクラスターがない場合、minikubeを使って作成するか、 以下のいずれかのKubernetesプレイグラウンドも使用できます:
バージョンを確認するには次のコマンドを実行してください:
kubectl version.このガイドでは、ノードがAMD64またはIntel 64のCPUアーキテクチャを使用していることを前提としています。
Kubernetes DNSが有効になっていることを確認してください。
DNS水平オートスケールがすでに有効になっているかどうかの確認
kube-system名前空間内のクラスターのDeploymentを一覧表示します:
kubectl get deployment --namespace=kube-system
出力は次のようになります:
NAME READY UP-TO-DATE AVAILABLE AGE
...
kube-dns-autoscaler 1/1 1 1 ...
...
出力に「kube-dns-autoscaler」が表示されている場合、DNS水平オートスケールはすでに有効になっています。 オートスケーリングパラメーターの調整にスキップしても問題ありません。
DNS Deploymentの名前を取得する
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サービスのDeploymentが表示されない場合は、名前で検索することもできます:
kubectl get deployment --namespace=kube-system
そして、corednsまたはkube-dnsという名前のDeploymentを探します。
スケール対象は
Deployment/<your-deployment-name>
となります。
ここで、<your-deployment-name>はDNS Deploymentの名前です。
たとえば、DNS Deploymentの名前がcorednsの場合、スケール対象はDeployment/corednsになります。
備考:
CoreDNSはKubernetesのデフォルトDNSサービスです。 CoreDNSは、もともとkube-dnsを使用していたクラスターでも動作できるように、k8s-app=kube-dnsというラベルを設定しています。DNS水平オートスケールを有効にする
このセクションでは、新しいDeploymentを作成します。
Deployment内のPodは、cluster-proportional-autoscaler-amd64イメージに基づくコンテナを実行します。
次の内容でdns-horizontal-autoscaler.yamlという名前のファイルを作成します:
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"]
# Remove the configmaps rule once below issue is fixed:
# 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: registry.k8s.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
# Should keep target in sync with cluster/addons/dns/kube-dns.yaml.base
- --target=<SCALE_TARGET>
# When cluster is using large nodes(with more cores), "coresPerReplica" should dominate.
# If using small nodes, "nodesPerReplica" should dominate.
- --default-params={"linear":{"coresPerReplica":256,"nodesPerReplica":16,"preventSinglePointFailure":true,"includeUnschedulableNodes":true}}
- --logtostderr=true
- --v=2
tolerations:
- key: "CriticalAddonsOnly"
operator: "Exists"
serviceAccountName: kube-dns-autoscaler
ファイル内で、<SCALE_TARGET>をスケール対象に置き換えます。
設定ファイルがあるディレクトリに移動し、次のコマンドを入力してDeploymentを作成します:
kubectl apply -f dns-horizontal-autoscaler.yaml
コマンドが成功した場合の出力は次のようになります:
deployment.apps/kube-dns-autoscaler created
DNS水平オートスケールが有効になりました。
DNSオートスケーリングパラメーターを調整する
kube-dns-autoscaler ConfigMapが存在することを確認します:
kubectl get configmap --namespace=kube-system
出力は次のようになります:
NAME DATA AGE
...
kube-dns-autoscaler 1 ...
...
ConfigMap内のデータを変更します:
kubectl edit configmap kube-dns-autoscaler --namespace=kube-system
次の行を探します:
linear: '{"coresPerReplica":256,"min":1,"nodesPerReplica":16}'
ニーズに応じてフィールドを変更します。 「min」フィールドは、DNSバックエンドの最小数を示します。 実際のバックエンド数は次の式を使用して計算されます:
replicas = max( ceil( cores × 1/coresPerReplica ) , ceil( nodes × 1/nodesPerReplica ) )
coresPerReplicaとnodesPerReplicaの値はどちらも浮動小数点数であることに注意してください。
クラスターで多くのコアを持つノードが使用されている場合はcoresPerReplicaが支配的になります。
クラスターでコアが少ないノードが使用されている場合はnodesPerReplicaが支配的になります。
他にもサポートされているスケーリングパターンがあります。 詳細は、cluster-proportional-autoscalerを参照してください。
DNS水平オートスケールを無効にする
DNS水平オートスケールを調整するためのオプションはいくつかあります。 どのオプションを使用するかは、さまざまな条件によって異なります。
オプション1: kube-dns-autoscaler Deploymentを0レプリカにスケールダウンする
このオプションはすべての状況で機能します。 次のコマンドを入力します:
kubectl scale deployment --replicas=0 kube-dns-autoscaler --namespace=kube-system
出力は次のようになります:
deployment.apps/kube-dns-autoscaler scaled
レプリカ数がゼロであることを確認します:
kubectl get rs --namespace=kube-system
出力のDESIRED列とCURRENT列に0が表示されます:
NAME DESIRED CURRENT READY AGE
...
kube-dns-autoscaler-6b59789fc8 0 0 0 ...
...
オプション2: kube-dns-autoscaler Deploymentを削除する
このオプションは、kube-dns-autoscalerが自身の管理下にある場合、つまり誰も再作成しない場合に機能します:
kubectl delete deployment kube-dns-autoscaler --namespace=kube-system
出力は次のようになります:
deployment.apps "kube-dns-autoscaler" deleted
オプション3: マスターノードからkube-dns-autoscalerマニフェストファイルを削除する
このオプションは、kube-dns-autoscalerが(非推奨の)Addon Managerの管理下にあり、マスターノードへの書き込みアクセス権がある場合に機能します。
マスターノードにサインインし、対応するマニフェストファイルを削除します。 このkube-dns-autoscalerの一般的なパスは次のとおりです:
/etc/kubernetes/addons/dns-horizontal-autoscaler/dns-horizontal-autoscaler.yaml
マニフェストファイルが削除されると、Addon Managerはkube-dns-autoscaler Deploymentを削除します。
DNS水平オートスケールの仕組みを理解する
cluster-proportional-autoscalerアプリケーションは、DNSサービスとは別にデプロイされます。
オートスケーラーPodは、クラスター内のノード数とコア数についてKubernetes APIサーバーをポーリングするクライアントを実行します。
現在のスケジュール可能なノードとコア、および指定されたスケーリングパラメーターに基づいて、必要なレプリカ数が計算され、DNSバックエンドに適用されます。
スケーリングパラメーターとデータポイントはConfigMapを介してオートスケーラーに提供され、最新の目的のスケーリングパラメーターで最新の状態を維持するために、ポーリング間隔ごとにパラメーターテーブルを更新します。
スケーリングパラメーターへの変更は、オートスケーラーPodを再構築または再起動することなく許可されます。
オートスケーラーは、linearとladderの2つの制御パターンをサポートするコントローラーインターフェースを提供します。
次の項目
- クリティカルなアドオンPodの保証されたスケジューリングについて読む。
- cluster-proportional-autoscalerの実装について詳しく学ぶ。