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