k8s安装cert-manager使用Ingress暴露服务

在没有 cert-manager 的情况下,你需要手动申请证书、创建 Kubernetes Secret,并在证书到期前重复这一流程,过程繁琐且容易出错。
cert-manager 的核心价值在于:

自动化:它会自动向 Let's Encrypt 等证书颁发机构(CA)申请证书,并在到期前自动续期。
集成:它将获得的证书自动存储为 Kubernetes Secret,供 Ingress 直接使用。
灵活性:它支持多种证书来源,如 Let's Encrypt (ACME协议)、HashiCorp Vault 或自签名证书

我们是非云场景,外网IP直接绑定到一张网卡上,另外我们使用Ingress自签证书

1.安装cert-manager

helm repo add jetstack https://charts.jetstack.io/
helm repo update

我们可以查看下目前所有的版本

helm search repo cert-manager --versions

我们选择v1.19.2这个版本进行安装

helm install cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --version v1.19.2 \
  --set crds.enabled=true

2.查看安装状态

kubectl get pods --namespace cert-manager

202603241718206842993879.png

要让 cert-manager 帮你管理证书,你需要告诉它去哪个机构(CA)申请,以及通过哪种方式验证你对域名的所有权。这里以最常用的 Let's Encrypt 为例。
Issuer 和 ClusterIssuer 的区别:
Issuer:作用域仅限于某个命名空间。
ClusterIssuer:作用于整个集群,所有命名空间都可以使用。
Let's Encrypt 提供了两种验证域名所有权的方式,你需要根据自己的网络环境选择一种。

HTTP-01 服务有公网 IP,且域名已正确解析。 通过访问一个临时路径(/.well-known/acme-challenge/)来验证。实现简单,但不能申请通配符证书 *.example.com
DNS-01 服务在内部网络,或需要申请通配符证书。 通过在域名的 DNS 记录中添加一个 TXT 记录来验证。配置稍复杂,但功能强大,可以申请通配符证书

这里由于环境限制和场景我们选择使用Issuer自签证书
3.安装ingress

Ingress 是 Kubernetes 中的一种 API 对象,用于管理从集群外部到集群内部服务的 HTTP 和 HTTPS 流量。它通过定义规则,将外部请求路由到集群内的不同服务。Ingress 提供了负载均衡、SSL 终结以及基于名称的虚拟主机等功能。
基本功能

Ingress 允许通过配置以下功能来管理流量:
外部访问 URL:为服务提供可访问的外部 URL。
负载均衡:在多个后端服务之间分配流量。
SSL/TLS 支持:通过 Secret 配置 TLS 证书以加密流量。
基于路径或主机名的路由:根据请求的路径或主机名将流量路由到不同的服务。

使用helm安装

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --create-namespace

4.创建Issuer和Certificate

创建一个自签名的 Issuer(类型为 selfsigned),或使用 ca 类型的 Issuer 搭建内部 CA。
在 Certificate 中引用这个内部 Issuer,cert-manager 会直接签发证书,无需任何公网验证。

cat selfsigned.yaml
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: selfsigned-issuer
  namespace: default
spec:
  selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: my-app-cert
  namespace: default
spec:
  secretName: my-app-tls
  dnsNames:
  - app.example.com
  issuerRef:
    name: selfsigned-issuer
    kind: Issuer

5.创建ingress规则

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
  annotations:
    cert-manager.io/force-renew: "true"
spec:
  ingressClassName: nginx  # 替换为你的 Ingress Class,通过kubectl get ingressclass 获取
  tls:
  - hosts:
    - app.example.com       # 你的域名
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-app-service # 业务svc的名字
            port:
              number: 80

6.发布业务deployMent和svc

这里就不举例子了,可以根据自己的项目自己撰写

7.注意事项

由于我们使用的是非云场景,所以需要修改ingress-nginx-controller,这个pod网络需要修改成hostnetwork
kubectl edit deploy -n ingress-nginx ingress-nginx-controller

添加

dnsPolicy: ClusterFirstWithHostNet
hostNetwork: true

最后再解析域名到Ingress中绑定的域名,网络的流向就是这样的
用户流量->Ingress-nginx pod->Ingress规则->应用svc->应用pod

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.sulao.cn/post/1166

评论列表

0%