CentOS8でkind (Kubernetes in Docker) をinstallする

## はじめに

今回はkindをinstallしようとしたが前段階のgoのinstallで手こずったのでそこから共有します。~~ならタイトル変えろ~~ 

## kind (Kubernetes in Docker) とは

一言でいえば、LocalでKubernetesクラスタを構築する手段の一つ。
LocalなKubernetesにはいろいろ選択肢がある。

- Docker for Mac
- Minikube
- microk8s

その中でkindというツールを今回は導入してみようと思う。
kindの特徴は以下の通りだ。

- 他のツールと違い __マルチノードクラスタ__ の作成機能がある。
- Kubernetesの公式プロジェクトかつ、Kubernetesそのもののテストにも用いられている。

詳しくは調べてほしいが初めての人はこれを知っておくだけで十分であろう。
では早速導入してみる。

## 前提条件
docker, kubectl が既にinstall済

```
[root@hogehoge test]# cat /etc/redhat-release
CentOS Linux release 8.0.1905 (Core)
[root@hogehoge test]# docker --version
Docker version 18.06.3-ce, build d7080c1
[root@hogehoge test]# kubectl version --short
Client Version: v1.15.0
Server Version: v1.15.4
```

CentOS8にDockerをinstallする方法は前回の記事を参照してください。
[CentOS8でDockerCEをinstallする](https://qiita.com/it__chago/items/d6293cf9ab5d4a2c0420)

## では早速kindをinstall・・・？

[Quick Start](https://kind.sigs.k8s.io/docs/user/quick-start/) を読むとどうやらkindをinstallするにはGoの最新版がinstallされていないといけないらしい。てことでいつもの`yum`改め`dnf`コマンドで。

```
[root@hogehoge test]# dnf install golang
メタデータの期限切れの最終確認: 2:16:42 時間前の 2019年10月16日 12時18分36秒 に実施しました。
依存関係が解決しました。
=============================================================================================================================================================
 パッケージ                             アーキテクチャー          バージョン                                              リポジトリ                   サイズ
=============================================================================================================================================================
Installing:
 golang                                 x86_64                    1.11.6-1.module_el8.0.0+192+8b12aa21                    AppStream                    637 k
依存関係をインストール中:

(中略)

トランザクションの概要
=============================================================================================================================================================
インストール  22 パッケージ

ダウンロードサイズの合計: 159 M
インストール済みのサイズ: 522 M
これでよろしいですか? [y/N]:
```

バージョン1.11・・・
全然最新版じゃない！！

## golangの最新版をinstall

[go1.13](https://golang.org/dl/) が2019/10/16時点で最新なのでここから入手。

```
[root@hogehoge ~]# cd /usr/local
[root@hogehoge local]# wget https://dl.google.com/go/go1.13.1.linux-amd64.tar.gz
--2019-10-16 14:43:07--  https://dl.google.com/go/go1.13.1.linux-amd64.tar.gz
dl.google.com (dl.google.com) をDNSに問いあわせています... 216.58.197.238, 2404:6800:4004:80f::200e
dl.google.com (dl.google.com)|216.58.197.238|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 120040373 (114M) [application/octet-stream]
`go1.13.1.linux-amd64.tar.gz' に保存中

go1.13.1.linux-amd6 100%[===================>] 114.48M  95.0MB/s 時間 1.2s

2019-10-16 14:43:09 (95.0 MB/s) - `go1.13.1.linux-amd64.tar.gz' へ保存完了 [120040373/120040373]
[root@hogehoge local]# tar -zxvf go1.13.1.linux-amd64.tar.gz

(中略)

[root@hogehoge local]# ls
bin  etc  games  go  go1.13.1.linux-amd64.tar.gz  include  lib  lib64  libexec  sbin  share  src
```

goというディレクトリがとりあえず出来た。go1.13.1.linux-amd64.tar.gz自体はもう削除しても大丈夫そう。

## PATHを通す

`go`コマンドを使えるようにする。ただ`export`コマンドを実行するだけだと __ターミナルを閉じた時に初期化される__ ため今回は`~/.bashrc`に`export`文を書き永続的に環境変数を設定する。

```
[root@hogehoge go]# vi ~/.bashrc
```

下3行を新たに追加して上書き保存。

```
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
export PATH=$PATH:/usr/local/go/bin
```

後はbashrcを適用するだけ。

```
[root@hogehoge go]# source ~/.bashrc
[root@hogehoge go]# go version
go version go1.13.1 linux/amd64
```
無事`go`コマンドが使えるようになりました。

## kindをinstall

[kind v0.5.1](https://kind.sigs.k8s.io/docs/user/quick-start/) が2019/10/16時点で最新なのでv0.5.1を指定してinstallする。

```
[root@hogehoge go]# GO111MODULE="on" go get sigs.k8s.io/kind@v0.5.1

(中略)

# sigs.k8s.io/kind
/usr/local/go/pkg/tool/linux_amd64/link: running gcc failed: exec: "gcc": executable file not found in $PATH
```

install出来ない。何故だ・・・。

## 原因

詳しいことは分からないが（分かる人もしいたら教えて頂けると嬉しいです）goの環境変数である __CGO_ENABLED__ が __0__ になっていないとこの現象が起きるみたいです。

```
[root@hogehoge go]# go env | grep CGO_ENABLED
CGO_ENABLED="1"
```

## 対処

こちらも`export`コマンドで1を0にすればいいのですが、折角なので先ほどと同じように永続的な設定をしてみます。

```
[root@hogehoge go]# vi ~/.bashrc
```

下1行を新たに追加して上書き保存。

```
# .bashrc

(中略)

export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
export PATH=$PATH:/usr/local/go/bin
export CGO_ENABLED=0
```
```
[root@hogehoge go]# source ~/.bashrc
[root@hogehoge go]# go env | grep CGO_ENABLED
CGO_ENABLED="0"
```

では改めて

```
[root@hogehoge go]# GO111MODULE="on" go get sigs.k8s.io/kind@v0.5.1
go: finding sigs.k8s.io v0.5.1
go: finding sigs.k8s.io/kind v0.5.1
go: downloading sigs.k8s.io/kind v0.5.1

(中略)

[root@hogehoge go]# kind version
v0.5.1
[root@hogehoge go]# type kind
kind はハッシュされています (/root/go/bin/kind)
```

無事installが出来たみたいですね。
これでいつでもkindでクラスタ作成出来るようになりました。

## 終わりに

実は事前にkubeadm経由でクラスタ（といってもmastar1台のみなのでクラスタとは呼べない？）を作っていたのですが、kindで新たに作成すると元々作っていたクラスタが行方不明？になる現象が起きています・・・。

```
[root@hogehoge go]# kind get clusters
[root@hogehoge go]# kubectl get nodes
NAME       STATUS   ROLES    AGE   VERSION
hogehoge   Ready    master   19d   v1.15.0
[root@hogehoge go]# kubectl config get-contexts
CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE
*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin
[root@hogehoge go]# 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
[root@hogehoge go]# export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"
[root@hogehoge go]# kubectl cluster-info
Kubernetes master is running at https://127.0.0.1:46279
KubeDNS is running at https://127.0.0.1:46279/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
[root@hogehoge go]# kubectl get nodes
NAME                 STATUS   ROLES    AGE   VERSION
kind-control-plane   Ready    master   48s   v1.15.3
[root@hogehoge go]# kubectl config get-contexts
CURRENT   NAME                    CLUSTER   AUTHINFO           NAMESPACE
*         kubernetes-admin@kind   kind      kubernetes-admin
```

kind自体は問題なく作れていそうですが、私の想定としては

```
CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE
*         kubernetes-admin@kind         kind         kubernetes-admin
          kubernetes-admin@kubernetes   kubernetes   kubernetes-admin
```

と表示されいつでも2つを選択できる状態になると思っていたのですが・・・。
勉強不足が故、どなたか分かる方ご教示願います・・・。
深く理解するためには公式ドキュメント熟読するしかないか・・・。


## 参考
 
- [kindで始めるお手軽Kubernetes環境](https://speakerdeck.com/masayaaoyama/cloudnativejp-09-kubernetes-in-docker-kind)
- [ターミナルを閉じるとGOPATHが初期化されます](https://teratail.com/questions/149676)
- [cmd/go: "go test" complains about missing gcc (even if no tests exist, and only for certain imports) #27303](https://github.com/golang/go/issues/27303)