はじめに
ローカルで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/ja/docs/concepts/services-networking/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
- リソースを立ち上げる
kubectl apply -f ingress.yml
- リソース状況の確認
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
- ホストマシン(Docker Driver)のetc/hostsに以下を追加
XXX.XX.X.XX hogehoge.local
XXX.XX.X.XXは、minikube ip
で取得したIPアドレス
これでhttp://hogehoge.local/ にアクセスすればいけるぞ!
しかし、、
アクセスに失敗した、、
この後数時間試行錯誤を繰り返すも問題の解決に至らず、、
解決策: 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にポートフォワーディングしてアクセスしちゃえばいいんじゃねと思い、以下の記事を参考に実施した。
- minikubeのssh-host情報を取得する
% minikube ssh-host
[127.0.0.1]:52606 ssh-rsa AAA....
- minikubeのssh秘密キーのパスを取得する
~/$ minikube ssh-key
/home/hoge/.minikube/machines/minikube/id_rsa
- 以下のコマンドを実施してsshポートフォワードを実施
1, 2で取得したssh-host情報のポート番号、秘密キーパス、host名を書き換えて実行
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 にアクセスすると、、
やったーーー!!これで無事アクセスできました🎉🎉🎉
おわりに
コンテナのネットワーク周りはやっぱり手こずる、、、