傀儡子えんじにあ の ぶろぐ

開発や自作PCなんかのやつをのせるやつ

Kubernetes in Docker こと kind の環境構築

Kubernetesの基本については完全に理解したので、実際に触っていろいろやってみたくなりました
そこで実際に環境構築するうえで取れる手段は以下の3つくらいかなぁと

  1. Google Kubernetes Engine や Amazon EKSなんかのパブリッククラウドで使う
  2. Raspberry Pi なんかの安価なPC複数台で実際に作ってみる
  3. 学習用のツールを使う

1は多少とはいえ料金発生しちゃいますし、2は初期投資額がでかい
もちろんそのくらい払えやってのはあるんですがある程度使えるようになるまでは安く済ませたい

ということで、3の学習用ツールに目を付けました
ツールもいろいろあるんですが、後述の通り機能面に若干の不満が
そこで最近知った kind を使って環境構築してみましたので以下まとめ

kind.sigs.k8s.io

kind とは

Kubernetes IN Dockerの略称
k8sをローカルで構築しテストするためのツールの一つ
Windows,Mac,Linuxに対応
k8s公式もこれを使ってテストしてるらしい

他のツールとの相違点

kind以外にもminikubeなんかがある
kind最大の特徴はマルチノードクラスタが作成可能な点

k8sでは、複数のノードが参加して一つのクラスタを構成するのが一般的
しかし、他のツールではシングルノークラスタしか構成できず、限られた機能しか使うことができなかった
kindはマルチノードクラスタが作成可能なため、全てではないがより多くの機能を使用可能

kindの仕組み

kindでは、各ノードとして動作するdockerコンテナをデプロイしてクラスタを構成する
デフォルトで提供されているコンテナは、Ubuntu18.04を元に必要ないサービスを削除してサイズを小さくしたイメージ「node-image」を使用
自身で用意したイメージを使用して構成することもできる

Quick Start

今回はVMware仮想マシン上にマルチノードクラスタを作成し、nginxをデプロイするとこまでやってみます
仮想マシンはUbuntu18.04.3で、メモリ8GB、CPU4コアで動かしてます
メモリは公式によると最低8GB必要で、コア数についての記述は見つかりませんでしたがマルチノードクラスタなら4コアはあげといたほうが無難かと

kindのインストール準備

kindインストールの前に、docker、kubectl、Go言語を使用可能にする必要がありますのでまずはそっちから
とりあえずcurlgccが必要になるので入れておきましょう

$ sudo apt install -y curl gcc
1. dockerのインストール

dockerはapt install

$ sudo apt install -y docker.io
$ docker -v
Docker version 18.09.7, build 2d0083d
$ sudo usermod -aG docker suzkor

最後に、dockerグループにユーザーを追加します
これでdockerは準備完了 グループ変更したので、一回再起動しておきます

2. 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 -
$ echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
$ sudo apt-get update
$ sudo apt-get install -y kubectl
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.3", GitCommit:"2d3c76f9091b6bec110a5e63777c332469e0cba2", GitTreeState:"clean", BuildDate:"2019-08-19T11:13:54Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?

サーバーと通信できてないというエラーは出てますが、まあそんなものはないので当然
これでkubectlの準備もできました

3. Go言語のインストール
$ curl -O https://dl.google.com/go/go1.12.9.linux-amd64.tar.gz
$ sudo tar -C /usr/local -xzf go1.12.9.linux-amd64.tar.gz
$ export PATH=$PATH:/usr/local/go/bin
$ export PATH=$PATH:$(go env GOPATH)/bin

最後の2行は起動時毎回必要なので .profile にでも記載しておきましょう
これでGoの準備もできたので、kindを入れていきます

kindのインストール

以下のコマンドですんなり入ります

$ GO111MODULE="on" go get sigs.k8s.io/kind@v0.5.0
$ kind version
v0.5.0

これでインストール完了です

クラスタ作成

まずはテストでシングルノークラスタ作成してみましょう

kind create cluster
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.15.3) 🖼 
 ✓ Preparing nodes 📦 
 ✓ Creating kubeadm config 📜 
 ✓ Starting control-plane 🕹️ 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
Cluster creation complete. You can now use the cluster with:

export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"
kubectl cluster-info
$ export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"
$ kubectl get nodes
NAME                 STATUS   ROLES    AGE   VERSION
kind-control-plane   Ready    master   96s   v1.15.3

作成後、言われた通りのコマンド実行するとkubectlが通るようになります
見てみると、シングルノードで動いてるのがわかります
というわけでテストはおk 作ったクラスタを削除しましょう

$ kind delete cluster

次は実際にマスター1、ワーカー2のクラスタ作ってみましょう
まずはYAMLクラスタの設定ファイル作ります

kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha3
nodes:
- role: control-plane
- role: worker
- role: worker
  extraPortMappings:
  - containerPort: 30000
    hostPort: 80

これでマスターノード(control-plane)とワーカーノード(worker)2つが作られます
extraPortMappingsを設定しておくと、ホストとノードコンテナのポートフォワーディングが設定できます
動作としてはdocker run-pオプションとおんなじだと思う
コンテナポートが30000なのは後で説明します

作成したYAMLファイルをもとにクラスタ作成しましょう

$ kind create cluster --config kind-example.yaml
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.15.3) 🖼
 ✓ Preparing nodes 📦📦📦 
 ✓ Creating kubeadm config 📜 
 ✓ Starting control-plane 🕹️ 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
 ✓ Joining worker nodes 🚜 
Cluster creation complete. You can now use the cluster with:

export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"
kubectl cluster-info
$ kubectl get nodes
NAME                 STATUS   ROLES    AGE     VERSION
kind-control-plane   Ready    master   2m30s   v1.15.3
kind-worker          Ready    <none>   113s    v1.15.3
kind-worker2         Ready    <none>   113s    v1.15.3

お手軽にマルチノードクラスタができましたね、素晴らしきかな
お次はnginxをデプロイしてみましょう
YAMLマニフェストを作成します

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deplpoy
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template: 
    metadata:
      labels:
        app: nginx 
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80 
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  type: NodePort
  ports:
    - port: 80
      nodePort: 30000 #NodePortのため30000~32767
  selector:
    app: nginx

テスト用なので、とりあえずレプリカ数は1で
ServiceはNodePortでやるので、デフォルトだと30000~32767のポートしか使えません
おとなしく30000にしときましょう 先ほどホストとマッピングしたポートに合わせてください
出来上がったらあとはk8sに丸投げして少し待ったらcurlでホストから確認してみましょう

$ kubectl apply -f nginx-conf.yaml
deployment.apps/nginx-deplpoy created
service/nginx-svc created
$ curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

nginxうごいてる! すごい! らくちん!
しばらくはこれ使ってk8s勉強したいとおもいます