手当たり次第に書くんだ

飽きっぽいのは本能

Kubernetes NginxコンテナとService NodePort

目次に戻る

概要

KubernetesのNginxコンテナに対してServiceオブジェクトのNodePortを介して接続します。NodePortを使用するとCluster外から接続可能となります。

手順

Namespace

複数のオブジェクトが作成される為、専用のNamespaceを作成します。

Namespaceの作成

root@k8s-01:~# kubectl create namespace nginx-nodeport-ns

namespace/nginx-nodeport-ns created

Namespaceの確認

root@k8s-01:~# kubectl get namespace

NAME                 STATUS   AGE
nginx-nodeport-ns    Active   17s

Deployment

Deployment用Manifestの作成

Pod用Manifestを作成します。Serviceを使用する場合は複数のPodが想定される為、Deploymentで作成します。

root@k8s-01:~# vim /root/k8s/yaml/nginx-nodeport-dep.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-nodeport-dep
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx

Deployment用Manifestの実行

Deployment用ManifestからDeploymentを作成します。

root@k8s-01:~# kubectl create -n nginx-nodeport-ns -f /root/k8s/yaml/nginx-nodeport-dep.yaml

deployment.apps/nginx-nodeport-dep created

Deploymentのステータス確認

Deploymentのステータスを確認します。

root@k8s-01:~# kubectl get deployment -n nginx-nodeport-ns

NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
nginx-nodeport-dep   2/2     2            2           27s

Service

Service用Manifestの作成

Service用Manifestを作成します。「type: NodePort」を指定しています。

root@k8s-01:~# vim /root/k8s/yaml/nginx-nodeport-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-nodeport-svc
spec:
  selector:
    app: nginx
  ports:
  - port: 80
  type: NodePort

Service用Manifestの実行

Service用ManifestからServiceを作成します。

root@k8s-01:~# kubectl create -n nginx-nodeport-ns -f /root/k8s/yaml/nginx-nodeport-svc.yaml

service/nginx-nodeport-svc created

Serviceのステータス確認

Serviceのステータスを確認します。ClusterIPに10.103.227.70がアサインされており、Nodeに32054/TCPで着信した場合は、10.103.227.70:80に転送される状態となっています。Nodeのiptablesルールを確認すると分かりますが、KUBE-SERVICES(ユーザチェイン)に設定され、KUBE-SERVICESはPREROUTINGチェインに組み込まれています。つまりiptablesでDNATをしているだけですね。

root@k8s-01:~# kubectl get service -n nginx-nodeport-ns

NAME                 TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx-nodeport-svc   NodePort   10.103.227.70           80:32054/TCP   28s

オブジェクト全体の確認

nginx-clusterip-nsの全オブジェクトを確認します。

root@k8s-01:~# kubectl get all -n nginx-nodeport-ns -o wide

NAME                                      READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
pod/nginx-nodeport-dep-6799fc88d8-6jvpv   1/1     Running   0          10m   10.255.179.60   k8s-02              
pod/nginx-nodeport-dep-6799fc88d8-zqjjd   1/1     Running   0          10m   10.255.179.59   k8s-02              

NAME                         TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE     SELECTOR
service/nginx-nodeport-svc   NodePort   10.103.227.70           80:32054/TCP   7m41s   app=nginx

NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES   SELECTOR
deployment.apps/nginx-nodeport-dep   2/2     2            2           10m   nginx        nginx    app=nginx

NAME                                            DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES   SELECTOR
replicaset.apps/nginx-nodeport-dep-6799fc88d8   2         2         2       10m   nginx        nginx    app=nginx,pod-template-hash=6799fc88d8

NodePortを介したNginxコンテナの動作確認

NodePortを介してNginxコンテナにHTTPで接続

Cluster外のホストからNodeIPにcurlで接続すると応答があります。これはMaster NodeでもWorker Nodeでも関係ありません。Cluster内ではClusterIPを参照すれば良いでしょう。

root@k8s-01:~# curl 192.168.68.11:32054

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

環境の削除

本稿で作成した環境を削除します。

root@k8s-01:~# kubectl delete namespace nginx-nodeport-ns

namespace "nginx-nodeport-ns" deleted

目次に戻る

Kubernetes NginxコンテナとService NodePort

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る