個人的にAmazon EKSをGetting Startedしてみる

Amazon EKSがGenerally Availableになったので、チョロっとGetting Startedしてみたいと思います。尚、本ブログの内容はタイトルの通り私個人のものであり、所属企業・部門見解を代表するものではありませんmm

Amazon EKSの事前準備

Amazon EKSのクラスタを作る前にk8sがAWSのリソースを作成できるようにIAM roleを作る必要があります。そしてEKSクラスタ用のVPCとセキュリティグループが必要です。

IAM Role作ります
Screen Shot 2018-06-06 at 16.53.11

出来ました
Screen Shot 2018-06-06 at 16.55.29

VPC作ります。CloudFormationでOragonリージョンで
Screen Shot 2018-06-06 at 16.59.43

Amazon EKSクラスターには kubectl と kubelet が必要で、KubernetesクラスタにIAM authenticationを許可するために Heptio Authenticator を使います。

ということで kubectl をインストールします。自分の場合はMacでやるので↓から Amazon EKS-vended kubectl のバイナリをダウンロードしてきます。

MacOS: https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/bin/darwin/amd64/kubectl

51.2MBでした。コレにパスを通してあげたりします。

$ curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/bin/darwin/amd64/kubectl
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 51.2M  100 51.2M    0     0  1512k      0  0:00:34  0:00:34 --:--:-- 2522k

↓こんな感じで叩けたらOK

$ kubectl version --short --client
Client Version: v1.10.3

続いて heptio-authenticator-aws をインストール。こちらも先程のkubectlと同様にcurlでS3から取得後、先程と同様にパスを通してあげたりします。

$ 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
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 25.0M  100 25.0M    0     0   997k      0  0:00:25  0:00:25 --:--:-- 1103k

Amazon EKSクラスタを作成

クラスタを作ったIAMユーザーが Kubernetes RBAC authorization table に administrator として登録されている必要があります。今回はCLIを使ってクラスタを作ってみます。事前にEKSに対応した最新版のAWS CLIにしておくのと、aws configureでリージョンをOregon(us-west-2)にしておきます。
そして、aws eksを叩くと、↓のようにクラスタを作ってくれます。

$ aws eks create-cluster --name 名前 --role-arn arn:aws:iam::AWSアカウント:role/作ったEKS用ロール --resources-vpc-config subnetIds=subnet-xxx,subnet-xxx,subnet-xxx,securityGroupIds=sg-xxx
{
    "cluster": {
        "name": "test",
        "arn": "arn:aws:eks:us-west-2:アカウントID:cluster/名前",
        "createdAt": 1528275727.29,
        "version": "1.10",
        "roleArn": "arn:aws:iam::アカウントID:role/作ったEKS用ロール",
        "resourcesVpcConfig": {
            "subnetIds": [
                "subnet-xxx",
                "subnet-xxx",
                "subnet-xxx"
            ],
            "securityGroupIds": [
                "sg-xxx"
            ],
            "vpcId": "vpc-xxx"
        },
        "status": "CREATING",
        "certificateAuthority": {}
    }
}

暫く待ってから構築状況を見てみると、”CREATING”が”ACTIVE”になります。

$ aws eks describe-cluster --name test --query cluster.status
"CREATING"
$ aws eks describe-cluster --name test --query cluster.status
"ACTIVE"

作ったAmazon EKS用にkubectlを設定

kubeconfigファイルを作っていきます。テンプレートはGetting Startedのページにある↓をもとにして、”aws eks describe-cluster –name クラスタ名”を叩いて返ってきた情報で埋めてあげて、”~/.kube/config-クラスタ名”な感じで保存します。

apiVersion: v1
clusters:
- cluster:
    server: 
    certificate-authority-data: 
  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"
        - ""
        # - "-r"
        # - ""

で、kubectl get allを叩いてみると↓のような結果が返ってきます。

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.100.0.1           443/TCP   1h

EKSのWorker Nodeを立てる

CloudFormationのCreate Stackで↓のテンプレートを使って構築します。
https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/amazon-eks-nodegroup.yaml

AutoScalingとかAMIとかVPCをとかサブネットとか設定
Screen Shot 2018-06-06 at 19.19.34

作ったWorker Nodeをクラスタに参加させます。configuration mapをダウンロードして上記のCloudFormationのoutputで出てきたRoleのARNを記載します。

apiVersion: v1
kind: ConfigMap
metadata:
  name: aws-auth
  namespace: kube-system
data:
  mapRoles: |
    - rolearn: 
      username: system:node:{{EC2PrivateDNSName}}
      groups:
        - system:bootstrappers
        - system:nodes

そして、kubectlにこの設定を食わせてやります。

$ kubectl apply -f aws-auth-cm.yaml
configmap "aws-auth" created

それっぽく見えています。

$ kubectl get nodes --watch
                         STATUS    ROLES     AGE       VERSION
ip-192-168-191-181.us-west-2.compute.internal   Ready         34s       v1.10.3
ip-192-168-206-53.us-west-2.compute.internal    Ready         38s       v1.10.3
ip-192-168-65-156.us-west-2.compute.internal    Ready         37s       v1.10.3
ip-192-168-206-53.us-west-2.compute.internal   Ready         41s       v1.10.3
ip-192-168-65-156.us-west-2.compute.internal   Ready         40s       v1.10.3
ip-192-168-191-181.us-west-2.compute.internal   Ready         40s       v1.10.3
ip-192-168-206-53.us-west-2.compute.internal   Ready         51s       v1.10.3

Guest Bookアプリケーション

詳細は↓こちらを御覧ください。
https://github.com/kubernetes/examples/blob/master/guestbook-go/README.md

kubectlに設定を食わせます。

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/redis-master-controller.json
replicationcontroller "redis-master" created

redisのmasterとslave。

$ 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

guestbook関連

$ 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.111.14    a6459deb7697511e8b4b002f3e159500-301097149.us-west-2.elb.amazonaws.com   3000:30669/TCP   35s       app=guestbook
kubernetes     ClusterIP      10.100.0.1       <none>                                                                   443/TCP          1h        <none>
redis-master   ClusterIP      10.100.230.148   <none>                                                                   6379/TCP         2m        app=redis,role=master
redis-slave    ClusterIP      10.100.120.84    <none>                                                                   6379/TCP         1m        app=redis,role=slave

3000番ポートでリスンしているアプリにアクセスできました!
Screen Shot 2018-06-06 at 19.38.48

書き込みもできました!!
Screen Shot 2018-06-06 at 19.40.21

お掃除

Guestbookの削除

$ kubectl delete rc/redis-master rc/redis-slave rc/guestbook svc/redis-master svc/redis-slave svc/guestbook
replicationcontroller "redis-master" deleted
replicationcontroller "redis-slave" deleted
replicationcontroller "guestbook" deleted
service "redis-master" deleted
service "redis-slave" deleted
service "guestbook" deleted

EKSクラスタの削除に関しては、EKSのドキュメントの Deleting a Cluster のページを参考に
Screen Shot 2018-06-06 at 19.46.59

シェアする

  • このエントリーをはてなブックマークに追加

フォローする