K8S通过Ingress和外部负载均衡暴露服务

14次阅读

共计 2584 个字符,预计需要花费 7 分钟才能阅读完成。

一. 背景常识

Kubernetes 通过 Ingress 裸露服务有两种计划:

  1. 将服务的域名间接指向到其中一台 worker 节点上. 这种形式将流量集中到这一台 worker 节点上, 容易引起单点故障, 故只实用于开发, 测试, 和 Demo 环境. 示意图如下:
  2. 将服务的域名指向独立负载平衡服务到 所有 worker 节点 , 而 Ingress 会监听所有 worker 节点上的流量并进行相应的散发, 从而保障正确的服务.
    在这种计划下, 即使咱们不是所有的节点都启动了该服务的容器, Ingress 也会正确散发. 比方咱们咱们有 3 个 worker 节点: ttg12 / ttg13 / ttg14, 而服务对应的 Deployment 中设置的 replica=2, 也就是只启动 2 个正本. 假如这 2 个容器启动在 ttg12 和 ttg13 上. 这时候, 负载平衡服务器上转发的流量也会打到 ttg14 上, 尽管这个节点自身并没有对应的 pod, 但通过 Ingress, 也能失常地提供服务. 示意图如下:

二. 部署

本文示例部署一个 lb-tomcat9.faceless.cn 的域名指向 负载平衡服务器, 并通过 Ingress 提供服务.

2.1 部署 Deployment 和 Service

本地新建文件 lb-tomcat9-svc.yaml:

apiVersion: apps/v1
kind: Deployment 
metadata: 
  name: tomcat9-dev-dpl
  labels:
    app: tomcat9
    env: dev
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tomcat9
      env: dev
  template:
    metadata:
      labels:
        app: tomcat9
        env: dev
    spec:
      containers:
      - name: tomcat9
        image: tomcat:9.0.37-jdk8-openjdk
        ports:
        - containerPort: 8080

---
apiVersion: v1
kind: Service
metadata:
  name: tomcat9-dev-svc
  labels:
    app: tomcat9
    env: dev
spec:
  selector:
    app: tomcat9
    env: dev
  ports:
  - name: nginx-port
    protocol: TCP
    port: 8080
    targetPort: 8080

利用本配置文件:

kubectl apply -f lb-tomcat9-svc.yaml

输入:

deployment.apps/tomcat9-dev-dpl created
service/tomcat9-dev-svc created

2.2 部署 Ingress

在本地新建 Ingress 配置 lb-tomcat9-ingress.yaml, 将 lb-tomcat9.faceless.cn 域名下的所有流量分发给 tomcat9-dev-svc 服务:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: lb-tomcat9-ingress
spec:
  rules:
  - host: lb-tomcat9.faceless.cn
    # Ingress 的 `http` 端口为 80, 对应在负载平衡配置文件中 **upstream** 模块下配置的端口
    http:
      paths: 
      - path: /
        backend:
          serviceName: tomcat9-dev-svc
          servicePort: 8080

利用本配置文件:

kubectl apply -f lb-tomcat9-ingress.yaml

输入:

ingress.networking.k8s.io/lb-tomcat9-ingress configured

留神 Ingress 除了部署资源之外, 还须要对应的 Ingress Controller. 本文应用 Nignx 出厂的 nginx/nginx-ingress 控制器. 可应用 Kuboard 教程中的配置脚本装置:

kubectl apply -f https://kuboard.cn/install-script/v1.18.x/nginx-ingress.yaml

具体请参考: https://kuboard.cn/install/install-k8s.html# 装置 -ingress-controller.

另外对于 Nginx Ingress 的两种不同实现, 请参考我的另一篇博文: K8S Ingress 控制器两个实现版本 (kubernetes-ingress 和 ingress-nginx) 的区别.

2.3 验证是否失效

先通过 kubectl get pods | grep tomcat9-dev-dpl 确认 2 个 pods 的状态都已为 Running.

而后在本地通过 /etc/hostslb-tomcat9.faceless.cn 域名别离执行 ttg12 / ttg13 / ttg14 对应的 IP, 并拜访 http://lb-tomcat9.faceless.cn, 查看这 3 个 IP 是否都能失常返回.

2.4 部署 负载平衡

本文负载平衡 (Load Balancer) 应用 Nginx 实现, 对应的配置文件为:

# 这里定义了一个名称为 `lb_tomcat9_server` 的 ` 上游 `, 即负载平衡的指标站点清单
upstream lb_tomcat9_server {
  server ttg12:80;
  server ttg13:80;
  server ttg14:80;
}
# 上面定义 `lb-tomcat9.faceless.cn` 站点, 将所有流量转发到 `lb_tomcat9_server`
server {
    listen       80;
    listen  [::]:80;
    server_name  lb-tomcat9.faceless.cn;

    location / {
        proxy_pass http://lb_tomcat9_server;
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    # redirect server error pages to the static page /50x.html
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {root   /usr/share/nginx/html;}
}

更多细节可参考笔记: Docker 容器部署 Nginx 实现负载平衡

正文完
 0