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

您所在的位置:网站首页 如何在k8s中实现负载均衡 【云原生Kubernetes】K8S集群+负载均衡层+防火墙 实例

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

2023-10-01 01:31| 来源: 网络整理| 查看: 265

实验拓扑:

拓扑.png

实验要求:

(1)Kubernetes 区域可采用 Kubeadm 方式进行安装。

(2)要求在 Kubernetes 环境中,通过yaml文件的方式,创建2个Nginx Pod分别放置在两个不同的节点上,Pod使用hostPath类型的存储卷挂载,节点本地目录共享使用 /data,2个Pod副本测试页面二者要不同,以做区分,测试页面可自己定义。

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

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

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

实验环境:

节点IP安装组件master(2C/4G,cpu核心数要求大于2)192.168.10.10docker、kubeadm、kubelet、kubectl、flannelnode01(2C/2G)192.168.10.20docker、kubeadm、kubelet、kubectl、flannelnode02(2C/2G)192.168.10.30docker、kubeadm、kubelet、kubectl、flannellb01192.168.10.40nginx,keepalivedlb02192.168.10.50nginx,keepalived网关服务器内网网卡ens33:192.168.10.1,外网网卡ens36:12.0.0.1iptables客户端12.0.0.12 一、Kubeadm 方式部署 k8s 集群 1.1 环境准备(所有节点操作)  #所有节点,关闭防火墙规则,关闭selinux,关闭swap交换  systemctl stop firewalld  systemctl disable firewalld  setenforce 0  sed -i 's/enforcing/disabled/' /etc/selinux/config  iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X  ​  swapoff -a #交换分区必须要关闭  sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭swap分区,&符号在sed命令中代表上次匹配的结果  ​  #加载 ip_vs 模块  for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done  ​  #修改主机名  hostnamectl set-hostname master     #master节点操作  su  hostnamectl set-hostname node01     #node01节点操作  su  hostnamectl set-hostname node02     #node02节点操作  su  ​  #所有节点修改/etc/hosts文件,添加IP和主机名的映射关系  vim /etc/hosts  192.168.10.10 master  192.168.10.20 node01  192.168.10.30 node02  ​  #调整内核参数  cat > /etc/sysctl.d/kubernetes.conf /etc/docker/daemon.json mynginx.yaml  ​  #2、修改模板文件  vim mynginx.yaml  ---  apiVersion: v1  kind: Pod  metadata:   labels:     app: yuji-nginx #pod的标签   name: yuji-nginx01  spec:   nodeName: node01       #指定该pod调度到node01节点   containers:    - image: nginx:1.14     name: mynginx     ports:      - containerPort: 80 #定义容器的端口     volumeMounts:         #挂载存储卷      - name: page01 #名称需要与下方定义的存储卷的名称一致       mountPath: /usr/share/nginx/html #容器中的挂载点,设置为nginx服务的网页根目录       readOnly: false     #可读可写   volumes:                #定义一个存储卷    - name: page01 #存储卷的名称     hostPath: #存储卷的类型为 hostPath       path: /data #node节点的共享目录       type: DirectoryOrCreate #该类型表示如果共享目录不存在,则系统会自动创建该目录  ---  apiVersion: v1  kind: Pod  metadata:   labels:     app: yuji-nginx #pod的标签   name: yuji-nginx02  spec:   nodeName: node02         #指定该pod调度到node02节点   containers:    - name: mynginx     image: nginx:1.14     ports:      - containerPort: 80 #定义容器的端口     volumeMounts:           #挂载存储卷      - name: page02 #名称需要与下方定义的存储卷的名称一致       mountPath: /usr/share/nginx/html #容器中的挂载点       readOnly: false   volumes: #定义一个存储卷    - name: page02 #存储卷的名称     hostPath:            #存储卷类型为 hostPath       path: /data #node节点的共享目录       type: DirectoryOrCreate #该类型表示如果共享目录不存在,则系统会自动创建该目录          #使用yaml文件创建自主式Pod资源  kubectl apply -f mynginx.yaml  ​  #查看创建的两个pod,被调度到了不同的node节点  kubectl get pods -o wide  NAME           READY   STATUS   RESTARTS   AGE     IP           NODE     NOMINATED NODE   READINESS GATES  yuji-nginx01   1/1     Running   0         9m16s   10.244.1.2   node01              yuji-nginx02   1/1     Running   0         9m16s   10.244.2.4   node02              ​  #---3、两个node节点的存储卷,写入不同的html文件内容,验证访问网页  #node01节点  echo "this is node01" > /data/index.html  ​  #node02节点  echo "this is node02 ~~" > /data/index.html  ​  curl 10.244.1.2   #访问Node01节点的Pod的IP  ​  curl 10.244.2.4   #访问Node02节点的Pod的IP

1-0.jpg

1-1.jpg

1-2.jpg

1-3.jpg

1-4.jpg

三、创建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              443/TCP       27h  yuji-nginx-svc   NodePort    10.96.100.164          80:30000/TCP   76s  ​  #查看service资源的详细信息  kubectl describe svc yuji-nginx-svc    Name:                     yuji-nginx-svc  Namespace:               default  Labels:                    Annotations:              Selector:                 app=yuji-nginx  Type:                     NodePort  IP Families:              IP:                       10.96.100.164  IPs:                      10.96.100.164  Port:                      80/TCP  TargetPort:               80/TCP  NodePort:                  30000/TCP  Endpoints:                10.244.1.2:80,10.244.2.4:80    #service资源管理的2个pod  Session Affinity:         None  External Traffic Policy: Cluster  Events:                    ​  ​  #3、测试使用nodeIP:nodePort访问nginx网页  curl 192.168.10.20:30000   #node01  ​  curl 192.168.10.30:30000   #node02

1.jpg

2.jpg

3.jpg

四、搭建负载均衡层

负载均衡区域配置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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3