PCに仮想化環境を構築しよう

# 目的
仮想マシンを作成し、Kubernetes + Dockerを使用できる環境を構築する

# 仮想化とは
サーバー、ストレージ、ネットワーク、クライアントPCなどのハードウェアリソースを、ソフトウェアを用いて管理すること。

# 仮想マシンとは
仮想化を使って、コンピュータの中に作った別のコンピュータのこと。

# 構築する環境
ホストOSに仮想化ソフトを使ってCentOSのゲストOSに、Docker・minikubeをのせた環境を構築します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681113/fc981d2d-47d8-e9cb-c8fe-8025bdf57d38.png)

# 仮想マシン作成
- Windows上にインストールしたVMWare上に、ゲストOSとしてCentOSをインストールする
https://www.centos.org/

- 仮想マシンの作成
1. VMware Workstation Playerを起動

2. 新規マシンの作成を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681113/473cf5e6-7ccb-81fc-250f-b5125c6ea0b9.png)

3. ダウンロードしたイメージファイルを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681113/33cea629-e4e6-b040-d64f-cc6224ca28c0.png)

4. ユーザネームとパスワードを設定し起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681113/bfa14c14-d548-13ee-eeb2-1f5bb78d68ab.png)

# Docker + Kubernetes環境構築
1. Dockerインストール
2. kubectlコマンドインストール
3. minikubeインストール
4. Kubernetes起動

ただし上記の手順は煩雑なので、一気に実行できるようにスクリプトで実行します。
- ローカルで以下のファイルを作成
```minikube-installer.sh
#! /bin/sh

# Modify yum.conf
sed -i -e "/timeout\=/d" /etc/yum.conf
sed -i -e "13s/^/timeout=300\n/g" /etc/yum.conf
sed -i -e "/ip_resolve\=/d" /etc/yum.conf
sed -i -e "14s/^/ip_resolve=4\n/g" /etc/yum.conf

# Add .curlrc
cat <<-EOF > ~/.curlrc
ipv4
EOF

# Install conntrack
yum install -y \
  conntrack-tools-1.4.4

# Install "Docker"
yum install -y \
  yum-utils-1.1.31 \
  device-mapper-persistent-data-0.8.5 \
  lvm2-2.02.185

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

yum install -y \
  docker-ce-19.03.8 \
  docker-ce-cli-19.03.8 \
  containerd.io-1.2.13

mkdir -p /etc/docker
cat <<-EOF > /etc/docker/daemon.json
{
  "dns": ["8.8.8.8"]
}
EOF

systemctl enable docker
systemctl start docker

# Install "kubectl"
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.18.2/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv -f ./kubectl /usr/local/bin

# Install "minikube"
curl -Lo minikube https://storage.googleapis.com/minikube/releases/v1.9.2/minikube-linux-amd64
chmod +x minikube
install minikube /usr/local/bin
rm -f minikube

# stop firewall
systemctl disable firewalld
systemctl stop firewalld

# Add addons
/usr/local/bin/minikube start --vm-driver=none
/usr/local/bin/minikube addons enable ingress

# Docker restart and update DNS settings
systemctl restart docker
```

- 仮想環境のIPアドレスを確認
1. 仮想環境を立ち上げる
2. ターミナルを起動し以下のコマンドを実行
```
$ ip -f inet a
```
この仮想環境では、`192.168.133.128`がIPアドレスとして設定されていることがわかる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681113/b6a351a6-c548-ca9a-4453-fa32c2a61ce7.png)

- 作成したシェルスクリプトを仮想マシンに転送
1. WinSCPを起動
2. ホスト名・ユーザ名・パスワードを入力しログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681113/5f611257-dae4-9203-5d3c-91bc1a8578a9.png)
3. 作成したシェルスクリプトを仮想マシン側にドラッグアンドドロップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681113/71eb02d0-9ffa-699d-0130-abe6ba1f2dd2.png)

- 転送したシェルスクリプトを実行
1. Tera Termを起動
2. ホスト名・ユーザ名・パスワードを入力しログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681113/a44ad7b6-c7bc-c9d3-f2b8-ca9368f5b91d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681113/8c71d74e-f2d0-b295-e445-2c0ff77f604e.png)
3. 先ほど転送したシェルスクリプトがあるか確認
`ls`コマンドを実行
```
Last login: Sat Dec 10 20:34:40 2022 from 192.168.133.1
[root@localhost ~]# ls
anaconda-ks.cfg  minikube-installer-for-7.8.2003.sh  original-ks.cfg
```

- スクリプト実行
```
$ sh minikube-installer.sh
```

- 動作確認

`docker version`コマンド実行
```
[root@localhost ~]# docker version
Client: Docker Engine - Community
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        afacb8b
 Built:             Wed Mar 11 01:27:04 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       afacb8b
  Built:            Wed Mar 11 01:25:42 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
```
`kubectl version`コマンド実行
```
[root@localhost ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.2", GitCommit:"52c56ce7a8272c798dbc29846288d7cd9fbae032", GitTreeState:"clean", BuildDate:"2020-04-16T11:56:40Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.0", GitCommit:"9e991415386e4cf155a24b1da15becaa390438d8", GitTreeState:"clean", BuildDate:"2020-03-25T14:50:46Z", GoVersion:"go1.13.8", Compiler:"gc", Platform:"linux/amd64"}
```

- kubernetesクラスタの起動

Tere Termを起動し以下のコマンドを実行
`minikube status`コマンド実行
→hostがRunningになっていなければ、`minikube start`コマンド実行

以下の結果が表示されればKubernetesクラスタが起動されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681113/c719a367-c362-2a42-f6ca-a29624fc4e98.png)

- Remote SSH on VSCode
SSH接続は好みの方法でよいが、今回はVSCodeで接続します。

1. VSCodeにRemote SSH拡張をインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681113/4597dbaf-6d05-434a-ab46-75c8fa3ec828.png)

2. 初回接続設定
VSCodeの左側のリモートエクスプローラのアイコンから「SSH」→「SSH構成ファイルを開く」からConfigを開き接続設定を記述
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681113/98f46de1-b45d-edad-6ec2-10f948294ff9.png)

3. SSH接続
**仮想マシンを起動した状態で**、接続のためにボタン押下。
仮想マシンのパスワードを入力しrootディレクトリにログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681113/2e752b30-6abf-4362-4e81-c0498d668397.png)