Edited at

kubernetesをminikubeで触ってみたメモ

More than 1 year has passed since last update.

kubernetes を触ったのでコマンドのメモ書きです。PodとかServiceとか概念に理解が追いついていないので、何か間違っていたらご指摘下さい。


やったこと



  • minikube の導入

  • 補完を聞くようにする


  • minikube 上の kubernetes でdockerコンテナを動かす

とりあえず2048のコンテナを動かしてみました。

スクリーンショット 2018-06-05 17.08.00.png


困ったときに見ると良さそうな公式リファレンス

基本的な概念:

https://kubernetes.io/docs/reference/glossary/?fundamental=true#term-cluster

minikubeでkubernetes動かすgetting-started:

https://kubernetes.io/docs/getting-started-guides/minikube/


minikubeの導入

minikubeを動かすホスト用にVirtualBoxのインストール

http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp

Homebrewでminikubeのインストール

$ brew cask install minikube


minikubeの起動/停止

$ minikube --vm-driver=virtualbox start

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.2", GitCommit:"81753b10df112992bf51bbc2c2f85208aad78335", GitTreeState:"clean", BuildDate:"2018-05-12T04:12:12Z", GoVersion:"go1.9.6", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.0", GitCommit:"fc32d2f3698e36b93322a3465f63a14e9f0eaead", GitTreeState:"clean", BuildDate:"2018-03-26T16:44:10Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}

$ minikube stop

$ kubectl version
# 何も起こらないので Ctrl + C で抜ける

ここまではガッツリクラメソさんの記事通りです。

参考: Minikubeを使ってローカル環境にKubernetes環境を用意する


kubectlコマンドを補完が効くようにする

補完についてのあれこれをみる

$ kubectl completion -h

Output shell completion code for the specified shell (bash or zsh). The shell code must be evaluated to provide
interactive completion of kubectl commands. This can be done by sourcing it from the .bash _profile.

Detailed instructions on how to do this are available here:
https://kubernetes.io/docs/tasks/tools/install-kubectl/#enabling-shell-autocompletion

Note for zsh users: [1] zsh completions are only supported in versions of zsh >= 5.2

Examples:
# Installing bash completion on macOS using homebrew
## If running Bash 3.2 included with macOS
brew install bash-completion
## or, if running Bash 4.1+
brew install bash-completion@2
## If kubectl is installed via homebrew, this should start working immediately.
## If you've installed via other means, you may need add the completion to your completion directory
kubectl completion bash > $(brew --prefix)/etc/bash_completion.d/kubectl

# Installing bash completion on Linux
## Load the kubectl completion code for bash into the current shell
source <(kubectl completion bash)
## Write bash completion code to a file and source if from .bash_profile
kubectl completion bash > ~/.kube/completion.bash.inc
printf "
# Kubectl shell completion
source '
$HOME/.kube/completion.bash.inc'
"
>> $HOME/.bash_profile
source $HOME/.bash_profile

# Load the kubectl completion code for zsh[1] into the current shell
source <(kubectl completion zsh)
# Set the kubectl completion code for zsh[1] to autoload on startup
kubectl completion zsh > "${fpath[1]}/_kubectl"

Usage:
kubectl completion SHELL [options]

Use "kubectl options" for a list of global command-line options (applies to all commands).

bashはこの辺

# Installing bash completion on macOS using homebrew

## If running Bash 3.2 included with macOS
brew install bash-completion
## or, if running Bash 4.1+
brew install bash-completion@2
# Installing bash completion on Linux
## Load the kubectl completion code for bash into the current shell
source <(kubectl completion bash)
## Write bash completion code to a file and source if from .bash_profile
kubectl completion bash > ~/.kube/completion.bash.inc
printf "
# Kubectl shell completion
source '
$HOME/.kube/completion.bash.inc'
"
>> $HOME/.bash_profile
source $HOME/.bash_profile

zshはこの辺を参照すると良さそう

# Load the kubectl completion code for zsh[1] into the current shell

source <(kubectl completion zsh)
# Set the kubectl completion code for zsh[1] to autoload on startup
kubectl completion zsh > "${fpath[1]}/_kubectl"

zsh 使っているので以下を実行

$ kubectl completion zsh > "${fpath[1]}/_kubectl"

一応実体を見ておく(精神衛生的に)

$ cat "${fpath[1]}/_kubectl"

# 省略…
#
#
__kubectl_bash_source <(__kubectl_convert_bash_to_zsh)
_complete kubectl 2>/dev/null

FPATH以下に関数置くとautoload時に実行してくれるらしい

参考: .zshrcで見かけるautoloadの意味と使い方

これで補完が効くようになる。


2048のコンテナをkubenetesで動かしてみる

2048はこれです。

スクリーンショット 2018-06-05 17.08.00.png

使わせていただく Dockerfile はこちらです。

alexwhen/docker-2048: https://github.com/alexwhen/docker-2048

nginxで静的ファイルの2048を配信している感じですね。このDockerImageをkubernetesで動かしてみます。

DockerImageの作成

$ git clone https://github.com/alexwhen/docker-2048.git

$ docker build -t "docker-2048" .
$ docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
alexwhen/docker-2048 latest 7929bcd70e47 2 years ago 8.02MB

Podを起動する

$ kubectl run 2048-nginx --image=alexwhen/docker-2048 --port=80

$ kubectl get pod
NAME READY STATUS RESTARTS AGE
2048-nginx-7975dd56cd-m9m5m 1/1 Running 1 48m

Serviceを起動する

$ kubectl expose deployment 2048-nginx --name my-2048 --port 80 --type NodePort

$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 23h
my-2048 NodePort 10.97.40.79 <none> 80:30531/TCP 41m

30531番ポートが2048コンテナの80番ポートにフォワーディングされているイメージ

ServiceのTypeについては以下を参照

kubernetes - Services: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types

GCP上などで --type LoadBalancer とかにすると外部IPとクラスター内のIPが紐づいて、EXTERNAL-IPに外部IPが表示されるようです(minikube上でどうなるかは不明。virtualboxのprivate-ipとかになるのだろうか)

Serviceからコンテナにアクセスしてみる

$ minikube service list

# minikubeにサービスが認識されている
|-------------|----------------------|-----------------------------|
| NAMESPACE | NAME | URL |
|-------------|----------------------|-----------------------------|
| default | kubernetes | No node port |
| default | my-test | http://192.168.99.100:30531 |
| kube-system | kube-dns | No node port |
| kube-system | kubernetes-dashboard | http://192.168.99.100:30000 |
|-------------|----------------------|-----------------------------|
$ minikube service my-2048

ブラウザが自動で開いて2048が表示されるはず。この辺はminikubeの機能。


dashboardを覗いてみる

minikube service list したときに kubernetes-dashboard というServiceがありました。試しに覗いてみます。

# これだとだめっぽい

$ minikube service kubernetes-dashboard

# 直接URLにアクセスしてもいいけど専用コマンドがある
$ minikube dashboard

スクリーンショット 2018-06-05 17.39.10.png

見れました。

これが何なのかというと公式のWebUIみたいです。リファレンスみると kubectl create しているけど、 minikubeではデフォルトで使えるっぽい。

Running Kubernetes Locally via Minikube

- dashboard: https://kubernetes.io/docs/getting-started-guides/minikube/#dashboard

Web UI (Dashboard): https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/