K8s集群 实现集群业务是否对外暴露的控制 (多LB实施方案)

简介: K8s集群 实现集群业务是否对外暴露的控制 (多LB实施方案)

K8s集群 实现集群业务是否对外暴露的控制 (多LB实施方案)



架构图:


简述实施步骤:

1.新建集群会自动创建一个公网的LB,需要新创建一个内网LB绑定在此nginx controller 上,实现内网访问pod的目的。


2.新建专属内网的nginx controller 绑定内网LB只对内网提供服务,并且修改默认的ingress.class标签


1.基础Nginx Controller绑定内网LB

参考网址:https://help.aliyun.com/document_detail/151506.html


查看集群现存lb

# kubectl get svc -A |grep LoadBalancer
kube-system   nginx-ingress-lb                     LoadBalancer   192.168.223.150   47.108.153.86   80:30299/TCP,443:31348/TCP   86m


新建集群LB服务

(推荐)方式一:


集群服务 > 网络 > 服务 > 选择nginx-controller所在命名空间 > 创建 > 负载均衡.内网.新建slb.关联nginx


这种方式是最快捷的,或者也能选择手动创建


方式二:


1.创建负载均衡器 2.在此页面创建时,绑定已有负载均衡即可


或者,当您成功创建一个私网SLB实例后,您可以通过以下示例注解来配置Nginx Ingress Controller使用该SLB实例,

# nginx ingress slb service
apiVersion: v1
kind: Service
metadata:
  name: nginx-ingress-lb
  namespace: kube-system
  labels:
    app: nginx-ingress-lb
  annotations:
    # 指明SLB实例地址类型为私网类型。
    service.beta.kubernetes.io/alicloud-loadbalancer-address-type: intranet
    # 修改为您的私网SLB实例ID。
    service.beta.kubernetes.io/alicloud-loadbalancer-id: <YOUR_INTRANET_SLB_ID>
    # 是否自动创建SLB端口监听(会覆写已有端口监听),也可手动创建端口监听。
    #service.beta.kubernetes.io/alicloud-loadbalancer-force-override-listeners: 'true'
spec:
  type: LoadBalancer
  # route traffic to other nodes
  externalTrafficPolicy: "Cluster"
  ports:
  - port: 80
    name: http
    targetPort: 80
  - port: 443
    name: https
    targetPort: 443
  selector:
    # select app=ingress-nginx pods
    app: ingress-nginx


查询是否创建成功

# kubectl get svc -A |grep LoadBalancer
kube-system   nginx-ingress-lb                     LoadBalancer   192.168.223.150   47.108.153.86   80:30299/TCP,443:31348/TCP   100m
kube-system   vpc-lb                               LoadBalancer   192.168.37.202    172.24.43.76    80:32532/TCP,443:31330/TCP   3m19s


部署服务测试连通性

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hellok8s-dep
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello-kubernetes
  template:
    metadata:
      labels:
        app: hello-kubernetes
    spec:
      containers:
      - name: hello-kubernetes
        image: paulbouwer/hello-kubernetes:1.4
        #image: centos:7
        #args:
        #- sleep
        #- "1000000"
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: hellok8s-svc
  namespace: default
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: hello-kubernetes
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hellok8s-ingress
  annotations:
    ##用来绑定特定的ingress-nginx
    #kubernetes.io/ingress.class: ack-nginx-vpc    
    ##默认class
    kubernetes.io/ingress.class: nginx
    ##配置了ssl证书即打开此配置
    #nginx.ingress.kubernetes.io/ssl-redirect: 'true'
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/enable-cors: 'true'
    nginx.ingress.kubernetes.io/cors-allow-headers: DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,Access-Control-Allow-Origin
    nginx.ingress.kubernetes.io/cors-allow-methods: PUT, GET, POST, OPTIONS, DELETE
    nginx.ingress.kubernetes.io/cors-allow-origin: '*'
    nginx.ingress.kubernetes.io/cors-allow-credentials: 'true'
spec:
  ##按需配置ssl证书
  #tls:
  #- secretName: da-e.top-tls
  #  hosts:
  #  - "*.test.com"
  rules:
  ##按需配置域名
  #- host: www.test.com  
  - http:
      paths:
      - path: /hellok8s
        pathType: Prefix
        backend:
          service:
            name: hellok8s-svc
            port:
              number: 80
      - path: /
        pathType: Prefix
        backend:
          service:
            name: hellok8s-svc
            port:
              number: 80
# kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
hellok8s-dep-6588f6bd76-wlh4h   1/1     Running   0          60s
1
2
3
# kubectl get svc -A |grep LoadBalancer
kube-system   nginx-ingress-lb                     LoadBalancer   192.168.223.150   47.108.153.86   80:30299/TCP,443:31348/TCP   100m
kube-system   vpc-lb                               LoadBalancer   192.168.37.202    172.24.43.76    80:32532/TCP,443:31330/TCP   3m19s


验证内外网访问

浏览器访问公网LB地址

http://47.108.153.86/hellok8s

同一VPC机器访问内网LB地址

# curl 172.24.43.76 
<!DOCTYPE html>
<html>
<head>
    <title>Hello Kubernetes!</title>
    <link rel="stylesheet" type="text/css" href="/css/main.css">
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Ubuntu:300" >
</head>
<body>
  <div class="main">
    <img src="/images/kubernetes.png"/>
    <div class="content">
      <div id="message">
  Hello world!
</div>
<div id="info">
  <table>
    <tr>
      <th>pod:</th>
      <td>hellok8s-dep-6588f6bd76-wlh4h</td>
    </tr>
    <tr>
      <th>node:</th>
      <td>Linux (4.19.91-26.al7.x86_64)</td>
    </tr>
  </table>
</div>
    </div>
  </div>
</body>
</html>


总结:这样做的好处:同一VPC访问服务时,可以走内网,节省流量


2.集群新建Nginx Controller内网访问LB

参考网址:https://help.aliyun.com/document_detail/151524.html

# kubectl create ns vpc-nginx
namespace/vpc-nginx created

web页面创建应用nginx controller应用

容器服务 》应用市场 》ack-ingress-nginx-v1 》选择对应集群和命名空间(找不到命名空间时,刷新网页)


修改ingressClassResource的name字段


必须配置为专属标识,以区别两个nginx controller



默认为ack-nginx 修改为 ack-nginx-vpc


关闭公网访问 controller.service.external.enabled = false


打开内网controller.service.internal.enabled = true


(注意参考文档配置是 ack-ingress-nginx-v1版本)


等待部署完成

# kubectl -n vpc-nginx get svc |grep LoadBalancer
ack-ingress-nginx-v1-default-controller-internal    LoadBalancer   192.168.183.85    172.24.43.77   80:30389/TCP,443:31903/TCP   2m47s

验证阶段

##删除刚刚的测试pod
# kubectl delete -f hello.yaml 
deployment.apps "hellok8s-dep" deleted
service "hellok8s-svc" deleted
ingress.networking.k8s.io "hellok8s-ingress" deleted


修改ingress.class配置 绑定内网Nginx Controller

##只修改ingress.annotations片段
......
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hellok8s-ingress
  annotations:
    ##用来绑定特定的ingress-nginx
    kubernetes.io/ingress.class: ack-nginx-vpc    
    ##默认class
    #kubernetes.io/ingress.class: nginx
    ##配置了ssl证书即打开此配置
    #nginx.ingress.kubernetes.io/ssl-redirect: 'true'
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/enable-cors: 'true'
    nginx.ingress.kubernetes.io/cors-allow-headers: DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,Access-Control-Allow-Origin
    nginx.ingress.kubernetes.io/cors-allow-methods: PUT, GET, POST, OPTIONS, DELETE
    nginx.ingress.kubernetes.io/cors-allow-origin: '*'
    nginx.ingress.kubernetes.io/cors-allow-credentials: 'true'
spec:
......


部署查看效果

# kubectl get ing
NAME               CLASS    HOSTS   ADDRESS        PORTS   AGE
hellok8s-ingress   <none>   *       172.24.43.77   80      55s
[root@iZ2vc69mi81oajsfk8bjefZ .kube]# kubectl  get svc -A |grep LoadBalancer
kube-system   nginx-ingress-lb                                    LoadBalancer   192.168.223.150   47.108.153.86   80:30299/TCP,443:31348/TCP   162m
kube-system   vpc-lb                                              LoadBalancer   192.168.37.202    172.24.43.76    80:32532/TCP,443:31330/TCP   65m
vpc-nginx     ack-ingress-nginx-v1-default-controller-internal    LoadBalancer   192.168.183.85    172.24.43.77    80:30389/TCP,443:31903/TCP   7m48s


发现ingress 已经成功绑定到内网的LB上


测试访问

## 公网私网LB失败,说明ingress未添加
[root@iZ2vc69mi81oajsfk8bjefZ .kube]# curl 47.108.153.86 
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
[root@iZ2vc69mi81oajsfk8bjefZ .kube]# curl 172.24.43.76
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
## 私网LB访问成功 说明ingress添加成功
[root@iZ2vc69mi81oajsfk8bjefZ .kube]# curl 172.24.43.77
<!DOCTYPE html>
<html>
<head>
    <title>Hello Kubernetes!</title>
    <link rel="stylesheet" type="text/css" href="/css/main.css">
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Ubuntu:300" >
</head>
<body>
  <div class="main">
    <img src="/images/kubernetes.png"/>
    <div class="content">
      <div id="message">
  Hello world!
</div>
<div id="info">
  <table>
    <tr>
      <th>pod:</th>
      <td>hellok8s-dep-6588f6bd76-xwj7q</td>
    </tr>
    <tr>
      <th>node:</th>
      <td>Linux (4.19.91-26.al7.x86_64)</td>
    </tr>
  </table>
</div>
    </div>
  </div>
</body>
</html>


总结:部署阶段稍麻烦,但是部署完成后,仅通过修改ingress配置绑定对应的Nginx Controller即可实现业务的对外控制

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
5天前
|
Kubernetes 应用服务中间件 Docker
Kubernetes学习-集群搭建篇(二) 部署Node服务,启动JNI网络插件
Kubernetes学习-集群搭建篇(二) 部署Node服务,启动JNI网络插件
|
5天前
|
存储 数据采集 Kubernetes
一文详解K8s环境下Job类日志采集方案
本文介绍了K8s中Job和Cronjob控制器用于非常驻容器编排的场景,以及Job容器的特点:增删频率高、生命周期短和突发并发大。文章重点讨论了Job日志采集的关键考虑点,包括容器发现速度、开始采集延时和弹性支持,并对比了5种采集方案:DaemonSet采集、Sidecar采集、ECI采集、同容器采集和独立存储采集。对于短生命周期Job,建议使用Sidecar或ECI采集,通过调整参数确保数据完整性。对于突发大量Job,需要关注服务端资源限制和采集容器的资源调整。文章总结了不同场景下的推荐采集方案,并指出iLogtail和SLS未来可能的优化方向。
|
1天前
|
运维 监控 Kubernetes
Kubernetes 集群的监控与日志管理最佳实践
【5月更文挑战第19天】 在现代微服务架构中,容器编排平台如Kubernetes已成为部署、管理和扩展应用程序的关键工具。随着其应用范围不断扩大,集群的稳定性和性能监控变得至关重要。本文将探讨针对Kubernetes集群的监控策略,并深入分析日志管理的实现方法。通过介绍先进的技术堆栈和实用工具,旨在为运维专家提供一套完整的解决方案,以确保集群运行的透明度和可靠性。
28 3
|
1天前
|
存储 运维 监控
Kubernetes 集群的监控与性能优化策略
【5月更文挑战第19天】 在微服务架构日益普及的背景下,容器编排工具如Kubernetes已成为部署、管理和扩展服务的关键平台。然而,随着集群规模的增长和服务的复杂化,有效的监控和性能优化成为确保系统稳定性和高效性的重要挑战。本文将探讨针对Kubernetes集群监控的最佳实践,并提出一系列性能优化策略,旨在帮助运维人员识别潜在的瓶颈,保障服务的持续可靠性及响应速度。
|
3天前
|
资源调度 Kubernetes 监控
Kubernetes 集群性能优化实践
【5月更文挑战第17天】在容器化和微服务架构日益普及的当下,Kubernetes 已成为众多企业的首选容器编排工具。然而,随着集群规模的增长和业务复杂度的提升,性能优化成为确保系统稳定性与高效运行的关键。本文将深入探讨 Kubernetes 集群性能优化的策略与实践,覆盖从节点资源配置到网络通信优化,再到高效的资源调度机制,旨在为运维人员提供系统的优化路径和具体的操作建议。
|
4天前
|
存储 Java Serverless
ACK One Argo 工作流集群:玩转容器对象存储
ACK One Argo 工作流集群:玩转容器对象存储
ACK One Argo 工作流集群:玩转容器对象存储
|
5天前
|
Kubernetes Ubuntu Docker
初始化k8s多结点集群
在Ubuntu22.04.3 LTS上设置k8s多节点集群,采用Docker v24.0.6、kubeadm v1.28和cir-dockerd v0.3.4。首先安装docker和cri-dockerd,更新k8s三件套至v1.28。然后,参照官方文档进行`kubeadm init`初始化集群,配置包括自定义镜像仓库、控制面端点等。成功初始化后,显示了相关证书和配置信息。最后,提供了一些额外的kubectl命令以管理节点。
16 1
|
5天前
|
存储 运维 Kubernetes
Kubernetes 集群的持续性能优化策略
【5月更文挑战第14天】 在动态且不断扩展的云计算环境中,保持 Kubernetes 集群的高性能运行是一个挑战。本文将探讨一系列实用的性能优化措施,旨在帮助运维专家确保其容器化应用能在资源受限的情况下仍保持高效与稳定。通过分析 Kubernetes 的资源调度机制、存储和网络配置,我们提出了一套综合的性能调优框架,并结合实际案例,展示如何实施这些策略以提升集群的整体性能。
|
5天前
|
运维 Prometheus 监控
Kubernetes 集群监控与性能优化实践
【5月更文挑战第14天】 在微服务架构日益普及的当下,Kubernetes 已成为容器编排的事实标准。然而,随着集群规模的扩大和业务复杂度的增加,监控系统的性能及稳定性变得至关重要。本文将深入探讨 Kubernetes 集群监控的重要性,介绍常用监控工具,并分享一系列针对集群性能优化的实践策略,帮助运维工程师确保服务的高可用性和优越性能。
|
5天前
|
Kubernetes 安全 API
Kubernetes学习-集群搭建篇(三) Node配置完善和API概述
Kubernetes学习-集群搭建篇(三) Node配置完善和API概述
Kubernetes学习-集群搭建篇(三) Node配置完善和API概述

推荐镜像

更多