LoginSignup
0
0

More than 1 year has passed since last update.

「しくみがわかるKubernetes」をEKSで学ぶ

Last updated at Posted at 2021-08-13

「しくみがわかるKubernetes」をAzureではなくAWSで動かしながら学ぶための環境構築メモ。

前提条件

  • macOS 11.4 (Apple Silicon)
  • AWS CLIの実行環境が準備できていること
  • docker環境が準備できていること

以降は、書籍の章立てに合わせて、AzureとAWSで差分が出る部分について記載していく。

2.2 開発環境の準備

Azure CLIコマンドのインストール

Azure CLIコマンドをインストールする代わりに、eksctlコマンドをインストールする。

% brew tap weaveworks/tap
% brew install weaveworks/tap/eksctl
% eksctl version
0.60.0

2.3 コンテナイメージのビルドと公開

ACRを使ったコンテナーイメージビルドと共有

ACRの代わりに、ECRを使ってコンテナイメージの作成とレジストリへの登録を行う。

ECRレジストリの作成

% aws ecr create-repository --repository-name photo-view --image-scanning-configuration scanOnPush=true --region ap-southeast-2
{
    "repository": {
        "repositoryArn": "arn:aws:ecr:ap-southeast-2:xxxxxxxxxxxx:repository/photo-view",
        "registryId": "xxxxxxxxxxxx",
        "repositoryName": "photo-view",
        "repositoryUri": "xxxxxxxxxxxx.dkr.ecr.ap-southeast-2.amazonaws.com/yyyyyyyy",
        "createdAt": "2021-08-12T09:33:46+09:00",
        "imageTagMutability": "MUTABLE",
        "imageScanningConfiguration": {
            "scanOnPush": true
        },
        "encryptionConfiguration": {
            "encryptionType": "AES256"
        }
    }
}

ECRレジストリへのログイン

aws ecr get-login-password --region ap-southeast-2 | docker login --username AWS --password-stdin xxxxxxxxxxxx.dkr.ecr.ap-southeast-2.amazonaws.com

Dockerイメージのビルド

ACRでビルドする代わりに、ローカルでビルドしたものをECRにPUSHする。
まずはローカルでビルド。

% git clone https://github.com/ToruMakabe/Understanding-K8s
% cd Understanding-K8s/chap02/v1.0
% docker build -t photo-view:v1.0 .

次にローカルで動作確認。ブラウザで http://localhost にアクセスして写真が表示されればOK。

% docker run --rm -p 80:80 photo-view:v1.0

DockerイメージのECRへのPUSH

ECRにPUSHするためのtagを追加

docker tag photo-view:v1.0 xxxxxxxxxxxx.dkr.ecr.ap-southeast-2.amazonaws.com/photo-view:v1.0

ECRにpush

docker push xxxxxxxxxxxx.dkr.ecr.ap-southeast-2.amazonaws.com/photo-view:v1.0 

ECRに登録されたことを確認

aws ecr list-images --repository-name photo-view --region ap-southeast-2

Apple Silicon環境の場合

ローカルがApple Silicon環境の場合は、docker buildでビルドされるのはaarm64向け。これから作成するAWS上のEKSのノードはamd64環境のため、このイメージは実行できない。そのため、マルチプラットフォーム版のDockerイメージを作ってECRに登録しておく必要がある。

まずはDocker Desktop for macOS (Apple Silicon)で、マルチプラットフォームビルドができるように設定する。

% docker buildx ls
NAME/NODE       DRIVER/ENDPOINT STATUS  PLATFORMS
desktop-linux   docker                  
  desktop-linux desktop-linux   running linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
default *       docker                  
  default       default         running linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
% docker buildx create --name mybuilder
mybuilder
% docker buildx ls                     
NAME/NODE       DRIVER/ENDPOINT             STATUS   PLATFORMS
mybuilder       docker-container                     
  mybuilder0    unix:///var/run/docker.sock inactive 
desktop-linux   docker                               
  desktop-linux desktop-linux               running  linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
default *       docker                               
  default       default                     running  linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
% docker buildx use mybuilder
% docker buildx ls
NAME/NODE       DRIVER/ENDPOINT             STATUS   PLATFORMS
mybuilder *     docker-container                     
  mybuilder0    unix:///var/run/docker.sock inactive 
desktop-linux   docker                               
  desktop-linux desktop-linux               running  linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
default         docker                               
  default       default                     running  linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
% docker buildx inspect --bootstrap
% docker buildx ls
NAME/NODE       DRIVER/ENDPOINT             STATUS  PLATFORMS
mybuilder *     docker-container                    
  mybuilder0    unix:///var/run/docker.sock running linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
desktop-linux   docker                              
  desktop-linux desktop-linux               running linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
default         docker                              
  default       default                     running linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
% docker image ls
REPOSITORY                                                              TAG               IMAGE ID       CREATED        SIZE
moby/buildkit                                                           buildx-stable-1   febfa34ea4a7   3 weeks ago    134MB
% docker buildx build --platform linux/amd64,linux/arm64 -t xxxxxxxxxxxx.dkr.ecr.ap-southeast-2.amazonaws.com/photo-view-mp:v1.0 --push .

2.4 Azureを使ったKubernetesクラスター作成

AKSを使う代わりにEKSでKubernetesクラスターを作成する。

AKSを使ったクラスター構築

eksctlを使ってEKS上にクラスタを構築する。

クラスターとノードグループの作成

ノードとして動作するEC2インスタンスに接続するためのSSHキーペアを作っておく。

% aws ec2 create-key-pair --key-name eks_key --query 'KeyMaterial' --output text --region ap-southeast-2 > eks_key.pem

eksctlコマンドでクラスタとノードグループを同時に生成する。
コマンドを実行するとCloudFormationのスタックが登録され、クラスタに必要なリソースが生成される。
生成完了までは20分程度かかるので待つ。

% eksctl create cluster --name TestEKSCluster --region ap-southeast-2 --with-oidc --ssh-access --ssh-public-key eks_key --managed --nodes 1 --nodes-min 0 --nodes-max 3 --node-type t3.small

生成されていることを確認する。

% eksctl get cluster --region ap-southeast-2
2021-08-13 12:26:37 [ℹ]  eksctl version 0.60.0
2021-08-13 12:26:37 [ℹ]  using region ap-southeast-2
NAME        REGION      EKSCTL CREATED
TestEKSCluster  ap-southeast-2  True
% eksctl get nodegroup --region ap-southeast-2 --cluster TestEKSCluster
2021-08-13 12:30:05 [ℹ]  eksctl version 0.60.0
2021-08-13 12:30:05 [ℹ]  using region ap-southeast-2
CLUSTER     NODEGROUP   STATUS  CREATED         MIN SIZE    MAX SIZE    DESIRED CAPACITY    INSTANCE TYPE   IMAGE ID    ASG NAME
TestEKSCluster  ng-545be9b5 ACTIVE  2021-08-13T03:18:41Z    0       3       1           t3.small    AL2_x86_64  eks-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

eksctlが.kube/configの編集も自動で行ってくれるため、kubectlでのアクセスもこの時点で可能になる。
kubectlでkubernetesのレベルでもノードが認識されていることを確認する。

% kubectl get node
NAME                                                STATUS   ROLES    AGE   VERSION
ip-192-168-46-103.ap-southeast-2.compute.internal   Ready    <none>   10m   v1.20.4-eks-6b7464

ノードグループの実体はEC2のオートスケーリンググループなので、AWSコンソールや、AWS CLIでオートスケーリンググループの情報も確認してみる。

% aws autoscaling describe-auto-scaling-groups --region ap-southeast-2

ノードとして動作しているEC2インスタンスにSSHで接続してみる。ノードのアドレスはAWSコンソールで確認。

% ssh -i eks_key.pem ec2-user@<IPアドレス>

ノード数をスケールアウトしてみる。

% eksctl scale nodegroup --region ap-southeast-2 --cluster TestEKSCluster --name ng-545be9b5 --nodes 2
% kubectl get node
NAME                                                STATUS   ROLES    AGE   VERSION
ip-192-168-46-103.ap-southeast-2.compute.internal   Ready    <none>   40m   v1.20.4-eks-6b7464
ip-192-168-90-158.ap-southeast-2.compute.internal   Ready    <none>   42s   v1.20.4-eks-6b7464

ノード数をスケールインしてみる。

% eksctl scale nodegroup --region ap-southeast-2 --cluster TestEKSCluster --name ng-545be9b5 --nodes 0
% kubectl get node                    
No resources found

a1インスタンス

a1インスタンスのノードグループも作ってみた。
addonをアップデートするように警告メッセージが出るが、--skip-outdated-addons-check=trueをつけてスキップ。
警告メッセージ通りにアップデートするとノードグループをクラスタにJOINさせるところで失敗した。

eksctl create nodegroup --region ap-southeast-2 --cluster TestEKSCluster --name a1NodeGroup --ssh-access --ssh-public-key eks_key --nodes 1 --nodes-min 0 --nodes-max 3 --node-type a1.medium --node-zones ap-southeast-2c --managed --skip-outdated-addons-check=true
0
0
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
0
0