kubernetes: minikubeで立ち上げたIngressにアクセスできなかった問題を解決した

## はじめに
ローカルでkubernetesの勉強をしており、localhostからIngressへのアクセスができない問題が発生していた。

解決するまでにかなりの時間を要したので備忘録としてここに残しておこうと思った。

## 環境

- os: macOS
- minikube version: v1.29.0
- driver: Docker


## 結論

minikubeサーバーを踏み台にしてポートフォワードすることでブラウザでIngress経由でアクセスできた。

## どういった問題が起きたか
[k8s docs: Set up Ingress on Minikube with the NGINX Ingress Controller](https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/)を参考に、
以下のような構成でリソースを立ち上げようとしていた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037585/64cc5336-d943-82d6-52dd-6e5554038205.png)
引用: https://kubernetes.io/ja/docs/concepts/services-networking/ingress/

手順は以下

1. 以下のようなリソース.ymlを作成

```ingress.yml
apiVersion: v1
kind: Service
metadata:
  name: web-svc
spec:
  selector:
    app: web
    env: practice
  ports:
  - port: 80
    targetPort: 80

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web
      env: practice
  template:
    metadata:
      name: nginx
      labels:
        app: web
        env: practice
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.2-alpine
        ports:
          - containerPort: 80

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: frontend
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - host: hogehoge.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-svc
            port:
              number: 80
```

2. リソースを立ち上げる

```sh
kubectl apply -f ingress.yml
```

3. リソース状況の確認

```
 kubectl get ing,svc,deploy  
NAME                                 CLASS    HOSTS           ADDRESS        PORTS   AGE
ingress.networking.k8s.io/frontend   <none>   hogehoge.local   XXX.XXX.XX.X   80      101m

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   42h
service/web-svc      ClusterIP   10.108.173.128   <none>        80/TCP    106m

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   2/2     2            2           106m
```

4. ホストマシン(Docker Driver)のetc/hostsに以下を追加
```
XXX.XX.X.XX hogehoge.local
```

XXX.XX.X.XXは、`minikube ip`で取得したIPアドレス

これでhttp://hogehoge.local/ にアクセスすればいけるぞ！

しかし、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037585/20221a77-2791-d1a1-8651-f0f45e310851.png)

アクセスに失敗した、、

この後数時間試行錯誤を繰り返すも問題の解決に至らず、、

## 解決策: minikubeにsshポートフォワーディングをしてアクセスできるようにした

`minikube ssh`でminikube内に入って`curl hogehoge.local`を実行してみると、、

```
docker@minikube:~$ curl hogehoge.local
<!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>
```

どうやら、minikube内では、Ingress経由でnginxにアクセスできているみたい


それならいっそminikubeにポートフォワーディングしてアクセスしちゃえばいいんじゃねと思い、以下の記事を参考に実施した。

https://mome-n.com/posts/minikube-service-fixed-port/

1. minikubeのssh-host情報を取得する

```
% minikube ssh-host
[127.0.0.1]:52606 ssh-rsa AAA....
```
2. minikubeのssh秘密キーのパスを取得する

```
~/$ minikube ssh-key
/home/hoge/.minikube/machines/minikube/id_rsa
```

3. 以下のコマンドを実施してsshポートフォワードを実施

1, 2で取得したssh-host情報のポート番号、秘密キーパス、host名を書き換えて実行

```ssh
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -N docker@127.0.0.1 -p 52606 -i /home/hoge/.minikube/machines/minikube/id_rsa -L 30000:hogehoge.local:80
```


http://localhost:30000 にアクセスすると、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037585/e0a20099-c05a-875f-a616-f66f3adf35cc.png)

やったーーー！！これで無事アクセスできました🎉🎉🎉


### おわりに

コンテナのネットワーク周りはやっぱり手こずる、、、