Minikubeを無料枠のAWS EC2 t2.microで実行しよう
Kubernetesをクラウドサービスで扱おうとするとどうしても課金が発生してしまうので、無料枠の t2.micro で実行できないかと思ってやってみた記事。つまり、 Minikube を AWS EC2 t2.micro で実行する記事 です。
EC2 t2.micro
今回使用するインスタンスのスペックは次の通り…
- AMI:Ubuntu Server 18.04 LTS (HVM), SSD Volume Type - ami-09c81ecf1c2b2ef70
- インスタンスタイプ:t2.micro
- ストレージ:汎用SSD(gp2) 30GiB
- vCPU:1
- Mem:1GiB
※ コンソールでの作業時、もしsudoで sudo: unable to resolve host ip- ...
みたいな文言が出力される場合は、 /etc/hosts
にホスト名を追記すれば消せます。
$ sudo sh -c 'echo 127.0.1.1 $(hostname) >> /etc/hosts'
インストール作業
Docker
Kubernetesはホスト上で実行するので、 Docker をインストールしておきます。
sudo apt-get update sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common
$ docker -v Docker version 17.03.2-ce, build f5ec1e2
Get Docker CE for Ubuntu | Docker Documentation
kubectl
Kubernetesを操作するための kubectl をインストールしておきます。
sudo apt-get update && sudo apt-get install -y apt-transport-https curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list sudo apt-get update sudo apt-get install -y kubectl
$ sudo kubectl version Client Version: version.Info{ ,,,
https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-on-linux
Minikube
Minikube をインストールします。(コマンドのバイナリをダウンロードするだけです)
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && sudo cp minikube /usr/local/bin/ && rm minikube
$ minikube version minikube version: v1.1.1
Minikubeの実行
管理者になって、 minikube start
からMinikubeを起動します。Kubernetesはホスト上で実行するためVMドライバーは不要で、オプションでは none
になっています。
$ sudo -i # minikube start --vm-driver=none
コマンドの実行後、1回目の起動はCPU数が問題で apiserver
が起動しないかもしれません。
しかし諦めずに2回目の起動を行うと(何故か)起動できるので、2回目の実行を行ってムリヤリMinikubeを起動してあげてください。
# minikube start --vm-driver=none ... [ERROR NumCPU]: the number of available CPUs 1 is less than the required 2 ... Sorry that minikube crashed. # minikube start --vm-driver=none ... Done! kubectl is now configured to use "minikube"
Minikubeが動作すると minikube status
や kubectl
から状態を確認することが出来ます。
# minikube status host: Running kubelet: Running apiserver: Running kubectl: Correctly Configured: pointing to minikube-vm at ... # kubectl get nodes NAME STATUS ROLES AGE VERSION minikube Ready <none> 150m v1.14.3
おっと、この時点でもうメモリが悲鳴を上げている気が…。
いろいろ動かしてみよう
ひとまずMinikubeが動いたので、その上でいろいろ動かしてみましょう。
EchoServer
動作確認を兼ねて、 gcr.io/google_containers/echoserver
を使って簡易のWebサーバーを立ち上げてみます。
kubectl run hello-minikube --image=gcr.io/google_containers/echoserver:1.4 --port=8080 kubectl expose deployment hello-minikube --type=NodePort
ここで作成したサービスのポートにcurlでアクセスすると情報が返ってきます。セキュリティグループでこのポートを開放してあげれば http://IPv4パブリックIP:ポート
でブラウザからもアクセスできますね。
# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-minikube NodePort 10.108.62.7 <none> 8080:30732/TCP 24h # curl localhost:30732 CLIENT VALUES: client_address= ...
EchoServerの削除は次のコマンドで行えます。
kubectl delete services hello-minikube kubectl delete deployment hello-minikube
Jenkins
次はEchoServerよりちょっとだけ大きな Jenkins を動かしてみましょうか。
とりあえずボリュームの共有とかデータの保存とかは考えず、動作の確認をしてみましょう。JenkinsのReplicationControllerとServiceを起動するために次のYAMLテンプレートを用意しました。
kubernetes-jenkins.yaml · GitHub
applyします。
# kubectl apply -f kubernetes-jenkins.yaml replicationcontroller/jenkins created service/jenkins-svc created
お、ちゃんと動いているらしい…。
# kubectl get pods,svc NAME READY STATUS RESTARTS AGE pod/jenkins-hnz4k 1/1 Running 0 27s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/jenkins-svc NodePort 10.105.128.151 <none> 8080:30080/TCP 27s
でもメモリは辛そう…。
※ Jenkinsを2分くらい起動していると apiserver
が死にます。(kubectlが使えない!!)
# # kubectl get pods,svc Unable to connect to the server: net/http: TLS handshake timeout # minikube status host: Running kubelet: Running apiserver: Stopped
こうなるともう minikube stop
しか…。
apiserverは死にましたが他は生きてるので、一応Jenkinsにはアクセスできます。セキュリティグループでTCP 30080を開放すれば http://IPv4パブリックIP:30080
でブラウザからアクセスも可能。(性能は足りてないので運用はできないと思いますが…)
結果
MinikubeはEC2のt2.microでも一応動きますが、使うとしても定期タスクの実行くらいでしか使えなさそうです。Kubernetesの操作を学ぶくらいには良さそう。
GitLabとかJenkinsみたいなWebアプリの運用は性能がショボいので厳しいですね。