本文主要是通过部署一个tomcat 和nginx服务来测试最新版本ingress-nginx1.4.0的代理是否生效。

一、说明

基于nginx服务的ingress controller根据不同的开发公司,又分为k8s社区的ingres-nginx和nginx公司的nginx-ingress。k8s社区提供的ingress,github地址如下:
https://github.com/kubernetes/ingress-nginx。nginx社区提供的ingress,github地址如下:https://github.com/nginxinc/kubernetes-ingress。在此根据github上的活跃度和关注人数,我们选择的是k8s社区的ingres-nginx。

二、ingress-nginx的工作原理

ingress具体的工作原理如下:

  1. ingress contronler通过与k8s的api进行交互,动态地去感知k8s集群中ingress服务规则的变化,然后读取它,并按照定义的ingress规则,转发到k8s集群中对应的service。
  2. 而这个ingress规则写明了那个域名对应k8s集群中的哪个service,然后再根据ingress-controller中的nginx配置模板,生成一段对应的nginx配置。
  3. 然后再把该配置动态地写到ingress-controller的pod里,该ingress-controller的pod里面运行着一个nginx服务,控制器会把生成的nginx配置写入到nginx的配置文件中,然后reload一下,使其配置生效,以此来达到域名分配置及动态更新的效果。

三、部署方法

1、编写deployment,文件名为tomcat-nginx-deploy.yaml,脚本如下:

apiVersion: v1
kind: Namespace
metadata:
  name: dev
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: dev
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod 
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
        ports:
        - containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-deployment
  namespace: dev
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tomcat-pod
  template:
    metadata:
      labels:
        app: tomcat-pod
    spec:
      containers:
      - name: tomcat
        image: tomcat:8.5-jre10-slim
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: dev
spec:
  ports:
    - port: 80 #对外暴露 80 端口
      name: nginx
  clusterIP: None
  selector:
    app: nginx-pod #选择 nginx-pod 
---
apiVersion: v1
kind: Service
metadata:
  name: tomcat-service
  namespace: dev
spec:
  ports:
    - port: 8080 #对外暴露 8080 端口
      name: tomcat
  clusterIP: None
  selector:
    app: tomcat-pod #选择 tomcat-pod 

说明:

  • Deployment 部署tomcat:8.5-jre10-slim,nginx:1.17.1
  • Service 暴露 tomcat pod,nginx pod
  • 访问 http://tomcat.test.com 这个域名的 所有请求 / 都转发到 tomcat-service 上
  • 访问 http://nginx.test.com 这个域名的 所有请求 / 都转发到 nginx-service 上

2、编写ingress,文件名为
tomcat--nginx-ingress.yaml,脚本如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-http
  namespace: dev
spec:
  ingressClassName: nginx #需要指定 哪个 IngressClass
  rules:
  - host: nginx.test.com #所有的  nginx.test.com请求都转发到  Service nginx-service
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-service
            port:
              number: 80
  - host: tomcat.test.com #所有的  tomcat.test.com请求都转发到  Service tomcat-service
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: tomcat-service
            port:
              number: 8080

3、部署deployment、ingress,命令如下:

kubectl apply -f tomcat-nginx-deploy.yaml
kubectl apply -f tomcat-nginx-ingress.yaml

截图如下:

4、查看部署情况

可以看到刚才部署的deployment,pod,svc等资源已经开始running.命令如下:

kubectl get all -n dev

查看tomcat,nginx的pod日志,命令如下:

kubectl logs -f --tail=200 tomcat-deployment-7db86c59b7- jt416 -n dev
kubectl logs -f --tail=200 nginx-deployment-5ffc5bf56c-4rxvn -n dev

5、测试部署是否成功

由于我们的ingress资源配置的域名是http://tomcat.test.com,http://nginx.test.com,所以我们需要把它添加到宿主机的hosts 文件中,如下:

按照预期:当我们访问http://tomcat.test.com的时候其实就是访问192.168.10.7上的 ingress-nginx-controller 这个nginx,那么根据 ingress 的 资源的设定它会把请求 转发到tomcat-service 上,从而访问到 tomcat 界面;

当我们访问 http://nginx.test.com的时候其实就是访问 192.168.10.7上的 ingress-nginx-controller 这个nginx,那么根据 ingress 的 资源的设定它会把请求 转发到nginx-service 上,从而访问到 nginx界面。

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐