Ingress

Kubernetes 暴露服务的方式目前只有三种:LoadBlancer Service、NodePort Service、Ingress。
Ingress 可以提供负载均衡、SSL 和基于名称的虚拟托管。

Ingress 是什么?

Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。
下面是一个将所有流量都发送到同一 Service 的简单 Ingress 示例:
在这里插入图片描述

可以将 Ingress 配置为服务提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及提供基于名称的虚拟主机等能力。 Ingress 控制器通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。
Ingress 不会公开任意端口或协议。将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常使用 Service.Type=NodePort 或 Service.Type=LoadBalancer 类型的服务。

使用Ingress的好处:

端口管理。减少不必要端口暴露,便于管理。
所有的请求,通过Ingress对应的IP:PORT进入,过滤/转发/负载均衡到相应的service/pod。
NodePort会在每个node上暴露对应的port,不便管理。

环境准备

你必须安装 Ingress 控制器 才能使用 Ingress。
你需要先安装 Ingress 控制器,例如 ingress-nginx。 你可以从许多 Ingress 控制器 中进行选择。

1.创建deployment

[root@master k8s]# vim nginx.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent

---
kind: Service
apiVersion: v1
metadata:
  name: nginx-svc
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
[root@master k8s]# vim httpd.yaml 

metadata:
  name: httpd
spec:
  replicas: 3
  selector:
    matchLabels:
      app: httpd
  template:
    metadata:
      labels:
        app: httpd
    spec:
      containers:
      - name: httpd
        image: httpd
        imagePullPolicy: IfNotPresent

---
apiVersion: v1
kind: Service
metadata:
  name: httpd-svc
spec:
  selector:
    app: httpd
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: default-http-backend #创建一个默认的service,当访问ingress地址找不到时访问默认地址,否则ingress会报错!!!
  namespace: kube-system
spec:
  selector:
    app: httpd
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

2.部署Ingress

2.1 下载Ingress文件

[root@master yaml]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.35.0/deploy/static/provider/baremetal/deploy.yaml

2.2 修改yaml文件

[root@master yaml]# vim deploy.yaml
......
spec:
      hostNetwork:  true   #本地网络访问
      dnsPolicy: ClusterFirst
      containers:
        - name: controller
          image: registry.aliyuncs.com/google_containers/nginx-ingress-controller:0.30.0
          imagePullPolicy: IfNotPresent
......
# kubectl  apply  -f  deploy.yaml

2.3 查看

namespace为ingress-nginx

[root@master k8s]# kubectl get pod -o wide -n ingress-nginx 
NAME                                        READY   STATUS      RESTARTS   AGE   IP           NODE    NOMINATED NODE   READINESS GATES
ingress-nginx-admission-create-cmkfl        0/1     Completed   0          33m   10.244.2.9   node3   <none>           <none>
ingress-nginx-admission-patch-rndpw         0/1     Completed   0          33m   10.244.1.8   node1   <none>           <none>
ingress-nginx-controller-5f7f7f888f-29lnm   1/1     Running     0          32m   10.244.1.9   node1   <none>           <none>

3.基于httpd的访问

3.1 创建对应的Ingress规则

[root@master k8s]# vim ingress-httpd.yaml 

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: web-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: www.sjxt.com
    http:
      paths:
      - path: /nginx
        backend:
          serviceName: nginx-svc
          servicePort: 80
      - path: /httpd
        backend:
          serviceName: httpd-svc
          servicePort: 80

3.2 查看对应规则的详细信息

[root@master k8s]# kubectl  describe  ingresses web-ingress
Name:             web-ingress
Namespace:        default
Address:          192.168.80.192
Default backend:  default-http-backend:80 (<none>) #此处有坑,对应前面httpd.yaml里要增加default-http-backend服务
Rules:
  Host          Path  Backends
  ----          ----  --------
  www.sjxt.com
                /nginx   nginx-svc:80 (10.244.1.3:80,10.244.2.3:80,10.244.3.5:80)
                /httpd   httpd-svc:80 (10.244.1.4:80,10.244.2.4:80,10.244.3.6:80)
Annotations:    nginx.ingress.kubernetes.io/rewrite-target: /
Events:
  Type    Reason  Age   From                      Message
  ----    ------  ----  ----                      -------#此处有坑,前面报没有default-http-backend服务时不会创建这两个events,httpd.yaml增加增加default-http-backend后需要将ingress-httpd.yaml delete再apply
  Normal  CREATE  36m   nginx-ingress-controller  Ingress default/web-ingress 
  Normal  UPDATE  35m   nginx-ingress-controller  Ingress default/web-ingress

3.4 访问

[root@master k8s]# kubectl get ingress
NAME          CLASS    HOSTS          ADDRESS          PORTS   AGE
web-ingress   <none>   www.sjxt.com   192.168.80.192   80      61m

www.sjxt.com为ingress中rules配置的hosts
ingress也是pod,k8s_POD_ingress-nginx-controller在192.168.80.192节点,可以通过污点限制在固定的node

PS:有DNS的话可以设置解析,没有的话必须在host文件下添加域名解析才可访问

windows:C:\Windows\System32\drivers\etc\

linux:/etc/hosts

[root@client ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.80.192 wwww.ingress.com 
[root@master k8s]# kubectl get svc -n ingress-nginx #30605端口为访问域名+的端口
NAME                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.105.104.184   <none>        80:30605/TCP,443:31251/TCP   61m
ingress-nginx-controller-admission   ClusterIP   10.96.69.199     <none>        443/TCP                      61m

参考:
https://blog.csdn.net/weixin_45191791/article/details/109956817
https://www.orchome.com/1452

Logo

开源、云原生的融合云平台

更多推荐