Blog

Blog を SSL にした

let's encrypt で certbot で複数ドメインでやるのめんどくさくて https://64p.org/ だけ TLS 対応しているという状況を長らく続けていたのだが、k8s 化するついでに対応。

https://www.javachinna.com/deploy-angular-spring-boot-mysql-digitalocean-kubernetes/

を参考にして対応。

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.10.0/cert-manager.yaml

として cert-manager を入れる(digital ocean の web ui からも入れられるけど)

以下のようにして cert-manager を管理する。これも kubectl apply -f すれば OK

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    # Email address used for ACME registration
    email: [email protected]
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      # Name of a secret used to store the ACME account private key
      name: letsencrypt-prod-private-key
    # Add a single challenge solver, HTTP01 using nginx
    solvers:
    - http01:
        ingress:
          class: nginx
kubectl apply -f https://raw.githubusercontent.com/compumike/hairpin-proxy/v0.2.1/deploy.yml

として hairpin-proxy を入れる。

PROXY protocol support for internal-to-LoadBalancer traffic for Kubernetes Ingress users, specifically for cert-manager self-checks.

という感じのやつ(ref. https://github.com/compumike/hairpin-proxy )。

あとは kubectl apply -f k8s/ingress-nginx.yml などとして以下のファイルを適用すれば終わり。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: blog3-app-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
  - hosts:
    - blog.64p.org
    - 64p.org
    secretName: hp-64p-app-tls
  rules:
  - host: "blog.64p.org"
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: blog3-app-server
            port:
              number: 8080
  - host: "64p.org"
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: hp-64p-app-server
            port:
              number: 8080