LoginSignup
15
15

More than 5 years have passed since last update.

EKSのチュートリアルをやりながらKubernetesを感覚で学ぶ

Last updated at Posted at 2019-02-05

やりたいこと

Aamazon EKSをチュートリアルをやりながら、どうせならKubernetesについても感覚で学んでいこうと思います。

参考文献:https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started.html

前提

IAMロールの作成

EKSでは自身でELBを作成するため、IAMのロールを作成する必要があります。

VPCの作成

※ 今回はCFnで作成しましたが、勉強のためにYamlを見ながら手で作成するのもありだと思います。

kubectlのインストール

kubectlについて

Kubectlはawscliのようなもので、kubernetesのApiをcliで管理できるコマンドです。
awscliをお使いの方はご存知かもしれませんが、cliではほとんど全ての操作が可能です。
そのため、本番環境へEKSを採用する際はkubectlを実施できる環境を安全に保つ必要があります。
例として、「kubectlを実行できる専用のEC2インスタンスを用意する」などの施策が必要となります。

インストール方法

  • kubectlのバイナリファイルをローカルPCにダウンロードします
    • ローカルPC(macos)で以下のコマンドを実行
    • 最後のコマンドで Client Version: v.XXX が表示されればOK

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
cp ./kubectl /usr/local/bin/kubectl
kubectl version --short --client

aws-iam-authenticatorのインストール

aws-iam-authenticatorについて

kubectlはKubernetesのApiをcliで使うために作られています。
ですので、EKSへ接続には、別途、IAMでの認証が必要になります。
IAMでの認証をするために、今回は aws-iam-authenticatorを使用します。

インストール方法

  • aws-iam-authenticatorのバイナリファイルをローカルPCにダウンロードします
    • ローカルPC(macos)で以下のコマンドを実行
    • 最後のコマンドでコマンドのhelpが表示されればOK

curl -o aws-iam-authenticator https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-07-26/bin/darwin/amd64/aws-iam-authenticator
chmod +x ./aws-iam-authenticator
mv ./aws-iam-authenticator /usr/local/bin/aws-iam-authenticator
aws-iam-authenticator help

EKSクラスタの作成

EKSクラスタについて

EKSでKubernetesを動かすには、IAMやVPCの設定が必要です。
EKSクラスタを作成すると、以下のリソースがKubernetesに紐付けられます。

  • EKSクラスタに紐づくもの
    • IAM Role
    • VPC
    • Subnets
    • Security groups

EKSクラスタを作成後、kubectlを使ってクラスタ上にコンテナを配置していくことになります。

EKSクラスタをコンソールで作成

  • https://console.aws.amazon.com/eks/home#/clusters にログイン
  • [Create cluster] を押してクラスタを作成
    • EKS用に作成した IAM Role, VPC, Subnets, Security groups を設定
  • Status を確認し、EKSクラスタが作成されるまで待つ

スクリーンショット 2019-02-05 11.53.42.png
スクリーンショット 2019-02-05 12.01.23.png

configファイルの作成

configファイルについて

kubectlの設定ファイルです。
ここにEKSクラスタやその他の設定を記述してきます。

作成方法

以下のコマンドを実行します。
configファイル名は任意の名前で作成します。
~/.kube/cofigで作成するとKubernetesの設定ファイルを上書きすることになります。
例えば、Docker Desktop for MacでKubernetesを使っている場合、configファイルは~/.kube/cofigに作成されます。


mkdir -p ~/.kube
touch ~/.kube/config-eks

.kube/config-eksに以下を記述します。


apiVersion: v1
clusters:
- cluster:
    server: <endpoint-url>
    certificate-authority-data: <base64-encoded-ca-cert>
  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: aws-iam-authenticator
      args:
        - "token"
        - "-i"
        - "<cluster-name>"
        # - "-r"
        # - "<role-arn>"
      # env:
        # - name: AWS_PROFILE
        #   value: "<aws-profile>"
  • 以下の値は置き換えが必要になります。
    • <endpoint-url>
      • EKSコンソールでCluster ARNをコピーして置き換え
    • <base64-encoded-ca-cert>
      • EKSコンソールでCertificate authorityをコピーして置き換え
    • <cluster-name>
      • EKSコンソールでClusterを確認し、クラスタ名に置き換えます
    • (オプション) <role-arn>
      • aws-iam-authenticatorで使うデフォルトのRoleを変更する場合に設定します
      • 使用する場合はコメントアウトを外して使います
    • (オプション) <aws-profile>
      • aws-iam-authenticatorでAWS Profileを使用する場合に設定します
      • 使用する場合はコメントアウトを外して使います

設定ファイルをkubectlへ反映させる

作成したconfigファイルをKUBECONFIGに設定します。

  • 設定方法は2つあります
    • 1. 環境変数として設定する
    • 2. エイリアスとして設定する
    • 3. kubectl configで切り替える

環境変数として設定する場合


echo 'export KUBECONFIG=$KUBECONFIG:~/.kube/config-eks' >> ~/.bash_profile
source ~/.bash_profile
kubectl config view

この場合、kubectlを実行するたびに、~/.kube/config-eksが必ず読まれます。

エイリアスとして設定する


echo 'alias eksctl="KUBECONFIG=$KUBECONFIG:~/.kube/config-eks kubectl"' >> ~/.bash_profile
source ~/.bash_profile
eksctl config view
# eksctlと違うconfigが設定されていることを確認
kubectl config view

エイリアスとして設定すると、Docker Desktop for Macとの棲み分けができて便利です。

※ 上記まで、読み飛ばす方もいるはずなので、今後、cliの名前はkubectlに統一しています。

kubectl configで切り替える

~/.kube/configに複数環境を設定しておいて、必要に応じてkubectlで切り替える方法もあります。
例えば以下のように、2つの設定を記述しておきます。

apiVersion: v1
clusters:
- cluster:
    server: <endpoint-url>
    certificate-authority-data: <base64-encoded-ca-cert>
  name: docker-for-desktop-cluster
## ↓追加
- cluster:
    server: <endpoint-url>
    certificate-authority-data: <base64-encoded-ca-cert>
  name: kubernetes
contexts:
## ↓追加
- context:
    cluster: kubernetes
    user: aws
  name: aws
- context:
    cluster: docker-for-desktop-cluster
    user: docker-for-desktop
  name: docker-for-desktop
## ↓現在、設定されているクラスタ
current-context: aws
kind: Config
preferences: {}
users:
## ↓追加
- name: aws
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1alpha1
      command: aws-iam-authenticator
      args:
        - "token"
        - "-i"
        - "<cluster-name>"
        # - "-r"
        # - "<role-arn>"
      # env:
        # - name: AWS_PROFILE
        #   value: "<aws-profile>"
- name: docker-for-desktop
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

kubectl config viewでNAMEとCLUSTERが増えたことを確認

→ kubectl config get-contexts
CURRENT   NAME                 CLUSTER                      AUTHINFO             NAMESPACE
*         aws                  kubernetes                   aws                  
          docker-for-desktop   docker-for-desktop-cluster   docker-for-desktop 

NAMEで指定して切り替え

→ kubectl config use-context docker-for-desktop
Switched to context "docker-for-desktop".

切り替えが成功したかを確認

→ kubectl config get-contexts
CURRENT   NAME                 CLUSTER                      AUTHINFO             NAMESPACE
          aws                  kubernetes                   aws                  
*         docker-for-desktop   docker-for-desktop-cluster   docker-for-desktop

EKSにワーカーノードを作成する

ワーカーノードについて

Kubernetesにはnodeという概念があります。AWSで言うとEC2インスタンスに当たります。
EKSでコンテナを動かすにはnode(EC2インスタンス)の作成が必要となります。
後述しますが、node上にはランダムにコンテナが配置されるようになります。

ワーカーノードの作成

CFnへの設定項目

Stack name: CFnのスタック名(任意の値でOK)
ClusterName: EKSクラスタ名(名前を一致させる必要がある)
ClusterControlPlaneSecurityGroup: EKSクラスタに設定したSecurityGroup
NodeGroupName: nodeグループ名(任意の値でOK)
NodeAutoScalingGroupMinSize: ワーカーノードがスケールアウトする際のnode数の最小値(任意の値でOK)
NodeAutoScalingGroupDesiredCapacity: スタック作成時のnode数(任意の値でOK)
NodeAutoScalingGroupMaxSize: ワーカーノードがスケールアウトする際のnode数の最大値(任意の値でOK)
NodeInstanceType: ワーカーノードのインスタンスタイプ (任意の値でOK)
NodeImageId: ワーカーノードのAMI ID
(参照:https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/eks-optimized-ami.html)
NodeVolumeSize: ワーカーノードに割り当てるVolumeの大きさ
KeyName: EC2インスタンスへのssh key

ワーカーノードとEKSクラスタを紐付ける

aws-auth ConfigMapを使って、IAMのユーザとロールをKubernetes内のユーザやロールに紐付けます。


curl -O https://amazon-eks.s3-us-west-2.amazonaws.com/cloudformation/2018-11-07/aws-auth-cm.yaml
  • aws-auth-cm.yamlの<ARN of instance role>はEC2インスタンス用に作成したRoleのARNに置き換えます。

apiVersion: v1
kind: ConfigMap
metadata:
  name: aws-auth
  namespace: kube-system
data:
  mapRoles: |
    - rolearn: <ARN of instance role>
      username: system:node:{{EC2PrivateDNSName}}
      groups:
        - system:bootstrappers
        - system:nodes
  • kubectlでKubernetesに適用
    • configmap "aws-auth" createdが出力されればOK

kubectl apply -f aws-auth-cm.yaml
  • 適用できているか、nodeを確認
    • XXXX.compute.internalというのが作られていればOK
      • 注意:STATUSがReadyにならないとコンテナは配置できない

kubectl get node
  • ちなみにEC2のコンソールからもnodeが確認できます

サンプルアプリケーションを作成

nodeの準備ができたので、コンテナを配置してインターネット経由でアクセスできるようにします。

Redisクラスタ作成のサンプル

Kubernetesにはreplicationcontroller,serviceなどのリソースが存在します。
とりあえずコンテナをデプロイして行きます。


kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/redis-master-controller.json
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/redis-master-service.json
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/redis-slave-controller.json
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/redis-slave-service.json
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/guestbook-controller.json
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/guestbook-service.json
  • Webページの確認
    • TYPEがLoadBalancerのEXTERNAL-IPをコピーして<EXTERNAL-IP>:3000をブラウザで開きます。
    • ブラウザでGuestbookを確認できればOKです。

kubectl get services -o wide

スクリーンショット 2019-02-05 15.58.52.png

以上で一旦、EKS上でコンテナを動かすことが可能になりました。

podとnodeとserviceとreplicationcontrollerの確認

  • kubectl getを使えは大抵の値はとってこれます。
    • また、一度に複数の値をとってくることも可能です
      • 以下、例に pod, node, service(svc), replicationcontroller(rc) の値を一緒に取ってきています。

kubectl get pod,node,svc,rc

上記のコマンドの結果からも、どのnodeにどのpodを配置するかは意識しなくていいことがわかります。

Redisクラスタの削除

先程、作成したservicereplicationcontrollerを全て消していきます。


kubectl delete service --all
kubectl delete replicationcontroller --all

Nodeの削除

nodeはCFnで作成したので、CFnのコンソール画面で消します。

EKSクラスタの削除

EKSのコンソール画面からEKSクラスタも削除します。

所感

多少の設定項目はありますが、 設定さえしてしまえば通常のKubernetesと同じように使えるのがいいです。
また、ロードバランサやNodeは従来のAWSリソースを使えるので、AWSユーザにはわかりやすいと思います。
ローカルPCでは Docker Desktop for Mac を使いつつ、AWSにはEKSでデプロイするというは開発環境としても使いやすいと思います。

15
15
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
15
15