RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

kind (Kubernetes IN Docker) でクラスタ構築時に済ませておきたいポート設定の基本

はじめに

こんにちは!新卒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設定を紹介し,実際にレスポンスを確認するところまで行いました.
ここまで見ていただきありがとうございました!

Copyright © RAKUS Co., Ltd. All rights reserved.