g00ceyの技術ブログ

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

目次

kubernetes
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

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のチュートリアル

Docker DesktopでKubernetes入門

チュートリアルを確認したところ、明示的に使用しているリソースは下記の通りであると認識。

  • 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.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
          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抽象化された概念が多いから大変じゃ。
精進するしかないっすね。

参考文献


Share

comments powered by Disqus