コンソールから EKS クラスターを作成してみた

AWS
AWS
この記事は約56分で読めます。

先日 eksctl を利用して EKS クラスターを作成しましたが、今度はマネジメントコンソールから EKS クラスターを作成してみます。

Getting started with Amazon EKS – AWS Management Console and AWS CLI - Amazon EKS
Learn how to create your first Amazon EKS cluster with nodes using the AWS Management Console and AWS CLI.

必要なネットワークリソースについて

クラスターの作成前に、EKS の要件を満たすパブリックサブネットとプライベートサブネットを持つ VPC が必要です。

Amazon EKS VPC and subnet requirements and considerations - Amazon EKS
Learn about Amazon EKS requirements and considerations for the VPC and subnets that you create a cluster in.

上記ドキュメントの内容のいくつかを以下に記載します。

  • クラスター作成には、異なる AZ にある最低 2 つのサブネットを指定
  • VPC には十分な数の IP アドレスが必要
    • クラスター、ノード、その他の Kubernetes リソースで利用
    • VPC の CIDR ブロックは追加できる
  • VPC には DNS ホスト名と、DNS 解決のサポートが必要
  • Kubernetes 1.14 以前で作成した クラスターは、「kubernetes.io/cluster/my-cluster: owned」というタグを VPC に追加して利用していた
  • EKS は、指定したサブネットに 2 – 4 個の ENI を作成
    • この ENI により、クラスターと VPC 間で通信可能となる
    • kubectl exec や kubectl logs などの Kubernetes の機能も有効にする
  • クラスター作成後、ENI を作成するサブネットの変更はできない
  • Kubernetes バージョン更新時、元の ENI を削除し、新しい ENI を作成する
    • 新 ENI は元のサブネットとは異なるサブネットに作成されることもある
    • どのサブネットに ENI が作成されるかを制御するために、クラスター作成時に指定するサブネットの数を 2 つだけに制御できる
  • サブネットの要件
    • サブネットはそれぞれ、EKSで使用するために 6 つの IP アドレスを持つ必要がある
      • 最低 16 個の IP アドレスを推奨
    • Outposts, Wavelength, Local Zone に存在できない
      • VPCにそれらがある場合、これらのタイプのサブネットに自己管理ノードと Kubernetes リソースをデプロイできる
    • パブリックまたはプライベートにすることができるが、プライベートサブネットの指定が推奨される
  • クラスター作成時に指定したサブネットに、ノードや Kubernetes リソースをデプロイできる
    • しかし、指定しなかったサブネットにもデプロイできる
    • 異なるサブネットにデプロイした場合、EKS はそれらのサブネットにクラスターの ENI を作成しない
  • ノードと Kubernetes リソースをデプロイするサブネットに必要な要件
    • 使用可能な IP アドレスがある
    • インターネットから Pod へのインバウンドが必要な場合、ロードバランサーと Ingress をデプロイするために必要な IP アドレスを持つパブリックサブネットが最低 1 つは必要
      • ロードバランサーはパブリックサブネットにデプロイでき、プライベートまたはパブリックサブネットの Pod に負荷分散できる
      • 可能であれば、ノードをプライベートにデプロイすることを推奨
    • プライベートサブネットにノードをデプロイし、NAT Gateway や egress-only gateway へのルートがない場合、VPC エンドポイントを作成する
      • VPC エンドポイントは、ノードと Pod が通信する必要がある全ての AWS サービスに必要
      • エンドポイントには、ノードが属するサブネットが含まれている必要がある
    • ロードバランサーをサブネットに配置する場合、サブネットには次のタグが必要
      • プライベート
        • kubernetes.io/role/internal-elb: 1
      • パブリック
        • kubernetes.io/role/elb: 1
    • 1.18 以前の Kubernets クラスタを作成した場合、EKS は指定されたサブネットの全てに次のタグを追加
      • kubernetes.io/cluster/my-cluster: shared
    • 現在は、Kubernetes クラスターを作成しても、EKS はサブネットにタグを追加しない
      • ただし、1.19 より前のバージョンのクラスターで使用されていたサブネットのタグが、バージョンを更新しても自動的に削除されることはない
      • AWS Load Balancer Controller のバージョン 2.1.1 以前では、このタグが必要。新しいバージョンを使用している場合、サービスを中断することなくタグを削除できる

クラスターがリソースを管理するために利用する IAM ロールの作成

EKS クラスターの作成前に Kubernetes クラスター がユーザーに代わって他の AWS サービスを呼び出すためのクラスターサービスロールを作成します。

Amazon EKS cluster IAM role - Amazon EKS
Kubernetes clusters managed by Amazon EKS make calls to other AWS services on your behalf to manage the resources that you use with the service. Before you can ...

作成する IAM ロールには AWS マネージドポリシー AmazonEKSClusterPolicy をアタッチします。同ポリシーでは EC2、ELB、AutoScaling、KMS などのアクションが許可されています。

EKS クラスターの作成

まず、「クラスターを作成」をクリックします。

次に、名前を適当に入力し、Kubernetes バージョンをデフォルトの 1.24 に、クラスターサービルロールに先ほど作成した IAM ロールを選択します。
シークレットの暗号化はなしにします。

なお、EKS Kubernetes のバージョンは、平均 3 ヶ月ごとにリリースされており、各マイナーバージョンは最初にリリースされてから約 12 か月間サポートされます。

シークレットの暗号化は、KMS キーを利用して Kubernetes シークレットの暗号化に用いたデータキーの暗号化を行います。全てのデータに対してデフォルトで EBS ボリュームの暗号化が有効化されていますが、Kubernetes シークレットについては KMS キーによるエンベロープ暗号化(キーを別のキーで暗号化すること)が追加され、多層防御セキュリティを実現します。

Using EKS encryption provider support for defense-in-depth | Amazon Web Services
Gyuho Lee, Rashmi Dwaraka, and Michael Hausenblas When we announced that we plan to natively support the AWS Encryption Provider in Amazon EKS, the feedback we ...

次に、ネットワーキングとクラスターエンドポイントアクセスの設定を行います。
既存の VPC を選択し、異なる AZ のパブリックサブネット 2 つを選択しました。セキュリティグループはなし、クラスター IP アドレスファミリーは IPv4 を選択、クラスターエンドポイントアクセスはデフォルトのパブリックのままにします。

ここで選択するセキュリティグループは、追加のセキュリティグループです。EKS は、クラスターと VPC 間の通信を可能にするセキュリティグループをデフォルトで作成します。追加のセキュリティグループを選択すると、そのセキュリティグループも ENI に関連付けらます。

クラスターエンドポイントアクセスは、Kubernetes API サーバーエンドポイントへのアクセスを設定します。Kubernetes API サーバーエンドポイントは、kubectl などから Kubernetes クラスターを管理する際のアクセスに利用されます。
パブリックに設定しており接続元の制限もしていないので、VPC 外部からアクセスが可能です。

次に、ログ記録の設定をします。今回は全てのログを記録してみます。

次に、アドオンを選択します。今回はデフォルトのままでいきます。

なお、アドオンとはサポート運用機能を提供するソフトウェアです。

Amazon EKS add-ons - Amazon EKS
An add-on is software that provides supporting operational capabilities to Kubernetes applications, but is not specific to the application. This includes softwa...

次に、アドオンの設定を構成します。
全てデフォルトのままでいきます。

最後に確認画面が出るので、内容を確認して作成します。

クラスターと通信するために kubeconfig の設定を行う

$ aws eks update-kubeconfig --name test

上記コマンドにより、kubeconfig ファイルがアップデートされます。
更新された kubeconfig の抜粋は以下です。

$ kubectl config view           
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://xxx.gr7.ap-northeast-1.eks.amazonaws.com
  name: arn:aws:eks:ap-northeast-1:xxx:cluster/test
contexts:
- context:
    cluster: arn:aws:eks:ap-northeast-1:xxx:cluster/test
    user: arn:aws:eks:ap-northeast-1:xxx:cluster/test
  name: arn:aws:eks:ap-northeast-1:xxx:cluster/test
current-context: arn:aws:eks:ap-northeast-1:xxx:cluster/test
kind: Config
preferences: {}
users:
- name: arn:aws:eks:ap-northeast-1:xxx:cluster/test
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1beta1
      args:
      - --region
      - ap-northeast-1
      - eks
      - get-token
      - --cluster-name
      - test
      command: aws
      env:
      - name: AWS_PROFILE
        value: xxx
      interactiveMode: IfAvailable
      provideClusterInfo: false

クラスターの全リソースを取得します(ワンライナーコマンドは ChatGPT にヒントをもらったりこちらの記事を参考にしました)。

$ kubectl get $(kubectl api-resources --verbs=list --namespaced -o name | tr "\n" "," | sed 's/,$//')  -o wide --all-namespaces
NAMESPACE         NAME                                           DATA   AGE
default           configmap/kube-root-ca.crt                     1      89m
kube-node-lease   configmap/kube-root-ca.crt                     1      89m
kube-public       configmap/kube-root-ca.crt                     1      89m
kube-system       configmap/coredns                              1      89m
kube-system       configmap/cp-vpc-resource-controller           0      89m
kube-system       configmap/eks-certificates-controller          0      89m
kube-system       configmap/extension-apiserver-authentication   6      89m
kube-system       configmap/kube-proxy                           1      89m
kube-system       configmap/kube-proxy-config                    1      89m
kube-system       configmap/kube-root-ca.crt                     1      89m

NAMESPACE     NAME                   ENDPOINTS                      AGE
default       endpoints/kubernetes   10.0.0.222:443,10.0.1.68:443   89m
kube-system   endpoints/kube-dns     <none>                         89m

NAMESPACE     LAST SEEN   TYPE      REASON             OBJECT                         SUBOBJECT   SOURCE              MESSAGE                               FIRST SEEN   COUNT   NAME
kube-system   4m3s        Warning   FailedScheduling   pod/coredns-5fc8d4cdcf-vd5bz               default-scheduler   no nodes available to schedule pods   89m          18      event/coredns-5fc8d4cdcf-vd5bz.1744e9d210b60e38
kube-system   4m3s        Warning   FailedScheduling   pod/coredns-5fc8d4cdcf-xgqfn               default-scheduler   no nodes available to schedule pods   89m          18      event/coredns-5fc8d4cdcf-xgqfn.1744e9d21c67b519

NAMESPACE     NAME                           READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES
kube-system   pod/coredns-5fc8d4cdcf-vd5bz   0/1     Pending   0          89m   <none>   <none>   <none>           <none>
kube-system   pod/coredns-5fc8d4cdcf-xgqfn   0/1     Pending   0          89m   <none>   <none>   <none>           <none>

NAMESPACE         NAME                                                SECRETS   AGE
default           serviceaccount/default                              0         89m
kube-node-lease   serviceaccount/default                              0         89m
kube-public       serviceaccount/default                              0         89m
kube-system       serviceaccount/attachdetach-controller              0         89m
kube-system       serviceaccount/aws-cloud-provider                   0         89m
kube-system       serviceaccount/aws-node                             0         89m
kube-system       serviceaccount/certificate-controller               0         89m
kube-system       serviceaccount/clusterrole-aggregation-controller   0         89m
kube-system       serviceaccount/coredns                              0         89m
kube-system       serviceaccount/cronjob-controller                   0         89m
kube-system       serviceaccount/daemon-set-controller                0         89m
kube-system       serviceaccount/default                              0         89m
kube-system       serviceaccount/deployment-controller                0         89m
kube-system       serviceaccount/disruption-controller                0         89m
kube-system       serviceaccount/eks-vpc-resource-controller          0         89m
kube-system       serviceaccount/endpoint-controller                  0         89m
kube-system       serviceaccount/endpointslice-controller             0         89m
kube-system       serviceaccount/endpointslicemirroring-controller    0         89m
kube-system       serviceaccount/ephemeral-volume-controller          0         89m
kube-system       serviceaccount/expand-controller                    0         89m
kube-system       serviceaccount/generic-garbage-collector            0         89m
kube-system       serviceaccount/horizontal-pod-autoscaler            0         89m
kube-system       serviceaccount/job-controller                       0         89m
kube-system       serviceaccount/kube-proxy                           0         89m
kube-system       serviceaccount/namespace-controller                 0         89m
kube-system       serviceaccount/node-controller                      0         89m
kube-system       serviceaccount/persistent-volume-binder             0         89m
kube-system       serviceaccount/pod-garbage-collector                0         89m
kube-system       serviceaccount/pv-protection-controller             0         89m
kube-system       serviceaccount/pvc-protection-controller            0         89m
kube-system       serviceaccount/replicaset-controller                0         89m
kube-system       serviceaccount/replication-controller               0         89m
kube-system       serviceaccount/resourcequota-controller             0         89m
kube-system       serviceaccount/root-ca-cert-publisher               0         89m
kube-system       serviceaccount/service-account-controller           0         89m
kube-system       serviceaccount/service-controller                   0         89m
kube-system       serviceaccount/statefulset-controller               0         89m
kube-system       serviceaccount/tagging-controller                   0         89m
kube-system       serviceaccount/ttl-after-finished-controller        0         89m
kube-system       serviceaccount/ttl-controller                       0         89m

NAMESPACE     NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)         AGE   SELECTOR
default       service/kubernetes   ClusterIP   172.20.0.1    <none>        443/TCP         89m   <none>
kube-system   service/kube-dns     ClusterIP   172.20.0.10   <none>        53/UDP,53/TCP   89m   k8s-app=kube-dns

NAMESPACE     NAME                                           CONTROLLER                  REVISION   AGE
kube-system   controllerrevision.apps/aws-node-54c84b5c88    daemonset.apps/aws-node     1          89m
kube-system   controllerrevision.apps/aws-node-9cc48cd87     daemonset.apps/aws-node     2          81m
kube-system   controllerrevision.apps/kube-proxy-7ffdc5c8d   daemonset.apps/kube-proxy   1          89m

NAMESPACE     NAME                        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE   CONTAINERS   IMAGES                                                                                        SELECTOR
kube-system   daemonset.apps/aws-node     0         0         0       0            0           <none>          89m   aws-node     602401143452.dkr.ecr.ap-northeast-1.amazonaws.com/amazon-k8s-cni:v1.11.4-eksbuild.1           k8s-app=aws-node
kube-system   daemonset.apps/kube-proxy   0         0         0       0            0           <none>          89m   kube-proxy   602401143452.dkr.ecr.ap-northeast-1.amazonaws.com/eks/kube-proxy:v1.24.7-minimal-eksbuild.2   k8s-app=kube-proxy

NAMESPACE     NAME                      READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                                                                            SELECTOR
kube-system   deployment.apps/coredns   0/2     2            0           89m   coredns      602401143452.dkr.ecr.ap-northeast-1.amazonaws.com/eks/coredns:v1.8.7-eksbuild.3   eks.amazonaws.com/component=coredns,k8s-app=kube-dns

NAMESPACE     NAME                                 DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES                                                                            SELECTOR
kube-system   replicaset.apps/coredns-5fc8d4cdcf   2         2         0       89m   coredns      602401143452.dkr.ecr.ap-northeast-1.amazonaws.com/eks/coredns:v1.8.7-eksbuild.3   eks.amazonaws.com/component=coredns,k8s-app=kube-dns,pod-template-hash=5fc8d4cdcf

NAMESPACE     NAME                                                    HOLDER                                                                                  AGE
kube-system   lease.coordination.k8s.io/cloud-controller-manager      ip-172-16-119-48.ap-northeast-1.compute.internal_47dbdf26-c049-4772-985b-4b85e25e0341   89m
kube-system   lease.coordination.k8s.io/cp-vpc-resource-controller    ip-172-16-119-48.ap-northeast-1.compute.internal_aa849f1e-dd00-4ff3-9d1a-95f24a4d2445   89m
kube-system   lease.coordination.k8s.io/eks-certificates-controller   ip-172-16-119-48.ap-northeast-1.compute.internal                                        89m
kube-system   lease.coordination.k8s.io/kube-controller-manager       ip-172-16-119-48.ap-northeast-1.compute.internal_9310ef26-544b-44c2-86e0-634922200ac4   89m
kube-system   lease.coordination.k8s.io/kube-scheduler                ip-172-16-119-48.ap-northeast-1.compute.internal_b587a7cf-5bd5-49bd-bbac-98093c015af6   89m

NAMESPACE     NAME                                            ADDRESSTYPE   PORTS     ENDPOINTS              AGE
default       endpointslice.discovery.k8s.io/kubernetes       IPv4          443       10.0.0.222,10.0.1.68   89m
kube-system   endpointslice.discovery.k8s.io/kube-dns-qb7r7   IPv4          <unset>   <unset>                89m

NAMESPACE     LAST SEEN   TYPE      REASON             OBJECT                         SUBOBJECT   SOURCE              MESSAGE                               FIRST SEEN   COUNT   NAME
kube-system   4m4s        Warning   FailedScheduling   pod/coredns-5fc8d4cdcf-vd5bz               default-scheduler   no nodes available to schedule pods   89m          18      event.events.k8s.io/coredns-5fc8d4cdcf-vd5bz.1744e9d210b60e38
kube-system   4m4s        Warning   FailedScheduling   pod/coredns-5fc8d4cdcf-xgqfn               default-scheduler   no nodes available to schedule pods   89m          18      event.events.k8s.io/coredns-5fc8d4cdcf-xgqfn.1744e9d21c67b519

NAMESPACE     NAME                                                                                                 ROLE                                                  AGE   USERS                                                   GROUPS   SERVICEACCOUNTS
default       rolebinding.rbac.authorization.k8s.io/eks:az-poller                                                  Role/eks:az-poller                                    89m   eks:az-poller                                                    
kube-public   rolebinding.rbac.authorization.k8s.io/system:controller:bootstrap-signer                             Role/system:controller:bootstrap-signer               89m                                                                    kube-system/bootstrap-signer
kube-system   rolebinding.rbac.authorization.k8s.io/eks-vpc-resource-controller-rolebinding                        Role/eks-vpc-resource-controller-role                 89m   eks:vpc-resource-controller                                      kube-system/eks-vpc-resource-controller
kube-system   rolebinding.rbac.authorization.k8s.io/eks:addon-manager                                              Role/eks:addon-manager                                89m   eks:addon-manager                                                
kube-system   rolebinding.rbac.authorization.k8s.io/eks:authenticator                                              Role/eks:authenticator                                89m   eks:authenticator                                                
kube-system   rolebinding.rbac.authorization.k8s.io/eks:az-poller                                                  Role/eks:az-poller                                    89m   eks:az-poller                                                    
kube-system   rolebinding.rbac.authorization.k8s.io/eks:certificate-controller                                     Role/eks:certificate-controller                       89m   eks:certificate-controller                                       
kube-system   rolebinding.rbac.authorization.k8s.io/eks:cloud-controller-manager:apiserver-authentication-reader   Role/extension-apiserver-authentication-reader        89m   eks:cloud-controller-manager                                     
kube-system   rolebinding.rbac.authorization.k8s.io/eks:fargate-manager                                            Role/eks:fargate-manager                              89m   eks:fargate-manager                                              
kube-system   rolebinding.rbac.authorization.k8s.io/eks:k8s-metrics                                                Role/eks:k8s-metrics                                  89m   eks:k8s-metrics                                                  
kube-system   rolebinding.rbac.authorization.k8s.io/eks:node-manager                                               Role/eks:node-manager                                 89m   eks:node-manager                                                 
kube-system   rolebinding.rbac.authorization.k8s.io/system::extension-apiserver-authentication-reader              Role/extension-apiserver-authentication-reader        89m   system:kube-controller-manager, system:kube-scheduler            
kube-system   rolebinding.rbac.authorization.k8s.io/system::leader-locking-kube-controller-manager                 Role/system::leader-locking-kube-controller-manager   89m   system:kube-controller-manager                                   kube-system/kube-controller-manager
kube-system   rolebinding.rbac.authorization.k8s.io/system::leader-locking-kube-scheduler                          Role/system::leader-locking-kube-scheduler            89m   system:kube-scheduler                                            kube-system/kube-scheduler
kube-system   rolebinding.rbac.authorization.k8s.io/system:controller:bootstrap-signer                             Role/system:controller:bootstrap-signer               89m                                                                    kube-system/bootstrap-signer
kube-system   rolebinding.rbac.authorization.k8s.io/system:controller:cloud-provider                               Role/system:controller:cloud-provider                 89m                                                                    kube-system/cloud-provider
kube-system   rolebinding.rbac.authorization.k8s.io/system:controller:token-cleaner                                Role/system:controller:token-cleaner                  89m                                                                    kube-system/token-cleaner

NAMESPACE     NAME                                                                            CREATED AT
default       role.rbac.authorization.k8s.io/eks:az-poller                                    2023-02-18T12:07:21Z
kube-public   role.rbac.authorization.k8s.io/system:controller:bootstrap-signer               2023-02-18T12:07:18Z
kube-system   role.rbac.authorization.k8s.io/eks-vpc-resource-controller-role                 2023-02-18T12:07:28Z
kube-system   role.rbac.authorization.k8s.io/eks:addon-manager                                2023-02-18T12:07:25Z
kube-system   role.rbac.authorization.k8s.io/eks:authenticator                                2023-02-18T12:07:21Z
kube-system   role.rbac.authorization.k8s.io/eks:az-poller                                    2023-02-18T12:07:21Z
kube-system   role.rbac.authorization.k8s.io/eks:certificate-controller                       2023-02-18T12:07:21Z
kube-system   role.rbac.authorization.k8s.io/eks:fargate-manager                              2023-02-18T12:07:25Z
kube-system   role.rbac.authorization.k8s.io/eks:k8s-metrics                                  2023-02-18T12:07:21Z
kube-system   role.rbac.authorization.k8s.io/eks:node-manager                                 2023-02-18T12:07:25Z
kube-system   role.rbac.authorization.k8s.io/extension-apiserver-authentication-reader        2023-02-18T12:07:17Z
kube-system   role.rbac.authorization.k8s.io/system::leader-locking-kube-controller-manager   2023-02-18T12:07:18Z
kube-system   role.rbac.authorization.k8s.io/system::leader-locking-kube-scheduler            2023-02-18T12:07:18Z
kube-system   role.rbac.authorization.k8s.io/system:controller:bootstrap-signer               2023-02-18T12:07:17Z
kube-system   role.rbac.authorization.k8s.io/system:controller:cloud-provider                 2023-02-18T12:07:17Z
kube-system   role.rbac.authorization.k8s.io/system:controller:token-cleaner                  2023-02-18T12:07:17Z

ノードを作成する

管理対象ノードグループ

ノードを作成する際にノードで利用する IAM ロールを作成します。
信頼関係には EC2 を指定し、AWS のマネージドポリシー 3 つ(AmazonEKSWorkerNodePolicy、AmazonEC2ContainerRegistryReadOnly、AmazonEKS_CNI_Policy)をアタッチします。

IAM ロールを作成したら、コンソールからノードを追加します。


ノードグループの名前を適当に入力し、ノード IAM ロールに先ほど作成したロールを選択します。

なお、上記画像内の注意書きで管理ノードグループで利用する IAM ロールを自己管理ノードグループで利用しないように記載されています。これは、管理ノードグループを削除する際、他の管理対象ノードグループでも該当の IAM ロールを利用していない場合に、aws-auth ConfigMap から該当の IAM ロールが削除されてしまうからです。同じ IAM ロールを自己管理ノードグループで利用している場合、 ConfigMap から削除されることにより、自己管理ノードが NotReady ステータスに移行し中断されてしまいます。

Deleting a managed node group - Amazon EKS
This topic describes how you can delete an Amazon EKS managed node group.

次のページではコンピューティングのリソースやネットワーク設定を行いますが、すべてデフォルトのままにし、作成を行います。

ノードの作成が完了しました。

ノードの IAM ロールが ConfigMap にあることも確認してみます。

$ kubectl describe configmap/aws-auth -n kube-system
Name:         aws-auth
Namespace:    kube-system
Labels:       <none>
Annotations:  <none>

Data
====
mapRoles:
----
- groups:
  - system:bootstrappers
  - system:nodes
  rolearn: arn:aws:iam::xxx:role/EKSNodeRole
  username: system:node:{{EC2PrivateDNSName}}


BinaryData
====

Events:  <none>

Fargate

次に、Fargate プロファイルを作成してみます。
プロファイルで定義した条件と一致する条件で Pod がデプロイされると、Pod は Fargate にデプロイされます。

事前に Fargate プロファイルで設定する IAM ロールを作成しておきます。
eks-fargate-pods サービスに信頼関係のある IAM ロールで、マネージドポリシーの AmazonEKSFargatePodExecutionRolePolicy をアタッチします。

次に、Fargate プロファイルを作成していきます。

名前は適当に入力し、ポッド実行ロールには先ほど作成したロールを選択します。
Pod を実行するサブネットを指定しますが、パブリックサブネットは指定できません。プライベートサブネットのみ指定できます。

Fargate で実行する Pod を指定するため、ポッドセレクタに名前空間やラベルを指定します。今回は名前空間に default を指定します。

確認画面に遷移するので、作成します。

Fargateプロファイルの作成が完了したので、適当な Pod を作成します。

$ kubectl run nginx --image=nginx
pod/nginx created

しかし、私の場合は Pod は Pending から変わりませんでした。実行に失敗しているようです。結論からいうと Fargate ノードが起動するサブネットに NatGateway がないことが原因でした。

$ kubectl get pod/nginx
NAME    READY   STATUS    RESTARTS   AGE
nginx   0/1     Pending   0          2m53s

$ kubectl describe pod/nginx              
Name:                 nginx
Namespace:            default
Priority:             2000001000
Priority Class Name:  system-node-critical
Service Account:      default
Node:                 <none>
Labels:               eks.amazonaws.com/fargate-profile=fargate
                      run=nginx
Annotations:          CapacityProvisioned: 0.25vCPU 0.5GB
                      Logging: LoggingDisabled: LOGGING_CONFIGMAP_NOT_FOUND
                      kubernetes.io/psp: eks.privileged
Status:               Pending
IP:                   
IPs:                  <none>
NominatedNodeName:    a933d24bd3-7a5249a71321413995b128ae97409bb3
Containers:
  nginx:
    Image:        nginx
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-pgr8q (ro)
Volumes:
  kube-api-access-pgr8q:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason            Age    From               Message
  ----     ------            ----   ----               -------
  Warning  LoggingDisabled   6m32s  fargate-scheduler  Disabled logging because aws-logging configmap was not found. configmap "aws-logging" not found
  Warning  FailedScheduling  3m32s  fargate-scheduler  Pod provisioning timed out (will retry) for pod: default/nginx
  Warning  FailedScheduling  31s    fargate-scheduler  Pod provisioning timed out (will retry) for pod: default/nginx
  Warning  LoggingDisabled   29s    fargate-scheduler  Disabled logging because aws-logging configmap was not found. configmap "aws-logging" not found

上記の状態から NatGateway を作成してルートを追加すると、Pod の実行に成功しました。
以下のコマンドの実行結果の通り、Node に fargate-ip-10-0-3-37.ap-northeast-1.compute.internal/10.0.3.37 と記載されているので、Fargate で実行されていることもわかります。

$ kubectl get pod               
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          26m

$ $ kubectl describe pod/nginx
Name:                 nginx
Namespace:            default
Priority:             2000001000
Priority Class Name:  system-node-critical
Service Account:      default
Node:                 fargate-ip-10-0-3-37.ap-northeast-1.compute.internal/10.0.3.37
Start Time:           Sun, 19 Feb 2023 00:19:56 +0900
Labels:               eks.amazonaws.com/fargate-profile=fargate
                      run=nginx
Annotations:          CapacityProvisioned: 0.25vCPU 0.5GB
                      Logging: LoggingDisabled: LOGGING_CONFIGMAP_NOT_FOUND
                      kubernetes.io/psp: eks.privileged
Status:               Running
IP:                   10.0.3.37
IPs:
  IP:  10.0.3.37
Containers:
  nginx:
    Container ID:   containerd://b8ce377f4218b4e9083dd2619c9c00e6fe5ebf63391a7e7ddb37ac9d1a137e37
    Image:          nginx
    Image ID:       docker.io/library/nginx@sha256:6650513efd1d27c1f8a5351cbd33edf85cc7e0d9d0fcb4ffb23d8fa89b601ba8
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Sun, 19 Feb 2023 00:20:03 +0900
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-pgr8q (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  kube-api-access-pgr8q:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason            Age   From               Message
  ----     ------            ----  ----               -------
  Warning  LoggingDisabled   33m   fargate-scheduler  Disabled logging because aws-logging configmap was not found. configmap "aws-logging" not found
  Warning  FailedScheduling  30m   fargate-scheduler  Pod provisioning timed out (will retry) for pod: default/nginx
  Warning  FailedScheduling  27m   fargate-scheduler  Pod provisioning timed out (will retry) for pod: default/nginx
  Warning  LoggingDisabled   27m   fargate-scheduler  Disabled logging because aws-logging configmap was not found. configmap "aws-logging" not found
  Warning  FailedScheduling  24m   fargate-scheduler  Pod provisioning timed out (will retry) for pod: default/nginx
  Warning  LoggingDisabled   24m   fargate-scheduler  Disabled logging because aws-logging configmap was not found. configmap "aws-logging" not found
  Warning  FailedScheduling  21m   fargate-scheduler  Pod provisioning timed out (will retry) for pod: default/nginx
  Warning  LoggingDisabled   21m   fargate-scheduler  Disabled logging because aws-logging configmap was not found. configmap "aws-logging" not found
  Warning  FailedScheduling  18m   fargate-scheduler  Pod provisioning timed out (will retry) for pod: default/nginx
  Warning  LoggingDisabled   18m   fargate-scheduler  Disabled logging because aws-logging configmap was not found. configmap "aws-logging" not found
  Normal   Scheduled         17m   fargate-scheduler  Successfully assigned default/nginx to fargate-ip-10-0-3-37.ap-northeast-1.compute.internal
  Normal   Pulling           17m   kubelet            Pulling image "nginx"
  Normal   Pulled            17m   kubelet            Successfully pulled image "nginx" in 6.618645082s
  Normal   Created           17m   kubelet            Created container nginx
  Normal   Started           17m   kubelet            Started container nginx                                                  Started container nginx

ちなみに namespace を default ではなく異なる namespace にして Pod を作成し、マネージドノードに Pod がデプロイされる状況も確認できました。

$ kubectl create namespace test

$ kubectl run nginx --image=nginx -n test
pod/nginx created

$ kubectl get pod -n test                
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          9s

$ kubectl describe pod/nginx -n test
Name:             nginx
Namespace:        test
Priority:         0
Service Account:  default
Node:             ip-10-0-1-188.ap-northeast-1.compute.internal/10.0.1.188
Start Time:       Sun, 19 Feb 2023 00:32:39 +0900
Labels:           run=nginx
Annotations:      kubernetes.io/psp: eks.privileged
Status:           Running
IP:               10.0.1.233
IPs:
  IP:  10.0.1.233
Containers:
  nginx:
    Container ID:   containerd://fd00c0c860de992aa4953d7312bb1bd31893e50b18b727f06d8312a2f84d41bb
    Image:          nginx
    Image ID:       docker.io/library/nginx@sha256:6650513efd1d27c1f8a5351cbd33edf85cc7e0d9d0fcb4ffb23d8fa89b601ba8
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Sun, 19 Feb 2023 00:32:45 +0900
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-pfdvb (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  kube-api-access-pfdvb:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  20s   default-scheduler  Successfully assigned test/nginx to ip-10-0-1-188.ap-northeast-1.compute.internal
  Normal  Pulling    19s   kubelet            Pulling image "nginx"
  Normal  Pulled     14s   kubelet            Successfully pulled image "nginx" in 5.351372498s
  Normal  Created    14s   kubelet            Created container nginx
  Normal  Started    14s   kubelet            Started container nginx

また、 ConfigMap に Fargate プロファイルに設定した IAM ロールが追加されていることも確認できました。

$ kubectl describe configmap/aws-auth -n kube-system
Name:         aws-auth
Namespace:    kube-system
Labels:       <none>
Annotations:  <none>

Data
====
mapRoles:
----
- groups:
  - system:bootstrappers
  - system:nodes
  rolearn: arn:aws:iam::xxx:role/EKSNodeRole
  username: system:node:{{EC2PrivateDNSName}}
- groups:
  - system:bootstrappers
  - system:nodes
  - system:node-proxier
  rolearn: arn:aws:iam::xxx:role/EKSFargateRole
  username: system:node:{{SessionName}}


BinaryData
====

Events:  <none>

リソースを削除する

ノードグループと Fargate プロファイルを削除した後、EKS クラスターを削除します。
私の場合は NatGateway を追加したので、それも削除します。

タイトルとURLをコピーしました