CLOVER🍀

That was when it all began.

VMwareの肥大化した仮想マシンを小さくする

最近、VMware仮想マシンを使っていて、「なんかディスクサイズ、大きくない?」ということに気付きまして。

仮想マシン上で使っているディスクサイズからすると、1.5倍くらいのディスクサイズを占めていて、これはちょっと
どうにかならないかなぁと調べたところ、次のコマンドで小さくできました。

$ sudo vmware-toolbox-cmd disk shrink /

ヘルプを見ると、こんな感じ。

$ vmware-toolbox-cmd help disk
disk: ディスク圧縮操作を実行
使用方法: vmware-toolbox-cmd disk <サブコマンド> [引数]

サブコマンド:
   list: 使用可能な場所を一覧表示
   shrink <場所>: 指定された場所のファイル システムをワイプおよび圧縮
   shrinkonly: すべてのディスクを圧縮
   wipe <場所>: 指定された場所のファイル システムをワイプ

「shrink」サブコマンドで、指定した場所のファイルシステムを圧縮するようで。

このコマンドを実行すると、圧縮中は仮想マシンが使えなくなるのですが、仮想マシン上のサイズ…とはさすがにいきませんが、
かなり小さくしてくれました。

自分の環境では、50Gくらいディスクを使っていた仮想マシンが、35Gくらいにはなってくれましたよ。

Ubuntu Linux 16.04 LTSにMinikubeをインストールして、DriverにDockerを使用する

少しずつ、Kubernetesまわりの勉強を始めてみようかなということで。

Ubuntu Linux 16.04 LTSに、Minikubeをインストールして動かしてみます。

minikube

Minikubeというのは、Kubernetesをローカルで動かすためのソフトウェアですね。自分の手元のような環境だと、こういうのがありがたいです。

Minikube自体も前からあったのですが、Minikubeを使うためのソフトウェアがVirtualBoxなどで少し敬遠していたものの、
実はDockerでも動かすことができると聞いて、やってみようかなと。

では、進めていってみましょう。

環境

タイトルにも書いていますが、環境はUbuntu Linux 16.04 LTSで行っています。

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.4 LTS"

インストール

GitHubのREADME.mdを見ながら、インストール。

現時点での最新版はv0.26.1なのですが、うちの環境だと異様にCPUを使う、また2回目以降の挙動がどうにも変で、バージョンを下げて0.25.2を
使ってみることにします。幸い、このバージョンなら動くので。

Unable to start minikube v0.26 #2703

BUG - Minikube 0.26.0 - Ubuntu 17.10 - Unable to restart without error #2707

Minikubeのインストール。

$ curl -Lo minikube https://github.com/kubernetes/minikube/releases/download/v0.25.2/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/

確認。

$ minikube version
minikube version: v0.25.2

kubectlのインストール。

Install and Set Up 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 -
$ sudo sh -c 'cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF'
$ sudo apt-get update
$ sudo apt-get install -y kubectl

確認。

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.2", GitCommit:"81753b10df112992bf51bbc2c2f85208aad78335", GitTreeState:"clean", BuildDate:"2018-04-27T09:22:21Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
Unable to connect to the server: net/http: TLS handshake timeout

起動

では、Minikubeを起動してみます。

こちらに沿って。

Linux Continuous Integration without VM Support

「minikube start」で、オプションに「--vm-driver=none」を使うことで、ドライバをDockerとして起動できます。

$ sudo minikube start --vm-driver=none
There is a newer version of minikube available (v0.26.1).  Download it here:
https://github.com/kubernetes/minikube/releases/tag/v0.26.1

To disable this notification, run the following:
minikube config set WantUpdateNotification false
Starting local Kubernetes v1.9.4 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Downloading localkube binary
 163.02 MB / 163.02 MB [============================================] 100.00% 0s
 0 B / 65 B [----------------------------------------------------------]   0.00%
 65 B / 65 B [======================================================] 100.00% 0sSetting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
===================
WARNING: IT IS RECOMMENDED NOT TO RUN THE NONE DRIVER ON PERSONAL WORKSTATIONS
	The 'none' driver will run an insecure kubernetes apiserver as root that may leave the host vulnerable to CSRF attacks

When using the none driver, the kubectl config and credentials generated will be root owned and will appear in the root home directory.
You will need to move the files to the appropriate location and then set the correct permissions.  An example of this is below:

	sudo mv /root/.kube $HOME/.kube # this will write over any previous configuration
	sudo chown -R $USER $HOME/.kube
	sudo chgrp -R $USER $HOME/.kube
	
	sudo mv /root/.minikube $HOME/.minikube # this will write over any previous configuration
	sudo chown -R $USER $HOME/.minikube
	sudo chgrp -R $USER $HOME/.minikube 

This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true
Loading cached images from config file.

「minikube start」後に、次に実行すべきコマンドが表示されるので、ここはこれにしたがっておきます。

$ sudo chown -R $USER.$USER $HOME/.kube
$ sudo chown -R $USER.$USER $HOME/.minikube

DeploymentとServiceの作成。

$ kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.4 --port=8080
deployment.apps "hello-minikube" created
$ kubectl expose deployment hello-minikube --type=NodePort
service "hello-minikube" exposed

Podの状態を確認してみます。

$ kubectl get pod
NAME                            READY     STATUS    RESTARTS   AGE
hello-minikube-c6c6764d-nvr9f   1/1       Running   0          13s

curlで動作確認。

$ curl $(minikube service hello-minikube --url)
CLIENT VALUES:
client_address=172.17.0.1
command=GET
real path=/
query=nil
request_version=1.1
request_uri=http://192.168.254.128:8080/

SERVER VALUES:
server_version=nginx: 1.10.0 - lua: 10001

HEADERS RECEIVED:
accept=*/*
host=192.168.254.128:31572
user-agent=curl/7.47.0
BODY:
-no body in request-

また、この時に動作しているDockerコンテナは、こんな感じです。

$ docker ps
CONTAINER ID        IMAGE                                         COMMAND                  CREATED              STATUS              PORTS               NAMES
3fe390c8654b        k8s.gcr.io/echoserver                         "nginx -g 'daemon of…"   31 seconds ago       Up 30 seconds                           k8s_hello-minikube_hello-minikube-c6c6764d-8824q_default_b2a3da22-5538-11e8-908f-000c29471a6e_0
ac01183254be        gcr.io/google_containers/pause-amd64:3.0      "/pause"                 31 seconds ago       Up 31 seconds                           k8s_POD_hello-minikube-c6c6764d-8824q_default_b2a3da22-5538-11e8-908f-000c29471a6e_0
2cee91fc6848        k8s.gcr.io/k8s-dns-sidecar-amd64              "/sidecar --v=2 --lo…"   About a minute ago   Up About a minute                       k8s_sidecar_kube-dns-54cccfbdf8-m572j_kube-system_9c815b99-5538-11e8-908f-000c29471a6e_0
403a57ae5136        k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64        "/dnsmasq-nanny -v=2…"   About a minute ago   Up About a minute                       k8s_dnsmasq_kube-dns-54cccfbdf8-m572j_kube-system_9c815b99-5538-11e8-908f-000c29471a6e_0
a50ca1f382b4        k8s.gcr.io/k8s-dns-kube-dns-amd64             "/kube-dns --domain=…"   About a minute ago   Up About a minute                       k8s_kubedns_kube-dns-54cccfbdf8-m572j_kube-system_9c815b99-5538-11e8-908f-000c29471a6e_0
dfeb724bc721        e94d2f21bc0c                                  "/dashboard --insecu…"   About a minute ago   Up About a minute                       k8s_kubernetes-dashboard_kubernetes-dashboard-77d8b98585-wxljr_kube-system_9c5d4ee4-5538-11e8-908f-000c29471a6e_0
6b753de7c34c        gcr.io/google_containers/pause-amd64:3.0      "/pause"                 About a minute ago   Up About a minute                       k8s_POD_kube-dns-54cccfbdf8-m572j_kube-system_9c815b99-5538-11e8-908f-000c29471a6e_0
299bcb3aab05        gcr.io/google_containers/pause-amd64:3.0      "/pause"                 About a minute ago   Up About a minute                       k8s_POD_kubernetes-dashboard-77d8b98585-wxljr_kube-system_9c5d4ee4-5538-11e8-908f-000c29471a6e_0
4dc66c85f911        gcr.io/k8s-minikube/storage-provisioner       "/storage-provisioner"   About a minute ago   Up About a minute                       k8s_storage-provisioner_storage-provisioner_kube-system_9bdd26ec-5538-11e8-908f-000c29471a6e_0
be231b0a8af7        gcr.io/google_containers/pause-amd64:3.0      "/pause"                 About a minute ago   Up About a minute                       k8s_POD_storage-provisioner_kube-system_9bdd26ec-5538-11e8-908f-000c29471a6e_0
1a3b22ed8c70        gcr.io/google-containers/kube-addon-manager   "/opt/kube-addons.sh"    About a minute ago   Up About a minute                       k8s_kube-addon-manager_kube-addon-manager-ikaruga-ubuntu_kube-system_c4c3188325a93a2d7fb1714e1abf1259_1
c5d0c624aefc        gcr.io/google_containers/pause-amd64:3.0      "/pause"                 About a minute ago   Up About a minute                       k8s_POD_kube-addon-manager-ikaruga-ubuntu_kube-system_c4c3188325a93a2d7fb1714e1abf1259_0

Dockerコンテナだけかと思いきや、ホスト側にもいろいろいたり。

$ ps -ef | grep kube | grep -v 'grep'
root      46637      1 25 01:37 ?        00:00:24 /usr/local/bin/localkube --dns-domain=cluster.local --node-ip=192.168.254.128 --generate-certs=false --logtostderr=true --enable-dns=false
root      46788  46772  0 01:37 ?        00:00:00 /bin/bash /opt/kube-addons.sh
root      47396  47360  0 01:38 ?        00:00:00 /kube-dns --domain=cluster.local. --dns-port=10053 --config-map=kube-dns --v=2
nobody    47602  47577  0 01:38 ?        00:00:00 /sidecar --v=2 --logtostderr --probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.cluster.local.,5,A --probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.cluster.local.,5,A

削除

使い終わったら、ServiceとDeploymentを削除。

$ kubectl delete service hello-minikube
service "hello-minikube" deleted
$ kubectl delete deployment hello-minikube
deployment.extensions "hello-minikube" deleted

Minikubeも停止…

$ sudo minikube stop
Stopping local Kubernetes cluster...
Machine stopped.

なのですが、なぜか止まりません…。

最終的には、「minikube stop」を飛ばして削除です…。

$ sudo minikube delete

とりあえず、最低限は動かせた気はしますが、いろいろ怪しいです…。

これから、ちょっとずつ慣れて…いけるでしょうか?

ちなみに、minikubeのアンインストールはこちら。

How to uninstall? #1043

0.26.1は、なにがダメだった?

うちだと、ログにこんな感じに出力されるうえ、CPUリソースを大量に消費します。

[preflight] Running pre-flight checks.
	[WARNING SystemVerification]: docker version is greater than the most recently validated version. Docker version: 17.12.1-ce. Max validated version: 17.03
	[WARNING Swap]: running with swap on is not supported. Please disable swap
	[WARNING FileExisting-ebtables]: ebtables not found in system path
	[WARNING FileExisting-ethtool]: ethtool not found in system path
	[WARNING FileExisting-socat]: socat not found in system path
	[WARNING FileExisting-crictl]: crictl not found in system path
Suggestion: go get github.com/kubernetes-incubator/cri-tools/cmd/crictl
Flag --admission-control has been deprecated, Use --enable-admission-plugins or --disable-admission-plugins instead. Will be removed in a future version.
[preflight] Some fatal errors occurred:
	[ERROR Port-10250]: Port 10250 is in use
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
: running command: sudo /usr/bin/kubeadm init --config /var/lib/kubeadm.yaml --ignore-preflight-errors=DirAvailable--etc-kubernetes-manifests --ignore-preflight-errors=DirAvailable--data --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-etcd.yaml --ignore-preflight-errors=Swap --ignore-preflight-errors=CRI 
.: exit status 2`

これがどうしても抜けられずに、0.25に下げたらいいよ、みたいなIssueを見かけたので、バージョンを下げたら確かに
起動しました。代わりに、「minikube stop」はなんか止められないのですが…。