こんにちは、クラウド事業部の山路です。今回はAmazon EKSのCommunity Add-onがリリースされたので、Add-onの復習とCommunity Add-onの検証を簡単に行いました。
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のご支援をしております。
https://www.ap-com.co.jp/service/utilize-aws/
また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。