EKSのチュートリアルをやりながらKubernetesを感覚で学ぶ
EKSのチュートリアルをやりながらKubernetesを感覚で学ぶ:
Aamazon EKSをチュートリアルをやりながら、どうせならKubernetesについても感覚で学んでいこうと思います。
参考文献:https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started.html
EKSでは自身でELBを作成するため、IAMのロールを作成する必要があります。
Kubectlはawscliのようなもので、kubernetesのApiをcliで管理できるコマンドです。
awscliをお使いの方はご存知かもしれませんが、cliではほとんど全ての操作が可能です。
そのため、本番環境へEKSを採用する際はkubectlを実施できる環境を安全に保つ必要があります。
例として、「kubectlを実行できる専用のEC2インスタンスを用意する」などの施策が必要となります。
kubectlはKubernetesのApiをcliで使うために作られています。
ですので、EKSへ接続には、別途、IAMでの認証が必要になります。
IAMでの認証をするために、今回は
EKSでKubernetesを動かすには、IAMやVPCの設定が必要です。
EKSクラスタを作成すると、以下のリソースがKubernetesに紐付けられます。
kubectlの設定ファイルです。
ここにEKSクラスタやその他の設定を記述してきます。
以下のコマンドを実行します。
configファイル名は任意の名前で作成します。
例えば、
作成したconfigファイルをKUBECONFIGに設定します。
この場合、kubectlを実行するたびに、
エイリアスとして設定すると、
※ 上記まで、読み飛ばす方もいるはずなので、今後、cliの名前は
Kubernetesには
EKSでコンテナを動かすには
後述しますが、
nodeの準備ができたので、コンテナを配置してインターネット経由でアクセスできるようにします。
Kubernetesには
とりあえずコンテナをデプロイして行きます。
以上で一旦、EKS上でコンテナを動かすことが可能になりました。
上記のコマンドの結果からも、どのnodeにどのpodを配置するかは意識しなくていいことがわかります。
先程、作成した
nodeはCFnで作成したので、CFnのコンソール画面で消します。
EKSのコンソール画面からEKSクラスタも削除します。
多少の設定項目はありますが、 設定さえしてしまえば通常のKubernetesと同じように使えるのがいいです。
また、ロードバランサやNodeは従来のAWSリソースを使えるので、AWSユーザにはわかりやすいと思います。
ローカルPCでは
やりたいこと
Aamazon EKSをチュートリアルをやりながら、どうせならKubernetesについても感覚で学んでいこうと思います。参考文献:https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started.html
前提
- 作業はmacosで行います。
- EKSは対応リージョンが限られています。
IAMロールの作成
EKSでは自身でELBを作成するため、IAMのロールを作成する必要があります。-
https://console.aws.amazon.com/iam/ にログイン -
[Create role] > [AWS service] > [EKS]
でIAMを作成
VPCの作成
-
https://console.aws.amazon.com/cloudformation にログイン - CFn(CloudFormation)の管理画面で、以下のURLのyamlを使いstackを作成
-
https://amazon-eks.s3-us-west-2.amazonaws.com/cloudformation/2018-11-07/amazon-eks-vpc-sample.yaml
- 上記のYamlでは以下のリソースを作成しています。AWSからインターネット接続する基礎部分となります。
- VPC
- InternetGateway
- RouteTable
- Subnet
- SecurityGroup
- 上記のYamlでは以下のリソースを作成しています。AWSからインターネット接続する基礎部分となります。
-
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
- windows, Linux用のバイナリ
EKSクラスタの作成
EKSクラスタについて
EKSでKubernetesを動かすには、IAMやVPCの設定が必要です。EKSクラスタを作成すると、以下のリソースがKubernetesに紐付けられます。
- EKSクラスタに紐づくもの
- IAM Role
- VPC
- Subnets
- Security groups
EKSクラスタをコンソールで作成
-
https://console.aws.amazon.com/eks/home#/clusters にログイン -
[Create cluster]
を押してクラスタを作成
- EKS用に作成した IAM Role, VPC, Subnets, Security groups を設定
-
Status
を確認し、EKSクラスタが作成されるまで待つ
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
をコピーして置き換え
- EKSコンソールで
-
<base64-encoded-ca-cert>
- EKSコンソールで
Certificate authority
をコピーして置き換え
- EKSコンソールで
-
<cluster-name>
- EKSコンソールで
Cluster
を確認し、クラスタ名に置き換えます
- EKSコンソールで
- (オプション)
<role-arn>
- aws-iam-authenticatorで使うデフォルトのRoleを変更する場合に設定します
- 使用する場合はコメントアウトを外して使います
- (オプション)
<aws-profile>
- aws-iam-authenticatorでAWS Profileを使用する場合に設定します
- 使用する場合はコメントアウトを外して使います
-
設定ファイルをkubectlへ反映させる
作成したconfigファイルをKUBECONFIGに設定します。- 設定方法は2つあります
- 1. 環境変数として設定する
- 2. エイリアスとして設定する
環境変数として設定する場合
echo 'export KUBECONFIG=$KUBECONFIG:~/.kube/config-eks' >> ~/.bash_profile source ~/.bash_profile kubectl config view
~/.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に統一
しています。
EKSにワーカーノードを作成する
ワーカーノードについて
Kubernetesにはnode
という概念があります。AWSで言うとEC2インスタンスに当たります。EKSでコンテナを動かすには
node
(EC2インスタンス)の作成が必要となります。後述しますが、
node
上にはランダムにコンテナが配置されるようになります。
ワーカーノードの作成
-
https://console.aws.amazon.com/cloudformation にログイン - CFn(CloudFormation)の管理画面で、以下のURLのyamlを使いstackを作成
-
https://amazon-eks.s3-us-west-2.amazonaws.com/cloudformation/2018-11-07/amazon-eks-nodegroup.yaml
- AMI IDを入力するところがありますが、ここには下記URLに記述されているものを使います
-
amazon-eks-nodegroup.yaml
では以下のリソースを作成しています。
- IAM (EC2用のIAM Roleなど)
- SecurityGroup (EC2用のセキュリティグループ)
- AutoScalingGroup (オートスケール)
- LaunchConfiguration (EC2インスタンスの起動)
- いままでEKSのリソースを作成してきましたが、今回はEC2用のリソースを作成しています。
- AMI IDを入力するところがありますが、ここには下記URLに記述されているものを使います
-
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
以上で一旦、EKS上でコンテナを動かすことが可能になりました。
podとnodeとserviceとreplicationcontrollerの確認
-
kubectl get
を使えは大抵の値はとってこれます。
- また、一度に複数の値をとってくることも可能です
- 以下、例に
pod, node, service(svc), replicationcontroller(rc)
の値を一緒に取ってきています。
- 以下、例に
- また、一度に複数の値をとってくることも可能です
kubectl get pod,node,svc,rc
Redisクラスタの削除
先程、作成したservice
とreplicationcontroller
を全て消していきます。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でデプロイするというは開発環境としても使いやすいと思います。
コメント
コメントを投稿