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.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化します。