一、Ingress Controller的暴露方式

当使用K8S中的Ingress资源对象来暴露应用时,用户访问应用的入口是 Ingress Controller 的地址。

Ingress Controller 会根据 Ingress 规则将请求路由到相应的服务,并将服务的响应返回 给客户端。

这时候就要把Ingress Controller暴露出去,暴露方式有以下几种:

  • NodePort:使用 NodePort 服务类型来暴露 Ingress Controller,这种方式可以将 Ingress Controller 暴露到 Kubernetes 集群的所有节点上,通过节点的 IP 地址和 NodePort 可以访问到 Ingress Controller。
  • 优点: 比较简单,易于配置和管理。
  • 缺点: 需要暴露每个节点的端口,容易造成端口泛滥,不易于后续管理,或者 在安全方面存在一些隐患。
  • Aspose.Words.35773ace-034f-476d-9a7d-cde46e0c6276.010

  • LoadBalancer(推荐):使用 LoadBalancer 服务类型来暴露 Ingress Controller,这种方式可以将 Ingress Controller 暴露到云服务提供商的负载均衡器上, 从而可以通过负载均衡器的IP地址来访问 Ingress Controller。可以实现更好的负载均衡和高可用性。

  • 优点:可以自动创建负载均衡器,可以动态地分配IP地址,易于管理和扩展。
  • 缺点:需要依赖云厂商提供的负载均衡器服务,对于一些不支持负载均衡器服务的云平台或者本地环境不太适用。
  • Aspose.Words.35773ace-034f-476d-9a7d-cde46e0c6276.013

二、测试验证

采用前面课程中的java应用:

#定义资源文件
[root@master01 ~]# cd /root/6
[root@master01 6]# vim java.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot
spec:
  replicas: 2
  selector:
    matchLabels:
      app: springboot
  template:
    metadata:
      labels:
        app: springboot
    spec:
      containers:
      - name: springboot
        image: registry.cn-hangzhou.aliyuncs.com/abroad_images/springboot:v1-aming
        resources:
          limits:
            memory: "1Gi"
            cpu: "1"
          requests:
            memory: "128Mi"
            cpu: "100m"
        ports:
          - containerPort: 8080
            name: web
        livenessProbe:
          httpGet:
            port: web
            path: /apptwo
          timeoutSeconds: 2
          periodSeconds: 30
        readinessProbe:
          tcpSocket:
            port: web
          initialDelaySeconds: 10
---
apiVersion: v1
kind: Service
metadata:
  name: springboot
spec:
  type: ClusterIP
  selector:
    app: springboot
  ports:
  - name: http
    port: 8080
    protocol: TCP
    targetPort: 8080

#应用
[root@master01 6]# kaf java.yaml

配置HTTP:ingress-nginx转发模板:

#定义ingress
[root@master01 6]# vim http-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: java-ingress-nginx
  namespace: default
spec:
  ingressClassName: nginx
  rules:
    - host: java.zhang-qing.com
      http:
        paths:
          - pathType: Prefix
            backend:
              service:
                name: springboot
                port:
                  number: 8080
            path: /

#应用ingress
[root@master01 6]# kaf http-ingress.yaml

#测试访问
[root@master01 6]# curl http://java.zhang-qing.com/appone
appone

环境清理

[root@master01 ~]# k delete -f  java.yaml -f http-ingress.yaml

配置HTTPS:ingress-nginx转发模板:

(1)上传java.zhang-qing.com.key和java.zhang-qing.com.pem证书文件到/root目录下

[root@master01 ~]# ls java.zhang-qing.com.*
java.zhang-qing.com.key  java.zhang-qing.com.pem

(2)创建ingress-tls

#创建
[root@master01 ~]# kubectl create secret tls ingress-secret-java -n default --key java.zhang-qing.com.key  --cert java.zhang-qing.com.pem

#验证
[root@master01 ~]# kg secret | grep ingress-secret
ingress-secret-java   kubernetes.io/tls                     2      52s

(3)创建ingress-nginx

#定义ingress资源
[root@master01 6]# vim https-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: java-ingress-nginx
  namespace: default
spec:
  ingressClassName: nginx
  rules:
    - host: java.zhang-qing.com
      http:
        paths:
          - pathType: Prefix
            backend:
              service:
                name: springboot
                port:
                  number: 8080
            path: /
  tls:
  - hosts:
    - java.zhang-qing.com
    secretName: ingress-secret-java

#应用ingress
[root@master01 6]# kaf https-ingress.yaml

#测试访问
[root@master01 6]# curl https://java.zhang-qing.com/appone
appone

主要参数:

  • 在 metadata 字段中,name 字段指定了创建的 Ingress 资源的名称。
  • 在 spec 字段中,ingressClassName 字段指定了要使用的 Ingress 控制器。这里使用了名为 nginx 的 Ingress 类别(早先课程演示使用的参数为:kong)。
  • rules:指定了 Ingress 的规则列表。在这里只有一个规则,即当外部流量通过 HTTP 访问 Ingress 时,应该使用下面的配置:
  • path:指定了应该匹配的 URL 路径。在这里,所有路径都匹配 /,也就是只要是 java.zhang-qing.com请求都会进入到咱们的Springboot容器。
  • pathType:指定了路径匹配方式,这里使用了 Prefix 类型,表示只要路径以 / 开头,就匹配成功。
  • backend:指定将匹配的流量转发到哪个后端(Service)。这里选择了 springboot 的 Service(ClusterIP类型),及 Service 的 8080 端口接收流量。
  • tls:指定了 Ingress 的https。
  • hosts:主要域名;
  • secretName:通过如上创建的证书secret;

环境清理

[root@master01 ~]# k delete -f  java.yaml -f https-ingress.yaml

[root@master01 ~]# k delete secret ingress-secret-java

三、总结

Ingress-Nginx解决方案总结:

  • 功能层面:Ingress-Nginx是一个Kubernetes集群中的一个Ingress控制器,能够处理HTTP(s)和TCP流量,实现请求的路由、负载均衡、TLS终止、网络ACL等常见的负载均衡器功能。
  • 技术层面:Ingress-Nginx是使用Nginx作为反向代理服务器来实现的,同时它使用了Lua脚本、Nginx插件等技术,以便实现高效、灵活、可扩展的负载均衡器功能。
  • 部署和配置层面:Ingress-Nginx可以快速部署和配置,其配置文件使用了 Kubernetes的标准API,并提供了多种安装方式,包括使用Helm、YAML文件等。 用户可以通过这些方式轻松地进行配置和自定义。
  • 生态层面:Ingress-Nginx是Kubernetes生态系统中流行的Ingress控制器之一,具有广泛的社区支持和活跃的开发者。在官方的GitHub存储库中,有大量的文档、示例和更新,可以帮助用户快速使用和解决常见问题。