什么';将TLS添加到Kubernetes服务的最简单方法是什么?

什么';将TLS添加到Kubernetes服务的最简单方法是什么?,kubernetes,lets-encrypt,kubernetes-ingress,Kubernetes,Lets Encrypt,Kubernetes Ingress,我在GKE的Kubernetes上公开了一个简单的web服务器,并注册了一个域。我正在寻找添加TLS到这个,所以它可以通过HTTPS访问。我听说过很多关于使用Let's Encrypt的事情,最后尝试了这个方法:但我发现它完全是多余的。考虑到我的部署只是一个服务和pod,有没有更简单的方法来使用Let's Encrypt 我使用的配置是: apiVersion: apps/v1 kind: Deployment metadata: name: web labels: app: w

我在GKE的Kubernetes上公开了一个简单的web服务器,并注册了一个域。我正在寻找添加TLS到这个,所以它可以通过HTTPS访问。我听说过很多关于使用Let's Encrypt的事情,最后尝试了这个方法:但我发现它完全是多余的。考虑到我的部署只是一个服务和pod,有没有更简单的方法来使用Let's Encrypt

我使用的配置是:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  labels:
    app: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web
        image: gcr.io/my-repo
        ports:
        - containerPort: 8080
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
        readinessProbe:
          initialDelaySeconds: 10
          httpGet:
            path: /healthz
            port: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: web-balancer-service
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    run: web
  type: NodePort
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress-app

spec:
  rules:
  - host: my.domain.com
    http:
      paths:
      - path: /*
        backend:
          serviceName: web-balancer-service
          servicePort: 8080
========================================

编辑:根据@UtkuÖzdemir的建议,我试图将这些更改编入YAML。我使用创建了IP地址

gcloud compute addresses create example-ip-address --global
以及证书和配置,包括:

所有规定都正确,但当我使用
kubectl description ManagedCertificates检查ManagedCertificates时,示例证书
是这样说的

Spec:
  Domains:
    app.domain.xyz
Status:
  Certificate Name:    xxxxxxxxxxxxxxxxxx
  Certificate Status:  Provisioning
  Domain Status:
    Domain:  app.domain
    Status:  FailedNotVisible
Events:      <none>
Spec:
域:
app.domain.xyz
地位:
证书名称:XXXXXXXXXXXXXXXX
证书状态:设置
域状态:
域名:app.Domain
状态:FailedNotVisible
活动:

我已经等了24小时,所以假设这不会改变

由于您使用GKE本身的入口控制器,因此当您创建入口资源时,它会触发在Google云平台中创建负载平衡器资源。通常,SSL终止由入口控制器负责,因此GCP负载平衡器负责执行SSL终止

这意味着,证书管理器将不适用于您的案例,因为证书将位于群集之外,并且流量在进入群集之前将已被SSL终止

幸运的是,GCP具有自配置SSL(让我们加密)支持。要利用这一点,您需要遵循以下步骤:

  • 转到GCP上的负载平衡屏幕,切换到高级视图,然后跳转到证书选项卡(或只需单击)

  • 创建新的SSL证书,并选择“创建Google托管证书”。在域字段中,写下您想要SSL证书的确切域。应该是这样的:

  • 转到屏幕,并保留一个新的静态IP地址。选择要全局的类型(在撰写本文时,GCP入口控制器仅支持全局IP地址)。应该是这样的:
  • 以您保留的静态IP为例(在本例中为
    34.95.84.106
  • 转到您的域注册器,为您的域添加一个
    A
    类型记录(SSL证书中的记录),以指向您分配的静态IP。在本例中,它将是
    my-app.example.com->34.95.84.106

  • 最后,您需要编辑入口以放置2个注释,因此它将提示Google云的入口控制器使用您保留的静态IP和您创建的证书。请参见下面的入口示例:
  • 应用它,并通过转到GCP上的负载平衡器屏幕验证更改是否得到反映

    重要提示:
    • 如果已有由入口创建的GCP负载平衡器,您对入口所做的更改(注释)将不会反映到现有的负载平衡器上。因此,请删除现有入口,确保现有负载平衡器消失,并使用正确的注释创建入口,以便正确配置负载平衡器

    • 为了让我们的加密设置工作,您的DNS记录应该在适当的位置。它在颁发证书之前使用DNS检查域的所有者。此外,初始的资源调配可能需要相当长的时间(最多半小时)


    由于您使用GKE本身的入口控制器,因此当您创建入口资源时,它会触发在Google云平台中创建负载平衡器资源。通常,SSL终止由入口控制器负责,因此GCP负载平衡器负责执行SSL终止

    这意味着,证书管理器将不适用于您的案例,因为证书将位于群集之外,并且流量在进入群集之前将已被SSL终止

    幸运的是,GCP具有自配置SSL(让我们加密)支持。要利用这一点,您需要遵循以下步骤:

  • 转到GCP上的负载平衡屏幕,切换到高级视图,然后跳转到证书选项卡(或只需单击)

  • 创建新的SSL证书,并选择“创建Google托管证书”。在域字段中,写下您想要SSL证书的确切域。应该是这样的:

  • 转到屏幕,并保留一个新的静态IP地址。选择要全局的类型(在撰写本文时,GCP入口控制器仅支持全局IP地址)。应该是这样的:
  • 以您保留的静态IP为例(在本例中为
    34.95.84.106
  • 转到您的域注册器,为您的域添加一个
    A
    类型记录(SSL证书中的记录),以指向您分配的静态IP。在本例中,它将是
    my-app.example.com->34.95.84.106

  • 最后,您需要编辑入口以放置2个注释,因此它将提示Google云的入口控制器使用您保留的静态IP和您创建的证书。请参见下面的入口示例:
  • 应用它,并通过转到GCP上的负载平衡器屏幕验证更改是否得到反映

    重要提示:
    • 如果已有由入口创建的GCP负载平衡器,您对入口所做的更改(注释)将不会反映到现有的负载平衡器上。因此,请删除现有入口,确保现有负载平衡器消失,并使用正确的anno创建入口
      apiVersion: extensions/v1beta1
      kind: Ingress
      metadata:
        name: my-ingress-app
        annotations:
          ingress.gcp.kubernetes.io/pre-shared-cert: my-ssl-certificate # the name of the SSL certificate resource you created
          kubernetes.io/ingress.global-static-ip-name: my-static-ip # the name of the static ip resource you created
          kubernetes.io/ingress.allow-http: "false" # if you want to block plain http
      spec:
        rules:
          - host: my-app.example.com
            http:
              paths:
                - path: /*
                  backend:
                    serviceName: web-balancer-service
                    servicePort: 8080