【云原生Kubernetes】K8S集群+负载均衡层+防火墙 实例(下)

简介: 实验拓扑:

三、创建service资源

编写service对应的yaml文件,使用NodePort类型和TCP 30000端口将Nginx服务发布出去。

#1、编写service对应的yaml文件
 vim myservice.yaml
 apiVersion: v1
 kind: Service
 metadata: 
    name: yuji-nginx-svc
    namespace: default   
 spec:
   type: NodePort        #service类型设置为NodePort
   ports: 
   - port: 80            #service使用的端口号,ClusterIP后面跟的端口号。
     targetPort: 80      #需要转发到的后端Pod的端口号
     nodePort: 30000     #指定映射到物理机的端口号,k8s集群外部可以使用nodeIP:nodePort访问service
   selector:             
     app: yuji-nginx     #标签选择器要和上一步创建的pod的标签保持一致
 #创建service资源    
 kubectl apply -f myservice.yaml
 #2、查看service资源
 kubectl get svc
 NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
 kubernetes       ClusterIP   10.96.0.1       <none>        443/TCP        27h
 yuji-nginx-svc   NodePort    10.96.100.164   <none>        80:30000/TCP   76s
 #查看service资源的详细信息
 kubectl describe svc yuji-nginx-svc  
 Name:                     yuji-nginx-svc
 Namespace:                default
 Labels:                   <none>
 Annotations:              <none>
 Selector:                 app=yuji-nginx
 Type:                     NodePort
 IP Families:              <none>
 IP:                       10.96.100.164
 IPs:                      10.96.100.164
 Port:                     <unset>  80/TCP
 TargetPort:               80/TCP
 NodePort:                 <unset>  30000/TCP
 Endpoints:                10.244.1.2:80,10.244.2.4:80    #service资源管理的2个pod
 Session Affinity:         None
 External Traffic Policy:  Cluster
 Events:                   <none>
 #3、测试使用nodeIP:nodePort访问nginx网页
 curl 192.168.10.20:30000   #node01
 curl 192.168.10.30:30000   #node02
复制代码


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


四、搭建负载均衡层

负载均衡区域配置Keepalived+Nginx,实现负载均衡高可用,通过VIP 192.168.10.100和自定义的端口号即可访问K8S发布出来的服务。

  • lb01:192.168.10.40
  • lb02:192.168.10.50
  • VIP:192.168.10.100
#---------1、两台负载均衡器配置nginx--------------
 #关闭防火墙和selinux
 systemctl stop firewalld
 systemctl disable firewalld
 setenforce 0
 sed -i 's/enforcing/disabled/' /etc/selinux/config
 #设置主机名
 hostnamectl set-hostname lb01
 su
 hostnamectl set-hostname lb02
 su
 #配置nginx的官方在线yum源
 cat > /etc/yum.repos.d/nginx.repo << 'EOF'
 [nginx]
 name=nginx repo
 baseurl=http://nginx.org/packages/centos/7/$basearch/
 gpgcheck=0
 EOF
 yum install nginx -y
 #修改nginx配置文件,配置四层反向代理负载均衡,指定k8s群集2台node的节点ip和30000端口
 vim /etc/nginx/nginx.conf
 events {
     worker_connections  1024;
 }
 #在http块上方,添加stream块
 stream {
     upstream k8s-nodes {
         server 192.168.10.20:30000;    #node01IP:nodePort
         server 192.168.10.30:30000;    #node02IP:nodePort
     }
     server {
         listen 3344;                  #自定义监听端口
         proxy_pass k8s-nodes;
     }
 }
 http {
 ......
     #include /etc/nginx/conf.d/*.conf;    #建议将这一行注释掉,否则会同时加载/etc/nginx/conf.d/default.conf文件中的内容,nginx会同时监听80端口。
 }
 #检查配置文件语法是否正确
 nginx -t   
 #启动nginx服务,查看到已监听3344端口
 systemctl start nginx
 systemctl enable nginx
 netstat -natp | grep nginx 
 tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN             48395/nginx: master
 tcp        0      0 0.0.0.0:3344            0.0.0.0:*               LISTEN             48395/nginx: master
 #------------2、两台负载均衡器配置keepalived--------
 #安装keepalived服务
 yum install keepalived -y
 #修改keepalived配置文件
 vim /etc/keepalived/keepalived.conf
 ! Configuration File for keepalived
 global_defs {
    # 接收邮件地址
    notification_email {
      acassen@firewall.loc
      failover@firewall.loc
      sysadmin@firewall.loc
    }
    # 邮件发送地址
    notification_email_from Alexandre.Cassen@firewall.loc
    smtp_server 127.0.0.1    #修改为本机回环地址
    smtp_connect_timeout 30
    router_id LB01   #lb01节点的为LB01,lb02节点的为LB02
 }
 #添加一个周期性执行的脚本
 vrrp_script check_nginx {
     script "/etc/nginx/check_nginx.sh"  #指定检查nginx存活的脚本路径
 }
 vrrp_instance VI_1 {
     state MASTER            #lb01节点的为 MASTER,lb02节点的为 BACKUP
     interface ens33         #指定网卡名称 ens33
     virtual_router_id 51    #指定组ID,两个节点要一致
     priority 100            #设置优先级,lb01节点设置为 100,lb02节点设置为 90
     advert_int 1
     authentication {
         auth_type PASS
         auth_pass 1111
     }
     virtual_ipaddress {
         192.168.10.100      #指定VIP地址
     }
     track_script {          #追踪脚本
         check_nginx         #指定vrrp_script配置的脚本
     }
 }
 #将配置文件中剩余的内容全都删除
 #主调度器lb01创建nginx状态检查脚本 
 vim /etc/nginx/check_nginx.sh
 #!/bin/bash
 #egrep -cv "grep|$$" 用于过滤掉包含grep 或者 $$ 表示的当前Shell进程ID
 count=$(ps -ef | grep nginx | egrep -cv "grep|$$")
 if [ "$count" -eq 0 ];then
     systemctl stop keepalived
 fi
 chmod +x /etc/nginx/check_nginx.sh  #为脚本增加执行权限
 #启动keepalived服务(一定要先启动了nginx服务,再启动keepalived服务,否则keepalived检测到nginx没有启动,会杀死自己)
 systemctl start keepalived
 systemctl enable keepalived
 ip addr             #查看主节点的VIP是否生成
 #测试使用VIP:3344访问web网页
 curl 192.168.10.100:3344
 #----------3、关闭主调度器的nginx服务,模拟故障,测试keepalived-------
 #关闭主调度器lb01的Nginx服务,模拟宕机,观察VIP是否漂移到备节点
 systemctl stop nginx
 ip addr
 systemctl status keepalived   #此时keepalived被脚本杀掉了   
 #备节点查看是否生成了VIP
 ip addr    #此时VIP漂移到备节点lb02
 #恢复主节点
 systemctl start nginx         #先启动nginx
 systemctl start keepalived    #再启动keepalived
 ip addr
复制代码


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


五、配置防火墙服务器

iptables防火墙服务器,设置双网卡,并且配置SNAT和DNAT转换实现外网客户端可以通过12.0.0.1访问内网的Web服务。

  • 内网网卡ens33:192.168.10.1
  • 外网网卡ens36:12.0.0.1
##两台负载均衡器,将网关地址修改为防火墙服务器的内网IP地址
 vim /etc/sysconfig/network-scripts/ifcfg-ens33
 GATEWAY="192.168.10.1"
 systemctl restart network   #重启网络
 systemctl restart keepalived   #如果VIP丢失,需要重启一下keepalived
 ##配置防火墙服务器
 #-------------1、关闭防火墙和selinux-------------
 systemctl stop firewalld
 systemctl disable firewalld
 setenforce 0
 sed -i 's/enforcing/disabled/' /etc/selinux/config
 #------------2、开启路由转发功能----------------
 vim /etc/sysctl.conf
 net.ipv4.ip_forward = 1     //在文件中增加这一行,开启路由转发功能
 sysctl -p    //加载修改后的配置
 #------------3、配置iptables策略---------------
 #先将原有的规则清除
 iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
 #设置SNAT服务,解析源地址。修改nat表中的POSTROUTING链。
 #将源地址192.168.10.100转换为为12.0.0.1
 iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o ens36 -j SNAT --to 12.0.0.1
  #-t nat                  //指定nat表
  #-A POSTROUTING          //在POSTROUTING链中添加规则  
  #-s 192.168.10.100/24    //数据包的源地址
  #-o ens36                //出站网卡
  #-j SNAT --to 12.0.0.1   //使用SNAT服务,将源地址转换成公网IP地址。
 #设置DNAT服务,解析目的地址。修改nat表中的PRETROUTING链。
 #将目的地址12.0.0.1:3344 转换成 192.168.10.100:3344
 iptables -t nat -A PREROUTING -i ens36 -d 12.0.0.1 -p tcp --dport 3344 -j DNAT --to 192.168.10.100:3344
  #-A PREROUTING         //在PREROUTING链中添加规则        
  #-i ens36              //入站网卡
  #-d 12.0.0.254         //数据包的目的地址
  #-p tcp --dport 3344   //数据包的目的端口
  #-j DNAT --to 192.168.10.100:3344   //使用DNAT功能,将目的地址和端口转换成192.168.10.100:3344
 iptables -t nat -nL   #查看策略
 Chain PREROUTING (policy ACCEPT)
 target     prot opt source               destination
 DNAT       tcp  --  0.0.0.0/0            12.0.0.1             tcp dpt:3344 to:192.168.10.100:3344
 Chain INPUT (policy ACCEPT)
 target     prot opt source               destination
 Chain OUTPUT (policy ACCEPT)
 target     prot opt source               destination
 Chain POSTROUTING (policy ACCEPT)
 target     prot opt source               destination
 SNAT       all  --  192.168.10.0/24      0.0.0.0/0            to:12.0.0.1
 ##客户端修改网关配置文件,测试访问内网的Web服务
 客户端IP地址:12.0.0.12,将网关地址设置为防火墙服务器的外网网卡地址:12.0.0.1
 浏览器输入 http://12.0.0.1:3344 进行访问
复制代码


两台负载均衡器,将网关地址修改为防火墙服务器的内网IP地址,之后需要重启网络:

网络异常,图片无法展示
|


网络异常,图片无法展示
|


配置防火墙服务器:

网络异常,图片无法展示
|


网络异常,图片无法展示
|


客户端修改网关地址,测试访问内网的Web服务:

网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|

相关文章
|
Cloud Native 关系型数据库 分布式数据库
登顶TPC-C|云原生数据库PolarDB技术揭秘:Limitless集群和分布式扩展篇
阿里云PolarDB云原生数据库在TPC-C基准测试中以20.55亿tpmC的成绩刷新世界纪录,展现卓越性能与性价比。其轻量版满足国产化需求,兼具高性能与低成本,适用于多种场景,推动数据库技术革新与发展。
|
Cloud Native 关系型数据库 分布式数据库
登顶TPC-C|云原生数据库PolarDB技术揭秘:Limitless集群和分布式扩展篇
云原生数据库PolarDB技术揭秘:Limitless集群和分布式扩展篇
|
Cloud Native 关系型数据库 分布式数据库
客户说|知乎基于阿里云PolarDB,实现最大数据库集群云原生升级
近日,知乎最大的风控业务数据库集群,基于阿里云瑶池数据库完成了云原生技术架构的升级。此次升级不仅显著提升了系统的高可用性和性能上限,还大幅降低了底层资源成本。
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
1018 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
运维 Cloud Native 开发工具
智能运维:云原生大规模集群GitOps实践
智能运维:云原生大规模集群GitOps实践,由阿里云运维专家钟炯恩分享。内容涵盖云原生运维挑战、管理实践、GitOps实践及智能运维体系。通过OAM模型和GitOps优化方案,解决大规模集群的发布效率与稳定性问题,推动智能运维工程演进。适用于云原生环境下的高效运维管理。
717 8
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
|
存储 运维 Kubernetes
阿里云数字新基建系列:云原生操作系统Kubernetes-第1章(4)
阿里云数字新基建系列包括5本书,题材涉及Kubernetes、混合云架构、云数据库、CDN原理与流媒体技术、云服务器运维(Windows),囊括了领先的云技术知识与阿里云技术团队独到的实践经验,是国内IT技术图书中又一套重磅作品! 本书是阿里云容器服务产品线上实践的技术沉淀,主要包括理论篇和实践篇两部分内容。理论篇注重理论介绍,核心是Kubernetes on Cloud,即着重介绍Kubernetes和阿里云产品的结合。实践篇是疑难问题的诊断案例,希望通过案例来和读者分享Kubernetes深度问题诊断......
阿里云数字新基建系列:云原生操作系统Kubernetes-第1章(4)

热门文章

最新文章