用于节点端口的K8s Ingres。初学者示例

时间:2019-10-08 05:57:47

标签: kubernetes kubernetes-ingress

你能帮我吗?我想为节点端口部署Ingres。但我不知道这是否可能?

我试图在Google中找到一些信息,但是我获得了用于负载平衡的Ingress或一些困难的示例(例如在轨道上的Ingress Ruby等)。

2 个答案:

答案 0 :(得分:2)

我将在下面尝试提供最简单的示例。在我的示例中,将使用nginxdemos/hello码头工人形象。在本地这是这样的:

$docker run -p 80:80 -d nginxdemos/hello    
...
$curl -I http://localhost

HTTP/1.1 200 OK
Server: nginx/1.13.8
Date: Tue, 08 Oct 2019 06:14:52 GMT
Content-Type: text/html
Connection: keep-alive
Expires: Tue, 08 Oct 2019 06:14:51 GMT
Cache-Control: no-cache

很酷。这是我们的后端部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-backend
  namespace: java2days
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-server
  template:
    metadata:
      labels:
        app: nginx-server
    spec:
      containers:
        - name: nginx-server
          image: nginxdemos/hello
          ports:
            - containerPort: 80
              name: server-port
          livenessProbe:
            httpGet:
              path: /
              port: 80
            initialDelaySeconds: 15
            periodSeconds: 15
            timeoutSeconds: 3
          readinessProbe:
            httpGet:
              path: /
              port: 80
            initialDelaySeconds: 15
            periodSeconds: 15
            timeoutSeconds: 3

不久,我们将有2个nginx服务器的副本。在云中某处的节点上启动并运行:

$kubectl get pods

NAME                            READY   STATUS    RESTARTS   AGE
nginx-backend-dfcdb9797-dnx7x   1/1     Running   0          21m
nginx-backend-dfcdb9797-pnrhn   1/1     Running   0          21m

让我们现在创建一个NodePort服务。这是服务yaml:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: java2days
spec:
  ports:
    - port: 80
      protocol: TCP
      targetPort: 80
      name: http
  selector:
    app: nginx-server
  type: NodePort

请注意选择器,它与后端服务匹配。现在该到入口控制器了。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
  namespace: java2days
spec:
  rules:
    - http:
        paths:
          - backend:
              serviceName: nginx-service
              servicePort: 80
            path: /*

您将需要等待大约5-10分钟,直到GCloud为该Ingress设置IP地址。终于完成了,就像这样:

$kubectl get ingress

NAME            HOSTS   ADDRESS         PORTS   AGE
nginx-ingress   *       x.y.z.p         80      15m

现在从本地计算机上

$curl -I http://x.y.z.p

HTTP/1.1 200 OK

很好,它正在工作。如果您在浏览器中将其打开并刷新多次,则会看到服务器ID更改并且负载平衡正常工作。阅读的附加入口点-here

完成实验后,别忘了清理资源。

答案 1 :(得分:0)

入口背后的想法是,您需要使用入口控制器,如何公开入口控制器完全取决于您,就像您使用Kubernetes服务来公开它一样,例如,如果要在节点端口上使用入口您的结构类似于:


service exposing nodeport ==> ingress controller ==> web app service (via ingress) ==> web app

这是一般流程,因为无论如何公开入口控制器(LoadBalancer,NodePort等),路由通常基于主机名,即如果我的NodePort在172.64.0.25:30965中公开,那么我会将我的域指向该IP,并根据与之路由的主机进行入口路由。 here上有很多文档(这是针对Nginx入口控制器的,但是所有入口路由都非常相似)