minikube上のサービスにホストからアクセスするには、まずポートをnode(実機、ここではminikube VM)に割り当てる設定が必要です。
nginxのhttps / http のポートをNodePortに設定するServiceのコンフィグ例は以下の通りです。
apiVersion: v1
kind: Service
metadata:
labels:
name: nginx
name: nginx
spec:
ports:
- name: https
port: 443
nodePort: 30443
targetPort: https
protocol: TCP
- name: http
port: 80
nodePort: 30080
targetPort: http
protocol: TCP
selector:
name: nginx
type: NodePort
nodePortが外側からアクセス可能なポート番号です。kubernetesのデフォルトのNodePortの範囲は30000-32767のため、この範囲で指定します。
minikubeの起動オプションにIP範囲を変更するものもありますが、v0.27のhyperkit環境では、指定すると起動しなくなります。
なお、minikube VMのIPはminikube ip
で確認でき、例として https://192.168.64.11:30443/ のようなアドレスでブラウザからアクセスできます。
Webフレームワークにホスト名を伝達する設定
Webフレームワークを利用している場合、ポート付きのアドレスで認識できないと、リダイレクト処理などのケースでポート無しアドレスに転送される挙動になります。nginxなどのプロキシで以下のようにHTTPヘッダーを設定するとポート付きのホストとして認識できるケースがあります。
proxy_set_header X-Forwarded-Host $host:30080
この例ではポート番号をハードコードしていますが、 $server_port でポート番号を取得できます。ただし、Podの内部IPとNodePortのIP番号が異なる場合、$server_port の値がNodePortを指さないケースもあるため、最悪はこのようにハードコードすることで対処できます。
⁋ 2018/05/21↻ 2024/11/07
中馬崇尋
Chuma Takahiro
Chuma Takahiro