当前位置: 首页 > 知识库问答 >
问题:

让我们对发出假证书的kubernetes入口控制器进行加密

狄天逸
2023-03-14

不知道为什么我会得到假证书,即使证书是由我们使用certmanager加密正确颁发的

安装程序在阿里云ECS控制台上运行,其中一个Kube master和一个cube minion组成一个Kubernetes集群。

服务详情

root@kube-master:~# kubectl get svc 
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   3h20m
my-nginx     ClusterIP   10.101.150.247   <none>        80/TCP    77m

Pod详细信息

root@kube-master:~# kubectl get pods --show-labels
NAME                        READY   STATUS    RESTARTS   AGE   LABELS
my-nginx-6cc48cd8db-n6scm   1/1     Running   0          46s   app=my-nginx,pod-template-hash=6cc48cd8db

已部署舵手证书管理器

root@kube-master:~# helm ls 
NAME            REVISION    UPDATED                     STATUS      CHART               APP VERSION NAMESPACE  
cert-manager    1           Tue Mar 12 15:29:21 2019    DEPLOYED    cert-manager-v0.5.2 v0.5.2      kube-system
kindred-garfish 1           Tue Mar 12 17:03:41 2019    DEPLOYED    nginx-ingress-1.3.1 0.22.0      kube-system

正确签发证书

root@kube-master:~# kubectl describe certs 
Name:         tls-prod-cert
Namespace:    default
Labels:       <none>
Annotations:  <none>
API Version:  certmanager.k8s.io/v1alpha1
Kind:         Certificate
Metadata:
  Creation Timestamp:  2019-03-12T10:26:58Z
  Generation:          2
  Owner References:
    API Version:           extensions/v1beta1
    Block Owner Deletion:  true
    Controller:            true
    Kind:                  Ingress
    Name:                  nginx-ingress-prod
    UID:                   5ab11929-44b1-11e9-b431-00163e005d19
  Resource Version:        17687
  Self Link:               /apis/certmanager.k8s.io/v1alpha1/namespaces/default/certificates/tls-prod-cert
  UID:                     5dad4740-44b1-11e9-b431-00163e005d19
Spec:
  Acme:
    Config:
      Domains:
        zariga.com
      Http 01:
        Ingress:        
        Ingress Class:  nginx
  Dns Names:
    zariga.com
  Issuer Ref:
    Kind:       ClusterIssuer
    Name:       letsencrypt-prod
  Secret Name:  tls-prod-cert
Status:
  Acme:
    Order:
      URL:  https://acme-v02.api.letsencrypt.org/acme/order/53135536/352104603
  Conditions:
    Last Transition Time:  2019-03-12T10:27:00Z
    Message:               Order validated
    Reason:                OrderValidated
    Status:                False
    Type:                  ValidateFailed
    Last Transition Time:  <nil>
    Message:               Certificate issued successfully
    Reason:                CertIssued
    Status:                True
    Type:                  Ready
Events:
  Type    Reason        Age   From          Message
  ----    ------        ----  ----          -------
  Normal  CreateOrder   27s   cert-manager  Created new ACME order, attempting validation...
  Normal  IssueCert     27s   cert-manager  Issuing certificate...
  Normal  CertObtained  25s   cert-manager  Obtained certificate from ACME server
  Normal  CertIssued    25s   cert-manager  Certificate issued successfully

入口详细信息

root@kube-master:~# kubectl describe ingress
Name:             nginx-ingress-prod
Namespace:        default
Address:          
Default backend:  my-nginx:80 (192.168.123.202:80)
TLS:
  tls-prod-cert terminates zariga.com
Rules:
  Host  Path  Backends
  ----  ----  --------
  *     *     my-nginx:80 (192.168.123.202:80)
Annotations:
  kubernetes.io/ingress.class:        nginx
  kubernetes.io/tls-acme:             true
  certmanager.k8s.io/cluster-issuer:  letsencrypt-prod
Events:
  Type    Reason             Age    From                      Message
  ----    ------             ----   ----                      -------
  Normal  CREATE             7m13s  nginx-ingress-controller  Ingress default/nginx-ingress-prod
  Normal  CreateCertificate  7m8s   cert-manager              Successfully created Certificate "tls-prod-cert"
  Normal  UPDATE             6m57s  nginx-ingress-controller  Ingress default/nginx-ingress-prod

Letsencrypt Nginx生产定义

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress-prod
  annotations:
    kubernetes.io/ingress.class: nginx
    certmanager.k8s.io/cluster-issuer: letsencrypt-prod
    kubernetes.io/tls-acme: 'true'
  labels:
    app: 'my-nginx'
spec:
  backend:
    serviceName: my-nginx
    servicePort: 80
  tls:
  - secretName: tls-prod-cert
    hosts:
    - zariga.com

共有3个答案

李法
2023-03-14

如果你确信一切都设置正确,但它仍然不起作用,试试这个。

编辑您的nginx控制器的部署。为什么?因为,如果它在部署的命名空间中找不到秘密,Nginx控制器会部署它自己的证书(假证书)。不知道这一点(我是游戏新手)花了我几天的时间。

因此,要么更改Nginx入口控制器所在的名称空间并获取部署的名称,然后:

kubectl edit deployment nginx-ingress-ingress-nginx-controller -n nginx-ingress

或者,如果该名称空间中只有一个部署,则可以执行以下操作

kubectl edit deployment

您应该处于nginx控制器部署的编辑模式。查找截面:spec--

 spec:
  containers:
  - args:
    - /nginx-ingress-controller
    - --publish-service=$(POD_NAMESPACE)/nginx-ingress-ingress-nginx-controller
    - --election-id=ingress-controller-leader
    - --ingress-class=nginx
    - --configmap=$(POD_NAMESPACE)/nginx-ingress-ingress-nginx-controller
    - --validating-webhook=:8443
    - --validating-webhook-certificate=/usr/local/certificates/cert
    - --validating-webhook-key=/usr/local/certificates/key
    - --default-ssl-certificate=app-namespace/letsencrypt-cert-prod

如果您的nginx控制器没有找到默认证书(如上所述),您可以添加要使用的默认证书,因此它将通过添加以下内容在命名空间中搜索机密:

--default-ssl-certificate=your-cert-namespace/your-cert-secret

your-cert-namespace:您的证书秘密是your-cert-Secret的命名空间:包含秘密的证书的名称

保存并关闭编辑器后,应该对其进行更新。然后检查cert manager pod的日志:

kubectl logs cert-manager-xxxpodxx-abcdef -n cert-manager

确保一切正常。

如果所有资源都部署在同一命名空间中,则可能不会出现此问题。

公羊光明
2023-03-14

如果您使用clusterissuer URL作为登台URL,有时可能会发生这种情况。

检查发卡机构中设置的letsencrypt url。yaml或clusterissuer。yaml并将其更改为生产url:https://acme-v02.api.letsencrypt.org/directory

我曾经遇到过同样的问题,将url更改为生产url解决了这个问题。

还要检查您使用的入口tls机密是否正确。

实际群集颁发者应类似于生产:

apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: dev-clusterissuer
spec:
  acme:
    email: harsh@example.com
    privateKeySecretRef:
      name: dev-clusterissuer
    server: https://acme-v02.api.letsencrypt.org/directory       # <----check this server URL it is for Prod and use this only
    solvers:
    - http01:
        ingress:
          class: nginx

如果您使用的是服务器:https://acme-staging-v02.api.letsencrypt.org/directory您将面临问题,最好将其替换为服务器:https://acme-v02.api.letsencrypt.org/directory

东方琪
2023-03-14

也许对遇到类似问题的人会有所帮助。对我来说,一个忘记在Inete yaml文件中为规则tls部分指定主机名。复制主机名后,它开始使用正确的证书进行响应。

例子:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-web-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  tls:
  - hosts:
    - my.host.com                # <----
    secretName: tls-secret
  rules:
    - host: my.host.com          # <----
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              serviceName: my-nginx
              servicePort: 80
 类似资料:
  • 我使用nginx入口控制器在GKE上设置了一个新的kubernetes集群。TLS不起作用,它在使用假证书。 有很多配置细节,所以我做了一个回购https://github.com/jobevers/test_ssl_ingress 简而言之,步骤是 创建一个没有GKE负载均衡器的新集群 用我的密钥和证书创建一个tls秘密 创建一个nginx入口部署/pod 创建入口控制器 nginx-ingre

  • 让我们Encrypt通过IdenTrust交叉签名得到他们的中间,这应该是个好消息。但是,我在这个命令的输出中找不到这两个: 我知道可以在每台机器上手动添加受信任的CA,但由于我的应用程序应该是免费下载和可执行的,不需要任何进一步的配置,所以我正在寻找“开箱即用”的解决方案。你有好消息告诉我吗?

  • 我们已经建立了一个新的入口路由,需要TLS证书身份验证,并将其放置在自己的子域中,但我们发现证书管理器无法为其颁发证书。 使用此处提供的示例,我们生成CA证书和CA密钥,然后配置客户端证书:https://github.com/kubernetes/ingress-nginx/tree/master/docs/examples/auth/client-certs 在日志中,我可以看到所有请求都返回

  • 我正在云中的AWS EKS服务上运行我的工作负载。我可以看到没有默认的入口控制器可用(因为它可用于GKE),我们必须选择第三方。 我决定使用Traefik。在跟踪文档和其他资源(像这样)之后,我觉得使用Traefik作为IngresController不会自动在云中创建LoadBalancer。我们必须手动完成它来设置所有内容。 如何使用Traefik作为Kubernetes入口,就像其他入口控制

  • 我们正在GKE(谷歌kubernetes引擎)上运行一个API服务器。我们使用Google云endpoint和API密钥处理授权。我们将每个API密钥上的某些IP地址列为白名单。为了做到这一点,我们必须将负载平衡器转换为入口控制器,以公开我们的API服务器。IP白名单不适用于loadbalancer服务。现在,我们有一个类似以下内容的入口设置:

  • 我在RedHat EC2实例上安装了Minikube v1.3.1以进行一些测试。 由于nginx-ingress-控制器默认使用的端口已经在使用中,我正在尝试在部署中更改它们,但没有结果。有人能建议如何做吗? 如何知道端口已在使用? 当我使用命令kubectl-n kube system get deployment | grep nginx列出系统吊舱时,我得到: nginx入口控制器0/1