Amazon Elastic Kubernetes Service (Amazon EKS) マネージドノードグループのプロパティを変更したいと考えています。
簡単な説明
マネージドノードグループのプロパティを更新するプロセスは、変更するプロパティタイプによって異なります。
次のプロパティを更新するには、UpdateNodegroupConfig または UpdateNodegroupVersion を使用します。
- labels
- taints
- scalingConfig
- nodeRepairConfig
- updateConfig
- launchTemplate
注: launchTemplate プロパティを編集するには、そのプロパティをマネージドノードグループの作成時に指定する必要があります。
次のプロパティを更新するには、カスタム起動テンプレートを使用します。
- diskSize
- remoteAccess
- tags
注: TagResource API を使用してタグを更新することもできます。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
instanceType プロパティを変更するには、マネージドノードグループの作成時に、起動テンプレートでインスタンスタイプを指定します。その後、起動テンプレート内で更新します。
amiType プロパティを変更するには、マネージドノードグループの作成時に、起動テンプレートで ImageId を指定します。その後、起動テンプレート内で値を更新し、他の Amazon マシンイメージ (AMI) ID を指定します。
直接変更できないプロパティを更新するには、まずマネージドノードグループを作成する必要があります。次に、必要に応じて Pod Disruption Budget (PDB) を設定し、既存のノードをドレインし、古いマネージドノードグループを削除します。
新しいマネージドノードグループを作成する
次の手順を実行します。
- 新しいマネージドノードグループを作成します。
- 作成したマネージドノードグループから起動したノードが、クラスターに正常に参加できたかどうかを確認します。次のコマンドを実行します。
kubectl get node -l 'eks.amazonaws.com/nodegroup=my-new-node-group-name'
注: my-new-node-group-name を新しいノードグループに設定したい名前に置き換えてください。
ノードがクラスターに正常に参加できた場合は、次の例に類似した出力が表示されます。
NAME STATUS ROLES AGE VERSION
ip-192-168-95-10.ec2.internal Ready <none> 3m33s v1.33.3-eks-3abbec1
ip-192-168-96-53.ec2.internal Ready <none> 3m32s v1.33.3-eks-3abbec1
オプション: PDB を設定する
Pod を新しく作成したマネージドノードグループに安全に移行し、可用性を維持するには、ワークロードに PDB を設定することをおすすめします。
既に PDB を使用している場合は、構成を確認します。次のコマンドを実行します。
kubectl get pdb -n your_namespace
注: your-namespace を名前空間名に置き換えてください。
出力例:
NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE
my-pdb 2 N/A 2 95d
PDB を構成済みでない場合は、ワークロードごとに、次のテンプレートを使用して作成します。
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: mypdb
namespace: your_namespace
spec:
minAvailable: 2
selector:
matchLabels:
app: myapp
注: your_namespace を名前空間名に置き換えてください。
詳細については、「Pod Disruption Budgets で重要なワークロードを保護する」を参照してください。
既存のノードをドレインする
既存のノードをスケジュール不可としてマークし、そのノードで実行されているポッドを削除します。
注: Kubernetes Cluster Autoscaler を使用する場合は、スケーリングアクションでの競合を避けるために、デプロイのレプリカ数をゼロにスケールダウンします。次のコマンドを実行します。
kubectl scale deployments/cluster-autoscaler --replicas=0 -n kube-system
次の手順を実行します。
- 新しいポッドがスケジュールされないようにします。次のコマンドを実行します。
kubectl cordon -l 'eks.amazonaws.com/nodegroup=my-old-node-group-name'
注: my-old-node-group-name を既存のノードグループ名に置き換えてください。
- スケジュールできない各ノードから、ワークロードを 1 つずつ削除します。次のコマンドを実行します。
kubectl drain --ignore-daemonsets --delete-emptydir-data your_node
注: your-node をノード名に置き換えてください。
- エビクトした Pod が、新しいノードで実行されるようになったことを確認します。次のコマンドを実行します。
kubectl get deploy -n your_namespace
注: your_namespace を名前空間名に置き換えてください。
出力例:
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/test 4/4 4 4 5d3h
古いマネージドノードグループを削除する
既存ノードから DaemonSet 以外のすべてのポッドがエビクトされた後、古いマネージドノードグループを削除します。
関連情報
Kubernetes データプレーン