EKSがGAになってようやく使えるようになりました!
現時点ではオレゴン(us-west-2)とバージニア(us-east-1)で使えます。
https://aws.amazon.com/jp/blogs/aws/amazon-eks-now-generally-available/
マネージメントコンソルールに EKS
の文字が!
クリックすると
作成途中??
手順
Getting Startedを見ながら作ってみました。
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started.html
IAMロール作成
まずEKS用のIAMロールをつくります。
ロール作成の画面にいって、EKS
を選択します。
とりあえずポリシーは指定されたままで
適当に名前つけて作成。
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
CFnの画面でテンプレートURLを指定して、
CIDR指定して、
作成。
てきあがったものみるとただの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ファイルをつくります。
サーバーエンドポイント、証明書情報、クラスタ名を修正します。
eks-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に修正します。
aws-auth-cm.yaml
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
ELBを見ると、CLBができてます。
ブラウザでアクセスすると・・・
見れました。
まとめ
ようやくAWS上でマネージドなk8s環境が構築できるようになりました。
ただ・・・
だいぶめんどくさいですね・・・
おそらくツールとかが充実してくるんだとは思いますが・・・