kubeadmで構成したkubernetesにNginx Ingress Controllerを入れる

前回の記事で作成したkubernetesにnginx ingress controllerをインストールします。

rayuno.hatenablog.com

Overview

Architecture

nginx ingress controllerをインストールするにあたって、いくつか選択肢はありますが、クラスター外への公開ということで今回はtype:Loadbalancerとして公開したいと思います。
この場合、各クラウドベンダー(少なくともEKS、AKS)と同じような構成が擬似的に取れるので良いかと思います

今回の環境構成です
f:id:ramite:20220312151705p:plain

MetalLBのインストール

ではまず初めにMetalLBをインストールします。
操作はマスターノードで行っていますが、kubectlのクレデンシャルがあればどこでも大丈夫です。
この辺はMetalLBの公式を確認しましょう。

metallb.universe.tf

まずconfigmapを編集する必要があります。

kubectl edit configmap -n kube-system kube-proxy

位置がバラバラですが、mode:にipvsを追加するのと、strictARPをfalse -> trueに変更します。

apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
  strictARP: true

MetalLBをインストールします。

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/metallb.yaml

次に、MetalLBをL2モードで動作させる必要があります。

metallb.universe.tf

metallb-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 172.16.200.80-172.16.200.89

ここで指定するIPアドレスはNodeのサブネットアドレス内に収める必要があります。
作成したら、マニフェストを適用します。

kubectl apply -f metallb-configmap.yaml

ここまでやったら、metallbの作業は終了です。 一応確認しましょう。

kubectl get all,ing,cm -n metallb-system
NAME                             READY   STATUS    RESTARTS   AGE   IP              NODE       NOMINATED NODE   READINESS GATES
pod/controller-57fd9c5bb-z6bxx   1/1     Running   0          14h   10.245.226.66   worker-1   <none>           <none>
pod/speaker-hxkkd                1/1     Running   0          14h   172.16.200.93   worker-2   <none>           <none>
pod/speaker-v5285                1/1     Running   0          14h   172.16.200.92   worker-1   <none>           <none>
pod/speaker-vc694                1/1     Running   0          14h   172.16.200.91   master-0   <none>           <none>

NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE   CONTAINERS   IMAGES                            SELECTOR
daemonset.apps/speaker   3         3         3       3            3           kubernetes.io/os=linux   14h   speaker      quay.io/metallb/speaker:v0.12.1   app=metallb,component=speaker

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                               SELECTOR
deployment.apps/controller   1/1     1            1           14h   controller   quay.io/metallb/controller:v0.12.1   app=metallb,component=controller

NAME                                   DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES                               SELECTOR
replicaset.apps/controller-57fd9c5bb   1         1         1       14h   controller   quay.io/metallb/controller:v0.12.1   app=metallb,component=controller,pod-template-hash=57fd9c5bb

NAME                         DATA   AGE
configmap/config             1      14h
configmap/kube-root-ca.crt   1      14h

Nginx Ingress Controllerをインストールする

この辺から適当なバージョンを選びます。

github.com

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/cloud/deploy.yaml

以上。

動作確認

適当に動作確認しましょう。

kubectl create ns test-pod

cat <<EOF > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
EOF
kubectl apply -f deployment.yaml -n test-pod

cat <<EOF > test-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
EOF

kubectl apply -f test-svc.yaml -n test-pod

cat <<EOF > test-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
    - host: nginx.test.local
      http:
       paths:
       - path: /
         pathType: Prefix
         backend:
            service:
                name: nginx
                port:
                    number: 80
EOF

kubectl apply -f test-ingress.yaml -n test-pod

ここまでやって、namespace test-podのingressを確認します。

kubectl get ingress -n test-pod
NAME    CLASS    HOSTS                      ADDRESS         PORTS   AGE
nginx   <none>   nginx.test.local   172.16.200.80   80      14h

このHOSTSにある名前とAddressをDNSに登録してあげれば、ブラウザ等から確認ができます。