在 nginx 反向代理后面运行的 Kubernetes Ingress

Ant*_*era 7 nginx kubernetes minikube

我已经在可以从 Internet 访问的服务器上安装了 minikube。

我创建了一个可用的 kubernetes 服务:

>kubectl get service myservice
NAME        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
myservice   10.0.0.246   <nodes>       80:31988/TCP   14h
Run Code Online (Sandbox Code Playgroud)

minikube的IP地址为:

>minikube ip
192.168.42.135
Run Code Online (Sandbox Code Playgroud)

我希望 URL http://myservice.myhost.com(即端口 80)映射到 minikube 中的服务。

我在主机上运行了 nginx(与 kubernetes 完全无关)。我可以设置一个虚拟主机,将 URL 映射到192.168.42.135:31988(节点端口)并且它工作正常。

我想使用入口。我已经添加并启用了入口。但我不确定:

a) yaml 文件应该包含什么

b) 来自浏览器的端口 80 上的传入流量如何重定向到入口和 minikube。

c) 我还需要使用 nginx 作为反向代理吗?

d) 如果是这样,运行 ingress-nginx 的地址是什么(以便我可以将流量映射到它)?

sil*_*fox 5

设置

首先,您需要一个nginx 入口控制器

nginx 实例将侦听主机 80 和 443 端口,并将每个 HTTP 请求重定向到入口配置定义的服务,如下所示。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-service-ingress
annotations:
  # by default the controller redirects (301) HTTP to HTTPS,
  # the following would make it disabled.
  # ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: myservice
          servicePort: 80
Run Code Online (Sandbox Code Playgroud)

使用https://{host-ip}/要访问的MyService,主机应该在哪里nginx的控制器在运行一个。

外部

通常你不需要 Kubernetes 集群之外的另一个 nginx。

Minikube 有点不同,它在虚拟机而不是主机中运行 kubernetes。

我们需要做一些端口转发,比如 host:80 => minikube:80,在主机中运行反向代理(比如 nginx)是一种优雅的方式。

也可以通过在 Virtualbox 中设置虚拟网络端口转发来完成。


Ant*_*era 5

正如@silverfox 所说,您需要一个入口控制器。您可以像这样在 minikube 中启用入口控制器:

minikube addons enable ingress
Run Code Online (Sandbox Code Playgroud)

根据 ,Minikube 运行在 IP 192.168.42.135 上minikube ip。启用入口插件后,它也会监听端口 80。但这意味着主机上需要像 nginx 这样的反向代理,以代理对端口 80 的调用到 minikube。

在 minikube 上启用 ingress 后,我创建了一个 ingress 文件(myservice-ingress.yaml):

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: myservice-ingress
  annotations:
    ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: myservice.myhost.com
      http:
        paths:
        - path: /
          backend:
            serviceName: myservice
            servicePort: 80
Run Code Online (Sandbox Code Playgroud)

请注意,这与 @silverfox 给出的答案不同,因为它必须包含应该匹配的“主机”。

使用此文件,我创建了入口:

kubectl create -f myservice-ingress.yaml
Run Code Online (Sandbox Code Playgroud)

最后,我向 nginx 添加了一个虚拟主机(在 minikube 外部运行),以代理从外部到 minikube 的流量:

server {
  listen 80;
  server_name myservice.myhost.com;
  location / {
    proxy_set_header Host            $host;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_pass http://192.168.42.135;
  }
}
Run Code Online (Sandbox Code Playgroud)

Host头必须通过,因为入口使用它来匹配服务。如果没有通过,minikube 就无法将请求匹配到服务。

上面添加虚拟主机后记得重启nginx。