【Kubernetes】WebサイトをHTTPS化する(前編)

cert-manager

Kubernetes環境のWebサイトでLetsEncryptの証明書を利用してHTTPS化します。
証明書は90日で失効してしまうためcert-managerを利用して証明書更新を自動化します。
※長くなるため、前編・後編に分けています。

  1. ingressControllerの導入 ★ここ
  2. cert-managerで証明書更新の自動化

ingressとは

クラスター内のServiceに対する外部からのアクセス(主にHTTP)を管理するAPIオブジェクトです。
Ingressは負荷分散、SSL終端、名前ベースの仮想ホスティングの機能を提供します。

https://kubernetes.io/ja/docs/concepts/services-networking/ingress/

公式の説明そのままですが、外部アクセスをingressに通すことで負荷分散やSSL終端ができるようになります。L7レベルで制御することができるため / (ルート)配下のパスを指定してServiceにルーティングできます。

ingress controllerとは

ingressはリソースですので、リソースを利用するモジュールが必要になります。
それがingress controllerになります。

Nginx Ingress Controllerの導入

環境

名前バージョン
CentOS-Stream-9
kubeletv1.26.2
kubeadmv1.26.2
containerdv1.6.16
calicov3.25
metallbv0.13.9

Nginx Ingress Controllerのデプロイ

ナレッジが多いのでNginx Ingress Controllerを採用しました。
コントローラー本体をデプロイします。

curl -OL https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/baremetal/deploy.yaml

LoadBalancerで動かしたいのでyamlを編集してServiceのTypeをLoadBalancerに変更します。

apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.8.0
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
----------- snip -----------
  selector:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  type: LoadBalancer

Deploymentに–publish-serviceを追加します。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.8.0
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
----------- snip -----------
    spec:
      containers:
      - args:
        - /nginx-ingress-controller
        - --election-id=ingress-nginx-leader
        - --controller-class=k8s.io/ingress-nginx
        - --ingress-class=nginx
        - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
        - --validating-webhook=:8443
        - --validating-webhook-certificate=/usr/local/certificates/cert
        - --validating-webhook-key=/usr/local/certificates/key
        - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller

Ingress Controllerをデプロイします。

kubectl apply -f deploy.yaml

Nginx Ingress Controllerが稼働しているか確認します。
kubectl get all –namespace=ingress-nginxで稼働状況を確認できますが、EXTERNAL-IPの付与が完了するまで5分くらいかかりますので注意してください。
※ingress-nginx-admissionはバリデーション用なので気にしなくて良いみたいです。

[user001@k8s-mas01~]# kubectl get all --namespace=ingress-nginx
NAME                                            READY   STATUS      RESTARTS   AGE
pod/ingress-nginx-admission-create-ng25s        0/1     Completed   0          3m11s
pod/ingress-nginx-admission-patch-kpn6r         0/1     Completed   1          3m11s
pod/ingress-nginx-controller-7d98bbddbd-bqwhn   1/1     Running     0          3m11s

NAME                                         TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                      AGE
service/ingress-nginx-controller             LoadBalancer   10.104.40.116    172.16.200.2   80:32690/TCP,443:32222/TCP   3m11s
service/ingress-nginx-controller-admission   ClusterIP      10.109.209.244   <none>         443/TCP                      3m11s

NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ingress-nginx-controller   1/1     1            1           3m11s

NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/ingress-nginx-controller-7d98bbddbd   1         1         1       3m11s

NAME                                       COMPLETIONS   DURATION   AGE
job.batch/ingress-nginx-admission-create   1/1           6s         3m11s
job.batch/ingress-nginx-admission-patch    1/1           7s         3m11s

テスト用にNginxをデプロイ

Nginxをデプロイして動作確認をします。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: www-app
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: "nginx"
  rules:
  - 
http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: www-app-service
            port:
              number: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: www-app
  labels:
    app: www-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: www-app
  template:
    metadata:
      labels:
        app: www-app
    spec:
      containers:
      - name: web-container
        image: nginx
        ports:
          - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: www-app-service
  labels:
    app: www-app-service
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: www-app
  type: NodePort
  externalTrafficPolicy: Local
kubectl apply -f nginx-test.yaml

ブラウザで確認します。

最後に

Nginx Ingress Controllerを導入しました。
まだ、HTTP通信になりますので次回HTTPS化します。

参考サイト