ToB企服应用市场:ToB评测及商务社交产业平台

标题: Kubernetes Ingress [打印本页]

作者: 圆咕噜咕噜    时间: 昨天 06:10
标题: Kubernetes Ingress
目录

一、为什么须要 Ingress

我们利用传统的NodePort类型的Service的确能将集群内的服务袒露给集群外部客户端去访问,但是利用这种类型的Service存在以下问题:
为相识决这种需求,提供了一种高级的流量管理,也就Ingress和Ingress Controller,kubernetes利用Ingress Controller来接收所有入口的流量,然后通过Ingress资源来定义流量如何区分,以及如何转发的规则。有了Ingress和Ingress控制器。我们就可以直接定义流量转发规则来发布服务,而无需创建许多的NodePort和LoadBalancer类型的Service。

二、什么是Ingress,Ingress Controller

Ingress 是 Kubernetes 中的一个 API 对象,用于定义集群内部服务的外部可访问性。简而言之,Ingress 是用来描述如何将外部哀求路由到集群内部的服务的规则聚集。Ingress 提供了一种定义 HTTP 路由规则的方式,使得外部客户端可以通过一个同一的入口点访问集群内部的服务。

Ingress相当于一个7层的负载均衡器,是kubernetes对反向代理的一个抽象,它的工作原理类 似于Nginx,可以理解成在Ingress里创建诸多映射规则,Ingress Controller通过监听这些配置规则并 转化成Nginx的反向代理配置 , 然后对外部提供服务。
在这里有两个核心概念:
三、Ingress 的工作原理

Ingress(以Nginx为例)的工作原理如下:

四、Ingress 配置资源模版
  1. apiVersion: networking.k8s.io/v1   # 资源所属的API群组和版本
  2. kind: Ingress   # 资源类型
  3. metadata:   # 元数据
  4.      name:  <string>   # 资源名称
  5. namespace: <string>  # 命名空间
  6. spec:     
  7.    ingressClassName: "nginx"   # 适用的Ingress控制器类别,须明确指明
  8.    rules: <[]object>    # Ingress规则列表
  9.    - host: <string>      # 虚拟主机的FQDN,俗称域名
  10.      http: <object>
  11.    paths: <[]object>      # 虚拟主机的PATH定义列表
  12.    - path: <string>    # 匹配以什么开头类似于nginx中的location
  13.   pathType: <string>    # Prefix前缀匹配,不区分大小写 Exact。精确匹配URL,区分大小写
  14.   backend: <object>     # 后端
  15.       service: <object>   #关联后端的Service
  16.       name: <string>   # 后端Service的名称
  17.   port: <object>   #后端Service的端口
  18.      name:      # 端口名称
  19. number:   # 端口号
复制代码
五、实例

1、搭建 Ingress 情况

1.1、Ingress-Nginx官网地点
  1. #Ingress-Nginx 官网地址
  2. https://kubernetes.github.io/ingress-nginx/
  3. #Ingress-Nginx GitHub地址
  4. https://github.com/kubernetes/ingress-nginx
复制代码
1.2、master 节点下载 deploy.yaml
  1. wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.4/deploy/static/provider/baremetal/deploy.yaml
复制代码

1.3、所有节点提前 pull 必须的镜像
  1. docker pull registry.cn-hangzhou.aliyuncs.com/eagleslab/service:ingresswebhook111
  2. docker tag c41e9fcadf5a k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1
  3. docker pull registry.cn-hangzhou.aliyuncs.com/eagleslab/service:ingresscontroller104
  4. docker tag a9f76bcccfb5 k8s.gcr.io/ingress-nginx/controller:v1.0.4
复制代码
1.4、修改并应用 deploy.yaml 文件

如果是提前pull的镜像,要删除掉deploy.yaml中对镜像sha256的查抄,在image标签中,删除 @sha256到行尾
  1. sed -i 's/@sha256:.*//g' deploy.yaml
  2. kubectl apply -f deploy.yaml
复制代码

1.5、查看 ingress-nginx
  1. kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
复制代码

1.6、查看 service
  1. kubectl get svc -n ingress-nginx
复制代码

2、准备 service 和 pod


2.1、创建 nginx 和 tomcat 的 Deployment
  1. apiVersion: v1
  2. kind: Namespace
  3. metadata:
  4.   name: dev
  5.   
  6. ---
  7. apiVersion: apps/v1
  8. kind: Deployment
  9. metadata:
  10.   name: nginx-deployment
  11.   namespace: dev
  12. spec:
  13.   replicas: 3
  14.   selector:
  15.     matchLabels:
  16.       app: nginx-pod
  17.   template:
  18.     metadata:
  19.       labels:
  20.         app: nginx-pod
  21.     spec:
  22.       containers:
  23.       - name: nginx
  24.         image: nginx:1.17.1
  25.         ports:
  26.         - containerPort: 80
  27. ---
  28. apiVersion: apps/v1
  29. kind: Deployment
  30. metadata:
  31.   name: tomcat-deployment
  32.   namespace: dev
  33. spec:
  34.   replicas: 3
  35.   selector:
  36.     matchLabels:
  37.       app: tomcat-pod
  38.   template:
  39.     metadata:
  40.       labels:
  41.         app: tomcat-pod
  42.     spec:
  43.       containers:
  44.       - name: tomcat
  45.         image: tomcat:8.5-jre10-slim
  46.         ports:
  47.         - containerPort: 8080
  48. ---
  49. apiVersion: v1
  50. kind: Service
  51. metadata:
  52.   name: nginx-service
  53.   namespace: dev
  54. spec:
  55.   selector:
  56.     app: nginx-pod
  57.   clusterIP: None
  58.   type: ClusterIP
  59.   ports:
  60.   - port: 80
  61.     targetPort: 80
  62. ---
  63. apiVersion: v1
  64. kind: Service
  65. metadata:
  66.   name: tomcat-service
  67.   namespace: dev
  68. spec:
  69.   selector:
  70.     app: tomcat-pod
  71.   clusterIP: None
  72.   type: ClusterIP
  73.   ports:
  74.   - port: 8080
  75.     targetPort: 8080
复制代码
2.2、创建并查看对应 svc,pod
  1. kubectl apply -f tomcat-nginx.yaml
  2. kubectl get pods,svc -n dev
复制代码

3、HTTP代理

3.1、创建 ingress-http.yaml

ingressClassName: nginx
利用 nginx 的 IngressClass(关联的 ingress-nginx 控制器)
  1. apiVersion: networking.k8s.io/v1
  2. kind: Ingress
  3. metadata:
  4.   name: ingress-nginx
  5.   namespace: dev
  6. spec:
  7.   rules:
  8.   - host: nginx.bbj1030.cn
  9.     http:
  10.       paths:
  11.       - path: /
  12.         pathType: Prefix
  13.         backend:
  14.           service:
  15.             name: nginx-service
  16.             port:
  17.               number: 80
  18.   ingressClassName: nginx
  19. ---
  20. apiVersion: networking.k8s.io/v1
  21. kind: Ingress
  22. metadata:
  23.   name: ingress-tomcat
  24.   namespace: dev
  25. spec:
  26.   rules:
  27.   - host: tomcat.bbj1030.cn
  28.     http:
  29.       paths:
  30.       - path: /
  31.         pathType: Prefix
  32.         backend:
  33.           service:
  34.             name: tomcat-service
  35.             port:
  36.               number: 8080
  37.   ingressClassName: nginx
复制代码
3.2、应用并查看
  1. kubectl get ing -n dev
复制代码
  1. kubectl describe ing -n dev
复制代码

3.3、本地电脑配置 hosts 解析

将以上 nginx.bbj1030.cn 和 tomcat.bbj1030.cn 解析到 master 节点 192.168.112.10上
  1. 192.168.112.10 nginx.bbj1030.cn
  2. 192.168.112.10 tomcat.bbj1030.cn
复制代码

3.4、通过域名+端口号查看
  1. nginx.bbj1030.cn:32596
  2. tomcat.bbj1030.cn:32596
复制代码



4、HTTPS代理

4.1、生成证书
  1. openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/C=CN/ST=BJ/L=BJ/O=nginx/CN=bbj1030.cn"
复制代码
4.2、创建密钥
  1. kubectl create secret tls tls-secret --key tls.key --cert tls.crt
复制代码

4.3、创建ingress-https.yaml
  1. apiVersion: networking.k8s.io/v1
  2. kind: Ingress
  3. metadata:
  4.   name: https-nginx
  5.   namespace: dev
  6. spec:
  7.   tls:
  8.     - hosts:
  9.       - nginx.bbj1030.cn
  10.       secretName: tls-secret # 指定秘钥
  11.   rules:
  12.   - host: nginx.bbj1030.cn
  13.     http:
  14.       paths:
  15.       - path: /
  16.         pathType: Prefix
  17.         backend:
  18.           service:
  19.             name: nginx-service
  20.             port:
  21.               number: 80
  22.   ingressClassName: nginx
  23. ---
  24. apiVersion: networking.k8s.io/v1
  25. kind: Ingress
  26. metadata:
  27.   name: tomcat-https
  28.   namespace: dev
  29. spec:
  30.   tls:
  31.     - hosts:
  32.       - tomcat.bbj1030.cn
  33.       secretName: tls-secret # 指定秘钥
  34.   rules:
  35.   - host: tomcat.bbj1030.cn
  36.     http:
  37.       paths:
  38.       - path: /
  39.         pathType: Prefix
  40.         backend:
  41.           service:
  42.             name: tomcat-service
  43.             port:
  44.               number: 8080
  45.   ingressClassName: nginx
复制代码
4.4、应用并查看

须要先删除之前创建的 ingress 否则会报错
  1. kubectl delete -f ingress-http.yaml
  2. kubectl apply -f ingress-https.yaml
复制代码
  1. kubectl get ing -n dev
  2. kubectl describe ing -n dev
复制代码

4.5、通过 https://域名+端口号 访问
  1. https://nginx.bbj1030.cn:31563
  2. https://tomcat.bbj1030.cn:31563
复制代码



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4