Amazon Linux2 + aws-k8s-cniでKubernetesの構築

この記事を書いたチーム:chocochip

目的

【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc.  詳細はこちらから>

AWSにKubernetes(以下K8S)構築する場合、EKSを使用するのが一般的ですが
EKSは費用が高い(月額1万程)ため、検証用に使用する目的で
Amazon Linx2にK8Sを構築します。

こちらの記事は検証目的のため、本番運用の参考にはしないで下さい。

前提

・AWSのアカウントは取得済みであること

注意

この手順で「ec2-net-utils」をアンインストールする影響で
インスタンス再起動時にパブリックIPの割り当てがされなくなります。
今回の手順は検証用にパブリックサブネットで構築していますが、
実際にはプライベートサブネットで構築をお願いします。

準備各リソースの名前

K8Sクラスタ名:dev-k8s-cluster
K8SマスターEC2:dev-k8s-master
K8SノードEC2:dev-k8s-node

EC2に必要なリソースの作成

AWSコンソールを使用して作業を行います。
①IAMロールの作成

②信頼されたエンティティを選択します。
エンティティタイプ:AWSのサービス
ユースケース:EC2

③使用ロールを選択します。
使用ロール:AmazonEC2ContainerRegistryReadOnly

④ロールを作成します。
ロール名:dev-k8s-role

⑤セキュリティグループの作成

⑥セキュリティグループを作成します。
セキュリティグループ名:dev-k8s-security
説明:k8s ec2 security group
VPC:デフォルトVPC
※ここではインバンドルールには何設定しなくてよいです。

作成が完了後にセキュリティグループIDをメモします。

⑦インバンドルールを編集します。
SSH:マイIP
全てのトラフィック:⑥でメモしたセキュリティグループID

K8SマスターEC2の作成

AWSコンソールを使用して作業を行います。
①EC2のメニューでインスタンスを起動します。

②タグを設定します。
キー:Name、値:dev-k8s-master
キー:kubernetes.io/cluster/dev-k8s-cluster※各自クラスタ名に置き換えてください。、値:owned
キー:k8s-control-plane、値:※なしで構いません。

③AMIはAmazon Linuxを設定します。

④インスタンスタイプを設定します。
インスタンスタイプ:t3.small
※t3.smallですとK8Sを起動するだけでメモリが枯渇しますので
余裕が欲しい場合はインスタンスタイプを上げて下さい。

⑤キーペアを作成します。
キーペア名:dev-k8s-key

⑥ネットワークの設定します。
準備で作成した既存のセキュリティグループを選択します。
セキュリティグループ名:dev-k8s-security

⑦ストレージを設定します。
ルートボリューム:20G

⑧高度な詳細を設定します。
IAMインスタンスプロフィールに準備で作成したロールを設定します。
ロール名:dev-k8s-role

⑨EC2を起動します。

マスターEC2にK8Sのインストール

teraterm等のツールでK8SマスターEC2にSSHでログインして作業を行います。

①K8SマスターEC2のパブリックIP確認
AWSコンソールでEC2の一覧から「dev-k8s-master」の詳細を確認します。

②teratermでK8SマスターEC2にログインします。
IP:①で確認したパブリックIP
ユーザ名:ec2-user
鍵ファイル:上記で作成した「dev-k8s-key」

③EC2を最新の状態にアップデートします。

④ec2-net-utilsをアンインストールします。
後述のaws-k8s-cniプラグインを入れる時にec2-net-utilsが入っていると
挙動が不安定になるため、アンインストールします。

⑤コンテナランタイムをインストールします。
ランタイムはcontainerdを使用します。

containerdを自動起動するように設定します。

ステータスを確認します。

⑥OSパラメータを設定します。

⑦containerdのconfig.tomlを設定します。

デフォルト設定を作成します。

config.tomlのパラメータを変更します。

変更内容

設定を反映します。

⑧kubeadmインストール時に警告が出るためtcモジュールを追加します。

⑨kubeadm, kubelet, kubectlをインストールします。
K8S用のリポジトリを追加します。

ファイル内容:/etc/yum.repos.d/kubernetes.repo

インストールします。
※今回はバージョン1.23をインストールします。

kubeletを自動起動するように設定します。

ステータスを確認します。
ここではK8Sの構築が完了していないため、停止状態となっています。

⑩kubeadmを使用してK8Sをインストールします。

K8S用設定ファイルを作成します。

ファイル内容:config.yaml

kubeadmコマンドでK8Sをインストールします。

インストール完了時に表示されるコマンドをメモします。※上記赤枠部分

こちらはK8Sノードを追加する時に必要になりますので、必ずメモしましょう。

⑪kubectlコマンドを設定します。

ec2-userでkubectlコマンドを使用するための設定を行います。

kubectlコマンドでポットの状態を確認します。

※corednsがPendingとなっていますが、まだネットワークプラグインを入れる前なので問題ありません。

K8Sネットワークプラグインのイントール

①AWSコンソールでEC2のロールに権限を追加します。
ロール名:dev-k8s-role

②インラインポリシーにjsonで入力します。
必要なiamは以下に記載されています。

③インラインポリシーを作成します。
インラインポリシー名:dev-amazon-vpc-cni-k8s

④amazon-vpc-cni-k8sのyamlファイルをgitから取得します。
gitコマンドをインストールします。

今回はバージョン1.11.3を取得します

設定ファイルを編集します。

イメージの取得先とランタイムを変更します。

⑤K8Sにインストールします。

kubectlコマンドでポッドの状態を確認します。

※corednsがRunningになればインストール完了です。

 K8SノードEC2を作成します。

AWSコンソールを使用して作業を行います。

①EC2のメニューでインスタンスを起動します。

②タグを設定します。
キー:Name、値:dev-k8s-node
キー:kubernetes.io/cluster/dev-k8s-cluster※各自クラスタ名に置き換えてください。、値:owned

③AMIはAmazon Linuxを設定します。

④インスタンスタイプとキーペアを設定します。
インスタンスタイプ:t3.small
キーペア名:dev-k8s-key

⑥ネットワークの設定します。
準備で作成した既存のセキュリティグループを選択します。
セキュリティグループ名:dev-k8s-security

⑦ストレージ、ロールを設定します。
ルートボリューム:8G※デフォルトのままです。
ロール名:dev-k8s-role

⑧EC2を作成します。

ノードEC2にK8Sのインストール

teraterm等のツールでK8SマスターEC2にログインして作業を行います。

①K8SマスターEC2のグローバルIP確認
AWSコンソールでEC2の一覧から「dev-k8s-node」の詳細を確認します。

②teratermでK8SマスターEC2にログインします。
IP:①で確認したグローバルIP
ユーザ名:ec2-user
鍵ファイル:上記で作成した「dev-k8s-key」

③EC2を最新の状態にアップデートします。

④ec2-net-utilsをアンインストールします。
後述のaws-k8s-cniプラグインを入れる時にec2-net-utilsが入っていると
挙動が不安定になるため、アンインストールします。

⑤コンテナランタイムをインストールします。
ランタイムはcontainerdを使用します。

containerdを自動起動するように設定します。

ステータスを確認します。

⑥OSパラメータを設定します。

⑦containerdのconfig.tomlを設定します。

デフォルト設定を作成します。

config.tomlのパラメータを変更します。

ファイル内容:config.yaml

設定を反映します。

⑧kubeadmインストール時に警告が出るためtcモジュールを追加します。

⑨kubeadm, kubelet, kubectlをインストールします。

K8S用のリポジトリを追加します。

ファイル内容:/etc/yum.repos.d/kubernetes.repo

インストールします。

※今回はバージョン1.23をインストールします。

kubeletを自動起動するように設定します。

ステータスを確認します。
ここではK8Sの構築が完了していないため、停止状態となっています。

⑩kubeadmを使用してK8SマスターEC2に紐づけます。

マスターEC2にK8Sをインストールした時に表示されたコマンドを使用します。

sudoを付けてで実行する事と「–cri-socket=/run/containerd/containerd.sock」のオプションを追加します。

K8SマスターEC2で状態を確認します。

K8SマスターEC2にSSHログインし、kubectlコマンドでノードの状態を確認します。

STATUSが「Ready」になっていれば正常です。

サンプルnginxをデプロイします。

①nginxのyamlファイルを作成します。

ファイル内容:nginx.yaml

②nginxをデプロイします。

③nginxのデプロイを確認します。

STATUSが「Runnin」になっていれば正常です。

④サービスのノードポートを確認します。

PORTで「80:30366」となっているところを確認します。
ノードポートは「30366」となります。

⑤外部からアクセスできるようにセキュリティグループを変更します。
AWSコンソールにログインして作業を行います。

対象セキュリティグループ:dev-k8s-security

インバンドルールに以下を追加します。
タイプ:カスタムTCP
ポート範囲:30366※上記で確認したノードポートになります。
ソース:マイIP※検証用なのでマイIPとしています。公開する場合は「0.0.0.0/0」等を入力することで公開可能です。

⑥ブラウザでnginxにアクセスします。
URL:http://K8SノードEC2のパブリックIP:30366※上記で確認したノードポートになります。

nginxのページが表示されれば正常です。

以上。

【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>

Smallitのサービス