問題
Amazon EKSでクラスター作成後にkubectl get svc
コマンドを実行しても失敗する
# Amazon EKSクラスターのkubeconfigを取得→成功
$ aws eks update-kubeconfig --name <cluster_name>
Added new context arn:aws:eks:us-west-2:xxxxx:cluster/<cluster_name> to /Users/<username>/.kube/config
# 失敗するコマンド
$ kubectl get svc
error: the server doesn't have a resource type "svc"
原因
EKSクラスタを作成したIAMユーザとAWS CLIのIAMユーザが異なっている
@ngyuki さんに情報をご提供いただきました🙇♂️
参考:Amazon EKS の使用開始 - Amazon EKS
コンソールを使用してクラスターを作成する場合は、クラスター上で kubectl コマンドを実行する際、同じ IAM ユーザー認証情報が AWS SDK 認証情報チェーンにあることを確認する必要があります。
解決方法
パターン1. AWS CLIのIAMユーザをEKSクラスタを作成したユーザに切り替える
パターン2. AWS CLIのIAMユーザでEKSクラスタを作り直す(CLIでEKSクラスタを作り直す手順はこちら)
補足
rootアカウントでの操作は非推奨(参考)のため、rootアカウントでログインしたコンソールでEKSクラスタを作成した場合は、EKSクラスタを削除して、別のユーザでEKSクラスタを作り直したほうがよいと思われます
以下は原因が不明だったときの解決方法です
ここより下の内容は原因が不明だったときに投稿した解決方法です。
調査
海外のフォーラムやブログなどで紹介されていた解決方法
もっとスマートな解決方法がありましたらご教示くださいm(_ _)m
解決方法 | 結果 |
---|
- AWS CLIからEKSクラスターを作成する | ○:解決できた
- AWS CLIにIAMを設定する | ×:解決しなかった
- kubectlのバージョンを更新する | ×:解決しなかった
- aws-iam-authenticatorを設定する | ×:解決しなかった
解決できた手順
1. AWS CLIからEKSクラスターを作成する
EKSクラスターをコンソールから作成すると本問題が発生していたが、AWS CLIからEKSクラスターを作成すると解決したとの情報を見かけて、実践したところ解決できた。
補足
CloudFormationで作成したクラスターでも同様の問題が発生するようです
コメント欄にて @ishigero さんから情報をご提供いただきました m(_ _)m
参考:Amazon EKS の使用開始 - Amazon EKS
手順1. 既存クラスターの設定を確認
AWSのコンソール上で作成したクラスターの
- Role ARN
- Subnets
- security groups
をメモしておく
手順2. AWS CLIからクラスターを作成する
メモした情報を参考にAWS CLIからクラスターを作成する
補足
--role-arn
にはRole ARNの値を指定する
--resources-vpc-config
にはSubnets,Security groupsの値を指定する
$ aws eks create-cluster --name <cluster_name> \
--role-arn xxx \
--resources-vpc-config \
subnetIds=subnet-xxx,subnet-xxx,securityGroupIds=sg-xxx
{
"cluster": {
"status": "CREATING",
"name": "<cluster_name>",
"certificateAuthority": {},
"roleArn": "xxx",
"resourcesVpcConfig": {
"subnetIds": [
"subnet-xxx",
"subnet-xxx"
],
"vpcId": "vpc-xxx",
"securityGroupIds": [
"sg-xxx"
]
},
"version": "1.10",
"arn": "arn:aws:eks:us-west-2:xxx:cluster/<cluster_name>",
"platformVersion": "eks.2",
"createdAt": xxx
}
}
手順3. クラスターが作成されたことを確認
$ aws eks describe-cluster --name <cluster_name> --query cluster.status
"ACTIVE"
手順4. kubectl get svc
コマンドが成功することを確認
# 作成したクラスターのkubeconfigを取得
$ aws eks update-kubeconfig --name <cluster_name>
Updated context arn:aws:eks:us-west-2:xxx:cluster/<cluster_name> in /Users/<username>/.kube/config
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 3m
解決できなかった手順
2. AWS CLIにIAMを設定する
AWS CLIにIAMが設定されてないと本問題が発生するという情報を見かけたが、AWS CLIからAmazon EKSクラスターのkubeconfigが取得できることから、AWS CLIの設定は問題ないと判断した。
aws configure
AWS Access Key ID [****************WVJA]:
AWS Secret Access Key [****************LD/m]:
Default region name [us-west-2]:
Default output format [None]:
# Amazon EKSクラスターのkubeconfigを取得→成功
$ aws eks update-kubeconfig --name <cluster_name>
Added new context arn:aws:eks:us-west-2:xxxxx:cluster/<cluster_name> to /Users/<username>/.kube/confi
3. kubectlのバージョンを更新する
kubectlのバージョンが1.10.xx以上じゃないと問題が発生するという情報を見かけたが、バージョンは問題ないと判断した。
$ kubectl version --short --client
Client Version: v1.10.3
参考:kubectl のインストール - Amazon EKS
4. aws-iam-authenticatorを設定する
aws-iam-authenticatorの設定が無いと問題が発生するという情報を見かけたが、設定は問題ないと判断した。
$ aws-iam-authenticator help
A tool to authenticate to Kubernetes using AWS IAM credentials
...