share facebook facebook twitter menu hatena pocket slack

2018.06.20 WED

Amazon EKSがやってきた

佐々木真也

WRITTEN BY 佐々木真也

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環境が構築できるようになりました。

ただ・・・
だいぶめんどくさいですね・・・
おそらくツールとかが充実してくるんだとは思いますが・・・

元記事はこちら

Amazon EKSがやってきた

佐々木真也

佐々木真也

2016年cloudpack join。 前職では構築・設計・PMを担当。 その経験を生かし、案件対応だけでなく検証環境の構築も行います。

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。