百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

如何使用cert-manager管理网关的证书

cac55 2024-10-19 02:57 20 浏览 0 评论

cert-manager是一个证书生命周期管理系统,支持证书的申请、部署等功能。您可以使用cert-manager颁发ASM网关的证书,从而可以使用HTTPS协议通过ASM网关访问服务,保证数据传输的安全。本文介绍如何使用cert-manager管理网关的证书。

背景信息

cert-manager支持签发自签名证书和DNS域名证书,从而可以使用HTTPS协议通过ASM网关访问服务。这两种证书的区别如下:

  • 自签名证书:自签名证书仅具有加密功能,无身份验证功能。您可以在命令行工具中使用HTTPS协议访问ASM网关,但是自签名证书不受Web浏览器的信任,Web浏览器检查HTTPS连接会标记为潜在风险并弹出错误消息,即无法在Web浏览器中使用HTTPS协议通过ASM网关访问服务。
  • DNS域名证书:DNS域名证书由受信任的CA机构颁发,兼具加密和身份验证功能。相比自签名证书,DNS域名证书具有更高的安全性,受到Web浏览器的信任。您可以同时在命令行工具和Web浏览器中使用HTTPS协议通过ASM网关访问服务。

在集群中安装cert-manager

在本地安装Helm。

具体操作,请参见 Helm 。

使用kubectl连接集群。

具体操作,请参见 获取集群KubeConfig并通过kubectl工具连接集群 。

创建cert-manager命名空间

kubectl create namespace cert-manager

添加cert-manager Chart。

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

获取cert-manager Chart的最新信息。

helm repo update

安装cert-manager。

说明 cert-manager的版本需要和Kubernetes版本保持兼容。关于cert-manager和Kubernetes版本的对应关系,请参见 Supported Releases 。

helm install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --version v1.1.0 \
  --set installCRDs=true

使用cert-manager签发自签名证书

步骤一:在集群中生成自签证书

创建 issuer.yaml 。

apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: selfsigned
spec:
  selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: istio-ingressgateway-certs
spec:
  isCA: true
  duration: 2160h # 90d
  secretName: istio-ingressgateway-certs
  commonName: istio-ingressgateway-certs
  subject:
    organizations:
    - cluster.local
    - cert-manager
  issuerRef:
    name: selfsigned
    kind: Issuer
    group: cert-manager.io
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: istio-ingressgateway-certs
spec:
  ca:
    secretName: istio-ingressgateway-certs

创建自签名CA来颁发工作负载证书。

kubectl apply -f issuer.yaml -n istio-system

查看证书。

$. kubectl get secret -n istio-system 
# 预期输出: 
NAME                                        TYPE                             DATA         AGE
istio-ingressgateway-certs                  kubernetes.io/tls                3            68m

步骤二:添加证书和私钥挂载卷到入口网关

  1. 登录 ASM控制台 ,在左侧导航栏,选择。
  2. 网格管理 页面,单击目标实例名称,然后在左侧导航栏,选择。
  3. 入口网关 页面的目标网关右侧,单击 查看YAML
  4. 编辑 对话框,添加如下信息到 spec 字段。
  secretVolumes:
    - mountPath: /etc/istio/ingressgateway-certs
      name: ingressgateway-certs
      secretName: istio-ingressgateway-certs

添加之后的YAML文件示例如下: 展开查看YAML

apiVersion: istio.alibabacloud.com/v1beta1
kind: IstioGateway
metadata:
  name: ingressgateway
  namespace: istio-system
spec:
  clusterIds:
    - c58638b491a5248669b59609e0a17****
  cpu: {}
  externalTrafficPolicy: Local
  maxReplicas: 1
  minReplicas: 1
  ports:
    - name: status-port
      port: 15020
      targetPort: 15020
    - name: http2
      nodePort: 31380
      port: 80
      targetPort: 80
    - name: https
      nodePort: 31390
      port: 443
      targetPort: 443
    - name: tls
      port: 15443
      targetPort: 15443
  replicaCount: 1
  secretVolumes:
    - mountPath: /etc/istio/ingressgateway-certs
      name: ingressgateway-certs
      secretName: istio-ingressgateway-certs
  serviceAnnotations:
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: slb.s1.small
  serviceType: LoadBalancer

步骤三:在集群中检查入口网关配置

添加证书和私钥挂载卷到入口网关后,入口网关会加载证书与密钥。

验证 tls.crt 与 tls.key

执行以下命令,验证 tls.crt 与 tls.key 已被挂载到入口网关Pod中。

kubectl exec -it -n istio-system $(kubectl -n istio-system get pods -l istio=ingressgateway -o jsonpath='{.items[0].metadata.name}') -- ls -al /etc/istio/ingressgateway-certs

预期输出:

lrwxrwxrwx 1 root root   14 May  9 01:14 tls.crt -> ..data/tls.crt
lrwxrwxrwx 1 root root   14 May  9 01:14 tls.key -> ..data/tls.key

检查Ingress gateway证书

执行以下命令,检查Ingress gateway证书中的 Subject 字段的正确性。

kubectl exec -it -n istio-system $(kubectl -n istio-system get pods -l istio=ingressgateway -o jsonpath='{.items[0].metadata.name}')  -- cat /etc/istio/ingressgateway-certs/tls.crt | openssl x509 -text -noout | grep 'Subject:'

预期输出:

Subject: O = cert-manager + O = cluster.local, CN = istio-ingressgateway-certs

检查Ingress gateway代理

执行以下命令,检查Ingress gateway的代理能够正确访问证书。

kubectl exec -it -n istio-system $(kubectl -n istio-system get pods -l istio=ingressgateway -o jsonpath='{.items[0].metadata.name}') -- curl  127.0.0.1:15000/certs

预期输出:

{
 "certificates": [
  {
   "ca_cert": [
    {
     "path": "\u003cinline\u003e",
     "serial_number": "4edcf3",
     "subject_alt_names": [],
     "days_until_expiration": "7251",
     "valid_from": "2022-01-06T06:17:00Z",
     "expiration_time": "2042-01-01T06:22:03Z"
    }
   ],
...........

步骤四:验证使用HTTPS协议访问服务是否成功

在集群中创建服务。

创建 myexample-nginx.conf

使用以下内容,创建 myexample-nginx.conf 。 本文示例服务基于Nginx实现,您需要为Nginx服务器创建配置文件,以域名 aliyun.com 的服务为例,以下内容定义请求根路径直接返回字样 Welcome to aliyun.com! 及状态码 200

events {
}
http {
  log_format main '$remote_addr - $remote_user [$time_local]  $status '
  '"$request" $body_bytes_sent "$http_referer" '
  '"$http_user_agent" "$http_x_forwarded_for"';
  access_log /var/log/nginx/access.log main;
  error_log  /var/log/nginx/error.log;
  server {
    listen 80;
    location / {
        return 200 'Welcome to aliyun.com!';
        add_header Content-Type text/plain;
    }
  }
}

创建Nginx服务器的配置项。

kubectl create configmap \
myexample-nginx-configmap \
--from-file=nginx.conf=./myexample-nginx.conf

启用Sidecar自动注入

执行以下命令,为命名空间default启用Sidecar自动注入。

kubectl label namespace default istio-injection=enabled

创建 myexampleapp.yaml 。

apiVersion: v1
kind: Service
metadata:
  name: myexampleapp
  labels:
    app: myexampleapp
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    app: myexampleapp
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myexampleapp
spec:
  selector:
    matchLabels:
      app: myexampleapp
  replicas: 1
  template:
    metadata:
      labels:
        app: myexampleapp
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx-config
          mountPath: /etc/nginx
          readOnly: true
      volumes:
      - name: nginx-config
        configMap:
          name: myexample-nginx-configmap

创建域名为 aliyun.com 的内部服务。

kubectl apply -f myexampleapp.yaml

通过kubectl连接ASM。

具体操作,请参见 通过控制面kubectl访问Istio资源 。

在ASM中创建网关规则。

创建 istio-myexample-customingressgateway.yaml 。

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: istio-myexample-customingressgateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - hosts:
    - '*.aliyun.com'
    port:
      name: http
      number: 80
      protocol: HTTP
    tls:
      httpsRedirect: true
  - hosts:
    - '*.aliyun.com'
    port:
      name: https
      number: 443
      protocol: HTTPS
    tls:
      mode: SIMPLE
      privateKey: /etc/istio/ingressgateway-certs/tls.key
      serverCertificate: /etc/istio/ingressgateway-certs/tls.crt

执行以下命令,创建网关规则。

kubectl apply -f istio-myexample-customingressgateway.yaml

在ASM中创建虚拟服务。

创建 istio-myexample-customvirtualservice.yaml 。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: istio-myexample-customvirtualservice
spec:
  hosts:
  - "www.aliyun.com"
  gateways:
  - istio-myexample-customingressgateway
  http:
  - route:
    - destination:
        host: myexampleapp.default.svc.cluster.local
        port:
          number: 80

执行以下命令,创建虚拟服务。

kubectl apply -f istio-myexample-customvirtualservice.yaml

在集群中获取入口网关服务的地址。

kubectl get svc -n istio-system -l istio=ingressgateway

通过HTTPS协议访问aliyun.com服务。

curl -k -H Host:www.aliyun.com --resolve www.aliyun.com:443:{替换成真实的入口网关IP地址}  https://www.aliyun.com

预期输出:

Welcome to aliyun.com!

相关推荐

Mac电脑强制删除任何软件方法-含自启动应用

对于打工者来说,进入企业上班使用的电脑大概率是会被监控起来,比如各种流行的数据防泄漏DLP,奇安信天擎,甚至360安全卫士,这些安全软件你想卸载是非常困难的,甚至卸载后它自己又安装回来了,并且还在你不...

Linux基础知识 | 文件与目录大全讲解

1.linux文件权限与目录配置1.文件属性Linux一般将文件可存取的身份分为三个类别,分别是owner/group/others,且三种身份各read/write/execute等权限文...

文件保护不妥协:2025 年 10 款顶级加密工具推荐

数据安全无小事,2025年这10款加密工具凭借独特功能脱颖而出,从个人到企业场景全覆盖,第一款为Ping32,其余为国外英文软件。1.Ping32企业级加密核心工具,支持200+文件格...

省心省力 一个软件搞定系统维护_省心安装在哪里能找到

◆系统类似于我们居住的房间,需要经常打理才能保持清洁、高效。虽然它本身也自带一些清理和优化的工具,但借助于好用的第三方工具来执行这方面的任务,会更让人省心省力。下面笔者就为大家介绍一款集多项功能于一身...

JAVA程序员常用的几个工具类_java程序员一般用什么软件写程序

好的工具做起事来常常事半功倍,下面介绍几个开发中常用到的工具类,收藏一下,也许后面真的会用到。字符串处理:org.apache.commons.lang.StringUtilsisBlank(Char...

手工解决Windows10的若干难题_windows10系统卡顿怎么解决

【电脑报在线】很多朋友已经开始使用Win10,估计还只是测试版本的原因,使用过程中难免会出现一些问题,这里介绍解决一些解决难题的技巧。技巧1:让ProjectSpartan“重归正途”从10074...

System32文件夹千万不能删除,看完这篇你就知道为什么了

C:\Windows\System32目录是Windows操作系统的关键部分,重要的系统文件存储在该目录中。网上的一些恶作剧者可能会告诉你删除它,但你不应该尝试去操作,如果你尝试的话,我们会告诉你会发...

Windows.old 文件夹:系统备份的解析与安全删除指南

Windows.old是Windows系统升级(如Win10升Win11)或重装时,系统自动在C盘创建的备份文件夹,其核心作用是保留旧系统的文件、程序与配置,为“回退旧系统”提供保...

遇到疑难杂症?Windows 10回收站问题巧解决

回收站是Windows10的一个重要组件。然而,我们在使用过程中,可能会遇到一些问题。例如,不论回收站里有没有文件,都显示同一个图标,让人无法判别回收站的空和满的真实情况;没有了像Windows7...

卸载软件怎么彻底删掉?简单几个步骤彻底卸载,电脑小白看过来

日常工作学习生活中,我们需要在安装一些软件程序,但随着软件的更新迭代速度,很多时候我们需要重新下载安装新的程序,这时就需要将旧的一些软件程序进行卸载。但是卸载软件虽然很简单,但是很多小伙伴们表示卸载不...

用不上就删!如何完全卸载OneDrive?

作为Windows10自带的云盘,OneDrive为资料的自动备份和同步提供了方便。然而,从隐私或其他方面考虑,有些人不愿意使用OneDrive。但Windows10本身不提供直接卸载OneDri...

【Linux知识】Linux下快速删除大量文件/文件夹方法

在Linux下,如果需要快速删除大量文件或文件夹,可以使用如下方法:使用rm命令删除文件:可以使用rm命令删除文件,例如:rm-rf/path/to/directory/*这个命令会递...

清理系统不用第三方工具_清理系统垃圾用什么软件

清理优化系统一定要借助于优化工具吗?其实,手动优化系统也没有那么神秘,掌握了方法和技巧,系统清理也是一件简单和随心的事。一方面要为每一个可能产生累赘的文件找到清理的方法,另一方面要寻找能够提高工作效率...

系统小技巧:软件卸载不了?这里办法多

在正常情况下,我们都是通过软件程序组中的卸载图标,或利用控制面板中的“程序和功能”模块来卸载软件的。但有时,我们也会发现利用卸载图标无法卸载软件或者卸载图标干脆丢失找不到了,甚至控制面板中卸载软件的功...

麒麟系统无法删除文件夹_麒麟系统删除文件权限不够

删除文件夹方法例:sudorm-rf文件夹名称。删除文件方法例:sudorm-r文件名包括扩展名。如果没有权限,给文件夹加一下权限再删。加最高权限chmod775文件名加可执行权限...

取消回复欢迎 发表评论: