手当たり次第に書くんだ

飽きっぽいのは本能

Kubernetes NginxコンテナとService LoadBalancer

目次に戻る

概要

KubernetesのNginxコンテナに対してServiceオブジェクトのLoadBalancerを介して接続します。LoadBalancerを使用するとCluster全体で共通の仮想IPアドレスがアサインされ、仮想IPアドレスに対してCluster外から接続可能となります。本稿ではLoadBalancerにMetalLBを使用しています。

手順

Namespace

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

Namespaceの作成

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

namespace/nginx-loadbalancer-ns created

Namespaceの確認

root@k8s-01:~# kubectl get namespace

NAME                    STATUS   AGE
nginx-loadbalancer-ns   Active   18s

Deployment

Deployment用Manifestの作成

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

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-loadbalancer-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-loadbalancer-ns -f /root/k8s/yaml/nginx-loadbalancer-dep.yaml

deployment.apps/nginx-loadbalancer-dep created

Deploymentのステータス確認

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

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

NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
nginx-loadbalancer-dep   2/2     2            2           19s

Service

Service用Manifestの作成

Service用Manifestを作成します。「type: LoadBalancer」を指定しています。LoadBalancerを指定するとMetalLBが使用されるのですが、別の何らかの設定でLoadBalancer=MetalLBという前提があるはずです。そうでなければこのManifestにMetalLBを指定する項目があるはずです。仮にMetalLB以外のLBを追加するとどうなるのか。今後の課題とします。

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

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

Service用Manifestの実行

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

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

service/nginx-loadbalancer-svc created

Serviceのステータス確認

Serviceのステータスを確認します。ClusterIPに10.110.163.200がアサインされており、仮想IPアドレス(EXTERNAL-IP)に192.168.68.50がアサインされています。実体は他のServiceと同じくiptablesです。

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

NAME                     TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
nginx-loadbalancer-svc   LoadBalancer   10.110.163.200   192.168.68.50   80:30914/TCP   47s

オブジェクト全体の確認

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

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

NAME                                          READY   STATUS    RESTARTS   AGE     IP              NODE     NOMINATED NODE   READINESS GATES
pod/nginx-loadbalancer-dep-6799fc88d8-7dlfg   1/1     Running   0          9m31s   10.255.179.61   k8s-02              
pod/nginx-loadbalancer-dep-6799fc88d8-cr99d   1/1     Running   0          9m31s   10.255.179.63   k8s-02              

NAME                             TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE     SELECTOR
service/nginx-loadbalancer-svc   LoadBalancer   10.110.163.200   192.168.68.50   80:30914/TCP   5m55s   app=nginx

NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES   SELECTOR
deployment.apps/nginx-loadbalancer-dep   2/2     2            2           9m31s   nginx        nginx    app=nginx

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

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

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

Cluster外のホストから仮想IPアドレスにcurlで接続すると応答があります。

root@k8s-01:~# curl 192.168.68.50

<!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-loadbalancer-ns

namespace "nginx-loadbalancer-ns" deleted

目次に戻る

Kubernetes NginxコンテナとService LoadBalancer

コメントを残す

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

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

トップへ戻る