【EKS】 本番運用を想定した EKS クラスターを eksctl コマンドで作成する(マニフェストファイル付き)

本記事では、本番運用を想定した EKS クラスターを eksctl コマンドで作成する方法について、実際のファイル付きで解説する。

dashboard

前提


VPC、プライベートサブネット(2つ以上)、SGは事前に作成する。

※EKSのNodeの制約から、プライベートサブネットは必ず二つ以上作成する。

※SGは、kubectl api を利用するために、443のイングレス(ソース:kubectl 実行のための PC や踏み台 EC2)を許可しておく。

説明


本番運用を想定したEKSクラスター・ノードグループの作成には大きく以下のポイントがある。

・プライベートアクセス

 kubectl api 利用時はインターネットではなく、VPNを通したアクセスを行うことがベストプラクティスである。

・EBS暗号化

 多くのプロジェクトでは、EBS暗号化が要件であることが多く、SCP(サービスコントロールポリシー)に設定されていることも多い。

・ログの保存

 多くのプロジェクトでは、ログの保存が要件であることが多い。

・マネージドノードグループの利用

 多くのプロジェクトでは、マネージドサービスの利用が要件であることが多い。

実際のコマンド


マニフェストファイルの用意

vpc-id、subnet-id、sg-id を修正する。

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: test-cluster
  region: ap-northeast-1
  version: "1.28" #202412月時点の最新

addons: #デフォルトのアドオンの場合も、記載しない場合セルフマネージドとしてデプロイされる
- name: vpc-cni
- name: kube-proxy
- name: coredns

vpc:
  id: "<vpc-id>"
  subnets:
    private:
      ap-northeast-1a:
          id: "<subnet-id>"
      ap-northeast-1c:
          id: "<subnet-id>"

  manageSharedNodeSecurityGroupRules: true 
  #Automatically add security group rules to and from the default cluster security group and the shared node security group. This allows unmanaged nodes to communicate with the control plane and managed nodes. 

  securityGroup: <sg-id>
  #the ControlPlaneSecurityGroup, for communication between control plane and nodes
  #追加のセキュリティグループ(事前に手動作成必要)
  #443のイングレス(ソース:kubeletctl 実行のための PC や踏み台 EC2)を許可しておく

  #クラスターSGは現状作成できない。

  clusterEndpoints: #クラスターへのプライベートアクセスのみ許可
    privateAccess: true
    publicAccess: false

managedNodeGroups: #マネージドノードグループを利用する
  - name: test-ng
    instanceType: m5.large
    minSize: 2
    desiredCapacity: 2
    maxSize: 4
    volumeSize: 20
    volumeType: gp3
    volumeEncrypted: true #EBS Volumeの暗号化
    privateNetworking: true

    ssh: #EKS Node に ssh接続を許可する
      allow: true
      publicKeyName: hoannet-stg-ssh-key-eks #事前にssh鍵を作成する


cloudWatch:
  clusterLogging:
    enableTypes: ["api", "audit", "authenticator", "controllerManager", "scheduler"] #全ての標準ログを出すように設定
    logRetentionInDays: 60 #ログの保持期間
    # 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 
    # by default indefinite period

EKS クラスター・Node Group のデプロイと確認

デプロイ

※コマンド実行後、クラスター作成完了までに30分程度かかる。

kubectl apply -f eks-cluster.yaml
確認
kubectl get nodes