
はじめに
こんにちは!新卒1年目のTKDSです!
今回はkindで任意のポートをローカルマシンのポートにマッピングする方法を紹介します.
実際にkindでclusterを作成して動作確認をしながら進めます.
kindとは
コンテナを使用して,kubernetesクラスターを構築できるものです.
githubのAboutには
About
Kubernetes IN Docker - local clusters for testing Kubernetes
と書いてあるので,kindはKubernetes IN Dockerの略のようです.
先に結論から言うと,clusterの作成時に設定ファイルでポートを指定します.
では,clusterの作成・Kubernetesリソースの作成・動作確認・kindの設定し直しの順で行っていきます.
default 設定でのCluster構築
まずはdefault設定でClusterを構築し,curlで通信してみます.
Cluster作成
$ kind create cluster

defaultの設定で,kindという名前のclusterが作成されます.
作成されたclusterを確認してみましょう.
$ kind get clusters kind
deploymentとNodePortの作成
このdeploymentの内容はkubernetesのドキュメントにあるものを使用しています.
- deploymentの作成
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
- NodePortの作成
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
selector:
app: nginx
ports:
- protocol: TCP
port: 80
nodePort: 30007
リソースを作成します.

deploymentとpodの状態を確認します.

deploymentとdeploymentで指定していたpodがreplicasの数で起動しているのが確認できました.
次にNodePortの確認をします.

NodePortが作成されていることが確認できます.
- マッピングされているポートの確認
NodePortでportを設定したので,アクセスしてみます.

cluster-ipとそのポートを指定・localhostとNodePortの指定,どちらを行ってもnginxにはアクセスできません.
これは,nodePortで指定しているportがローカルマシンのportにマッピングされていないためです.
冒頭でも述べたようにkindで作るclusterはコンテナなので,コンテナのポートをローカルマシンにマッピングしなければなりません.
まずは,稼働してるclusterについて見てみます.
docker psでコンテナを確認することができます.

PORTSの項で,ローカルのポートにコンテナのポートがマッピングされているのが確認できます.
ここでは,NodePortで指定してる30007番のPortがマッピングされていないのがわかります.
そのため,ローカルマシンからコンテナ内のnodePortにアクセスができなくなっています.
では,yamlに書いたPortでアクセスできるようにしていきます.
kindの設定ファイルの作成
kindはcluster作成時に設定を書いたyamlファイルを指定することができます.
まずは設定ファイルを作成しましょう.
- 設定ファイルからcluster作成 kindのフラグについて調べます
$ kind create cluster --help
出力
Creates a local Kubernetes cluster using Docker container 'nodes'
Usage:
kind create cluster [flags]
Flags:
--config string path to a kind config file
-h, --help help for cluster
--image string node docker image to use for booting the cluster
--kubeconfig string sets kubeconfig path instead of $KUBECONFIG or $HOME/.kube/config
-n, --name string cluster name, overrides KIND_CLUSTER_NAME, config (default kind)
--retain retain nodes for debugging when cluster creation fails
--wait duration wait for control plane node to be ready (default 0s)
Global Flags:
--loglevel string DEPRECATED: see -v instead
-q, --quiet silence all stderr output
-v, --verbosity int32 info log verbosity, higher value produces more output
--config string path to a kind config fileと書いてあります.
まず設定ファイルを作成します.
kindの設定ファイルについては,ドキュメントのConfigurationに記述があります.
設定ファイルでkind上のコンテナのポート番号をcontainerPortに書き,hostPortにローカルマシンのポートを指定します.
設定ファイルは下記の通りです.
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 30007
hostPort: 30007
listenAddress: 127.0.0.1
- role: worker
では,設定ファイルを使って,clusterを作成しましょう.
$ kind create cluster --config my-cluster.yaml

- docker psでマウントされているポートを見る
$ docker ps

ローカルマシンのポートにコンテナのポートがマッピングされているのが確認できました.
設定したポートにアクセスする
もう一度,deploymentとserviceの作成をしておいてください.
では,アクセスしてみましょう.

無事レスポンスを確認することができました.
まとめ
今回は,kindでのport設定を紹介し,実際にレスポンスを確認するところまで行いました.
ここまで見ていただきありがとうございました!