kubernetes
ingress

快適な kubernetes オンプレミス環境を構築する(5. nginx-ingress-controllerを使ったIngress環境のセットアップ)

シリーズ目次

  1. 設計編
  2. RancherOSインストール & セットアップ
  3. Rancher Server のセットアップ
  4. Kubernetes環境にホストを追加する
  5. nginx-ingress-controllerを使ったIngress環境のセットアップ
  6. SSL自動発行環境セットアップ(kube-lego)
  7. NFSサーバ&NFSクライアントセットアップ
  8. プライベートレジストリを構築する
  9. 総括

nginx-ingress-controllerを使ったIngress環境のセットアップ

ざっくりとした流れ

  • nginx-ingress-controller を動作させるノードにラベルを付ける
  • default http backend を kubectl でデプロイ
  • nginx-ingress-controller を kubectl でデプロイ
  • Amazon Route53 などで Router Node に付与しているグローバル IP アドレス向けにレコードを追加する

nginx-ingress-controller を動作させるノードにラベルを付ける

  • kubectl コマンドで特定のノードにラベルを付けて、Router Node として動作させるようにします
kubectl get nodes
NAME      STATUS    ROLES     AGE       VERSION
host_b    Ready     <none>    1d        v1.8.3-rancher3
host_c    Ready     <none>    16d       v1.8.3-rancher3
host_d    Ready     <none>    1d        v1.8.3-rancher3
  • router node にしたいノードは host_d なので host_d に label を付けます
kubectl label node "role=router" -l "kubernetes.io/hostname=host_d"

default http backend を構築する

  • nginx-ingress-controller が解決できなかった URL などで 404 を返すために default http backend を構築しておきます
  • 以下のコマンドを CLI から実行します
  • k8s の namespace は ingress として分けておきます
$ cat <<EOF | kubectl create -f -
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: default-http-backend
  labels:
    app: default-http-backend
  namespace: ingress
spec:
  replicas: 1
  selector:
    matchLabels:
      app: default-http-backend
  template:
    metadata:
      labels:
        app: default-http-backend
    spec:
      terminationGracePeriodSeconds: 60
      containers:
      - name: default-http-backend
        # Any image is permissible as long as:
        # 1. It serves a 404 page at /
        # 2. It serves 200 on a /healthz endpoint
        image: gcr.io/google_containers/defaultbackend:1.4
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 30
          timeoutSeconds: 5
        ports:
        - containerPort: 8080
        resources:
          limits:
            cpu: 10m
            memory: 20Mi
          requests:
            cpu: 10m
            memory: 20Mi
---

apiVersion: v1
kind: Service
metadata:
  name: default-http-backend
  namespace: ingress
  labels:
    app: default-http-backend
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: default-http-backend
EOF

nginx-ingress-controller を kubectl でデプロイ

  • 以下のようなコマンドを実行して nginx-ingress-controller をデプロイします
  • DaemonSet でデプロイします
  • こちらも k8s の namespace は ingress として分けておきます
$ cat <<EOF | kubectl create -f -
apiVersion: extensions/v1beta1

kind: DaemonSet
metadata:
  name: nginx-ingress-controller-v1
  namespace: ingress
  labels:
    k8s-app: nginx-ingress-lb
    kubernetes.io/cluster-service: "true"
spec:
  template:
    metadata:
      labels:
        k8s-app: nginx-ingress-lb
        name: nginx-ingress-lb
    spec:
      hostNetwork: true
      terminationGracePeriodSeconds: 60
      nodeSelector:
        role: router
      containers:
      - image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.10.2
        name: nginx-ingress-lb
        imagePullPolicy: Always
        readinessProbe:
          httpGet:
            path: /healthz
            port: 10254
            scheme: HTTP
        livenessProbe:
          httpGet:
            path: /healthz
            port: 10254
            scheme: HTTP
          initialDelaySeconds: 10
          timeoutSeconds: 1
        # use downward API
        env:
          - name: POD_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: POD_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
        ports:
        - containerPort: 80
          hostPort: 80
        - containerPort: 443
          hostPort: 443
        args:
        - /nginx-ingress-controller
        - --default-backend-service=ingress/default-http-backend
EOF

Amazon Route53 などで Router Node に付与しているグローバル IP アドレス向けにレコードを追加する

  • タイトル通りですが、ここでワイルドカードのレコードを追加します
  • 例として Router Node (host_d) が XX.XX.XX.XX というグローバル IP アドレスを持っていたとしたら、 XX.XX.XX.XX を *.k8s.example.com などのレコードに紐づけるようにしておきます

構築した Ingress を実際に使ってみる

  • k8s 内にコンテナを作って、そのコンテナのサービスを外部に公開できるか確認しましょう

Pod を作成

kubectl run echoheaders --image=gcr.io/google_containers/echoserver:1.4 --replicas=1 --port=8080

作成した Pod のサービスを公開する

kubectl expose deployment echoheaders --port=80 --target-port=8080 --name=echoheaders

Ingress で外部に公開する

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: echomap
spec:
  rules:
  - host: echo.k8s.example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: echoheaders
          servicePort: 80
  • ここでのポイントは host が echo.k8s.example.com になっているところです
  • http://echo.k8s.example.com/ にアクセスして確認してみてください

まとめ

  • k8s クラスタに Ingress 環境を構築するところを紹介しました
  • 次回は公開したサービスの SSL 証明書を自動発行する機構(kube-lego)を構築していきます
  • SSL自動発行環境セットアップ(kube-lego) に続く