kubeadmで構成したkubernetesにNginx Ingress Controllerを入れる
前回の記事で作成したkubernetesにnginx ingress controllerをインストールします。
Overview
Architecture
nginx ingress controllerをインストールするにあたって、いくつか選択肢はありますが、クラスター外への公開ということで今回はtype:Loadbalancerとして公開したいと思います。
この場合、各クラウドベンダー(少なくともEKS、AKS)と同じような構成が擬似的に取れるので良いかと思います
今回の環境構成です
MetalLBのインストール
ではまず初めにMetalLBをインストールします。
操作はマスターノードで行っていますが、kubectlのクレデンシャルがあればどこでも大丈夫です。
この辺はMetalLBの公式を確認しましょう。
まず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-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をインストールする
この辺から適当なバージョンを選びます。
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に登録してあげれば、ブラウザ等から確認ができます。