Kubernetes的Ingress
前言
如果我们想让外部可以访问Pod,需要通过SVC的NodePort模式暴露IP+端口号来实现。
- 在每个节点上都会启动端口
- 在访问的时候通过任何节点,通过IP+端口号就能实现
但NodePort还存在这一些缺陷
- 端口不能重复,所以每个端口只能用一次,一个端口对应一个应用
- 实际访问都是通过域名,根据不同域名跳转到不同端口服务中
Ingress和Pod的关系
Pod和Ingress是通过Service进行关联的,而Ingress作为统一入口,由Service管理一组Pod。
- 首先SVC通过label标签关联一组Pod
- 然后Ingress作为入口,首先需要关联到SVC,然后发现一组Pod
- 发现Pod以后,就可以做负载均衡
Ingress工作流程
在实际访问中,我们需要维护很多域名,a.com,b.com。然后不同的域名对应不同的SVC,然后SVC管理不同的Pod
注意:
Ingress不是内置组件,需要我们单独安装Ingress插件
部署使用Ingress
这里我们使用Ingress-Nignx
- 安装Ingress Controller
- 创建Ingress规则(通过标签发现)
首先创建一个Nginx的Deployment和SVC和Tomcat的Deployent和SVC
## nginx-deployment的yaml
cat dep-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
run: nginx
replicas: 2
template:
metadata:
labels:
run: nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
## tomcat的deployment的yaml
cat dep-tomcat.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat
spec:
selector:
matchLabels:
run: tomcat
replicas: 2
template:
metadata:
labels:
run: tomcat
spec:
containers:
- name: tomcat
image: tomcat
ports:
- containerPort: 8080
## nginx的svc
cat svc-nginx.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: web
name: nginx
spec:
ports:
- port: 80
name: web-nginx
type: NodePort
selector:
run: nginx
## tomcat的svc
apiVersion: v1
kind: Service
metadata:
labels:
app: web
name: tomcat
spec:
ports:
- port: 80
name: web-tomcat
targetPort: 8080
type: NodePort
selector:
run: tomcat
引用yaml文件
kubectl apply -f dep-nginx.yaml dep-tomcat.yaml nginx-svc.yaml tomcat-svc.yaml
kubectl get svc,pod
kubectl get pod -o wide
kubectl describe svc nginx
kubectl describe svc tomcat
可以看到已经部署成功了,并且SVC已经和Pod关联成功
部署Ingress-Nginx
##插件yaml
cat mandatory.yaml
apiVersion: v1
kind: Namespace
metadata:
name: ingress-nginx
labels:
app.kubernetes.io/name: in