Kubernetes に NGINX Ingress Controller をデプロイする方法

0 件のコメント

今回は「ベアメタル Kubernetes 環境に ingress-nginx (L7ロードバランサ) を構築する方法」についてまとめます。

概要

ベアメタル Kubernetes 環境に NGINX ingress Controller を導入して「Ingress」を利用できるようにします。

本記事では「NGINX ingress Controller の導入から動作確認まで」を行っていきます。

前提

Ingress は その後ろで Service の ロードバランサ を利用しているので、前提として Service の ロードバランサ (MetalLB など) が利用できる状態になっていること。

  • Kubernetes v1.14
  • MetalLB 0.7.3
  • NGINX ingress Controller v0.24.1

インストール

  1. mandatory.yaml をダウンロード

    wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.24.1/deploy/mandatory.yaml
    
  2. mandatory.yaml を編集

    ingress-nginx の controller は master Node に配置したいので、affinity と tolerations を追加します。

    
    …(省略)…
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-ingress-controller
      namespace: ingress-nginx
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app.kubernetes.io/name: ingress-nginx
          app.kubernetes.io/part-of: ingress-nginx
      template:
        metadata:
          labels:
            app.kubernetes.io/name: ingress-nginx
            app.kubernetes.io/part-of: ingress-nginx
          annotations:
            prometheus.io/port: "10254"
            prometheus.io/scrape: "true"
        spec:
          serviceAccountName: nginx-ingress-serviceaccount
          containers:
            - name: nginx-ingress-controller
              image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.24.1
              args:
                - /nginx-ingress-controller
                - --configmap=$(POD_NAMESPACE)/nginx-configuration
                - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
                - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
                - --publish-service=$(POD_NAMESPACE)/ingress-nginx
                - --annotations-prefix=nginx.ingress.kubernetes.io
              securityContext:
                allowPrivilegeEscalation: true
                capabilities:
                  drop:
                    - ALL
                  add:
                    - NET_BIND_SERVICE
                # www-data -> 33
                runAsUser: 33
              env:
                - name: POD_NAME
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.name
                - name: POD_NAMESPACE
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.namespace
              ports:
                - name: http
                  containerPort: 80
                - name: https
                  containerPort: 443
              livenessProbe:
                failureThreshold: 3
                httpGet:
                  path: /healthz
                  port: 10254
                  scheme: HTTP
                initialDelaySeconds: 10
                periodSeconds: 10
                successThreshold: 1
                timeoutSeconds: 10
              readinessProbe:
                failureThreshold: 3
                httpGet:
                  path: /healthz
                  port: 10254
                  scheme: HTTP
                periodSeconds: 10
                successThreshold: 1
                timeoutSeconds: 10
    # - ADD - START - ------------
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: node-role.kubernetes.io/master
                    operator: Exists
          tolerations:
          - key: node-role.kubernetes.io/master
            operator: Exists
            effect: NoSchedule
    # - ADD -  END  - ------------
    
  3. mandatory.yaml を適用

    kubectl apply -f mandatory.yaml
    
  4. service-nodeport.yaml を適用

    kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/baremetal/service-nodeport.yaml
    

必要なPodが立ち上がっているかどうか、以下のコマンドで確認します。

kubectl get pods --all-namespaces -l app.kubernetes.io/name=ingress-nginx --watch

上記コマンドは状態を監視し続けるので、終了する際は Ctrl + C で抜けます。

設定

  1. ConfigMap用のマニュフェスト(configmap.yaml)を作成

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: nginx-config
      namespace: nginx-ingress
    data:
      proxy-connect-timeout: "10s"
      proxy-read-timeout: "10s"
      client-max-body-size: "2m"
    

    適用できる ConfigMap の namespace および name は 前述のインストールで引数 --configmap に渡している値を指定します。

    nginx-ingress の 設定はすべて文字列になるので必ず "(ダブルクォート) でくくります。

    その他設定は以下を参照してください。

    NGINX Ingress Controller - ConfigMaps

  2. 作成した ConfigMap を適用します。

    kubeadm apply -f configmap.yaml
    

動作確認

  1. 以下のようなサンプルマニュフェスト(sample.yaml)を作成

    Deployment にある イメージ や ポートは適宜書き換えてください。

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: sample-ingress
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /
    spec:
      backend:
        serviceName: sample-service
        servicePort: 8080
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: sample-service
    spec:
      selector:
        app: echo
      ports:
      - name: http
        protocol: TCP
        port: 8080
        targetPort: 3000
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sample-deployment
      labels:
        app: echo
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: echo
      template:
        metadata:
          labels:
            app: echo
        spec:
          containers:
          - name: echo
            image: garafu/test.echo:latest
            ports:
            - containerPort: 3000
    
    ---
    
  2. マニュフェストを適用して展開

    kubectl apply -f sample.yaml
    
  3. Ingress に External IP がふられるのを待つ

    kubectl get ing --watch
    

    IPが振られるまで数分かかります。 上記コマンドでは状態変化を追っているのでIPが振られると自動で更新されれます。 抜ける際は Ctrl + C で抜けます。

    実行した際のイメージは以下のようになります。

    [root@k8s-master k8s-ingress]# kubectl get ing --watch
    NAME             HOSTS   ADDRESS   PORTS   AGE
    sample-ingress   *                 80      8s
    sample-ingress   *       10.51.2.10   80      16s
    
  4. 接続確認

    curl http://10.51.2.10
    

今回は「ベアメタル Kubernetes 環境に ingress-nginx (L7ロードバランサ) を構築する方法」についてまとめました。 参考になったでしょうか? 本記事がお役に立っていると嬉しいです!!

参考記事

最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!