LoginSignup
36
26

More than 5 years have passed since last update.

Amazon EKSがやってきた

Last updated at Posted at 2018-06-06

EKSがGAになってようやく使えるようになりました!
現時点ではオレゴン(us-west-2)とバージニア(us-east-1)で使えます。

マネージメントコンソルールに EKS の文字が!

image.png

クリックすると
image.png

作成途中??

手順

Getting Startedを見ながら作ってみました。
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started.html

IAMロール作成

まずEKS用のIAMロールをつくります。

ロール作成の画面にいって、EKSを選択します。
image.png

とりあえずポリシーは指定されたままで
image.png

適当に名前つけて作成。
image.png

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を指定して、
image.png

CIDR指定して、
image.png

作成。
image.png

てきあがったものみるとただの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分くらい・・・)

image.png

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

image.png

AMIはEKS用のAMIがあるみたいです。

  • ami-dea4d5a1 (バージニア)
  • ami-73a6e20b (オレゴン)

image.png

この設定だと、AZごとに1台ずつインスタンスが作成されます。

image.png

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ができてます。
image.png

ブラウザでアクセスすると・・・

image.png

見れました。

まとめ

ようやくAWS上でマネージドなk8s環境が構築できるようになりました。

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

36
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
26