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

ingressとは
クラスター内のServiceに対する外部からのアクセス(主にHTTP)を管理するAPIオブジェクトです。
https://kubernetes.io/ja/docs/concepts/services-networking/ingress/
Ingressは負荷分散、SSL終端、名前ベースの仮想ホスティングの機能を提供します。
公式の説明そのままですが、外部アクセスをingressに通すことで負荷分散やSSL終端ができるようになります。L7レベルで制御することができるため / (ルート)配下のパスを指定してServiceにルーティングできます。
ingress controllerとは
ingressはリソースですので、リソースを利用するモジュールが必要になります。
それがingress controllerになります。
Nginx Ingress Controllerの導入
環境
| 名前 | バージョン | 
|---|---|
| CentOS-Stream-9 | |
| kubelet | v1.26.2 | 
| kubeadm | v1.26.2 | 
| containerd | v1.6.16 | 
| calico | v3.25 | 
| metallb | v0.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.yamlLoadBalancerで動かしたいので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: LoadBalancerDeploymentに–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.yamlNginx 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: Localkubectl apply -f nginx-test.yamlブラウザで確認します。

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