先日 eksctl を利用して EKS クラスターを作成しましたが、今度はマネジメントコンソールから EKS クラスターを作成してみます。
必要なネットワークリソースについて
クラスターの作成前に、EKS の要件を満たすパブリックサブネットとプライベートサブネットを持つ VPC が必要です。
上記ドキュメントの内容のいくつかを以下に記載します。
- クラスター作成には、異なる 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 リソースをデプロイできる
- パブリックまたはプライベートにすることができるが、プライベートサブネットの指定が推奨される
- サブネットはそれぞれ、EKSで使用するために 6 つの IP アドレスを持つ必要がある
- クラスター作成時に指定したサブネットに、ノードや 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.io/cluster/
- 現在は、Kubernetes クラスターを作成しても、EKS はサブネットにタグを追加しない
- ただし、1.19 より前のバージョンのクラスターで使用されていたサブネットのタグが、バージョンを更新しても自動的に削除されることはない
- AWS Load Balancer Controller のバージョン 2.1.1 以前では、このタグが必要。新しいバージョンを使用している場合、サービスを中断することなくタグを削除できる
クラスターがリソースを管理するために利用する IAM ロールの作成
EKS クラスターの作成前に Kubernetes クラスター がユーザーに代わって他の AWS サービスを呼び出すためのクラスターサービスロールを作成します。
作成する IAM ロールには AWS マネージドポリシー AmazonEKSClusterPolicy をアタッチします。同ポリシーでは EC2、ELB、AutoScaling、KMS などのアクションが許可されています。
EKS クラスターの作成
まず、「クラスターを作成」をクリックします。

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

なお、EKS Kubernetes のバージョンは、平均 3 ヶ月ごとにリリースされており、各マイナーバージョンは最初にリリースされてから約 12 か月間サポートされます。
シークレットの暗号化は、KMS キーを利用して Kubernetes シークレットの暗号化に用いたデータキーの暗号化を行います。全てのデータに対してデフォルトで EBS ボリュームの暗号化が有効化されていますが、Kubernetes シークレットについては KMS キーによるエンベロープ暗号化(キーを別のキーで暗号化すること)が追加され、多層防御セキュリティを実現します。

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


ここで選択するセキュリティグループは、追加のセキュリティグループです。EKS は、クラスターと VPC 間の通信を可能にするセキュリティグループをデフォルトで作成します。追加のセキュリティグループを選択すると、そのセキュリティグループも ENI に関連付けらます。
クラスターエンドポイントアクセスは、Kubernetes API サーバーエンドポイントへのアクセスを設定します。Kubernetes API サーバーエンドポイントは、kubectl などから Kubernetes クラスターを管理する際のアクセスに利用されます。
パブリックに設定しており接続元の制限もしていないので、VPC 外部からアクセスが可能です。
次に、ログ記録の設定をします。今回は全てのログを記録してみます。

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

なお、アドオンとはサポート運用機能を提供するソフトウェアです。
次に、アドオンの設定を構成します。
全てデフォルトのままでいきます。

最後に確認画面が出るので、内容を確認して作成します。
クラスターと通信するために 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 ステータスに移行し中断されてしまいます。
次のページではコンピューティングのリソースやネットワーク設定を行いますが、すべてデフォルトのままにし、作成を行います。
ノードの作成が完了しました。

ノードの 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 を追加したので、それも削除します。