5.云原生安全之ingress配置域名TLS证书

文章目录

将域名托管到cloudflare进行域名解析管理,使用cloudflare管理域名,免费为域名提供安全证书

cloudflare配置

使用cloudflare托管域名

  1. 登录https://dash.cloudflare.com/
  2. 添加站点
  3. 填写站点域名
  1. 选择免费版
  1. 查看 Cloudflare 名称服务器
  1. 进入购买域名网站控制台,将域名服务器设置为Cloudflare 名称服务器

购买国外域名参考:国外域名购买交易网站汇总,小编在godaddy购买的域名。

获取cloudflare API Token



在cloudflare中配置SSL/TLS

  1. 修改加密模式,选择完全
  1. 选择源服务器创建证书


kubesphere使用cert-manager申请cloudflare证书

参考:Kubernetes Ingress 配置泛域名 TLS 证书

安装证书管理器

bash 复制代码
$ kubectl create ns cert-manager
$ helm uninstall cert-manager -n cert-manager
$ helm install cert-manager jetstack/cert-manager \
  -n cert-manager \
  --version v1.8.0 \
  --set installCRDs=true \
  --set prometheus.enabled=false \
  --set 'extraArgs={--dns01-recursive-nameservers-only,--dns01-recursive-nameservers=119.29.29.29:53\,8.8.8.8:53}'    

验证安装结果

创建Secret资源

yaml 复制代码
kubectl create secret generic cloudflare-api-token-secret --from-literal=api-token=xxxxxxxxxxxxxx -n cert-manager
 
#把xxxxxxxxxxxxxx 替换为你的cloudflare上的token

上述创建方式翻译为资源文件Secret.yaml:

yaml 复制代码
apiVersion: v1
kind: Secret
metadata:
  name: cloudflare-api-token-secret
  namespace: cert-manager
type: Opaque
stringData:
  # #把xxxxxxxxxxxxxx 替换为你的cloudflare上的token
  api-token: xxx 

创建资源kubectl apply -f Secret.yaml,查看资源

创建cluster-issuer.yaml

yaml 复制代码
# 指定了使用的 Kubernetes API 版本和 cert-manager 的 API 组
apiVersion: cert-manager.io/v1
# 指定了这个 YAML 文件定义的 Kubernetes 对象类型为 ClusterIssuer,表示这是一个集群级别的证书颁发者。
kind: ClusterIssuer
# 部分包含了 Kubernetes 对象的元数据,包括名称 "letsencrypt" 和命名空间 "base"
metadata:
  name: letsencrypt
  namespace: base
# 部分定义了 ClusterIssuer 对象的规范
spec:
  # acme 部分定义了使用 ACME 协议进行证书颁发的配置信息
  acme:
    # 指定了 Let's Encrypt ACME 服务器的 URL
    server: https://acme-v02.api.letsencrypt.org/directory
    # 指定了与 Let's Encrypt 交互时使用的电子邮件地址
    email: 1293780497@qq.com
    # 指定了用于存储私钥的 Kubernetes Secret 对象的名称
    privateKeySecretRef:
      name: letsencrypt
    # 部分定义了用于验证域名所有权的 DNS 验证器,以确保证书颁发请求是由域名所有者发起的
    solvers:
    # 表示使用 DNS 验证器进行验证
    - dns01:
        # 表示使用 Cloudflare DNS 服务进行验证
        cloudflare:
          # 指定了与 Cloudflare 交互时使用的电子邮件地址
          email: 1293780497@qq.com
          apiTokenSecretRef:
            # 指定了用于访问 Cloudflare API 的 Kubernetes Secret 对象的名称和键
            name: cloudflare-api-token-secret
            key: api-token

这个 Kubernetes YAML 文件定义了一个名为 "letsencrypt" 的 ClusterIssuer 对象,用于配置 cert-manager 应用程序与 Let's Encrypt 证书颁发机构进行交互,以自动为 Kubernetes 集群中的 Ingress 资源颁发 SSL/TLS 证书。

创建cert.yaml

yaml 复制代码
# 指定了使用的 Kubernetes API 版本和 cert-manager 的 API 组
apiVersion: cert-manager.io/v1
# 指定了这个 YAML 文件定义的 Kubernetes 对象类型为 Certificate,表示这是一个证书对象
kind: Certificate
# 部分包含了 Kubernetes 对象的元数据
metadata:
  name: Certificate
  namespace: base
spec:
  # 指定了用于存储证书的 Kubernetes Secret 对象的名称
  secretName: remote-yxym-shop-tls
  # 指定了用于颁发证书的证书颁发者的名称和类型,这里指定了名为 "letsencrypt" 的 ClusterIssuer 对象
  issuerRef:
    name: letsencrypt
    kind: ClusterIssuer
  # 指定了证书颁发请求中包含的域名列表,这里只列出了一个名为 "xxx" 的域名。这些域名将用于验证证书颁发请求的域名所有权。
  dnsNames:
  - xxx

这个 Kubernetes YAML 文件定义了一个名为 "Certificate" 的 Certificate 对象,用于配置 cert-manager 应用程序获取 Let's Encrypt 证书并将其存储在 Kubernetes 集群中的 Secret 对象中,以供 Ingress 资源使用。

申请证书已经查看申请状态

  1. 申请证书
yaml 复制代码
kubectl apply -f cluster-issuer.yaml
kubectl apply -f cert.yaml
  1. 查看证书申请状态
yaml 复制代码
kubectl get certificate -n <namespace>
  1. 如果状态Ready不是True需要查看原因
bash 复制代码
kubectl get challenge -n <namespace>
kubectl describe challenge challenge-xxxxxx -n <namespace>

部署harbor并配置ingress使用证书

  1. 进入应用商店
  1. 搜索harbor,一直下一步,直到应用设置
  1. 应用设置
    1. 修改ingress.hosts.core为自己的域名
    2. 修改externalURL为自己的域名
  2. 点击安装
  3. 配置ingress应用路由,选择https以及证书
  1. harbor访问测试

爱快中端口映射到了99端口,内网网关域名为192.168.31.11

  1. docker登录harbor测试

背景及现象:应用商店部署harbor,在浏览器通过https能登录,但是在linux中通过docker login提示错误443端口连接不上,部署情况:

  1. ingress通过端口映射暴露在公网上
  2. linux上docker loginx通过公网域名:公网映射端口,测试443连接不上

解决方案:在ks集群中修改hosts文件,将ingress绑定的网关ip添加上

测试docker登录harbor成功

相关推荐
wclass-zhengge17 分钟前
K8S篇(基本介绍)
云原生·容器·kubernetes
颜淡慕潇23 分钟前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
昌sit!8 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
茶馆大橘12 小时前
微服务系列五:避免雪崩问题的限流、隔离、熔断措施
java·jmeter·spring cloud·微服务·云原生·架构·sentinel
北漂IT民工_程序员_ZG12 小时前
k8s集群安装(minikube)
云原生·容器·kubernetes
coding侠客12 小时前
揭秘!微服务架构下,Apollo 配置中心凭啥扮演关键角色?
微服务·云原生·架构
2301_8061313619 小时前
Kubernetes的基本构建块和最小可调度单元pod-0
云原生·容器·kubernetes
licy__1 天前
Docker 基础命令简介
docker·云原生·eureka
0_1_bits1 天前
【系统设计】高效的分布式系统:使用 Spring Boot 和 Kafka 实现 Saga 模式
spring boot·后端·云原生·架构·kafka·linq
探索云原生1 天前
GPU 环境搭建指南:如何在裸机、Docker、K8s 等环境中使用 GPU
ai·云原生·kubernetes·go·gpu