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でデプロイするというは開発環境としても使いやすいと思います。
コメント
コメントを投稿