Contents
概要
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-02pod/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