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

时间:2019-09-25 21:34:05

标签: kubernetes lets-encrypt kubernetes-ingress

我有一个简单的Web服务器在GKE的Kubernetes上公开公开,并注册了一个域。我正在为此添加TLS,以便可以通过HTTPS访问它。我听说过很多有关使用“让我们加密”的信息,但最终尝试了以下操作:https://github.com/jetstack/cert-manager/blob/master/docs/tutorials/acme/quick-start/index.rst,但发现它完全让人不知所措。假设我的部署只是单个服务和pod,是否有使用“加密”的更简单方法?

我正在使用的配置是:

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

证书以及以下项的设置:https://gist.github.com/nickponline/ab74d3d179e21474551b7596c6478eea

一切准备都正确,但是当我用kubectl describe ManagedCertificates example-certificate检查ManagedCertificates时说

Spec:
  Domains:
    app.domain.xyz
Status:
  Certificate Name:    xxxxxxxxxxxxxxxxxx
  Certificate Status:  Provisioning
  Domain Status:
    Domain:  app.domain
    Status:  FailedNotVisible
Events:      <none>

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

1 个答案:

答案 0 :(得分:2)

由于您使用GKE本身的入口控制器,因此在创建 Ingress 资源时,它将触发在Google Cloud Platform中创建 Load Balancer 资源。通常,SSL终止是入口控制器的责任,因此GCP负载平衡器负责SSL终止。

这意味着,cert-manager不适用于您的情况,因为证书将驻留在您的群集之外,并且流量在进入您的群集之前已经被SSL终止

幸运的是,GCP具有自我配置的SSL(Let's Encrypt)支持。要利用它,您需要按照以下步骤操作:

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

  2. 创建一个新的SSL证书,并选择“创建Google管理的证书”。在域字段中,写下您想要SSL证书的确切域。它应该看起来像这样:

enter image description here

  1. 转到External IP Addresses屏幕,并保留一个新的静态IP地址。选择要全局的类型(在撰写本文时,GCP入口控制器仅支持全局IP地址)。应该看起来像这样:

enter image description here

  1. 采用您保留的静态IP(在此示例中为34.95.84.106

enter image description here

转到您的域注册商,并为您的域添加一个A类型的记录(SSL证书中的记录)以指向您分配的静态IP。在此示例中,它将为my-app.example.com -> 34.95.84.106

  1. 最后,您将需要编辑入口以放置2个注释,因此它将提示Google Cloud的入口控制器使用您保留的静态IP和创建的证书。请参阅下面的入口示例:
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

应用它,并通过转到GCP上的“负载平衡器”屏幕来验证更改是否得到反映。

重要说明:

  • 如果某个入口已经创建了GCP负载平衡器,则您在入口上所做的更改(注释)将不会反映到现有的负载平衡器上。因此,请删除您现有的入口,确保现有的负载均衡器消失,并使用正确的注释创建该入口,以便正确配置负载均衡器。

  • 为使“让我们加密”设置生效,您的DNS记录应该存在。在颁发证书之前,它将使用DNS检查域的所有者。另外,最初的配置可能会花费一些时间(最多半小时)。