Docker for desktopでK8s入門 (ちょっとはまった)

Kubernetes 環境をひとまずAnsibleで用意するでK8s環境を構築にトライしたが、うまくいかなかったので、K8sの概念を理解を試みる。
Docker DesktopでKubernetes入門で紹介されているものをローカル環境で実施して、シングルノードなK8s環境において、どう取り扱うかをまとめる。
結論
はまったけど、一応service(ネットワーク周り)、deploy(Podをどのようにデプロイするか)、pod(コンテナの塊)ということは少し理解できた。
チュートリアルレベルはDocker for Desktopで出来た。
方針・前提条件
K8sのアウトラインの情報を提示し、K8sの説明については書き下さず、参考資料の提示にとどめる。
また、チュートリアルを通じて、K8sの操作感を確認する。
環境
- Windows Pro 2004
- Resource
- Mem: 16G
- CPU: i5-7200U
- SanDisk SDSSDH31000G(1T SSD)
- Docker for Desktop
- Kubernetes v1.18.8
- Command line v19.03.13
- Docker Engine v19.03.13
- Resource
Docker for Desktop(Kubernetes有効)、Chrome、IDEなどを起動していると常に、CPUパワーは70%程度を使用しているため、開発でがっつり使うとなると、もっとコアが欲しいところです。
実践
K8sのアウトラインを確認し、チュートリアルを進める。
K8sのアウトライン

Kubernetes Control Plane部分がいわゆるマスターノード。
Kubernetes Nodesが実際の仕事してくれるPodが動作するところ。
こうしてみると簡単なのだけど、Kubernetesのインストールをインストールを行うAnsible Galaxy - geerlingguy/kubernetesでは、かなり色々なものをインストールしていたので、上記図は簡易にしたものですね。
戦慄したのは、kubeadmを使用したのは、プロダクション環境(kubeadmを使用した高可用性クラスターの作成 | Kubernetes)では結構な数のマシンが必要となること。
前回のK8s構築でよく見るとマスターノードもワーカーノードもどちらとも同一のパッケージをインストールしているのでこれはよくないかもですね。(またK8sCluster構築記事を書くときに検証で)
K8sのチュートリアル
チュートリアルを確認したところ、明示的に使用しているリソースは下記の通りであると認識。
- pod
- service
- deploy
実践してみた
luna@DESKTOP-1HI6NGO:/mnt/c/Users/totug/workspace/git/tluna/work-blog$ kubectl run testnginx --image nginx
pod/testnginx created
luna@DESKTOP-1HI6NGO:/mnt/c/Users/totug/workspace/git/tluna/work-blog$ kubectl expose deployment testnginx --port 80 --type NodePort
Error from server (NotFound): deployments.apps "testnginx" not found
ここは試してこの記事終了、詳細はチュートリアルの記事読んでねという風にしたかったが、エラーが出た。
トラブルシュートだ。
deployment?を作成してからだとどうなるか。
上記のrunコマンドはどうもdeploymentを用意していないように見える。(挙動的に)
私のバージョンだけなのかはちょっと分からないが、deployをファイルで定義してやってみよう。
Deployment | Kubernetesを参考に進める
nginx-deployment.yamlapiVersion: 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
ports:
- containerPort: 80
luna@DESKTOP-1HI6NGO:/mnt/c/Users/totug/workspace/git/tluna/work-blog$ kubectl apply -f content/posts/2020-10-28-kubernetes-docker-fordesktop/nginx-deployment.yaml
deployment.apps/nginx-deployment created
luna@DESKTOP-1HI6NGO:/mnt/c/Users/totug/workspace/git/tluna/work-blog$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 14s
luna@DESKTOP-1HI6NGO:/mnt/c/Users/totug/workspace/git/tluna/work-blog$ kubectl expose deployment nginx-deployment --port 80 --type NodePort
service/nginx-deployment exposed
luna@DESKTOP-1HI6NGO:/mnt/c/Users/totug/workspace/git/tluna/work-blog$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 17h
nginx-deployment NodePort 10.104.99.179 <none> 80:30207/TCP 9m52s
こっちはうまいこと出来たね。
kubectl runとは
kubectlチートシート | Kubernetes 上記に記載してある下記のコマンドを実行。
kubectl run nginx --image=nginx --restart=Never --dry-run=client -o yaml > pod.yaml
pod.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: nginx
name: nginx
spec:
containers:
- image: nginx
name: nginx
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Never
status: {}
見た限り、ファイルのkindがpodとdeployで差異がありますね。
kubectl apply -f content/posts/2020-10-28-kubernetes-docker-fordesktop/pod.yaml
pod/nginx created
kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 23m
んー。
kubectl run ではdeploymentまでは生成されていない感じ。
ヘルプshell kubectl run --help 見てもimageからpodを定義するコマンドっぽいのだけど、バージョンが変わって仕様が変更になったのかな。
最後に
K8s抽象化された概念が多いから大変じゃ。
精進するしかないっすね。
参考文献
- 簡単にローカルKubernetes環境を構築できるツール「Minikube」 | さくらのナレッジ
- [挫折したエンジニア向け] Kubernetesの仕組みをちゃんと理解する (入門/基本編) - YouTube
- Kubernetesのコンポーネント | Kubernetes
- Docker DesktopでKubernetes入門