自由帳

とりとめのない学習メモです。主に Web サービスのシステム基盤や運用に関することを書いています

kubeadmで作ったK8sクラスター上にデプロイしたNginx Ingress Controllerでロードバランスを試した

kubeadmで作ったK8sクラスター上にデプロイしたNginx Ingress Controllerでロードバランスを試した。

環境

  • プラットフォーム さくらのVPS 3台 (k8s master * 1, k8s worker * 2)
  • OS: Ubuntu 18.04
  • kubernatis: 1.17.1
  • Docker: 19.03.5

事前準備

こちらこちらの手順で構築した環境で動作を確認する。

以下のようなL7ロードバランサを利用するマニフェストを作成する。 下記3つを1つのファイルとしても良いし別々のファイルにしてapplyするようにしても良い。

# namespace
apiVersion: v1
kind: Namespace
metadata:
  name: test
---
# ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: lb
  namespace: test
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
    - host: hogehoge.vs.sakura.ne.jp    # httpへアクセスする際に利用するホスト名
      http:
        paths:
          - path: /apache               # /apache への振り分け設定
            backend:
              serviceName: apache-svc
              servicePort: 80
          - path: /nginx                # /nginx への振り分け設定
            backend:
              serviceName: nginx-svc
              servicePort: 80
          - path: /
            backend:
              serviceName: blackhole
              servicePort: 80

Apacheマニフェストファイルを下記としておく。

# apache
apiVersion: v1
kind: Service
metadata:
  name: apache-svc
  namespace: testest
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: httpd
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd
  namespace: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: httpd
  template:
    metadata:
      labels:
        app: httpd
    spec:
      containers:
      - image: httpd:alpine
        name: httpd
        ports:
        - containerPort: 80

Nginxのマニフェストファイルを下記としておく。

# nginx
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  namespace: test
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:alpine
        name: nginx
        ports:
        - containerPort: 80

Apply後は以下のようになる。

$ kubectl get pods --all-namespaces
NAMESPACE        NAME                                                    READY   STATUS    RESTARTS   AGE
ingress-nginx    nginx-ingress-controller-7ff5fb7dd-bm65r                1/1     Running   0          43d
kube-system      coredns-6955765f44-5z4ph                                1/1     Running   1          91d
kube-system      coredns-6955765f44-fcfxs                                1/1     Running   1          91d
kube-system      etcd-ik1-319-19580.vs.sakura.ne.jp                      1/1     Running   1          91d
kube-system      kube-apiserver-hogehoge.vs.sakura.ne.jp                 1/1     Running   1          91d
kube-system      kube-controller-manager-hogehoge.vs.sakura.ne.jp        1/1     Running   1          91d
kube-system      kube-flannel-ds-amd64-9s4f9                             1/1     Running   1          90d
kube-system      kube-flannel-ds-amd64-ddzql                             1/1     Running   3          90d
kube-system      kube-flannel-ds-amd64-jmhwb                             1/1     Running   8          90d
kube-system      kube-proxy-fpppn                                        1/1     Running   1          91d
kube-system      kube-proxy-rszww                                        1/1     Running   1          91d
kube-system      kube-proxy-sl4vt                                        1/1     Running   3          91d
kube-system      kube-scheduler-hogehoge.vs.akura.ne.jp                  1/1     Running   1          91d
metallb-system   controller-5df7dc969b-rrgwb                             1/1     Running   0          43d
metallb-system   speaker-9mppl                                           1/1     Running   2          44d
metallb-system   speaker-fk8wq                                           1/1     Running   0          44d
test             httpd-75cb4864cc-xhqj2                                  1/1     Running   0          3d12h
test             nginx-5c559d5697-58qz9                                  1/1     Running   0          3d11h

こうなったら hogehoge.vs.sakura.ne.jp/nginx, hogehoge.vs.sakura.ne.jp/apache へリクエストして、それぞれのWelocomeページが表示されればOK。

まとめ

kubeadmで作成したk8sクラスター上に構築したIngress Controllerを利用して、L7のリクエスト負荷分散の動作を確認するための手順を書いた。

参考