EKSがGAになってようやく使えるようになりました!
現時点ではオレゴン(us-west-2)とバージニア(us-east-1)で使えます。
マネージメントコンソルールに EKS
の文字が!
作成途中??
手順
Getting Startedを見ながら作ってみました。
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started.html
IAMロール作成
まずEKS用のIAMロールをつくります。
CloudFormationでVPCの作成
Getting StartedではCFnのテンプレでVPC作れってことなので・・・
テンプレートのURLはこちら
https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/amazon-eks-vpc-sample.yaml
てきあがったものみるとただの3サブネットのVPCでした。
ローカル環境のセットアップ
- kubectlのインストール
EKS用のkubectlがあるみたいなのでダウンロード
$ curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/bin/darwin/amd64/kubectl
$ chmod +x ./kubectl
$ ./kubectl version --short --client
Client Version: v1.10.3
- Heptio Authenticator AWSのインストール
認証に使うらしい
$ curl -o heptio-authenticator-aws https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/bin/darwin/amd64/heptio-authenticator-aws
$ chmod +x ./heptio-authenticator-aws
$ ./heptio-authenticator-aws help
A tool to authenticate to Kubernetes using AWS IAM credentials
Usage:
heptio-authenticator-aws [command]
Available Commands:
help Help about any command
init Pre-generate certificate, private key, and kubeconfig files for the server.
server Run a webhook validation server suitable that validates tokens using AWS IAM
token Authenticate using AWS IAM and get token for Kubernetes
verify Verify a token for debugging purpose
- aws-cliのアップグレード
1.15.32以降が必要
$ sudo pip install --upgrade awscli
Clusterの作成
aws-cli
でやった方がよさそうです。
理由はわかりませんが、マネージメントコンソールからつくると、kubectlでの接続で認証でエラーになりました・・・
$ ./kubectl get all
error: the server doesn't have a resource type "cronjobs"
$ ./kubectl get node
error: You must be logged in to the server (Unauthorized)
作成のコマンドはこんな感じです。
$ aws eks create-cluster --name test --role-arn arn:aws:iam::XXXXXXXXXXX:role/EKS-Role --resources-vpc-config subnetIds=subnet-XXXXXX,subnet-XXXXXXX,securityGroupIds=XXXXXX --region us-east-1
{
"cluster": {
"status": "CREATING",
"name": "test",
"certificateAuthority": {},
"roleArn": "arn:aws:iam::XXXXXXXXX:role/EKS-Role",
"resourcesVpcConfig": {
"subnetIds": [
"subnet-XXXXXXX",
"subnet-XXXXXXX"
],
"vpcId": "vpc-XXXXXXXX",
"securityGroupIds": [
"sg-XXXXXX"
]
},
"version": "1.10",
"arn": "arn:aws:eks:us-east-1:XXXXXXXXXXXX:cluster/test",
"createdAt": 1528253503.404
}
}
CFnでつくったSubnetID、SGを指定しています。
バージニアでは1bのサブネットを含めると↓のエラーが出たので、外しています。
An error occurred (UnsupportedAvailabilityZoneException) when calling the CreateCluster operation: Cannot create cluster 'test' because us-east-1b, the targeted availability zone, does not currently have sufficient capacity to support the cluster. Retry and choose from these availability zones: us-east-1a, us-east-1c, us-east-1d
オレゴンでは問題なさそうでした。
STATUSが ACTIVE
になるのをひたすら待ちます。 (15〜20分くらい・・・)
kubectlでの接続
configファイルをつくります。
サーバーエンドポイント、証明書情報、クラスタ名を修正します。
apiVersion: v1
clusters:
- cluster:
server: (サーバーエンドポイント、DESCRIBE_CLUSTER_CONTAINER_LABEL_API_SERVER_ENDPOINTの部分)
certificate-authority-data: (証明書情報、DESCRIBE_CLUSTER_CONTAINER_LABEL_CERTIFICATE_AUTHORITYの部分)
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: aws
name: aws
current-context: aws
kind: Config
preferences: {}
users:
- name: aws
user:
exec:
apiVersion: client.authentication.k8s.io/v1alpha1
command: ./heptio-authenticator-aws
args:
- "token"
- "-i"
- "(クラスタ名)"
KUBECONFIGをセットします。
$ export KUBECONFIG=./eks-config
接続!
$./kubectl get all [12:04:13]
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 6m
できました。
Workerノードの作成
CFnのテンプレが用意されているので、これを使います。
URLはこちら。
https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/amazon-eks-nodegroup.yaml
AMIはEKS用のAMIがあるみたいです。
- ami-dea4d5a1 (バージニア)
- ami-73a6e20b (オレゴン)
この設定だと、AZごとに1台ずつインスタンスが作成されます。
ConfigMap
でNodeをJoinさせます。
サンプルがあるので、
$ curl -O https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/aws-auth-cm.yaml
rolearn
の部分をCFnで作成された NodeInstanceRole
のARNに修正します。
apiVersion: v1
kind: ConfigMap
metadata:
name: aws-auth
namespace: kube-system
data:
mapRoles: |
- rolearn: arn:aws:iam::XXXXXXXX:role/test-worker-nodes-NodeInstanceRole-XXXXXXXXX
username: system:node:{{EC2PrivateDNSName}}
groups:
- system:bootstrappers
- system:nodes
Applyします。
$ ./kubectl apply -f aws-auth-cm.yaml
configmap "aws-auth" created
$ ./kubectl get nodes
NAME STATUS ROLES AGE VERSION
ip-192-168-121-147.ec2.internal Ready <none> 52s v1.10.3
ip-192-168-182-144.ec2.internal Ready <none> 55s v1.10.3
ip-192-168-235-51.ec2.internal Ready <none> 53s v1.10.3
登録されました!
デプロイ
あとは、k8sの世界なのでお好きに。
とりあえず、サンプルのGuestBookをデプロイしてみます。
$ ./kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/redis-master-controller.json
replicationcontroller "redis-master" created
$ ./kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/redis-master-service.json
service "redis-master" created
$ ./kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/redis-slave-controller.json
replicationcontroller "redis-slave" created
$ ./kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/redis-slave-service.json
service "redis-slave" created
$ ./kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/guestbook-controller.json
replicationcontroller "guestbook" created
$ ./kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/guestbook-service.json
service "guestbook" created
$ ./kubectl get services -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
guestbook LoadBalancer 10.100.133.245 a22b8aa77693811e883521XXXXXXXXX-XXXXXXXXX.us-east-1.elb.amazonaws.com 3000:32551/TCP 5s app=guestbook
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 18m <none>
redis-master ClusterIP 10.100.141.60 <none> 6379/TCP 39s app=redis,role=master
redis-slave ClusterIP 10.100.252.136 <none> 6379/TCP 20s app=redis,role=slave
ブラウザでアクセスすると・・・
見れました。
まとめ
ようやくAWS上でマネージドなk8s環境が構築できるようになりました。
ただ・・・
だいぶめんどくさいですね・・・
おそらくツールとかが充実してくるんだとは思いますが・・・