[07] オンプレ環境で VM 2台を使って 1マスタ・1ノードの kubernetes を構築してみる (Ingress の導入)

# 概要

下表の構成で、オンプレ上に k8s を構築したときの記録である.
本記事では「**Ingress の導入手順**」を記す.


|No|用途|ノード名|形態|公開IP|内部IP|OS|備考|
|:--|:--|:--|:--|:--|:--|:--|:--|
|1|k8sマスタ|master01|VM|192.168.1.91|172.24.20.11|Ubuntu18.04||
|2|k8sノード|node01|VM|192.168.1.92|172.24.20.12|Ubuntu18.04||


# 参考にしたサイトおよび書籍

|URL|備考|
|:--|:--|
|[実践 Vagrant](https://www.oreilly.co.jp/books/9784873116655/)||
|[15Stepで習得 Dockerから入るKubernetes](http://www.ric.co.jp/book/contents/book_1161.html)|K8s だけでなく、Ansible, Vagrant, GlusterFS のことなども学べる.|
|https://github.com/takara9/vagrant-k8s|[『15Stepで習得 Dockerから入るKubernetes』](http://www.ric.co.jp/book/contents/book_1161.html)の著者が公開されている GitHub.<br/>Vagrant や Ansible コードを公開してくださっている.|
|https://github.com/takara9/vagrant-kubernetes|同上|
|https://github.com/takara9/codes_for_lessons|同上|
|https://nextpublishing.jp/book/12197.html|『解体kubeadm　フェーズから読み解くKubernetesクラスタ構築ツールの全貌』を参考にして 1マスタ・1ノードを構築した.|
|https://www.kaitoy.xyz/2020/10/31/metallb/||
|https://qiita.com/murata-tomohide/items/801c25492e55f672c23c||


# 環境

## 物理PC および 仮想PC の OS

```bash
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"
```

## 物理PC

下記ソフトを導入済みであること.

- Vagrant 
- VirtualBox



# 手順

## 1. Ingress マニフェスト 0.34.1 を適用する

検証時点(2021/05/30)では Ingress マニフェスト 0.34.1 を適用した.
(なお、最新の 0.40.1 を使用したところエラーが発生したので、意図的にバージョンを下げた)

この時点 (2021/05/30) では、Ingress マニフェストには deploy.yml のみ存在すれば良さそうである.
旧バージョンでは mandatory.yml と could の service-nodeport.yaml の 2つを適用していたようであるが、現時点 (2021/05/30) ではこの情報は古くなっていた.

```bash
vagrant@master01:~$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/cloud/deploy.yaml
```

## 2. 動作確認をする.

### 2-1. Ingress の状態を見る

「kubectl get all,ing,ns,cs -A」を実行して、Ingress の情報を確認する.

ここでは 🛑 が Ingress の情報であり、外部からは `ns-test.172.24.20.241.nip.io` でアクセスをすれば良い.

```bash
NAMESPACE              NAME                                             READY   STATUS      RESTARTS   AGE
ingress-nginx          pod/ingress-nginx-admission-create-mj757         0/1     Completed   0          4h30m
ingress-nginx          pod/ingress-nginx-admission-patch-5pwfz          0/1     Completed   0          4h30m
ingress-nginx          pod/ingress-nginx-controller-6595dc7ff4-l8n9l    1/1     Running     1          4h30m
kube-system            pod/coredns-558bd4d5db-clz2s                     1/1     Running     1          21h
kube-system            pod/coredns-558bd4d5db-ms22j                     1/1     Running     1          21h
kube-system            pod/etcd-master01                                1/1     Running     1          21h
kube-system            pod/kube-apiserver-master01                      1/1     Running     1          21h
kube-system            pod/kube-controller-manager-master01             1/1     Running     1          21h
kube-system            pod/kube-flannel-ds-q78x7                        1/1     Running     1          21h
kube-system            pod/kube-flannel-ds-wzp9w                        1/1     Running     1          21h
kube-system            pod/kube-proxy-6h965                             1/1     Running     1          21h
kube-system            pod/kube-proxy-bwwht                             1/1     Running     1          21h
kube-system            pod/kube-scheduler-master01                      1/1     Running     1          21h
kube-system            pod/metrics-server-755675c897-78ll7              1/1     Running     1          21h
kubernetes-dashboard   pod/cluster-admin-68f7c6c68f-6899n               1/1     Running     1          21h
kubernetes-dashboard   pod/dashboard-metrics-scraper-778b77d469-4vv5q   1/1     Running     1          21h
metallb-system         pod/controller-64f86798cc-g57s9                  1/1     Running     1          21h
metallb-system         pod/speaker-brnxg                                1/1     Running     1          21h
metallb-system         pod/speaker-dmd7h                                1/1     Running     1          21h
ns-test                pod/httpd-6cd65b68c6-wbnjk                       1/1     Running     1          4h29m
ns-test                pod/nginx-7fb7fd49b4-cs2tv                       1/1     Running     1          4h29m

NAMESPACE              NAME                                         TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                      AGE
default                service/kubernetes                           ClusterIP      10.32.0.1     <none>          443/TCP                      21h
ingress-nginx          service/ingress-nginx-controller             LoadBalancer   10.32.0.103   172.24.20.241   80:32108/TCP,443:30079/TCP   4h30m
ingress-nginx          service/ingress-nginx-controller-admission   ClusterIP      10.32.0.235   <none>          443/TCP                      4h30m
kube-system            service/kube-dns                             ClusterIP      10.32.0.10    <none>          53/UDP,53/TCP,9153/TCP       21h
kube-system            service/metrics-server                       ClusterIP      10.32.0.75    <none>          443/TCP                      21h
kubernetes-dashboard   service/dashboard-metrics-scraper            ClusterIP      10.32.0.170   <none>          8000/TCP                     21h
kubernetes-dashboard   service/kubernetes-dashboard                 ClusterIP      10.32.0.143   <none>          443/TCP                      21h
ns-test                service/apache-svc                           NodePort       10.32.0.219   <none>          80:31975/TCP                 4h29m
ns-test                service/nginx-svc                            NodePort       10.32.0.129   <none>          80:31571/TCP                 4h29m

NAMESPACE        NAME                             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
kube-system      daemonset.apps/kube-flannel-ds   2         2         2       2            2           <none>                   21h
kube-system      daemonset.apps/kube-proxy        2         2         2       2            2           kubernetes.io/os=linux   21h
metallb-system   daemonset.apps/speaker           2         2         2       2            2           kubernetes.io/os=linux   21h

NAMESPACE              NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
ingress-nginx          deployment.apps/ingress-nginx-controller    1/1     1            1           4h30m
kube-system            deployment.apps/coredns                     2/2     2            2           21h
kube-system            deployment.apps/metrics-server              1/1     1            1           21h
kubernetes-dashboard   deployment.apps/cluster-admin               1/1     1            1           21h
kubernetes-dashboard   deployment.apps/dashboard-metrics-scraper   1/1     1            1           21h
metallb-system         deployment.apps/controller                  1/1     1            1           21h
ns-test                deployment.apps/httpd                       1/1     1            1           4h29m
ns-test                deployment.apps/nginx                       1/1     1            1           4h29m

NAMESPACE              NAME                                                   DESIRED   CURRENT   READY   AGE
ingress-nginx          replicaset.apps/ingress-nginx-controller-6595dc7ff4    1         1         1       4h30m
kube-system            replicaset.apps/coredns-558bd4d5db                     2         2         2       21h
kube-system            replicaset.apps/metrics-server-755675c897              1         1         1       21h
kubernetes-dashboard   replicaset.apps/cluster-admin-68f7c6c68f               1         1         1       21h
kubernetes-dashboard   replicaset.apps/dashboard-metrics-scraper-778b77d469   1         1         1       21h
metallb-system         replicaset.apps/controller-64f86798cc                  1         1         1       21h
ns-test                replicaset.apps/httpd-6cd65b68c6                       1         1         1       4h29m
ns-test                replicaset.apps/nginx-7fb7fd49b4                       1         1         1       4h29m

NAMESPACE       NAME                                       COMPLETIONS   DURATION   AGE
ingress-nginx   job.batch/ingress-nginx-admission-create   1/1           11s        4h30m
ingress-nginx   job.batch/ingress-nginx-admission-patch    1/1           10s        4h30m

NAMESPACE   NAME                           CLASS    HOSTS                          ADDRESS         PORTS   AGE
ns-test🛑   ingress.networking.k8s.io/lb   <none>   ns-test.172.24.20.241.nip.io   172.24.20.241   80      4h29m

NAMESPACE   NAME                             STATUS   AGE
            namespace/default                Active   21h
            namespace/ingress-nginx          Active   4h30m
            namespace/kube-node-lease        Active   21h
            namespace/kube-public            Active   21h
            namespace/kube-system            Active   21h
            namespace/kubernetes-dashboard   Active   21h
            namespace/metallb-system         Active   21h
            namespace/ns-test                Active   4h29m
```

### 2-2. クラスタ外から curl を実行する

VirtualBox を稼働させている物理ホストから curl を実行する

#### 2-2-1. Apache への接続

`curl http://ns-test.172.24.20.241.nip.io/apache` を実行してみる.

```bash
$ curl http://ns-test.172.24.20.241.nip.io/apache
<html><body><h1>It works!</h1></body></html>
```

#### 2-2-2. Nginx への接続

`curl http://ns-test.172.24.20.241.nip.io/nginx` を実行してみる

```bash
$ curl http://ns-test.172.24.20.241.nip.io/nginx
<!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>
```


### 2-3. クラスタ外の Web ブラウザからのアクセス

#### 2-3-1. Apache への接続

`http://ns-test.172.24.20.241.nip.io/apache` にアクセスしてみる.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/53f04e28-a890-b990-0f73-6a881e77fe17.png)



#### 2-3-2. Nginx への接続

`http://ns-test.172.24.20.241.nip.io/nginx` にアクセスしてみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/a5bb0810-a41d-4fe7-693c-7bd954ebdcd0.png)

　

以上.