诞生
通常情况下,service和pod的IP仅可在集群内部访问
k8s提供了service方式:NodePort 来提供对外的服务,外部的服务可以通过访问Node节点ip+NodePort端口来访问集群内部的资源,外部的请求先到达service所选中的节点上,然后负载均衡到每一个节点上.
NodePort虽然提供了对外的方式但也有很大弊端:
- 由于service的实现方式:user_space 、iptebles、 3 ipvs、方式这三种方式只支持在4层协议通信,不支持7层协议,因此NodePort不能代理https服务.
- NodePort 需要暴露service所属每个node节点上端口,当需求越来越多,端口数量过多,导致维护成本过高,并且集群不好管理。
原理
Ingress也是Kubernetes API的标准资源类型之一,它其实就是一组基于DNS名称(host)或URL路径把请求转发到指定的Service资源的规则。用于将集群外部的请求流量转发到集群内部完成的服务发布。我们需要明白的是,Ingress资源自身不能进行“流量穿透”,仅仅是一组规则的集合,这些集合规则还需要其他功能的辅助,比如监听某套接字,然后根据这些规则的匹配进行路由转发,这些能够为Ingress资源监听套接字并将流量转发的组件就是Ingress Controller。
Ingress 控制器不同于Deployment 等pod控制器的是,Ingress控制器不直接运行为kube-controller-manager的一部分,它仅仅是Kubernetes集群的一个附件,类似于CoreDNS,需要在集群上单独部署。
ingress controller通过监视api server获取相关ingress、service、endpoint、secret、node、configmap对象,并在程序内部不断循环监视相关service是否有新的endpoints变化,一旦发生变化则自动更新nginx.conf模板配置并产生新的配置文件进行reload
部署ingress controller
# ingress controller 安装配置文件
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud-generic.yaml
#替换yaml配置文件中的镜像
sed -i "s#quay.io/kubernetes-ingress-controller#registry.aliyuncs.com/google_containers#g" mandatory.yaml
#安装
kubectl apply -f mandatory.yaml
如果需要部署多个ingress controller 可以修改mandatory.yaml中的Deployment为DaemonSet
kubectl get ns
[root@master ingress]# kubectl get ns
NAME STATUS AGE
default Active 9d
ingress-nginx Active 47h
kube-node-lease Active 9d
kube-public Active 9d
kube-system Active 9d
kubectl get pods -n ingress-nginx
[root@master ingress]# kubectl get pods -n ingress-nginx
NAME READY STATUS RESTARTS AGE
nginx-ingress-controller-74ccc4fb-hzzs2 1/1 Running 0 47h
添加Service 以nodeport的形式(不指定时为随机端口)
[root@master ingress]# cat service-nodeport.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
- name: https
port: 443
targetPort: 443
protocol: TCP
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
# 也可以直接下载官方的
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/service-nodeport.yaml
#部署service
kubectl apply -f service-nodeport.yaml
创建后端ingress后端服务
#创建一个serveice关联三个pods pod控制器为 Deployment
[root@master ingress]# cat deploy-demo.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
selector:
app: myapp
release: canary
ports:
- name: http
targetPort: 80
port: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-backend-pod
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
labels:
app: myapp
release: canary
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v2
ports:
- name: http
containerPort: 80
kubectl apply -f deploy-demo.yaml
将创建的nginx服务关联到ingress-nginx中
[root@master ingress]# cat ingress-myapp.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: myapp-ingress
namespace: default
spec:
rules:
- host: myapp.test.com
http:
paths:
- path: ##可以加url路径来区分多个服务
backend:
serviceName: myapp
servicePort: 80
kubectl apply -f ingress-myapp.yaml
浏览器测试
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。