在测试或开发环境中,使用服务组件将我们的应用程序暴露给外部请求是可以的。然而,我们需要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将不会工作。