在Kubernetes中使用Ingress和SSL终端的详细指南

556 阅读2分钟

在测试或开发环境中,使用服务组件将我们的应用程序暴露给外部请求是可以的。然而,我们需要Ingress来实现同样的逻辑。它是K8S集群中外部请求的实际入口点。Ingress控制器插件是手动安装在集群上的。我们将使用Nginx Ingress。如果你的设置有一个外部负载平衡器/代理服务器,它将位于Ingress控制器的前面,但我们这次将忽略它。这是为了避免将K8S组件完全暴露在外部。我们在这个例子中使用Minikube。

安装

$ minikube addons enable ingress
Verifying ingress addon...
The 'ingress' addon is enabled
$ kubectl get pod -n kube-system
NAME                                        READY   STATUS      RESTARTS   AGE
coredns-f9fd979d6-jwz84                     1/1     Running     7          19d
etcd-minikube                               1/1     Running     7          19d
ingress-nginx-admission-create-tpbrr        0/1     Completed   0          10m
ingress-nginx-admission-patch-vbwvm         0/1     Completed   2          10m
ingress-nginx-controller-799c9469f7-tkz48   1/1     Running     0          10m
kube-apiserver-minikube                     1/1     Running     9          19d
kube-controller-manager-minikube            1/1     Running     7          19d
kube-proxy-fjxvf                            1/1     Running     7          19d
kube-scheduler-minikube                     1/1     Running     7          19d
storage-provisioner                         1/1     Running     30         19d

运行kubectl describe pod -n kube-system ingress-nginx-controller-799c9469f7-tkz48 ,查看其细节。关于Nginx控制器注释的更多细节,请看这里

配置

apiVersion: networking.k8s.io/v1beta1
kind: Ingress

metadata:
  name: address-finder-ingress

spec:
  tls:
    - hosts:
        - my-address-finder.com
      secretName: address-finder-tls-secret
  rules:
    - host: my-address-finder.com
      http:
        paths:
          - path: /
            backend:
              serviceName: address-finder-service # You can add this, I am skipping.
              servicePort: 80

这是在我们的Kubernetes集群中向外部流量暴露一个单一的服务address-finder-service 。如果你想用不同的域/主机或路径暴露其他服务,你将需要使用上述基于路径的规格定义。

我们只希望从外部进行HTTPS访问。一旦HTTPS请求到达,Nginx的SSL终止就会在Ingress控制器层面发生。我们的Ingress设置将指示控制器使用提供的TLS证书终止流量,并将未加密的HTTP流量转发给内部服务(如纯文本)。欲了解更多信息,请访问这里:

  • SSL卸载/终止:它对负载平衡器上的所有HTTPS流量进行解密。这就是我们在上面做的事情。

  • SSL直通:它将HTTPS流量传递给后端服务器,而不解密负载均衡器上的流量。数据通过完全加密的方式。SSL Passthrough默认是禁用的,需要用--enable-ssl-passthrough 标志来启动控制器。注释nginx.ingress.kubernetes.io/ssl-passthrough ,指示控制器直接向后端发送TLS连接,而不是让NGINX解密通信。

证书

$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
   -keyout ~/Desktop/k8s.key -out ~/Desktop/k8s.crt \
   -subj "/CN=my-address-finder.com/O=my-address-finder.com"
$ kubectl create secret tls address-finder-tls-secret \
   --cert=~/Desktop/k8s.crt \
   --key=~/Desktop/k8s.key
$ kubectl describe secret address-finder-tls-secret
Name:         address-finder-tls-secret
Namespace:    default
Labels:       
Annotations:  

Type:  kubernetes.io/tls

Data
====
tls.crt:  1233 bytes
tls.key:  1708 bytes

主机

在部署了入口之后,你需要更新主机,如下图所示。你可以从address-finder-ingress 的详细信息中获得IP:

$ nano /etc/hosts
192.168.99.100  my-address-finder.com

现在你可以在你的浏览器中使用https://my-address-finder.com 。HTTP将不会工作。