k8s1.17-Ingress http代理案例

案例

为了实验方便,创建如下图所示的模型

创建pod

创建配置文件

创建配置文件

vim tomcat-nginx.yaml

按 i 键

复制粘贴下面内容:

apiVersion: apps/v1
kind: Deployment # 第一个控制器配置
metadata:
  name: nginx-deployment # 控制器名
  namespace: test
spec:
  replicas: 3 # 3个副本
  selector:
    matchLabels:
      app: nginx-pod # 该控制器 控制 下面 标签是 app: nginx-pod 的pod
  template: # pod 模板,是对pod的配置
    metadata:
      labels:
        app: nginx-pod # 指定标签
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1 # nginx 镜像
        ports:
        - containerPort: 80 # 容器端口

---

apiVersion: apps/v1
kind: Deployment # 第二个控制器配置
metadata:
  name: tomcat-deployment # 控制器名
  namespace: test
spec:
  replicas: 3 # 3个副本
  selector:
    matchLabels:
      app: tomcat-pod # 该控制器 控制 下面 标签是 app: tomcat-pod 的pod
  template: # pod 模板,是对pod的配置
    metadata:
      labels:
        app: tomcat-pod # 指定标签
    spec:
      containers:
      - name: tomcat
        image: tomcat:8.5-jre10-slim # tomcat镜像,使用此版本有首页
        ports:
        - containerPort: 8080 # 容器端口

---

apiVersion: v1
kind: Service # service 配置
metadata:
  name: nginx-service
  namespace: test
spec:
  selector:
    app: nginx-pod # 选择 上面 标签是 app: nginx-pod 的 pod
  clusterIP: None # service的固定ip,不写就随机分配
  type: ClusterIP # 网络类型,只能集群内访问
  ports:
  - port: 80 # service 端口
    targetPort: 80 # 转发给 pod 的端口

---

apiVersion: v1
kind: Service # service 配置
metadata:
  name: tomcat-service
  namespace: test
spec:
  selector:
    app: tomcat-pod # 选择 上面 标签是 app: tomcat-pod 的 pod
  clusterIP: None # service的固定ip,不写就随机分配
  type: ClusterIP # 网络类型,只能集群内访问
  ports:
  - port: 8080 # service 端口
    targetPort: 8080 # 转发给 pod 的端口

按 esc,:wq 保存退出

创建

kubectl create -f tomcat-nginx.yaml

查看

kubectl get svc -n test

执行结果如下:

NAME             TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
nginx-service    ClusterIP   None         <none>        80/TCP     48s
tomcat-service   ClusterIP   None         <none>        8080/TCP   48s

Http代理

Ingress规则编写

创建ingress-http.yaml

vim ingress-http.yaml

按 i 键

复制粘贴下面内容:

apiVersion: extensions/v1beta1
kind: Ingress # 配置 Ingress
metadata:
  name: ingress-http # Ingress 名字
  namespace: test # 所在命名空间
spec:
  rules:
  - host: nginx.myserver # 域名,必须指定
    http: # 使用 http 协议
      paths:
      - path: / # 上下文,访问 http://nginx.myserver:端口
        backend:
          serviceName: nginx-service # 将请求转发给上面 service 名字是 nginx-service 的 pod
          servicePort: 80 # 该 service 端口
  - host: tomcat.myserver # 域名,必须指定
    http: # 使用 http 协议
      paths:
      - path: / # 上下文,访问 http://tomcat.myserver:端口
        backend:
          serviceName: tomcat-service # 将请求转发给上面 service 名字是 tomcat-service 的 pod
          servicePort: 8080 # 该 service 端口

创建 Ingress

kubectl create -f ingress-http.yaml

执行结果如下表示成功:

ingress.extensions/ingress-http created

查看 Ingress

kubectl get ing ingress-http -n test

执行结果如下:

NAME           HOSTS                            ADDRESS        PORTS   AGE
ingress-http   nginx.myserver,tomcat.myserver   10.108.196.2   80      14s

解释:

  • HOSTS 是 *,这里没有配置域名,所以显示 8
  • ports 是 80,因为上面配置 Ingress 中,是 http 的配置,所以显示 80

查看详情

kubectl describe ing ingress-http  -n test

执行结果:

Name:             ingress-http
Namespace:        test
Address:          10.108.196.2
Default backend:  default-http-backend:80 (<none>)
Rules:
  Host             Path  Backends
  ----             ----  --------
  nginx.myserver
                   /   nginx-service:80 (10.244.1.24:80,10.244.2.10:80,10.244.2.11:80)
  tomcat.myserver
                   /   tomcat-service:8080 (10.244.1.23:8080,10.244.1.25:8080,10.244.2.12:8080)
Annotations:
  kubectl.kubernetes.io/last-applied-configuration:  {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{},"name":"ingress-http","namespace":"test"},"spec":{"rules":[{"host":"nginx.myserver","http":{"paths":[{"backend":{"serviceName":"nginx-service","servicePort":80},"path":"/"}]}},{"host":"tomcat.myserver","http":{"paths":[{"backend":{"serviceName":"tomcat-service","servicePort":8080},"path":"/"}]}}]}}

Events:
  Type    Reason  Age                    From                      Message
  ----    ------  ----                   ----                      -------
  Normal  UPDATE  6m47s (x2 over 3h18m)  nginx-ingress-controller  Ingress test/ingress-http

解释:

  • 访问 http://nginx.myserver:ingress 的 service端口,就将请求转发给 nginx-service:80 (10.244.1.24:80,10.244.2.10:80,10.244.2.11:80)

  • 访问 http://tomcat.myserver:ingress 的 service端口/tomcatser,就将请求转发给 tomcat-service:80 (10.244.1.23:8080,10.244.1.25:8080,10.244.2.12:8080)

修改hosts文件

必须通过域名才能访问服务,所以要修改 windows 的 hosts 文件,增加下面配置:

# 访问该域名,是访问 master 服务器
192.168.58.101 nginx.myserver

# 访问该域名,是访问 node1 服务器
192.168.58.102 tomcat.myserver

访问

在本地电脑上访问:

http://nginx.myserver:32099 访问nginx服务
http://tomcat.myserver:32099 访问tomcat服务

提示: 32099 是 ingress 的 service端口,可通过下面命令查看:

kubectl get svc -n ingress-nginx

原文出处:/show_1IX6LWUhwW96.html