Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ssl Https在本地无法用于kubernetes群集上的入口_Ssl_Kubernetes_Https_Kubernetes Ingress_Nginx Ingress - Fatal编程技术网

Ssl Https在本地无法用于kubernetes群集上的入口

Ssl Https在本地无法用于kubernetes群集上的入口,ssl,kubernetes,https,kubernetes-ingress,nginx-ingress,Ssl,Kubernetes,Https,Kubernetes Ingress,Nginx Ingress,我试图让我的入口通过https运行,但是我得到了HTTP错误403,我不知道我在这里遗漏了什么 我试图在my local domain.com上访问它们,我在etc/hosts文件中添加了该条目作为 127.0.0.1 my local domain.com这样我就可以访问它了 这是我的发行人 apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: cert-issuer namespace: my-namespace sp

我试图让我的入口通过https运行,但是我得到了
HTTP错误403
,我不知道我在这里遗漏了什么

我试图在
my local domain.com
上访问它们,我在
etc/hosts
文件中添加了该条目作为
127.0.0.1 my local domain.com
这样我就可以访问它了

这是我的发行人

apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: cert-issuer
  namespace: my-namespace
spec:
  selfSigned: {}
这是我的证书

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: self-signed-cert
  namespace: my-namespace
spec:
  secretName: my-secret-tls
  dnsNames:
    - my-local-domain.com
    - www.my-local-domain.com
  issuerRef:
    name: cert-issuer
这是我的nginx入口:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-service
  labels:
      name: ingress-service
  namespace: my-namespace
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/ssl-redirect: 'true'
    namespace: my-namespace
spec:
  tls:
    - hosts:
      - my-local-domain.com
      - www.my-local-domain.com
      secretName: my-secret-tls
  rules:
  - host: my-local-domain.com
    http:
      paths:
      - path: /api/(.*)
        pathType: Prefix
        backend:
          service:
            name: web-api
            port:
              number: 443
      - path: /(.*)
        pathType: Prefix
        backend:
          service:
            name: web-client
            port:
              number: 80
我的web客户端服务的nginx.conf

server {
        listen 80;

        location / {
            root /usr/share/nginx/html;
            index index.html index.htm;
            try_files $uri $uri/ /index.html;
        }

        gzip  on; 
    }
当我尝试使用
https://my-local-domain.com

Access to my-local-domain.com was denied
You don't have authorization to view this page.
HTTP ERROR 403
我也试着跑

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "//CN=my-local-domain.com\O=my-local-domain.com" -addext "subjectAltName = DNS:my-local-domain.com"

kubectl create secret tls tls-secret --key tls.key --cert tls.crt -n my-namespace
删除ingress中的
Certificate
CertificateIssuer
并将
tls secret
添加为
secretName
,以及将那些
tls.key
tls.crt
添加到我的web客户端nginx中,并将其更新为:

    server {
      listen 443 ssl default_server;

      ssl_protocols SSLv3 TLSv1;

      server_name www.my-local-domain.com my-local-domain.com;

      access_log /var/log/nginx/access.log;
      error_log  /var/log/nginx/error.log info;

      keepalive_timeout 75 75;

      ssl_certificate /etc/ssl/certs/self-signed.crt;
      ssl_certificate_key /etc/ssl/private/self-signed.key;
      ssl_session_timeout  5m;

      add_header Strict-Transport-Security "max-age=7200";
      
      location / {
          root /usr/share/nginx/html;
          index index.html index.htm;
          try_files $uri $uri/ /index.html;
      }
    }

p、 执行此操作时,我在端口
443
上运行everyrhing,而不是
80


当我从入口中删除
tls
部分时,它确实可以通过HTTP工作。我还尝试将我的dns/主机从
my local domain.com
更改为仅
localhost
,但仍然相同。即使我尝试访问
https://localhost
我知道HTTP错误403

我不知道这是否有帮助,但这里有一些建议:

  • 确定错误的来源
    您向我们提供了大量代码,但没有提供错误的详细信息。403是由Web服务、api还是入口控制器抛出的?您可以在错误页面中检查这一点。来自ingress控制器的错误通常在页脚中包含类似“openresty”的内容。但这几乎不取决于k8s中使用的入口控制器。
    您还可以检查容器的日志(nginx将日志写入
    /var/log/nginx/error.log
    )。在这里你可以找到一些更详细的信息,为什么你会得到403

  • 让群集处理SSL终止
    不要将ssl证书放入容器中。这几乎不会增加应用程序的复杂性。
    当集群处理这个问题时,这就容易多了。因此,您的应用程序可以更快地部署到具有其他环境的其他群集上

  • 使用自签名证书时,请避免使用证书管理器
    正如您已经测试过的,但我建议仅当您需要lets加密的证书时才使用证书管理器。否则将再次增加复杂性

  • 不要混淆HTTP和HTTPS
    您的webapi使用HTTPS进行内部通信(内部方式:入口控制器->webapi服务,通常未加密)。。。但不适用于您的web服务器。
    保持简单-HTTPS适用于所有人或任何人

  • 尽量避免url重写
    尽可能避免url重写。我经常看到它有问题,所以我建议避免它。
    我知道这并不总是可能的,但当所有组件都由您开发时。。。你为什么需要它?以下是您在“轻松”中的入门:

  • 无根是最好的
    对于您的问题不是很重要,但是使用非特权nginx映像代替标准nginx映像。如果您的服务(在本例中为
    nginx
    )遭到黑客攻击,则黑客拥有与nginx相同的权限。这意味着,他可以轻松地将工具安装到nginx容器中,并执行非常糟糕的操作。
    如果你使用的是未经授权的图像,黑客可以。。。几乎没有。他需要第二次机会来提升他的权利


  • 祝你好运找到你的错误。当您与我们分享您的下一步时,我们很高兴。

    请向我们提供服务和pod,以及您的nginx的设置。从我的第一个观点来看,我很困惑,为什么要将ssl转发到服务/pod。吊舱正在使用证书吗?您是否进一步检查了证书状态?如果证书在本地,发卡机构如何质疑证书。此外,my-local-domain.com还必须能够从集群内部解析。你检查过它是否工作了吗?当我看到这个不完整的描述时,实际上我有很多问题。也许你可以再加一点。@ManuelPolacek我刚刚尝试将443转发到该服务,因为我有cookie授权,并且它有
    samesite=none
    。不,api pod没有使用证书。您说的
    是什么意思?另外,my-local-domain.com也必须可以从集群内部解析
    ?把api吊舱完全放在外面,为什么它不能与客户端吊舱一起工作?我为我的客户端添加了我的nginx,也许我需要在那里添加ssl配置well@ManuelPolacek问题是,当我注释出入口中的所有路径并尝试访问:
    my local domain.com
    时,它返回
    403
    。它是否应该返回
    404未找到| Nginx
    ?因此,我认为最重要的是不允许https在localhostOk上工作。我是来帮助你们的。我再次检查了你的设置,可能你在入口中混合了你的协议。后端协议是https,web客户端正在侦听端口80,我猜是http。它尝试在非ssl端口上通信。这是一件事。另一件事是,您可能需要转发来自nginx入口的头,web客户端和web api服务需要主机信息。如果您使用的是nginx ingress helm图表,则它是controller.config.use-forwarded-headers,并计算两者的完全转发为true。请尝试一下…也许你也可以发布web api和web客户端的pod资源。顺便说一句,我认为发行人和证书都很好,你检查过它的状态了吗?谢谢你的建议。从现在开始,我在做Kubernetes的时候会记住这些。现在,当我在端口
    80
    上运行所有服务时,我有一个
    自签名的
    证书和颁发者,现在我得到了
    
    
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
       name: ingress-service
       labels:
          name: ingress-service
       namespace: my-namespace
       annotations:
          nginx.ingress.kubernetes.io/ssl-redirect: 'true'
    
    spec:
       tls:
          - hosts:
             - my-local-domain.com
             - www.my-local-domain.com
          secretName: my-secret-tls
       rules:
          - host: my-local-domain.com
            http:
               paths:
                  - path: /api/       
                    backend:
                       service:
                          name: web-api
                          port:
                             number: 80
                  - path: /
                    backend:
                       service:
                       name: web-client
                       port:
                          number: 80