ingress-nginx 使用

官方文档

https://kubernetes.github.io/ingress-nginx/

master 最新 mandatory 下载地址
https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml

ingress-nginx的暴露方式

官方文档

https://kubernetes.github.io/ingress-nginx/deploy/baremetal/

Deployment+LoadBalancer模式的Service

如果要把ingress部署在公有云,那用这种方式比较合适。用Deployment部署ingress-controller,创建一个type为LoadBalancer的service关联这组pod。大部分公有云,都会为LoadBalancer的service自动创建一个负载均衡器,通常还绑定了公网地址。只要把域名解析指向该地址,就实现了集群服务的对外暴露。

Deployment+NodePort模式的Service

同样用deployment模式部署ingress-controller,并创建对应的服务,但是type为NodePort。这样,ingress就会暴露在集群节点ip的特定端口上。由于nodeport暴露的端口是随机端口,一般会在前面再搭建一套负载均衡器来转发请求。该方式一般用于宿主机是相对固定的环境ip地址不变的场景。
NodePort方式暴露ingress虽然简单方便,但是NodePort多了一层NAT,在请求量级很大时可能对性能会有一定影响。

DaemonSet+HostNetwork+nodeSelector

用DaemonSet结合nodeselector来部署ingress-controller到特定的node上,然后使用HostNetwork直接把该pod与宿主机node的网络打通,直接使用宿主机的80/433端口就能访问服务。这时,ingress-controller所在的node机器就很类似传统架构的边缘节点,比如机房入口的nginx服务器。该方式整个请求链路最简单,性能相对NodePort模式更好。缺点是由于直接利用宿主机节点的网络和端口,一个node只能部署一个ingress-controller pod。比较适合大并发的生产环境使用。

这里讲2和3 方式

NodePort模式

kubectl apply -f mandatory.yaml

vi service.yaml

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  type: NodePort
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
      nodePort: 30080
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP
      nodePort: 30443
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

kubectl apply -f service.yaml

这里添加了一个service 对外 用nodeport 方式暴露端口。 这样定义的dns就可以在外面通过 http://test.server.com:nodeport 方式访问。(外部主机要添加dns 解析地址为 k8s 集群任意主机地址)

HostNetwork模式

这可以通过启用hostNetworkPods规范中的选项来实现。

template:
    spec:
      hostNetwork: true

在 mandatory.yaml 中对应位置添加上面信息。

kubectl apply -f mandatory.yaml

这样就会把 部署的节点直接暴露80和443端口。
没有部署的node 和k8s 主机不会暴露端口。
DNS解析地址也必须是部署的node 节点 ip。
外面通过 http://test.server.com 直接访问

示例

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
  - name: http
    port: 80
    targetPort: 80
  selector:
    k8s-app: nginx
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: nginx
  template:
    metadata:
      labels:
        k8s-app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-nginx
  namespace: default
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: test.server.com
    http:
      paths:
      - path:
        backend:
          serviceName: nginx
          servicePort: 80

外部直接通过 test.server.com 域名就能访问到 pod

查看具体信息

[root@master ~]# kubectl get pod
NAME                            READY   STATUS    RESTARTS   AGE
nginx-689d5cb88-5mprj           1/1     Running   0          4m
[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
nginx        ClusterIP   10.22.79.59     <none>        80/TCP    4m
[root@master ~]# kubectl get ing
NAME            HOSTS             ADDRESS   PORTS   AGE
ingress-nginx   test.server.com             80      4m