はじめに
くどうです。
Azure で Kubernetes をLarge Scale を説明していきます。
AKSでは現行nodeを100台までのスケールしか行えません。
大規模なシステムでは100台ですまないケースがあります。
そこで、今回は100台以上Scaleする場合を例に説明していきたいと思います。
下記では2500nodeに対応した時の話が書かれています。興味あるひとはどうぞ。
Scaling Kubernetes to 2,500 Nodes
https://blog.openai.com/scaling-kubernetes-to-2500-nodes/
Large Scale
Azureで100台以上のScaleを考えた場合以下の二つの方法が考えられます。
AzureにKubernetesを展開する5つの方法
・Jujuで展開する方法
・ACS-Engineで展開する方法
Jujuでは何台まで展開できるか書かれていないのと、Azureに最適化されているわけではないためACS-Engineをおすすめします。
ACS-Engineでは1200nodeまで対応できると書いてあります。
https://github.com/Azure/acs-engine/tree/master/examples/largeclusters
では、ACS-Engineで展開する方法ですがここを参考してください。
展開の方法は変わりません。
ACS-Engineの展開yamlが少々変わります。
https://github.com/Azure/acs-engine/blob/master/examples/kubernetes.json
"agentPoolProfiles": [
{
"name": "agentpool1",
"count": 3, ←ここを増加させるだけ
"vmSize": "Standard_D2_v2",
"availabilityProfile": "AvailabilitySet"
}
],
しかし、上記の方法では可用性セット上に200台という制限があります。
https://docs.microsoft.com/ja-jp/azure/azure-subscription-service-limits#virtual-machines-limits---azure-resource-manager
また、Load Balancerの利用を想定した場合、現行のKubernetesではLB Basicしか利用できないため100台という制限に引っかかります。
https://docs.microsoft.com/ja-jp/azure/azure-subscription-service-limits#load-balancer
そこで下記のように可用性セットを分割して最大100台の構成を複数展開します。
そして、可用性セット毎にLBを配置します。ある程度の台数を想定して可用性セット(agentpool)を展開する必要があります。

以下はカスタムvnetに2つの可用性セットを配置するサンプルです。IPなど設定は適時変更する必要があります。
可用性セットを増やす場合はコピーして使うだけです。
{
"apiVersion": "vlabs",
"properties": {
"orchestratorProfile": {
"orchestratorType": "Kubernetes",
"orchestratorRelease": "1.9",
"kubernetesConfig": {
"networkPolicy": "none",
"useInstanceMetadata": false,
"cloudProviderBackoff": true,
"cloudProviderBackoffRetries": 6,
"cloudProviderBackoffJitter": 1,
"cloudProviderBackoffDuration": 6,
"cloudProviderBackoffExponent": 1.5,
"cloudProviderRateLimit": true,
"cloudProviderRateLimitQPS": 3,
"cloudProviderRateLimitBucket": 10,
"kubeletConfig": {
"--node-status-update-frequency": "1m"
},
"controllerManagerConfig": {
"--node-monitor-grace-period": "5m",
"--pod-eviction-timeout": "1m",
"--route-reconciliation-period": "1m"
}
}
},
"masterProfile": {
"count": 1,
"dnsPrefix": "lv69-k8sdemo02",
"vnetSubnetId": "/subscriptions/{Subscription ID}/resourceGroups/test/providers/Microsoft.Network/virtualNetworks/test/subnets/test1",
"vmSize": "Standard_D2_v2",
"FirstConsecutiveStaticIP": "10.0.0.239",
"vnetCidr": "10.0.0.0/16"
},
"agentPoolProfiles": [
{
"name": "agentpool1",
"count": 2,
"vmSize": "Standard_D2_v2",
"vnetSubnetId": "/subscriptions/{Subscription ID}/resourceGroups/test/providers/Microsoft.Network/virtualNetworks/test/subnets/test1",
"availabilityProfile": "AvailabilitySet"
},
{
"name": "agentpool2",
"count": 2,
"vmSize": "Standard_D2_v2",
"vnetSubnetId": "/subscriptions/{Subscription ID}/resourceGroups/test/providers/Microsoft.Network/virtualNetworks/test/subnets/test1",
"availabilityProfile": "AvailabilitySet"
}
],
"linuxProfile": {
"adminUsername": "azureuser",
"ssh": {
"publicKeys": [
{
"keyData": ""
}
]
}
},
"servicePrincipalProfile": {
"clientId": "",
"secret": ""
}
}
}
展開後は下記のnode構成になります。
azureuser@k8s-master-42344502-0:~$ kubectl get node NAME STATUS ROLES AGE VERSION k8s-agentpool1-42344502-0 Ready agent 3m v1.9.6 k8s-agentpool1-42344502-1 Ready agent 3m v1.9.6 k8s-agentpool2-42344502-0 Ready agent 3m v1.9.6 k8s-agentpool2-42344502-1 Ready agent 3m v1.9.6 k8s-master-42344502-0 Ready master 3m v1.9.6
可用性セットを増やすことでLarge Scaleに対応します。
Load Balancerの展開
KubernetesではAzure Load Balancerの展開をサポートしています。
一部、オンラインドキュメントがないためソースを参考します。
https://github.com/kubernetes/kubernetes/blob/master/pkg/cloudprovider/providers/azure/azure_loadbalancer.go
以下はマニフェストのサンプルです。
Nginxを展開して各agentpoolにLBを展開しています。
apiVersion: v1
kind: Service
metadata:
name: nginx-service1
annotations:
service.beta.kubernetes.io/azure-load-balancer-mode: "{可用性セット名}"
spec:
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: nginx-http
protocol: TCP
selector:
app: nginx
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service2
annotations:
service.beta.kubernetes.io/azure-load-balancer-mode: "{可用性セット名}"
spec:
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: nginx-http
protocol: TCP
selector:
app: nginx
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 30
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- name: nginx-http
containerPort: 80
複数のLBを作成する場合metadata内に下記のように可用性セットを指定する必要があります。
・・・
metadata:
name: nginx-service1
annotations:
service.beta.kubernetes.io/azure-load-balancer-mode: "{可用性セット名}"
spec:
type: LoadBalancer
・・・・
またInternal LBを利用する場合は
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
も追加する必要があります。
azureuser@k8s-master-42344502-0:~$ kubectl create -f nginx.yaml service "nginx-service1" created service "nginx-service2" created deployment "nginx-deploy" created azureuser@k8s-master-42344502-0:~$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.0.0.1 < none > 443/TCP 21m nginx-service1 LoadBalancer 10.0.29.148 40.121.xxx.xxx 80:30041/TCP 6m nginx-service2 LoadBalancer 10.0.234.227 52.170.xxx.xxx 80:31708/TCP 6m
2つのLBが立ち上がったことを確認できます。
これで、複数の可用性セット、複数のLBでLargeScaleに対応することが可能です。
また、最終的にはDNSラウンドロビンなど利用して各LBへのアクセス手段を考える必要が出てきます。
まとめ
現状ではLBを利用したLargeScaleはこの方法はしかないような気がします。
そうそう、そこまで増やすことは少ないと思いますが・・・
今後AKSが上手い具合に対応してくることだろうと期待しましょう。
k8s 1.10 ではnode autoscaleも対応しているのでAKS対応してくることでしょう(期待)。