APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【AWS】Amazon EKS Community Add-onがリリースされたのでAdd-onのことを調査してみる


こんにちは、クラウド事業部の山路です。今回はAmazon EKSのCommunity Add-onがリリースされたので、Add-onの復習とCommunity Add-onの検証を簡単に行いました。

aws.amazon.com

Amazon EKS Add-onとは

Amazon EKS Add-onは、Kubernetesの運用で利用されるソフトウェア群です。Kubernetesの運用をする上で頻繁にインストールされるソフトウェアをAdd-onとして提供し、Amazon EKS上に簡単に導入・運用できる機能となります。

EKS Add-onには現在、 AWS Add-on / AWS Marketplace Add-on / Community Add-on の3種類があります。Community Add-onは2025年3月末にリリースされたばかりで、現在以下のAdd-onが利用できます。

Add-onの特徴

EKS Add-onはAmazon EKSとの互換性が検証されています。すべてのAdd-onは最新のセキュリティパッチとバグ修正が含まれています。これによりEKS上で安全に利用することが保証されます。

またEKS Add-onには上述の通り3種類ありますが、これらの導入・更新は同じ画面・同じ操作で実現できます。このような統一された管理体系により、ユーザーはAdd-onの違いを意識せず利用できます。

※Marketplace Add-onの場合はサブスクリプションの購読が追加で必要です。

ただし、何かトラブルがあったときの問い合わせ先は、各Add-onで異なるためご注意ください。

  • AWS Add-on: AWSサポートに問い合わせる
  • AWS Marketplace Add-on: AWSパートナーにサポートをリクエストする
  • Community Add-on: 対象のコミュニティに問い合わせる

Add-onの使いどころ

EKS Add-onの使いどころを考えてみると、EKSクラスターをテンプレートとして開発者に提供する場合が思い浮かびました。

EKS Add-onはEKSの運用で使われるソフトウェアを、AWS APIを通じてデプロイできることが特徴の一つです。EKSクラスターをAWS CloudFormation / Terraform等のIaCファイルで管理する場合、metrics-serverなどのソフトウェアも同じ方法で管理できます。これにより、EKSクラスターのプロビジョニング処理のプロセスを共通化し、開発環境の立ち上げやセルフサービスなどをよりシンプルに実現できます。

Add-onの導入と更新を試す

ここではAWS Add-on / Community Add-onを題材に、導入と更新を試してみます。今回はAWSマネジメントコンソールから操作しました。操作の前に、あらかじめEKSクラスターを作成しておきます。

# EKSは1.32を利用
~ $ kubectl version
Client Version: v1.32.0-eks-5ca49cb
Kustomize Version: v5.5.0
Server Version: v1.32.3-eks-bcf3d70

# Add-onインストール前の状態
~ $ kubectl get pods -A
NAMESPACE     NAME                       READY   STATUS    RESTARTS   AGE
kube-system   aws-node-4c7zb             2/2     Running   0          4m54s
kube-system   aws-node-67tkx             2/2     Running   0          4m53s
kube-system   coredns-6d78c58c9f-cbnfv   1/1     Running   0          8m48s
kube-system   coredns-6d78c58c9f-qngl2   1/1     Running   0          8m48s
kube-system   kube-proxy-892fs           1/1     Running   0          4m53s
kube-system   kube-proxy-n9x27           1/1     Running   0          4m54s

AWSマネジメントコンソールからログインします。EKSメニューからアドオンに移動し、 アドオンをさらに追加 を選択します。

アドオンの追加画面に移動します。この画面上で3種類のAdd-onから必要なものをチェックし、インストールするAdd-onを選択します。

※Community Add-onの選択画面はこちら。

次の画面で各Add-onの設定を行います。Add-onの設定にはAdd-onのバージョンなどが含まれます。ここではAmazon EBS CSI Driverを例にします。

Amazon EBS CSI DriverはEBSを操作するためのIAM権限が必要です。Add-on画面からはIAM権限の設定も可能で、EKS Pod Identity / IAM Role for Service Account (IRSA) のどちらかを選択できます。

またAdd-onの画面からは新規IAMロールの作成も簡単にできます。 推奨ロールを作成 を選択するとIAMロールの作成画面に移動し、必要な権限が選択された状態で表示されます。作業者は 次へ を選択するだけで必要なIAMロールを作成できます。

最後に追加するAdd-onの種類と設定を確認し、問題なければ追加を実行します。

しばらくするとAdd-onの追加が完了します。

# Podの作成も確認できます
~ $ kubectl get pods -A
NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE
kube-system   aws-node-4c7zb                       2/2     Running   0          21m
kube-system   aws-node-67tkx                       2/2     Running   0          21m
kube-system   coredns-6d78c58c9f-cbnfv             1/1     Running   0          25m
kube-system   coredns-6d78c58c9f-qngl2             1/1     Running   0          25m
kube-system   ebs-csi-controller-bdff8b7bc-9ngnf   6/6     Running   0          4m58s
kube-system   ebs-csi-controller-bdff8b7bc-pvlr6   6/6     Running   0          4m58s
kube-system   ebs-csi-node-2wlbw                   3/3     Running   0          4m59s
kube-system   ebs-csi-node-ltszs                   3/3     Running   0          4m59s
kube-system   kube-proxy-892fs                     1/1     Running   0          21m
kube-system   kube-proxy-n9x27                     1/1     Running   0          21m
kube-system   metrics-server-746f5dc94-nm8vc       1/1     Running   0          5m8s
kube-system   metrics-server-746f5dc94-w926f       1/1     Running   0          5m8s

なおMarketplace Add-onの場合、Add-on追加時点でサブスクリプションを購読していないと以下のように表示されます。

Add-on画面からサブスクリプションを購読することも可能です。

次にAdd-onの更新を行います。ここではmetrics-serverを例にしてみます。Add-onの画面に移動し、 バージョンの更新 を選択します。

するとAdd-onの設定画面に移動します。ここでバージョンの変更と変更内容の保存を行い、しばらくするとバージョンアップが完了します。

なおEKS Add-onはEKSでの利用に合わせて設定され、コンテナイメージはAmazon ECRのプライベートリポジトリで管理されます。metrics-serverは以下のように設定されていました。

metrics-serverの設定

~ $ kubectl get deploy metrics-server -n kube-system -oyaml
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "2"
  creationTimestamp: "2025-04-08T09:01:57Z"
  generation: 2
  labels:
    app.kubernetes.io/instance: metrics-server
    app.kubernetes.io/managed-by: EKS
    app.kubernetes.io/name: metrics-server
    app.kubernetes.io/version: 0.7.2
  name: metrics-server
  namespace: kube-system
  resourceVersion: "9092"
  uid: cb2ae036-77ca-4f29-a6b9-9e6a0d07e0b1
spec:
  progressDeadlineSeconds: 600
  replicas: 2
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app.kubernetes.io/instance: metrics-server
      app.kubernetes.io/name: metrics-server
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app.kubernetes.io/instance: metrics-server
        app.kubernetes.io/name: metrics-server
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/os
                operator: In
                values:
                - linux
              - key: kubernetes.io/arch
                operator: In
                values:
                - amd64
                - arm64
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app.kubernetes.io/name
                  operator: In
                  values:
                  - metrics-server
              topologyKey: kubernetes.io/hostname
            weight: 100
      containers:
      - args:
        - --secure-port=10251
        - --cert-dir=/tmp
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        image: 602401143452.dkr.ecr.ap-northeast-1.amazonaws.com/eks/metrics-server:v0.7.2-eksbuild.2
        imagePullPolicy: IfNotPresent
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /livez
            port: https
            scheme: HTTPS
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        name: metrics-server
        ports:
        - containerPort: 10251
          name: https
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /readyz
            port: https
            scheme: HTTPS
          initialDelaySeconds: 20
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        resources:
          limits:
            memory: 400Mi
          requests:
            cpu: 100m
            memory: 200Mi
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop:
            - ALL
          readOnlyRootFilesystem: true
          runAsNonRoot: true
          runAsUser: 1000
          seccompProfile:
            type: RuntimeDefault
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /tmp
          name: tmp
      dnsPolicy: ClusterFirst
      priorityClassName: system-cluster-critical
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      serviceAccount: metrics-server
      serviceAccountName: metrics-server
      terminationGracePeriodSeconds: 30
      tolerations:
      - key: CriticalAddonsOnly
        operator: Exists
      topologySpreadConstraints:
      - labelSelector:
          matchLabels:
            app.kubernetes.io/instance: metrics-server
            app.kubernetes.io/name: metrics-server
        maxSkew: 1
        topologyKey: topology.kubernetes.io/zone
        whenUnsatisfiable: ScheduleAnyway
      volumes:
      - emptyDir: {}
        name: tmp
status:
  availableReplicas: 2
  conditions:
  - lastTransitionTime: "2025-04-08T09:02:22Z"
    lastUpdateTime: "2025-04-08T09:02:22Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  - lastTransitionTime: "2025-04-08T09:01:57Z"
    lastUpdateTime: "2025-04-08T09:10:31Z"
    message: ReplicaSet "metrics-server-746f5dc94" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  observedGeneration: 2
  readyReplicas: 2
  replicas: 2
  updatedReplicas: 2
~ $ 

さいごに

APCはAWS Advanced Tier Services(アドバンストティアサービスパートナー)認定を受けております。


その中で私達クラウド事業部はAWSなどのクラウド技術を活用したSI/SESのご支援をしております。

www.ap-com.co.jp

https://www.ap-com.co.jp/service/utilize-aws/

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp