【云原生Kubernetes】K8S集群+负载均衡层+防火墙 实例 |
您所在的位置:网站首页 › 如何在k8s中实现负载均衡 › 【云原生Kubernetes】K8S集群+负载均衡层+防火墙 实例 |
实验拓扑: 实验要求: (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 三、创建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 四、搭建负载均衡层负载均衡区域配置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 |