13-k8s-ingress网络

文章目录

一、ingress介绍

  1. Service对集群之外暴露服务的主要方式有两种:NotePort和LoadBalancer,但是这两种方式,都有一定的缺点

    1)NodePort方式的缺点是会占用很多集群机器的端口,那么当集群服务变多的时候,这个缺点就愈发明显

    2)LB方式的缺点是每个service需要一个LB,浪费、麻烦,并且需要kubernetes之外设备的支持

    基于这种现状,kubernetes提供了Ingress资源对象,Ingress只需要一个NodePort或者一个LB就可以满足暴露多个Service的需求

  2. ingress相关涉及概念

    1)ingress:kubernetes中的一个对象,作用是定义请求如何转发到service的规则

    2)ingress controllel:具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发,实现方式有很多,比如Nginx, Contour, Haproxy等等

  3. ingress工作机制

    Ingress相当于一个七层的负载均衡器,是kubernetes对反向代理的一个抽象,它的工作原理类似于Nginx。原理是安装完ingress后,在Ingress Service中定义哪个域名对应kubernetes集群中的哪个Service,Ingress Controller通过监听这些映射规则并转化为Nginx(或Contour、Haproxy)的反向代理配置,并将反向代理配置写入这些Nginx(或Contour、Haproxy)服务,最后由Nginx(或Contour、Haproxy)对外提供服务

二、创建nginx和tomcat供测试

  1. 创建空间:kubectl create ns ingress-nginx

  2. 创建nginx pod和tomcat的pod

    1)编写yaml文件:vi /opt/nginx-tomcat-deployment.yaml

    java 复制代码
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      namespace: ingress-nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx-pod
      template:
        metadata:
          labels:
            app: nginx-pod
        spec:
          containers:
            - name: nginx-container
              image: nginx:latest
              ports:
                - name: nginx-port
                  containerPort: 80
                  protocol: TCP
    
    ---
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: tomcat-deployment
      namespace: ingress-nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: tomcat-pod
      template:
        metadata:
          labels:
            app: tomcat-pod
        spec:
          containers:
            - name: tomcat-container
              image: tomcat:8.5-jre10-slim
              ports:
                - name: tomcat-port
                  containerPort: 8080
                  protocol: TCP
    java 复制代码
    apiVersion: 定义所使用的Kubernetes API的版本,这里是"apps/v1"。
    kind: 定义资源的类型,这里是"Deployment"。
    metadata: 元数据,用于描述该Deployment的属性。
    	name: 定义Deployment的名称为"tomcat-deployment"。
    	namespace: 定义Deployment所属的命名空间为"dev"。
    spec: Deployment的规格,指定了Deployment的配置选项。
    	replicas: 定义要创建的Pod的副本数量,这里是3个。
    	selector: 用于选择要管理的Pod的标签。
    		matchLabels: 匹配标签的列表,这里选择带有"app: tomcat-pod"标签的Pod。
    	template: 定义要创建的Pod的模板。
    		metadata: Pod的元数据,用于描述Pod的属性。
    			labels: 为Pod添加的标签,这里是"app: tomcat-pod"。
    		spec: Pod的规格设置。
    			containers: 定义Pod中的容器列表。
    				name: 容器的名称为"tomcat-container"。
    				image: 定义容器所使用的镜像为"tomcat:8.5-jre10-slim"。
    				ports: 定义容器暴露的端口列表。
    					name: 定义端口的名称为"tomcat-port"。
    					containerPort: 定义容器内部监听的端口号为8080。
    					protocol: 定义端口的协议为TCP。

    2)创建pod:kubectl apply -f /opt/nginx-tomcat-deployment.yaml

    3)查看创建的pod:kubectl get pod

  3. 准备Service

    1)新建nginx-tomcat.yaml文件:vi /opt/nginx-tomcat.yaml

    java 复制代码
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service
      namespace: ingress-nginx
    spec:
      selector:
        app: nginx-pod
      type: ClusterIP
      clusterIP: None
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: tomcat-service
      namespace: ingress-nginx
    spec:
      selector:
        app: tomcat-pod
      type: ClusterIP
      clusterIP: None
      ports:
        - protocol: TCP
          port: 8080
          targetPort: 8080
    java 复制代码
    apiVersion: 定义所使用的Kubernetes API的版本,这里是"v1"。
    kind: 定义资源的类型,这里是"Service",表示创建一个Service资源。
    metadata: 元数据,用于描述该Service的属性。
    	name: 定义Service的名称为"nginx-service"。
    	namespace: 定义Service所属的命名空间为"dev"。
    spec: Service的规格,指定了Service的配置选项。
    	selector: 用于选择要匹配的Pod的标签。
    		app: 对应Pod的标签为"nginx-pod"。
    	type: 定义Service的类型,这里是"ClusterIP",表示创建一个仅在集群内部访问的Service。
    	clusterIP: 定义Service的虚拟IP地址,这里设置为"None",表示不会分配一个可路由的IP地址给Service。
    	ports: 定义Service暴露的端口列表。
    		protocol: 定义端口的协议为TCP。
    		port: 定义Service暴露的端口号为80。
    		targetPort: 定义将流量转发到Pod的目标端口为80。

    2)创建pod:kubectl apply -f /opt/nginx-tomcat.yaml

    3)查看:kubectl get svc -n ingress-nginx

三、创建ingress-http

  1. 创建ingress

    1)新建ingress-http.yaml文件:vi /opt/ingress-http.yaml

    java 复制代码
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-http
      namespace: ingress-nginx
    spec:
      rules:
        - host: nginx.bulut.com
          http:
            paths:
              - path: /
                pathType: Exact
                backend:
                  service:
                    name: nginx-service
                    port:
                      number: 80  
        - host: tomcat.bulut.com
          http:
            paths:
              - path: /
                pathType: Exact
                backend:
                  service:
                    name: tomcat-service
                    port:
                      number: 8080
      ingressClassName: nginx
    java 复制代码
    apiVersion: 定义所使用的Kubernetes API的版本,这里是"networking.k8s.io/v1",表示使用了网络扩展API。
    kind: 定义资源的类型,这里是"Ingress",表示创建一个Ingress资源。
    metadata: 元数据,用于描述该Ingress的属性。
    	name: 定义Ingress的名称为"ingress-http"。
    	namespace: 定义Ingress所属的命名空间为"dev"。
        annotations: 
          kubernetes.io/ingress.class: "nginx"
          nginx.ingress.kubernetes.io/rewrite-target: /  #表示匹配的路径,匹配部分需要重写逻辑
    spec: Ingress的规格,指定了Ingress的配置选项。
    	rules: 定义Ingress规则的列表。
    		- host: 指定Ingress规则要匹配的主机名。
    			nginx.bulut.com: 匹配主机为"nginx.bulut.com"。
    			tomcat.bulut.com: 匹配主机为"tomcat.bulut.com"。
    		http: 指定该规则使用HTTP协议。
    			paths: 定义路径与后端服务之间的映射关系。
    				- path: 指定要映射的路径为"/",表示将该规则应用于所有路径。
    				pathType: 指定路径类型为"Exact",表示精确匹配路径。Prefix表示前缀匹配,通常跟rewrite-target组合使用。
    				backend: 指定要将流量转发到的后端服务。
    					service: 指定后端服务的名称。
    						name: 后端服务的名称分别为"nginx-service"和"tomcat-service"。
    						port: 指定要将流量转发到的后端服务的端口。
    							number: 后端服务的端口号分别为80和8080。

    2)创建pod:kubectl apply -f /opt/ingress-http.yaml

    3)查看:kubectl get ingress ingress-http -n ingress-nginx

    4)查看详情:kubectl describe ingress ingress-http -n ingress-nginx

  2. 查看ingress运行所在服务器:kubectl get pods -n ingress-nginx -o wide

四、yaml方式安装ingress

ps:master节点操作

  1. 切换路径:cd /opt

  2. 创建ingress-nginx

    1)下载ingress-nginx的yaml文件:wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/cloud/deploy.yaml

    2)修改yaml文件内容

    复制代码
    image: k8s.gcr.io/ingress-nginx/controller:v1.2.0@sha256:d8196e3bc1e72547c5dec66d6556c0ff92a23f6d0919b206be170bc90d5f9185
    
    image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
    
    image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660

    改为

    java 复制代码
    image: docker.io/dyrnq/controller:v1.2.0@sha256:d8196e3bc1e72547c5dec66d6556c0ff92a23f6d0919b206be170bc90d5f9185
    
       
    image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
    
    image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
    java 复制代码
    image: docker.io/dyrnq/controller:v1.2.0@sha256:d8196e3bc1e72547c5dec66d6556c0ff92a23f6d0919b206be170bc90d5f9185
    的备用地址:
    image: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.2.0@sha256:d8196e3bc1e72547c5dec66d6556c0ff92a23f6d0919b206be170bc90d5f9185
    可忽略

    3)创建pod:kubectl apply -f /opt/deploy.yaml

    4)查看ingress-nginx的pod:kubectl get pod -n ingress-nginx -o wide

    5)查看ingress-nginx的Service:kubectl get svc -n ingress-nginx

  3. 访问nginx和tomcat服务

    1)设置主机名映射:vi /etc/hosts

    ps:这里的ip取运行ingress-nginx-controller pod的节点,因为我都是在worker1运行的,所以取192.168.248.11

    java 复制代码
    192.168.248.11 tomcat.bulut.com
    192.168.248.11 nginx.bulut.com

    2)重置网络:service network restart

    3)查看ingress-nginx的Service开放的端口:kubectl get svc -n ingress-nginx

    4)访问nginx:curl http://nginx.bulut.com:32397

    5)访问tomcat:curl http://tomcat.bulut.com:32397

  4. 原理说明:可以将ingress-nginx的Service开放的端口,理解成是nginx的端口。然后根据域名进行匹配,就跟nginx的前缀匹配一样,进行反向代理。

  5. 本地连接测试

    1)查看ingress pod所在:kubectl describe pod ingress-nginx-controller-77d4dc6978-bq2xt -n ingress-nginx

    2)在本地的hosts文件配置映射

    java 复制代码
    192.168.248.11 tomcat.bulut.com
    192.168.248.11 nginx.bulut.com

    3)浏览器访问:http://nginx.bulut.com:32397/

  6. ingress默认使用的http 80;https 443;采用nodeport方式默认的端口暴露范围在 30000-32767。通过更改apiserver nodeport端口范围,达到更改ingress端口的作用。

    1)修改apiserver端口范围:vi /etc/kubernetes/manifests/kube-apiserver.yaml

    添加 --service-node-port-range=1-32767

    2)重新启动apiserver:kubectl delete pod kube-apiserver-master -n kube-system

    3)修改配置,更改ingress端口:vi /opt/ingress-service.yaml

    java 复制代码
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app.kubernetes.io/component: controller
        app.kubernetes.io/instance: ingress-nginx
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
        app.kubernetes.io/version: 1.2.0
      name: ingress-nginx-controller
      namespace: ingress-nginx
    spec:
      externalTrafficPolicy: Local
      ports:
      - appProtocol: http
        name: http
        port: 80
        nodePort: 80
        protocol: TCP
        targetPort: http
      - appProtocol: https
        name: https
        port: 443
        protocol: TCP
        targetPort: https
      selector:
        app.kubernetes.io/component: controller
        app.kubernetes.io/instance: ingress-nginx
        app.kubernetes.io/name: ingress-nginx
      type: LoadBalancer

    4)启动:kubectl apply -f /opt/ingress-service.yaml

    5)访问:http://tomcat.bulut.com/和http://nginx.bulut.com/

    ps:nginx.bulut.com和tomcat.bulut.com主机名需要跟ingress-nginx所在的主机ip做映射。

五、helm方式安装ingress(推荐)

  1. 卸载原来的ingress:kubectl delete -f /opt/deploy.yaml

  2. 搜索 ingress-nginx :helm search repo ingress-nginx

  3. 给节点设置标签,后面set设置ingress只能部署在 ingress=true的节点上:kubectl label node worker1 ingress=true

  4. 直接安装ingress

    ps:因为是从github拉取,所以很慢甚至拉不到。如果拉不到,直接跳过此步骤。如果可以,直接进入第11步

    java 复制代码
    helm install ingress-nginx ingress-nginx/ingress-nginx  -n  ingress-nginx --set controller.hostNetwork=true  --set controller.dnsPolicy=ClusterFirstWithHostNet     --set controller.kind=DaemonSet    --set controller.image.registry=registry.cn-hangzhou.aliyuncs.com  --set controller.image.image=google_containers/nginx-ingress-controller   --set controller.admissionWebhooks.patch.image.registry=registry.cn-hangzhou.aliyuncs.com  --set controller.admissionWebhooks.patch.image.image=google_containers/kube-webhook-certgen --set controller.admissionWebhooks.patch.image.tag="v1.8.1"    --set controller.nodeSelector.ingress="true"   --set controller.service.type=ClusterIP    --set controller.admissionWebhooks.enabled=false
  5. 在/opt/helm目录下拉取镜像

    java 复制代码
    cd /opt/helm
    helm pull ingress-nginx/ingress-nginx
  6. 解压:tar -zxvf ingress-nginx-4.7.1.tgz

  7. 进入解压目录:cd /opt/helm/ingress-nginx

  8. 修改配置文件:vi values.yaml

    ps:不同地方的修改点用------------隔开

    java 复制代码
    ------4------
    controller:
      name: controller
      image:
        ## Keep false as default for now!
        chroot: false
        registry: registry.cn-hangzhou.aliyuncs.com
        image: google_containers/nginx-ingress-controller
        ## for backwards compatibility consider setting the full image url via the repository value below
        ## use *either* current default registry/image or repository format or installing chart by providing the values.yaml will fail
        ## repository:
        tag: "v1.8.1"
        # digest: sha256:e5c4824e7375fcf2a393e1c03c293b69759af37a9ca6abdb91b13d78a93da8bd
        # digestChroot: sha256:e0d4121e3c5e39de9122e55e331a32d5ebf8d4d257227cb93ab54a1b912a7627
    ------2------
    dnsPolicy: ClusterFirstWithHostNet
    ------1------
    hostNetwork: true
    
    ------3------
    kind: DaemonSet
    
    
    -------5-----
        patch:
          enabled: true
          image:
            registry: registry.cn-hangzhou.aliyuncs.com
            image: google_containers/kube-webhook-certgen
            ## for backwards compatibility consider setting the full image url via the repository value below
            ## use *either* current default registry/image or repository format or installing chart by providing the values.yaml will fail
            ## repository:
            tag: "v1.8.1"
            ## digest: sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b
            ## pullPolicy: IfNotPresent
    ------6------
    nodeSelector:
        kubernetes.io/os: linux
        ingress: "true"
      ## Liveness and readiness probe values
      ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes         
    ------7------            
        type: ClusterIP
        ## type: NodePort     
    ------8------       
      admissionWebhooks:
        annotations: {}
        # ignore-check.kube-linter.io/no-read-only-rootfs: "This deployment needs write access to root filesystem".
    
        ## Additional annotations to the admission webhooks.
        ## These annotations will be added to the ValidatingWebhookConfiguration and
        ## the Jobs Spec of the admission webhooks.
        enabled: false
  9. 创建ingress-nginx资源:helm install ingress-nginx -n ingress-nginx .

    ps卸载:helm uninstall ingress-nginx -n ingress-nginx

  10. 查看:kubectl get pod -n ingress-nginx -o wide

  11. 访问http://nginx.bulut.com/和http://tomcat.bulut.com/

    ps:如果没有经过第三步,需要补充一些第三步的步骤,比如创建ingress的映射关系等等

六、Ingress的HTTPS代理

ps:master节点操作

  1. 生成证书

    java 复制代码
    openssl req -newkey rsa:2048 -nodes -keyout tls.key -x509 -days 3650 -out tls.crt -subj "/C=CN/ST=HN/L=CS/O=bulut/OU=bulut/CN=bulut.com/[email protected]"

    参数说明

    java 复制代码

req:表示证书请求的子命令

-newkey rsa:2048:表示生成私钥

-nodes:表示私钥不加密

-keyout tls.key:表示生成的私钥输出文件

-x509:表示输出证书

-days 3650:表示证书有效期

-out tls.crt:表示生成的证书输出文件

-subj "/C=CN/ST=HN/L=CS/O=bulut/OU=bulut/CN=bulut.com/[email protected]":表示自动输入证书拥有者信息,分别表示:国家/省份/城市/公司名/部门名/域名/邮件地址

复制代码
2. 创建密钥:kubectl create secret tls tls-secret --key tls.key --cert tls.crt

3. 创建Ingress

1)新建ingress-https.yaml文件:vi /opt/ingress-https.yaml 

```java
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-https
spec:
  tls:
    - secretName: tls-secret
      hosts:
        - nginx.bulut.com
        - tomcat.bulut.com
  rules:
    - host: nginx.bulut.com
      http:
        paths:
          - path: /
            pathType: Exact
            backend:
              service:
                name: nginx-service
                port:
                  number: 80
    - host: tomcat.bulut.com
      http:
        paths:
          - path: /
            pathType: Exact
            backend:
              service:
                name: tomcat-service
                port:
                  number: 8080
java 复制代码
apiVersion: networking.k8s.io/v1: 这指定了使用的Kubernetes API版本。
kind: Ingress: 这指定了资源类型为Ingress。
metadata: 这是Ingress对象的元数据,包括名称(name)和命名空间(namespace)。
spec: 这是Ingress规范,定义了Ingress的规则和TLS配置。
	tls: 这指定了使用的TLS证书的名称(secretName)和绑定的主机名列表(hosts)。
	rules: 这定义了Ingress的路由规则。
		host: 这指定了请求的主机名。
		http: 这定义了针对HTTP请求的规则。
			paths: 这定义了路由到该主机的路径规则。
				path: 这指定了请求的路径。
				pathType: 这指定了路径的匹配类型,例如Exact表示精确匹配。
				backend: 这指定了路由到的后端服务。
					service: 这定义了后端服务的名称(name)和端口(port)。

2)创建pod:kubectl apply -f /opt/ingress-https.yaml

  1. Ingress查看:kubectl get ingress ingress-https

  2. Ingress详情的查看:kubectl describe ingress ingress-https

  3. 访问tomcat和nginx

    java 复制代码
    curl --insecure https://nginx.bulut.com
    curl --insecure https://tomcat.bulut.com
相关推荐
发财哥fdy7 分钟前
4.2-3 fiddler抓取手机接口
网络
网络安全指导员2 小时前
如何在JMeter中配置断言,将非200状态码视为测试成功
网络·学习·jmeter·安全·web安全·架构
~樱小路~2 小时前
网络:华为数通HCIA学习:IP路由基础
网络·学习·华为
GalaxyPokemon2 小时前
Muduo网络库实现 [十三] - HttpRequest模块
linux·服务器·网络·c++
liruiqiang052 小时前
循环神经网络 - 机器学习任务之同步的序列到序列模式
网络·人工智能·rnn·深度学习·神经网络·机器学习
圈圈编码3 小时前
WebSocket
java·网络·spring boot·websocket·网络协议·spring
Brilliant Nemo3 小时前
Docker 镜像相关的基本操作
运维·docker·容器
基哥的奋斗历程4 小时前
kubernetes configMap 存储
云原生·容器·kubernetes
Double Point4 小时前
(三十三)Dart 中使用 Pub 包管理系统与 HTTP 请求教程
网络·网络协议·http
云上艺旅1 天前
K8S学习之基础七十四:部署在线书店bookinfo
学习·云原生·容器·kubernetes