Shiopon Labo

しおぽん(@shiopon01)の個人ブログです

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

Install Minikube - Kubernetes

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 statuskubectl から状態を確認することが出来ます。

# 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

おっと、この時点でもうメモリが悲鳴を上げている気が…。

f:id:shiopon01:20190621151705p:plain
htopの結果

いろいろ動かしてみよう

ひとまず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

でもメモリは辛そう…。

f:id:shiopon01:20190621153735p:plain
htopの結果2

※ 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 でブラウザからアクセスも可能。(性能は足りてないので運用はできないと思いますが…)

f:id:shiopon01:20190621154501p:plain
Jenkins

結果

MinikubeはEC2のt2.microでも一応動きますが、使うとしても定期タスクの実行くらいでしか使えなさそうです。Kubernetesの操作を学ぶくらいには良さそう。

GitLabとかJenkinsみたいなWebアプリの運用は性能がショボいので厳しいですね。