• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

K8S集群+负载均衡层+防火墙

武飞扬头像
龙Llong
帮助1

实验拓扑图:

学新通

实验要求:

(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.10 docker、kubeadm、kubelet、kubectl、flannel
node01(2C/2G) 192.168.10.20 docker、kubeadm、kubelet、kubectl、flannel
node02(2C/2G) 192.168.10.30 docker、kubeadm、kubelet、kubectl、flannel
lb01 192.168.10.40 nginx,keepalived
lb02 192.168.10.50 nginx,keepalived
网关服务器 内网网卡ens33:192.168.10.1,外网网卡ens36:12.0.0.1 iptables
客户端 12.0.0.12  

一、kubeadm 部署 K8S 集群架构

1、环境准备

//所有节点,关闭防火墙规则,关闭selinux,关闭swap交换

  1.  
    systemctl stop firewalld
  2.  
    systemctl disable firewalld
  3.  
    setenforce 0
  4.  
    iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
  5.  
    swapoff -a #交换分区必须要关闭
  6.  
    sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭swap分区,&符号在sed命令中代表上次匹配的结果
  7.  
    #加载 ip_vs 模块
  8.  
    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
学新通

//修改主机名

  1.  
    hostnamectl set-hostname master
  2.  
    hostnamectl set-hostname node01
  3.  
    hostnamectl set-hostname node02
学新通
学新通
学新通

//所有节点修改hosts文件

  1.  
    vim /etc/hosts
  2.  
    192.168.160.20 master
  3.  
    192.168.160.40 node01
  4.  
    192.168.160.90 node02
学新通

//调整内核参数

  1.  
    cat > /etc/sysctl.d/kubernetes.conf << EOF
  2.  
    #开启网桥模式,可将网桥的流量传递给iptables链
  3.  
    net.bridge.bridge-nf-call-ip6tables=1
  4.  
    net.bridge.bridge-nf-call-iptables=1
  5.  
    #关闭ipv6协议
  6.  
    net.ipv6.conf.all.disable_ipv6=1
  7.  
    net.ipv4.ip_forward=1
  8.  
    EOF
学新通

//生效参数

sysctl --system
学新通

2、所有节点安装docker

  1.  
    yum install -y yum-utils device-mapper-persistent-data lvm2
  2.  
    yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  3.  
    yum install -y docker-ce docker-ce-cli containerd.io
  4.  
     
  5.  
    mkdir /etc/docker
  6.  
    cat > /etc/docker/daemon.json <<EOF
  7.  
    {
  8.  
    "registry-mirrors": ["https://6g3b0w0w.mirror.aliyuncs.com"],
  9.  
    "exec-opts": ["native.cgroupdriver=systemd"],
  10.  
    "log-driver": "json-file",
  11.  
    "log-opts": {
  12.  
    "max-size": "100m"
  13.  
    }
  14.  
    }
  15.  
    EOF
  16.  
    #使用Systemd管理的Cgroup来进行资源控制与管理,因为相对Cgroupfs而言,Systemd限制CPU、内存等资源更加简单和成熟稳定。
  17.  
    #日志使用json-file格式类型存储,大小为100M,保存在/var/log/containers目录下,方便ELK等日志系统收集和管理日志。
  18.  
     
  19.  
    systemctl daemon-reload
  20.  
    systemctl restart docker.service
  21.  
    systemctl enable docker.service
  22.  
     
  23.  
    docker info | grep "Cgroup Driver"
学新通
学新通
学新通
学新通

3、所有节点安装kubeadm,kubelet和kubectl

//定义kubernetes源,安装kubeadm,kubelet和kubectl

  1.  
    cat > /etc/yum.repos.d/kubernetes.repo << EOF
  2.  
    [kubernetes]
  3.  
    name=Kubernetes
  4.  
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
  5.  
    enabled=1
  6.  
    gpgcheck=0
  7.  
    repo_gpgcheck=0
  8.  
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  9.  
    EOF
  10.  
     
  11.  
    yum install -y kubelet-1.15.1 kubeadm-1.15.1 kubectl-1.15.1
学新通

//开机自启kubelet

systemctl enable kubelet.service

 #K8S通过kubeadm安装出来以后都是以Pod方式存在,即底层是以容器方式运行,所以kubelet必须设置开机自启

学新通

4、部署K8S集群

//查看初始化需要的镜像

kubeadm config images list
学新通
 
//在 master 节点上传 v1.20.11.zip压缩包至 /opt 目录
  1.  
    unzip v1.20.11.zip -d /opt/k8s
  2.  
    cd /opt/k8s/v1.20.11
  3.  
     
  4.  
    for i in $(ls *.tar); do docker load -i $i; done
学新通
学新通

//复制镜像和脚本到 node 节点,并在 node 节点上执行脚本加载镜像文件

  1.  
    scp -r /opt/k8s root@node01:/opt
  2.  
    scp -r /opt/k8s root@node02:/opt
学新通
学新通
学新通

//初始化kubeadm

这里我用的是方法一

方法一:

  1.  
    kubeadm config print init-defaults > /opt/kubeadm-config.yaml
  2.  
     
  3.  
    cd /opt/
  4.  
    vim kubeadm-config.yaml
  5.  
    ......
  6.  
    11 localAPIEndpoint:
  7.  
    12 advertiseAddress: 192.168.160.20 #指定master节点的IP地址
  8.  
    13 bindPort: 6443
  9.  
    ......
  10.  
    34 kubernetesVersion: v1.20.11 #指定kubernetes版本号
  11.  
    35 networking:
  12.  
    36 dnsDomain: cluster.local
  13.  
    37 podSubnet: "10.244.0.0/16" #指定pod网段,10.244.0.0/16用于匹配flannel默认网段
  14.  
    38 serviceSubnet: 10.96.0.0/16 #指定service网段
  15.  
    39 scheduler: {}
  16.  
    --- #末尾再添加以下内容
  17.  
    apiVersion: kubeproxy.config.k8s.io/v1alpha1
  18.  
    kind: KubeProxyConfiguration
  19.  
    mode: ipvs #把默认的service调度方式改为ipvs模式
  20.  
     
  21.  
     
  22.  
    kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log
  23.  
    #--experimental-upload-certs 参数可以在后续执行加入节点时自动分发证书文件,k8sV1.16版本开始替换为 --upload-certs
  24.  
    #tee kubeadm-init.log 用以输出日志
学新通
学新通
学新通
学新通
学新通

//查看 kubeadm-init 日志

less kubeadm-init.log
学新通
学新通

//kubernetes配置文件目录

ls /etc/kubernetes/
学新通

//存放ca等证书和密码的目录

ls /etc/kubernetes/pki
学新通

方法二:

  1.  
    kubeadm init \
  2.  
    --apiserver-advertise-address=192.168.160.20 \
  3.  
    --image-repository registry.aliyuncs.com/谷歌_containers \
  4.  
    --kubernetes-version=v1.15.1 \
  5.  
    --service-cidr=10.1.0.0/16 \
  6.  
    --pod-network-cidr=10.244.0.0/16

--------------------------------------------------------------------------------------------
初始化集群需使用kubeadm init命令,可以指定具体参数初始化,也可以指定配置文件初始化。
可选参数:
--apiserver-advertise-address:apiserver通告给其他组件的IP地址,一般应该为Master节点的用于集群内部通信的IP地址,0.0.0.0表示节点上所有可用地址
--apiserver-bind-port:apiserver的监听端口,默认是6443
--cert-dir:通讯的ssl证书文件,默认/etc/kubernetes/pki
--control-plane-endpoint:控制台平面的共享终端,可以是负载均衡的ip地址或者dns域名,高可用集群时需要添加
--image-repository:拉取镜像的镜像仓库,默认是k8s.gcr.io
--kubernetes-version:指定kubernetes版本
--pod-network-cidr:pod资源的网段,需与pod网络插件的值设置一致。通常,Flannel网络插件的默认为10.244.0.0/16,Calico插件的默认值为192.168.0.0/16;
--service-cidr:service资源的网段
--service-dns-domain:service全域名的后缀,默认是cluster.local
---------------------------------------------------------------------------------------------

方法二初始化后需要修改 kube-proxy 的 configmap,开启 ipvs

  1.  
    kubectl edit cm kube-proxy -n=kube-system
  2.  
    修改mode: ipvs
  3.  
     
  4.  
     
  5.  
     
  6.  
    提示:
  7.  
    ......
  8.  
    Your Kubernetes control-plane has initialized successfully!
  9.  
     
  10.  
    To start using your cluster, you need to run the following as a regular user:
  11.  
     
  12.  
    mkdir -p $HOME/.kube
  13.  
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  14.  
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
  15.  
     
  16.  
    You should now deploy a pod network to the cluster.
  17.  
    Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  18.  
    https://kubernetes.io/docs/concepts/cluster-administration/addons/
  19.  
     
  20.  
    Then you can join any number of worker nodes by running the following on each as root:
  21.  
    kubeadm join 192.168.160.20:6443 --token abcdef.0123456789abcdef \
  22.  
    --discovery-token-ca-cert-hash sha256:1e59b41e6e5cddb0d8b6798ab758bb1753ade0bb62037b8d1f22853d33333264
学新通
学新通

//在 node 节点上执行 kubeadm join 命令加入群集

  1.  
    kubeadm join 192.168.160.20:6443 --token abcdef.0123456789abcdef \
  2.  
    --discovery-token-ca-cert-hash sha256:1e59b41e6e5cddb0d8b6798ab758bb1753ade0bb62037b8d1f22853d33333264
学新通
学新通

//所有节点部署网络插件flannel
方法一:
//所有节点上传flannel镜像 flannel.tar 到 /opt 目录,master节点上传 kube-flannel.yml 文件

  1.  
    cd /opt
  2.  
    docker load -i flannel.tar
学新通
学新通
学新通

//在 master 节点创建 flannel 资源

kubectl apply -f kube-flannel.yml
学新通

如果状态还是NotReady,就替换新的cni成旧的cni,因为新的cni有污点,还有flannel.tar,重新下载镜像,kube-flannel.yml替换好了就行了

学新通
学新通

//在master节点查看节点状态(需要等几分钟)

kubectl get pods -n kube-system
学新通

//测试 pod 资源创建

  1.  
    kubectl create deployment nginx --image=nginx
  2.  
     
  3.  
    kubectl get pods -o wide
  4.  
    NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  5.  
    nginx-6799fc88d8-wltvk 0/1 ContainerCreating 0 22s <none> node01 <none> <none>
学新通

//暴露端口提供服务

  1.  
    kubectl expose deployment nginx --port=80 --type=NodePort
  2.  
    kubectl get svc
学新通
学新通

//扩展3个副本

  1.  
    kubectl scale deployment nginx --replicas=3
  2.  
    kubectl get pods -o wide
学新通

二、创建两个自主式Pod资源

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

  1.  
    #1、先空跑命令,生成nginx的pod模板文件
  2.  
     kubectl run mynginx --image=nginx:1.14 --port=80 --dry-run=client -o yaml > mynginx.yaml
  3.  
     
  4.  
     #2、修改模板文件
  5.  
     vim mynginx.yaml
  6.  
     ---
  7.  
     apiVersion: v1
  8.  
     kind: Pod
  9.  
     metadata:
  10.  
      labels:
  11.  
        app: mcl-nginx #pod的标签
  12.  
      name: mcl-nginx01
  13.  
     spec:
  14.  
      nodeName: node01       #指定该pod调度到node01节点
  15.  
      containers:
  16.  
       - image: nginx:1.14
  17.  
        name: mynginx
  18.  
        ports:
  19.  
         - containerPort: 80 #定义容器的端口
  20.  
        volumeMounts:         #挂载存储卷
  21.  
         - name: page01 #名称需要与下方定义的存储卷的名称一致
  22.  
          mountPath: /usr/share/nginx/html #容器中的挂载点,设置为nginx服务的网页根目录
  23.  
          readOnly: false     #可读可写
  24.  
      volumes:                #定义一个存储卷
  25.  
       - name: page01 #存储卷的名称
  26.  
        hostPath: #存储卷的类型为 hostPath
  27.  
          path: /data #node节点的共享目录
  28.  
          type: DirectoryOrCreate #该类型表示如果共享目录不存在,则系统会自动创建该目录
  29.  
     ---
  30.  
     apiVersion: v1
  31.  
     kind: Pod
  32.  
     metadata:
  33.  
      labels:
  34.  
        app: mcl-nginx #pod的标签
  35.  
      name: mcl-nginx02
  36.  
     spec:
  37.  
      nodeName: node02         #指定该pod调度到node02节点
  38.  
      containers:
  39.  
       - name: mynginx
  40.  
        image: nginx:1.14
  41.  
        ports:
  42.  
         - containerPort: 80 #定义容器的端口
  43.  
        volumeMounts:           #挂载存储卷
  44.  
         - name: page02 #名称需要与下方定义的存储卷的名称一致
  45.  
          mountPath: /usr/share/nginx/html #容器中的挂载点
  46.  
          readOnly: false
  47.  
      volumes: #定义一个存储卷
  48.  
       - name: page02 #存储卷的名称
  49.  
        hostPath:            #存储卷类型为 hostPath
  50.  
          path: /data #node节点的共享目录
  51.  
          type: DirectoryOrCreate #该类型表示如果共享目录不存在,则系统会自动创建该目录
  52.  
           
  53.  
     #使用yaml文件创建自主式Pod资源
  54.  
     kubectl apply -f mynginx.yaml
  55.  
     
  56.  
     #查看创建的两个pod,被调度到了不同的node节点
  57.  
     [root@master ~]# kubectl get pods -o wide
  58.  
    NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  59.  
    mcl-nginx01 1/1 Running 0 35s 10.244.1.15 node01 <none> <none>
  60.  
    mcl-nginx02 1/1 Running 0 35s 10.244.2.4 node02 <none> <none>
  61.  
    nginx-deployment 1/1 Running 0 10d 10.244.1.14 node01 <none> <none>
  62.  
     
  63.  
     
  64.  
     #---3、两个node节点的存储卷,写入不同的html文件内容,验证访问网页
  65.  
     #node01节点
  66.  
     echo "this is node01" > /data/index.html
  67.  
     
  68.  
     #node02节点
  69.  
     echo "this is node02 ~~" > /data/index.html
  70.  
     
  71.  
     curl 10.244.1.15   #访问Node01节点的Pod的IP
  72.  
     
  73.  
     curl 10.244.2.4   #访问Node02节点的Pod的IP
学新通

学新通

学新通

学新通

学新通

学新通

三、创建service资源

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

  1.  
    #1、编写service对应的yaml文件
  2.  
     vim myservice.yaml
  3.  
     apiVersion: v1
  4.  
     kind: Service
  5.  
     metadata:
  6.  
        name: mcl-nginx-svc
  7.  
        namespace: default  
  8.  
     spec:
  9.  
      type: NodePort        #service类型设置为NodePort
  10.  
      ports:
  11.  
       - port: 80 #service使用的端口号,ClusterIP后面跟的端口号。
  12.  
        targetPort: 80 #需要转发到的后端Pod的端口号
  13.  
        nodePort: 30000     #指定映射到物理机的端口号,k8s集群外部可以使用nodeIP:nodePort访问service
  14.  
      selector:            
  15.  
        app: mcl-nginx #标签选择器要和上一步创建的pod的标签保持一致
  16.  
         
  17.  
     #创建service资源    
  18.  
     kubectl apply -f myservice.yaml
  19.  
     
  20.  
     #2、查看service资源
  21.  
     kubectl get svc
  22.  
     NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  23.  
    kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11d
  24.  
    mcl-nginx-svc NodePort 10.100.5.197 <none> 80:30000/TCP 17s
  25.  
    nginx NodePort 10.105.252.176 <none> 80:30051/TCP 11d
  26.  
     
  27.  
     
  28.  
     #查看service资源的详细信息
  29.  
     kubectl describe svc yuji-nginx-svc  
  30.  
     Name: mcl-nginx-svc
  31.  
    Namespace: default
  32.  
    Labels: <none>
  33.  
    Annotations: <none>
  34.  
    Selector: app=mcl-nginx
  35.  
    Type: NodePort
  36.  
    IP Families: <none>
  37.  
    IP: 10.100.5.197
  38.  
    IPs: 10.100.5.197
  39.  
    Port: <unset> 80/TCP
  40.  
    TargetPort: 80/TCP
  41.  
    NodePort: <unset> 30000/TCP
  42.  
    Endpoints: 10.244.1.15:80,10.244.2.4:80
  43.  
    Session Affinity: None
  44.  
    External Traffic Policy: Cluster
  45.  
    Events: <none>
  46.  
     
  47.  
     
  48.  
     
  49.  
     #3、测试使用nodeIP:nodePort访问nginx网页
  50.  
     curl 192.168.10.20:30000   #node01
  51.  
     
  52.  
     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.  
    #---------1、两台负载均衡器配置nginx--------------
  2.  
     
  3.  
     #关闭防火墙和selinux
  4.  
     systemctl stop firewalld
  5.  
     systemctl disable firewalld
  6.  
     setenforce 0
  7.  
     sed -i 's/enforcing/disabled/' /etc/selinux/config
  8.  
     
  9.  
     #设置主机名
  10.  
     hostnamectl set-hostname lb01
  11.  
     su
  12.  
     hostnamectl set-hostname lb02
  13.  
     su
  14.  
     
  15.  
     #配置nginx的官方在线yum源
  16.  
     cat > /etc/yum.repos.d/nginx.repo << 'EOF'
  17.  
     [nginx]
  18.  
     name=nginx repo
  19.  
     baseurl=http://nginx.org/packages/centos/7/$basearch/
  20.  
     gpgcheck=0
  21.  
     EOF
  22.  
     
  23.  
     yum install nginx -y
  24.  
     
  25.  
     #修改nginx配置文件,配置四层反向代理负载均衡,指定k8s群集2台node的节点ip和30000端口
  26.  
     vim /etc/nginx/nginx.conf
  27.  
     events {
  28.  
        worker_connections  1024;
  29.  
     }
  30.  
     
  31.  
     #在http块上方,添加stream块
  32.  
     stream {
  33.  
        upstream k8s-nodes {
  34.  
            server 192.168.160.40:30000;    #node01IP:nodePort
  35.  
            server 192.168.160.90:30000;    #node02IP:nodePort
  36.  
        }
  37.  
        server {
  38.  
            listen 3344;                  #自定义监听端口
  39.  
            proxy_pass k8s-nodes;
  40.  
        }
  41.  
     }
  42.  
     
  43.  
     http {
  44.  
     ......
  45.  
         #include /etc/nginx/conf.d/*.conf;   #建议将这一行注释掉,否则会同时加载/etc/nginx/conf.d/default.conf文件中的内容,nginx会同时监听80端口。
  46.  
     }
  47.  
     
  48.  
     #检查配置文件语法是否正确
  49.  
     nginx -t  
  50.  
     
  51.  
     #启动nginx服务,查看到已监听3344端口
  52.  
     systemctl start nginx
  53.  
     systemctl enable nginx
  54.  
     netstat -natp | grep nginx
  55.  
     tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3088/nginx: master
  56.  
    tcp 0 0 0.0.0.0:3344 0.0.0.0:* LISTEN 3088/nginx: master
  57.  
     
  58.  
     
  59.  
     
  60.  
     #------------2、两台负载均衡器配置keepalived--------
  61.  
     
  62.  
     #安装keepalived服务
  63.  
     yum install keepalived -y
  64.  
     
  65.  
     #修改keepalived配置文件
  66.  
     vim /etc/keepalived/keepalived.conf
  67.  
     ! Configuration File for keepalived
  68.  
     
  69.  
     global_defs {
  70.  
        # 接收邮件地址
  71.  
        notification_email {
  72.  
          acassen@firewall.loc
  73.  
          failover@firewall.loc
  74.  
          sysadmin@firewall.loc
  75.  
        }
  76.  
        # 邮件发送地址
  77.  
        notification_email_from Alexandre.Cassen@firewall.loc
  78.  
        smtp_server 127.0.0.1    #修改为本机回环地址
  79.  
        smtp_connect_timeout 30
  80.  
        router_id LB01 #lb01节点的为LB01,lb02节点的为LB02
  81.  
     }
  82.  
     
  83.  
     #添加一个周期性执行的脚本
  84.  
     vrrp_script check_nginx {
  85.  
        script "/etc/nginx/check_nginx.sh" #指定检查nginx存活的脚本路径
  86.  
     }
  87.  
     
  88.  
     vrrp_instance VI_1 {
  89.  
        state MASTER #lb01节点的为 MASTER,lb02节点的为 BACKUP
  90.  
        interface ens33 #指定网卡名称 ens33
  91.  
        virtual_router_id 51 #指定组ID,两个节点要一致
  92.  
        priority 100 #设置优先级,lb01节点设置为 100,lb02节点设置为 90
  93.  
        advert_int 1
  94.  
        authentication {
  95.  
            auth_type PASS
  96.  
            auth_pass 1111
  97.  
        }
  98.  
        virtual_ipaddress {
  99.  
             192.168.160.100    #指定VIP地址
  100.  
        }
  101.  
        track_script {          #追踪脚本
  102.  
            check_nginx #指定vrrp_script配置的脚本
  103.  
        }
  104.  
     }
  105.  
     #将配置文件中剩余的内容全都删除
  106.  
     
  107.  
     #主调度器lb01创建nginx状态检查脚本
  108.  
     vim /etc/nginx/check_nginx.sh
  109.  
     #!/bin/bash
  110.  
     #egrep -cv "grep|$$" 用于过滤掉包含grep 或者 $$ 表示的当前Shell进程ID
  111.  
     count=$(ps -ef | grep nginx | egrep -cv "grep|$$")
  112.  
     if [ "$count" -eq 0 ];then
  113.  
        systemctl stop keepalived
  114.  
     fi
  115.  
     
  116.  
     chmod x /etc/nginx/check_nginx.sh  #为脚本增加执行权限
  117.  
     
  118.  
     #启动keepalived服务(一定要先启动了nginx服务,再启动keepalived服务,否则keepalived检测到nginx没有启动,会杀死自己)
  119.  
     systemctl start keepalived
  120.  
     systemctl enable keepalived
  121.  
     ip addr #查看主节点的VIP是否生成
  122.  
     
  123.  
     #测试使用VIP:3344访问web网页
  124.  
     curl 192.168.160.100:3344
  125.  
     
  126.  
     
  127.  
     #----------3、关闭主调度器的nginx服务,模拟故障,测试keepalived-------
  128.  
     
  129.  
     #关闭主调度器lb01的Nginx服务,模拟宕机,观察VIP是否漂移到备节点
  130.  
     systemctl stop nginx
  131.  
     ip addr
  132.  
     systemctl status keepalived   #此时keepalived被脚本杀掉了  
  133.  
     
  134.  
     #备节点查看是否生成了VIP
  135.  
     ip addr    #此时VIP漂移到备节点lb02
  136.  
     
  137.  
     #恢复主节点
  138.  
     systemctl start nginx         #先启动nginx
  139.  
     systemctl start keepalived    #再启动keepalived
  140.  
     ip addr
学新通

学新通学新通学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

五、配置防火墙服务器

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

  • 内网网卡ens33:192.168.10.1
  • 外网网卡ens36:12.0.0.1
  1.  
    ##两台负载均衡器,将网关地址修改为防火墙服务器的内网IP地址
  2.  
     vim /etc/sysconfig/network-scripts/ifcfg-ens33
  3.  
     GATEWAY="192.168.160.1"
  4.  
     
  5.  
     systemctl restart network   #重启网络
  6.  
     systemctl restart keepalived #如果VIP丢失,需要重启一下keepalived
  7.  
     
  8.  
     ##配置防火墙服务器
  9.  
     #-------------1、关闭防火墙和selinux-------------
  10.  
     systemctl stop firewalld
  11.  
     systemctl disable firewalld
  12.  
     setenforce 0
  13.  
     sed -i 's/enforcing/disabled/' /etc/selinux/config
  14.  
     
  15.  
     #------------2、开启路由转发功能----------------
  16.  
     vim /etc/sysctl.conf
  17.  
     net.ipv4.ip_forward = 1     //在文件中增加这一行,开启路由转发功能
  18.  
     
  19.  
     sysctl -p   //加载修改后的配置
  20.  
     
  21.  
     
  22.  
     #------------3、配置iptables策略---------------
  23.  
     
  24.  
     #先将原有的规则清除
  25.  
     iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
  26.  
     
  27.  
     #设置SNAT服务,解析源地址。修改nat表中的POSTROUTING链。
  28.  
     #将源地址192.168.10.100转换为为12.0.0.1
  29.  
     iptables -t nat -A POSTROUTING -s 192.168.160.100/24 -o ens36 -j SNAT --to 12.0.0.1
  30.  
      #-t nat                 //指定nat表
  31.  
      #-A POSTROUTING         //在POSTROUTING链中添加规则 
  32.  
      #-s 192.168.160.100/24   //数据包的源地址
  33.  
      #-o ens36               //出站网卡
  34.  
      #-j SNAT --to 12.0.0.1   //使用SNAT服务,将源地址转换成公网IP地址。
  35.  
     
  36.  
     
  37.  
     #设置DNAT服务,解析目的地址。修改nat表中的PRETROUTING链。
  38.  
     #将目的地址12.0.0.1:3344 转换成 192.168.160.100:3344
  39.  
     iptables -t nat -A PREROUTING -i ens36 -d 12.0.0.1 -p tcp --dport 3344 -j DNAT --to 192.168.10.100:3344
  40.  
      #-A PREROUTING         //在PREROUTING链中添加规则       
  41.  
      #-i ens36             //入站网卡
  42.  
      #-d 12.0.0.254         //数据包的目的地址
  43.  
      #-p tcp --dport 3344   //数据包的目的端口
  44.  
      #-j DNAT --to 192.168.160.100:3344   //使用DNAT功能,将目的地址和端口转换成192.168.10.100:3344
  45.  
      
  46.  
     
  47.  
     iptables -t nat -nL   #查看策略
  48.  
     Chain PREROUTING (policy ACCEPT)
  49.  
    target prot opt source destination
  50.  
    DNAT tcp -- 0.0.0.0/0 12.0.0.1 tcp dpt:3344 to:192.168.160.100:3344
  51.  
     
  52.  
    Chain INPUT (policy ACCEPT)
  53.  
    target prot opt source destination
  54.  
     
  55.  
    Chain OUTPUT (policy ACCEPT)
  56.  
    target prot opt source destination
  57.  
     
  58.  
    Chain POSTROUTING (policy ACCEPT)
  59.  
    target prot opt source destination
  60.  
    SNAT all -- 192.168.160.0/24 0.0.0.0/0 to:12.0.0.1
  61.  
     
  62.  
      
  63.  
     ##客户端修改网关配置文件,测试访问内网的Web服务
  64.  
     客户端IP地址:12.0.0.12,将网关地址设置为防火墙服务器的外网网卡地址:12.0.0.1
  65.  
     浏览器输入 http://12.0.0.1:3344 进行访问
学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggbgig
系列文章
更多 icon
同类精品
更多 icon
继续加载