仕事でKubernetesクラスタを触る機会があったので、家でも触ってみたいと思い、実施したことを忘備録的にまとめます。 AWSのページを確認すると
の2パターンが確認できます。
eksctl
とはWeaveworksがメインで開発している、eksを簡単に構築・運用できるようにするためのコマンドラインツールになります。使用感としてはGCPの gcloud
コマンドに近いとのことです。
( gcloud
コマンド、ちゃんと使ったこと無いので伝聞なのが心苦しいですが。。)
コンソールから実施するタイプの方は、Kuberentes及びAWS CloudFormationなどにある程度慣れている方向けです(結構たいへんです)。
今回は構築・削除を簡単にしたいので、 eksctl
を利用する方式を取ります。
※以下構築方法はあくまでプライベートでの検証用途です。会社の環境で同じ設定をすると、おそらく(というか確実に)インフラ or SRE エンジニアからぶっ飛ばされるので気をつけましょう。
やること
(全然セットアップしてない体で説明を開始します。してあるよって方はスキップでおk)
とりあえずローカル以外でKubernetesを立てるというだけなら、eksctlコマンドを利用すれば驚くほど簡単になっています。
1. IAMユーザーの作成&アクセスポリシーの追加
1.
以下の用にIAMの画面からキーを発行します。
ここでは
ユーザー名: eks-power-access
アクセスの種類: プラグラムによるアクセス
としました。
2.
次にポリシーをアタッチします。本当はダメな設定ですが、スポットの検証用ということでAdministrator権限をつけています。
(これが万一流出するとほぼ確実に不正利用されるので気をつけましょう)
本来ならば、EKSの構築に必要な権限を調べて、それのみアタッチすべきですが、 ちょっと面倒くさかった 作業簡略化のためAdministratorをつけています
3.
最後入力内容を確認しましょう
4.
キーが発行できたらCSVをダウンロードしておきましょう。画面からでも確認できますが、ダウンロードできるものはしておいたほうが何かと確実です。
2. AWS CLIのセットアップ
(正直ここまでセットアップ済みだよ!!って方がほとんどだと思いますが)
aws cliのインストールにはpythonが必要になります。お使いのPCがMacでしたらすでに導入されているので問題ないです。
python3系じゃないとだめだろ!!!馬鹿野郎!!!という方はググって頑張ってください。
pyenvもしくはvirtualenvを入れているという方はおそらく説明不要だと思うので、ここの文章はスキップで問題ないです。
他OSの方も、python導入(Windowsに関しては、スタンドアローンのインストーラーがあるのでpythonを使わなくても使用可能です)に関してはググって頑張ってください。
以下コマンドで導入することができます
$ pip install awscli
Windowsのスタンドアローンインストーラーの方はこちらを参照ください。
3. eksctlのセットアップ
こちらもすぐに終わります。
$ curl --silent --location "https://github.com/weaveworks/eksctl/releases/download/latest_release/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp $ sudo mv /tmp/eksctl /usr/local/bin
$ brew tap weaveworks/tap $ brew install weaveworks/tap/eksctl
$ chocolatey install eksctl
ここに書きましたが、最新コマンドはこちらで確認をお願いします。
補完は好き好きで(あると便利です)
4. 立てちゃう
はい。立てちゃいます。
なんにも考えないで実行すると、以下コマンドになります
$ eksctl create cluster
ですが、このコマンドだと m5.large
インスタンス2台を us-west-2
(オハイオ) リージョンにて、専用VPCを作成して構築することになります。あとクラスタ名がランダムで決まります。
検証用途にこのサイズのインスタンスは大きすぎるので、ある程度指定してあげましょう。
引数で指定してあげることもできますが、設定値はyamlで管理できるので、是非yamlにしましょう。
以下を指定しました。
以下のようなyamlになるかと思われます。
githubにもいくつかサンプルがあるので、是非参考にしてみてください。
作成するには、以下コマンドを実施します。
$ eksctl create cluster --config-file simple-kubernetes-with-eksctl.yml
10分程度で完成しました
$ eksctl create cluster --config-file simple-kubernetes-with-eksctl.yml [ℹ] using region ap-northeast-1 [ℹ] setting availability zones to [ap-northeast-1d ap-northeast-1a ap-northeast-1c] [ℹ] subnets for ap-northeast-1d - public:192.168.0.0/19 private:192.168.96.0/19 [ℹ] subnets for ap-northeast-1a - public:192.168.32.0/19 private:192.168.128.0/19 [ℹ] subnets for ap-northeast-1c - public:192.168.64.0/19 private:192.168.160.0/19 [ℹ] nodegroup "worker00" will use "ami-0dfbca8d183884f02" [AmazonLinux2/1.12] [ℹ] creating EKS cluster "kube00-tokyo" in "ap-northeast-1" region [ℹ] 1 nodegroup (worker00) was included [ℹ] will create a CloudFormation stack for cluster itself and 1 nodegroup stack(s) [ℹ] if you encounter any issues, check CloudFormation console or try 'eksctl utils describe-stacks --region=ap-northeast-1 --name=kube00-tokyo' [ℹ] 2 sequential tasks: { create cluster control plane "kube00-tokyo", create nodegroup "worker00" } [ℹ] building cluster stack "eksctl-kube00-tokyo-cluster" [ℹ] deploying stack "eksctl-kube00-tokyo-cluster" [ℹ] building nodegroup stack "eksctl-kube00-tokyo-nodegroup-worker00" [ℹ] --nodes-min=2 was set automatically for nodegroup worker00 [ℹ] --nodes-max=2 was set automatically for nodegroup worker00 [ℹ] deploying stack "eksctl-kube00-tokyo-nodegroup-worker00" [✔] all EKS cluster resource for "kube00-tokyo" had been created [✔] saved kubeconfig as "/Users/dorian/.kube/config" [ℹ] adding role "arn:aws:iam::xxxxxxxxxxxx:role/eksctl-kube00-tokyo-nodegroup-wor-NodeInstanceRole-13QV27O8G46HU" to auth ConfigMap [ℹ] nodegroup "worker00" has 0 node(s) [ℹ] waiting for at least 2 node(s) to become ready in "worker00" [ℹ] nodegroup "worker00" has 2 node(s) [ℹ] node "ip-192-168-19-13.ap-northeast-1.compute.internal" is ready [ℹ] node "ip-192-168-36-85.ap-northeast-1.compute.internal" is ready [ℹ] kubectl command should work with "/Users/dorian/.kube/config", try 'kubectl get nodes' [✔] EKS cluster "kube00-tokyo" in "ap-northeast-1" region is ready
では実際にkubectlコマンドが通るか試してみましょう。
$ kubectl get nodes NAME STATUS ROLES AGE VERSION ip-192-168-19-13.ap-northeast-1.compute.internal Ready <none> 8m v1.12.7 ip-192-168-36-85.ap-northeast-1.compute.internal Ready <none> 8m v1.12.7
$ kubectl describe nodes Name: ip-192-168-19-13.ap-northeast-1.compute.internal Roles: <none> Labels: alpha.eksctl.io/cluster-name=kube00-tokyo alpha.eksctl.io/instance-id=i-0d24521d0fc8630ef alpha.eksctl.io/nodegroup-name=worker00 beta.kubernetes.io/arch=amd64 beta.kubernetes.io/instance-type=t3.micro beta.kubernetes.io/os=linux failure-domain.beta.kubernetes.io/region=ap-northeast-1 failure-domain.beta.kubernetes.io/zone=ap-northeast-1d kubernetes.io/hostname=ip-192-168-19-13.ap-northeast-1.compute.internal Annotations: node.alpha.kubernetes.io/ttl=0 volumes.kubernetes.io/controller-managed-attach-detach=true CreationTimestamp: Wed, 03 Jul 2019 20:20:37 +0900 Taints: <none> Unschedulable: false Conditions: Type Status LastHeartbeatTime LastTransitionTime Reason Message ---- ------ ----------------- ------------------ ------ ------- OutOfDisk False Wed, 03 Jul 2019 20:25:58 +0900 Wed, 03 Jul 2019 20:20:37 +0900 KubeletHasSufficientDisk kubelet has sufficient disk space available MemoryPressure False Wed, 03 Jul 2019 20:25:58 +0900 Wed, 03 Jul 2019 20:20:37 +0900 KubeletHasSufficientMemory kubelet has sufficient memory available DiskPressure False Wed, 03 Jul 2019 20:25:58 +0900 Wed, 03 Jul 2019 20:20:37 +0900 KubeletHasNoDiskPressure kubelet has no disk pressure PIDPressure False Wed, 03 Jul 2019 20:25:58 +0900 Wed, 03 Jul 2019 20:20:37 +0900 KubeletHasSufficientPID kubelet has sufficient PID available Ready True Wed, 03 Jul 2019 20:25:58 +0900 Wed, 03 Jul 2019 20:20:47 +0900 KubeletReady kubelet is posting ready status Addresses: InternalIP: 192.168.19.13 ExternalIP: xxx.xxx.xxx.xxx InternalDNS: ip-192-168-19-13.ap-northeast-1.compute.internal ExternalDNS: ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com Hostname: ip-192-168-19-13.ap-northeast-1.compute.internal ~~~~
問題なさそうですね。 では、一通り必要な検証が終わったとして、お金節約のため、クラスタを削除しましょう。以下コマンドで実施できます。
eksctl delete cluster --name kube00-tokyo
$ eksctl delete cluster --name kube00-tokyo [ℹ] using region ap-northeast-1 [ℹ] deleting EKS cluster "kube00-tokyo" [✔] kubeconfig has been updated [ℹ] 2 sequential tasks: { delete nodegroup "worker00", delete cluster control plane "kube00-tokyo" [async] } [ℹ] will delete stack "eksctl-kube00-tokyo-nodegroup-worker00" [ℹ] waiting for stack "eksctl-kube00-tokyo-nodegroup-worker00" to get deleted [ℹ] will delete stack "eksctl-kube00-tokyo-cluster" [✔] all cluster resources were deleted
削除されました。
Kubernetes自体はローカルでも検証することはできますが、クラウドベンダーの機能(AWSで言えばALBIngress, IAMとRBACの連携など)を試すときはサーバー上に構築する必要があります。
eksctlのおかげで、AWSでも簡単に構築できるようになったので、是非試してみてください。