2020/12/02
今回できたこと
未解決
今後の作業
お約束
定例作業
参考文献
macOSで用いられるDocker用のハイパーバイザHyperKitの位置付けがわかる。
動作のために、(Free)BSDのハイパーバイザーbHyve由来のmacOS用のハイパーバイザーxhyveの技術を使っているらしい。 mikikubeチュートリアル
minikubeの特長は、以下の通り。
簡単にK8s環境を試すことができる。
minikube help startによるとmacOSでは、virtualbox, parallels, vmwarefusion, hyperkit, vmware, docker, podman (experimental)が使えるようだ。
はじめに、minikubeが動いていないことを確認する。
code:shell
% minikube status
minikube
type: Control Plane
host: Stopped
kubelet: Stopped
apiserver: Stopped
kubeconfig: Stopped
% docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
以下のように、minikubeを起動する。
ここでは、virtualboxドライバで起動している。
code:shell
% minikube start --driver virtualbox
* Darwin 10.15.7 上の minikube v1.15.1
* 設定を元に、 virtualbox ドライバを使用します
* VM ブートイメージをダウンロードしています...
minikube-v1.15.0.iso.sha256: 65 B / 65 B ------------- 100.00% ? p/s 0s minikube-v1.15.0.iso: 181.00 MiB / 181.00 MiB [] 100.00% 3.16 MiB p/s 57s
* コントロールプレーンのノード minikube を minikube 上で起動しています
* Kubernetes v1.19.4 のダウンロードの準備をしています
preloaded-images-k8s-v6-v1.19.4-docker-overlay2-amd64.tar.lz4: 486.35 MiB
* virtualbox VM (CPUs=2, Memory=4000MB, Disk=20000MB) を作成しています...
* Docker 19.03.13 で Kubernetes v1.19.4 を準備しています...
* Kubernetes コンポーネントを検証しています...
* 有効なアドオン: storage-provisioner, default-storageclass
* Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
% minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
dashboardも起動しておく。
code:shell
% minikube dashboard
* ダッシュボードの状態を確認しています...
* プロキシを起動しています...
* プロキシの状態を確認しています...
例題hello-nodeをデプロイする。
code:shell
% kubectl create deployment hello-node --image=k8s.gcr.io/echoserver:1.4
deployment.apps/hello-node created
% kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
hello-node 1/1 1 1 94s
hello-nodeをデプロイした後のイベント情報は、以下の通り。
code:shell
% kubectl get events
LAST SEEN TYPE REASON OBJECT MESSAGE
2m53s Normal Scheduled pod/hello-node-7567d9fdc9-m768n Successfully assigned default/hello-node-7567d9fdc9-m768n to minikube
2m51s Normal Pulling pod/hello-node-7567d9fdc9-m768n Pulling image "k8s.gcr.io/echoserver:1.4"
113s Normal Pulled pod/hello-node-7567d9fdc9-m768n Successfully pulled image "k8s.gcr.io/echoserver:1.4" in 58.638019165s
104s Normal Created pod/hello-node-7567d9fdc9-m768n Created container echoserver
104s Normal Started pod/hello-node-7567d9fdc9-m768n Started container echoserver
2m53s Normal SuccessfulCreate replicaset/hello-node-7567d9fdc9 Created pod: hello-node-7567d9fdc9-m768n
2m53s Normal ScalingReplicaSet deployment/hello-node Scaled up replica set hello-node-7567d9fdc9 to 1
25m Normal NodeHasSufficientMemory node/minikube Node minikube status is now: NodeHasSufficientMemory
25m Normal NodeHasNoDiskPressure node/minikube Node minikube status is now: NodeHasNoDiskPressure
25m Normal NodeHasSufficientPID node/minikube Node minikube status is now: NodeHasSufficientPID
24m Normal Starting node/minikube Starting kubelet.
24m Normal NodeHasSufficientMemory node/minikube Node minikube status is now: NodeHasSufficientMemory
24m Normal NodeHasNoDiskPressure node/minikube Node minikube status is now: NodeHasNoDiskPressure
24m Normal NodeHasSufficientPID node/minikube Node minikube status is now: NodeHasSufficientPID
24m Normal NodeAllocatableEnforced node/minikube Updated Node Allocatable limit across pods
24m Normal RegisteredNode node/minikube Node minikube event: Registered Node minikube in Controller
23m Normal Starting node/minikube Starting kube-proxy.
設定を確認する。
code:shell
% kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority: /Users/mutoh/.minikube/ca.crt
name: minikube
contexts:
- context:
cluster: minikube
user: minikube
name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
user:
client-certificate: /Users/mutoh/.minikube/profiles/minikube/client.crt
client-key: /Users/mutoh/.minikube/profiles/minikube/client.key
今回のデプロイがWebブラウザで参照できるように、exposeする。
code:shell
% kubectl expose deployment hello-node --type=LoadBalancer --port=8080
service/hello-node exposed
この時点で動いているサービスは、以下の通り。
code:shell
% kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-node LoadBalancer 10.109.168.60 <pending> 8080:30684/TCP 52s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 31m
hello-nodeのサービスを確認すると、以下のようになる。
code:shell
% minikube service hello-node
|-----------|------------|-------------|-----------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|------------|-------------|-----------------------------|
|-----------|------------|-------------|-----------------------------|
* Opening service default/hello-node in default browser...
% minikube service hello-node
|-----------|------------|-------------|-----------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|------------|-------------|-----------------------------|
|-----------|------------|-------------|-----------------------------|
* Opening service default/hello-node in default browser...
このコマンドを実行すると自動的にブラウザが起動し、以下のような出力が得られる。
code:shell
CLIENT VALUES:
client_address=172.17.0.1
command=GET
real path=/
query=nil
request_version=1.1
SERVER VALUES:
server_version=nginx: 1.10.0 - lua: 10001
HEADERS RECEIVED:
accept=text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
accept-encoding=gzip, deflate
accept-language=en,ja;q=0.9
connection=keep-alive
host=192.168.99.100:30684
upgrade-insecure-requests=1
user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36
BODY:
-no body in request-
利用できるアドオンとその状態は以下のように確認できる。
code:shell
% minikube addons list
|-----------------------------|----------|--------------|
| ADDON NAME | PROFILE | STATUS |
|-----------------------------|----------|--------------|
| ambassador | minikube | disabled |
| csi-hostpath-driver | minikube | disabled |
| dashboard | minikube | enabled ✅ |
| default-storageclass | minikube | enabled ✅ |
| efk | minikube | disabled |
| freshpod | minikube | disabled |
| gcp-auth | minikube | disabled |
| gvisor | minikube | disabled |
| helm-tiller | minikube | disabled |
| ingress | minikube | disabled |
| ingress-dns | minikube | disabled |
| istio | minikube | disabled |
| istio-provisioner | minikube | disabled |
| kubevirt | minikube | disabled |
| logviewer | minikube | disabled |
| metallb | minikube | disabled |
| metrics-server | minikube | disabled |
| nvidia-driver-installer | minikube | disabled |
| nvidia-gpu-device-plugin | minikube | disabled |
| olm | minikube | disabled |
| pod-security-policy | minikube | disabled |
| registry | minikube | disabled |
| registry-aliases | minikube | disabled |
| registry-creds | minikube | disabled |
| storage-provisioner | minikube | enabled ✅ |
| storage-provisioner-gluster | minikube | disabled |
| volumesnapshots | minikube | disabled |
|-----------------------------|----------|--------------|
アドオンのひとつのmetrics-serverを有効化するには、以下のように行う。
code:shell
% minikube addons enable metrics-server
* The 'metrics-server' addon is enabled
addon enable後では、podのpod/metrics-server-d9b576748-6xhjwとservice/metrics-serverが追加されていた。
code:shell
% kubectl get pod,svc -n kube-system
NAME READY STATUS RESTARTS AGE
pod/coredns-f9fd979d6-bvclp 1/1 Running 0 37m
pod/etcd-minikube 1/1 Running 0 37m
pod/kube-apiserver-minikube 1/1 Running 0 37m
pod/kube-controller-manager-minikube 1/1 Running 0 37m
pod/kube-proxy-bpql8 1/1 Running 0 37m
pod/kube-scheduler-minikube 1/1 Running 0 37m
pod/metrics-server-d9b576748-6xhjw 1/1 Running 0 29s
pod/storage-provisioner 1/1 Running 0 37m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 37m
service/metrics-server ClusterIP 10.104.81.160 <none> 443/TCP 29s
アドオンは、以下のようにして無効化できる。
code:shell
% minikube addons disable metrics-server
* 「metrics-server」アドオンは無効化されています
serviceとdeploymentを消去する前に、状態を確認する。
code:shell
% kubectl get services,deployment
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/hello-node LoadBalancer 10.109.168.60 <pending> 8080:30684/TCP 22m
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 52m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/hello-node 1/1 1 1 30m
サービスやデプロイは、deleteを使って、以下のように削除できる。
code:shell
% kubectl delete service hello-node
service "hello-node" delete
% kubectl delete deployment hello-node
deployment.apps "hello-node" deleted
% kubectl get services,deployment
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 53m
stopを使うことで、minikube環境を停止できる。
code:shell
% minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
% minikube stop
* ノード "minikube" を停止しています...
* 1台のノードが停止しました。
% minikube status
minikube
type: Control Plane
host: Stopped
kubelet: Stopped
apiserver: Stopped
kubeconfig: Stopped
最後に、minikube環境を削除するためには、deleteを使う。
code:shell
% minikube delete
* virtualbox の「minikube」を削除しています...
* クラスタ "minikube" の全てのトレースを削除しました。
% minikube status
* There is no local cluster named "minikube"
- To fix this, run: "minikube start"
以上で、チュートリアルの内容は終了した。
Deploymentの実習
nginxを使う。
レプリカ数は3つ。
サービスは、port 80を使う。
code:nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
デプロイは、URLを指定して、以下のように実行できる。
code:shell
deployment.apps/nginx-deployment created
% kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 0/3 3 0 21s
(しばらく待つ)
% kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 118s
全てのPod起動後の状態は、以下の通り。
code:shell
% kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-66b6c48dd5-8rg9m 1/1 Running 0 5m14s
pod/nginx-deployment-66b6c48dd5-grddx 1/1 Running 0 5m14s
pod/nginx-deployment-66b6c48dd5-k6674 1/1 Running 0 5m15s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9m53s
以下のように、ロードバランサーをデプロイする。
code:shell
% kubectl expose deployment nginx-deployment --type=LoadBalancer --port=8080
service/nginx-deployment exposed
% kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-66b6c48dd5-8rg9m 1/1 Running 0 9m53s
pod/nginx-deployment-66b6c48dd5-grddx 1/1 Running 0 9m53s
pod/nginx-deployment-66b6c48dd5-k6674 1/1 Running 0 9m54s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 14m
service/nginx-deployment LoadBalancer 10.110.108.142 <pending> 8080:31692/TCP 32s
code:shell
% minikube service nginx-deployment
|-----------|------------------|-------------|-----------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|------------------|-------------|-----------------------------|
|-----------|------------------|-------------|-----------------------------|
* Opening service default/nginx-deployment in default browser...
ホスト側からは、このIP(192.168.99.100)に到達できている。
code:shell
% ping 192.168.99.100
PING 192.168.99.100 (192.168.99.100): 56 data bytes
64 bytes from 192.168.99.100: icmp_seq=0 ttl=64 time=0.296 ms
64 bytes from 192.168.99.100: icmp_seq=1 ttl=64 time=0.242 ms
64 bytes from 192.168.99.100: icmp_seq=2 ttl=64 time=0.312 ms
^C
--- 192.168.99.100 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.242/0.283/0.312/0.030 ms
% telnet 192.168.99.100 31692
Trying 192.168.99.100...
telnet: connect to address 192.168.99.100: Connection refused
telnet: Unable to connect to remote host
minikube内部からは、以下のような状況になっている。
code:shell
$ netstat -na|grep 8080
$ netstat -na|grep 31692
tcp 0 0 0.0.0.0:31692 0.0.0.0:* LISTEN
$ telnet localhost 31692
telnet: can't connect to remote host (127.0.0.1): Connection refused
$ telnet 192.168.99.100 31692
telnet: can't connect to remote host (192.168.99.100): Connection refused
ロードバランサとPodのnginxとの接続がうまくできていないような気がするので、もう一度hello-minikubeに戻って作業を行う予定である。
参考情報:minikubeで他のドライバを利用する
2回目のminikubeチュートリアルの作業中に、minikube起動時にdockerドライバーを自動選択したので、記録しておく。
この場合、起動に非常に時間がかかったうえに、最終的には起動に失敗している。
code:shell
% minikube start
* Darwin 10.13.6 上の minikube v1.14.2
* dockerドライバーが自動的に選択されました。他の選択肢: hyperkit, virtualbox
* コントロールプレーンのノード minikube を minikube 上で起動しています
* Pulling base image ...
* docker container (CPUs=2, Memory=1987MB) を作成しています...
! StartHost failed, but will try again: creating host: create: creating: setting up container node: preparing volume for minikube container: docker run --rm --entrypoint /usr/bin/test -v minikube:/var gcr.io/k8s-minikube/kicbase:v0.0.13@sha256:4d43acbd0050148d4bc399931f1b15253b5e73815b63a67b8ab4a5c9e523403f -d /var/lib: exit status 125
stdout:
stderr:
Unable to find image 'gcr.io/k8s-minikube/kicbase:v0.0.13@sha256:4d43acbd0050148d4bc399931f1b15253b5e73815b63a67b8ab4a5c9e523403f' locally
docker: Error response from daemon: Get https://gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers). See 'docker run --help'.
! Executing "docker container inspect minikube --format={{.State.Status}}" took an unusually long time: 16.669440288s
* Restarting the docker service may improve performance.
* docker 「 minikube 」 container がありません。再生成します。
* docker container (CPUs=2, Memory=1987MB) を作成しています...
* Failed to start docker container. Running "minikube delete" may fix it: recreate: creating host: create host timed out in 360.000000 seconds
! Startup with docker driver failed, trying with alternate driver hyperkit: Failed to start host: recreate: creating host: create host timed out in 360.000000 seconds
* docker の「minikube」を削除しています...
* コンテナ "minikube" を削除しています...
! Executing "docker container inspect minikube --format={{.State.Status}}" took an unusually long time: 6.890142696s
* Restarting the docker service may improve performance.
* /Users/mutoh/.minikube/machines/minikube を削除しています...
* クラスタ "minikube" の全てのトレースを削除しました。
* docker-machine-driver-hyperkit ドライバをダウンロードしています:
docker-machine-driver-hyperkit.sha256: 65 B / 65 B --- 100.00% ? p/s 0s docker-machine-driver-hyperkit: 11.44 MiB / 11.44 MiB 100.00% 861.41 KiB
* The 'hyperkit' driver requires elevated permissions. The following commands wi
ll be executed:
$ sudo chown root:wheel /Users/mutoh/.minikube/bin/docker-machine-driver-hyperkit
$ sudo chmod u+s /Users/mutoh/.minikube/bin/docker-machine-driver-hyperkit
Password:
* コントロールプレーンのノード minikube を minikube 上で起動しています
* hyperkit VM (CPUs=2, Memory=4000MB, Disk=20000MB) を作成しています...
panic: runtime error: invalid memory address or nil pointer dereference
k8s.io/minikube/pkg/minikube/machine.DeleteHost(0x5b53960, 0xc0000a0e40, 0x584438a, 0x8, 0x0, 0x0, 0x0, 0x1, 0x1)
/private/tmp/minikube-20201027-77220-1e367eq/pkg/minikube/machine/delete.go:91 +0x133
k8s.io/minikube/pkg/minikube/node.startHost(0x5b53960, 0xc0000a0e40, 0xc0001a4000, 0xc000894140, 0xc0000a0e00, 0x0, 0x0, 0x3a6e6f736a2e6769, 0x6d3a656d614e7b20)
/private/tmp/minikube-20201027-77220-1e367eq/pkg/minikube/node/start.go:379 +0xcf0
k8s.io/minikube/pkg/minikube/node.startMachine(0xc0001a4000, 0xc000894140, 0xc000466500, 0x7, 0x0, 0x0, 0x0, 0x0, 0x10, 0xc0001e8c58, ...)
/private/tmp/minikube-20201027-77220-1e367eq/pkg/minikube/node/start.go:347 +0xa5
k8s.io/minikube/pkg/minikube/node.Provision(0xc0001a4000, 0xc000894140, 0x1, 0xc00086c700, 0xc000020870, 0x40, 0x0, 0x0, 0x0, 0x0, ...)
/private/tmp/minikube-20201027-77220-1e367eq/pkg/minikube/node/start.go:237 +0x499
k8s.io/minikube/cmd/minikube/cmd.provisionWithDriver(0x66a49a0, 0x584420a, 0x8,0x7, 0x10101, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
/private/tmp/minikube-20201027-77220-1e367eq/cmd/minikube/cmd/start.go:324 +0x63e
k8s.io/minikube/cmd/minikube/cmd.runStart(0x66a49a0, 0x66f8438, 0x0, 0x0)
/private/tmp/minikube-20201027-77220-1e367eq/cmd/minikube/cmd/start.go:217 +0xf49
github.com/spf13/cobra.(*Command).execute(0x66a49a0, 0x66f8438, 0x0, 0x0, 0x66a49a0, 0x66f8438)
/Users/brew/Library/Caches/Homebrew/go_mod_cache/pkg/mod/github.com/spf13/cobra@v1.0.0/command.go:846 +0x2c2
github.com/spf13/cobra.(*Command).ExecuteC(0x66a9860, 0x0, 0x1, 0xc00096e280)
/Users/brew/Library/Caches/Homebrew/go_mod_cache/pkg/mod/github.com/spf13/cobra@v1.0.0/command.go:950 +0x375
github.com/spf13/cobra.(*Command).Execute(...)
/Users/brew/Library/Caches/Homebrew/go_mod_cache/pkg/mod/github.com/spf13/cobra@v1.0.0/command.go:887
k8s.io/minikube/cmd/minikube/cmd.Execute()
/private/tmp/minikube-20201027-77220-1e367eq/cmd/minikube/cmd/root.go:106 +0x995
main.main()
/private/tmp/minikube-20201027-77220-1e367eq/cmd/minikube/main.go:75 +0x12a
% minikube status
minikube
type: Control Plane
host: Stopped
kubelet: Stopped
apiserver: Stopped
kubeconfig: Stopped
次に起動した時は、Hyperkitドライバを利用しようとしていた。
code:shell
% minikube start
* Darwin 10.13.6 上の minikube v1.14.2
* プロフィールを元に、 hyperkit ドライバを使用します
* コントロールプレーンのノード minikube を minikube 上で起動しています
* 既存の hyperkit VM を "minikube" のために再起動しています...
! StartHost failed, but will try again: driver start: IP address never found in dhcp leases file Temporary error: unable to parse line: declined=1,b8:27:eb:f8:e3:29
* Updating the running hyperkit "minikube" VM ...
* Failed to start hyperkit VM. Running "minikube delete" may fix it: provision: Temporary Error: error getting ip during provisioning: IP address is not set
X Exiting due to GUEST_PROVISION: Failed to start host: provision: Temporary Error: error getting ip during provisioning: IP address is not set
*
* If the above advice does not help, please let us know:
% minikube status
E1202 11:56:36.515020 46339 status.go:316] failed to get driver ip: getting IP: IP address is not set
E1202 11:56:36.551263 46339 status.go:227] status error: getting IP: IP address is not set
minikube
type: Control Plane
host: Error
kubelet: Nonexistent
apiserver: Nonexistent
kubeconfig: Nonexistent
% minikube stop
* ノード "minikube" を停止しています...
* 1台のノードが停止しました。
% minikube delete
* hyperkit の「minikube」を削除しています...
* クラスタ "minikube" の全てのトレースを削除しました。
強制的にドライバを使う場合は、以下のようにコマンドラインオプションで--driver virtualboxを指定する。
このオプションは、毎回設定した方が良いと思われる。
code:shell
% minikube start --driver virtualbox
* Darwin 10.13.6 上の minikube v1.14.2
* 設定を元に、 virtualbox ドライバを使用します
* コントロールプレーンのノード minikube を minikube 上で起動しています
* virtualbox VM (CPUs=2, Memory=4000MB, Disk=20000MB) を作成しています...