【云原生Kubernetes系列项目实战第一篇】k8s集群+高可用负载均衡层+防火墙( 提及年少一词,应与平庸相斥)

您所在的位置:网站首页 k8s与docker的关系 【云原生Kubernetes系列项目实战第一篇】k8s集群+高可用负载均衡层+防火墙( 提及年少一词,应与平庸相斥)

【云原生Kubernetes系列项目实战第一篇】k8s集群+高可用负载均衡层+防火墙( 提及年少一词,应与平庸相斥)

2023-04-19 02:06| 来源: 网络整理| 查看: 265

系列文章目录

😜即日起,更新云原生相关知识,喜欢的小伙伴可以给我点个三连喔

😜收录至专栏 云原生

😜【云原生Docker系列第一篇】Docker镜像管理

😜【云原生Docker系列第二篇】Docker容器管理

😜【云原生Docker系列第三篇】Docker网络模式

😜【云原生Docker系列第四篇】Docker Cgroups资源控制操作

😜【云原生Docker系列第五篇】Docker数据管理

😜【云原生Docker系列第六篇】基于docker创建镜像

😜【云原生Docker系列第七篇】浅谈镜像的分层原理

😜【云原生Docker系列第九篇】Docker-Compose 容器集群的快速编排

😜【云原生Docker系列项目实战第一篇】dockerfile+lnmp+workpress

😜【云原生Kubernetes系列第一篇】深入理解容器集群管理系统Kubernetes(k8s)

😜【云原生Kubernetes系列第二篇】Kubernetes(k8s)核心组件

😜【云原生Kubernetes系列第三篇】二进制部署单节点Kubernetes(k8s)v1.20

😜【云原生Kubernetes系列第五篇】kubeadm v1.20 部署K8S 集群架构

😜【云原生Kubernetes系列第七篇】一文掌握k8s之YAML文件

文章目录 系列文章目录前言一、Kubeadm 方式部署 k8s 集群1.1 环境准备(所有节点操作)1.2 所有节点安装docker1.3 所有节点安装kubeadm,kubelet和kubectl1.4 部署K8S集群1.5 所有节点部署网络插件flannel 二、创建两个自主式Pod资源三、创建service资源四、搭建负载均衡层五、配置网关服务器

前言

实验拓扑:

实验要求:

(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,外网网卡ens32:12.0.0.1iptables客户端12.0.0.1 一、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 } #末尾再添加以下内容 --- apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: ipvs #把默认的kube-proxy调度方式改为ipvs模式 #在master节点操作,初始化kubeadm,搭建k8s控制平面节点。结尾会有几条命令分别在master和node上执行 kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log #--experimental-upload-certs 参数可以在后续执行加入节点时自动分发证书文件,K8S V1.16版本开始替换为 --upload-certs #tee kubeadm-init.log 用以输出日志 #master节点执行以下命令: #kubectl需经由API server认证及授权后方能执行相应的管理操作,kubeadm 部署的集群为其生成了一个具有管理员权限的认证配置文件 /etc/kubernetes/admin.conf,它可由 kubectl 通过默认的 “$HOME/.kube/config” 的路径进行加载。 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config #两个node节点执行以下命令,加入集群: kubeadm join 192.168.10.10:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:b48d7bec33150c0f58bd04c17a6b994900fdef116b6ef355282909330b3a23cc #查看 kubeadm-init 日志 less kubeadm-init.log #kubernetes配置文件目录 ls /etc/kubernetes/ #存放ca等证书和密码的目录 ls /etc/kubernetes/pki #--------- 5、master节点,修改yaml文件,进行健康检查 ------------------------ #初始化后,kubeadm本身没有健康检查方法,需要修改两个yaml文件,之后重启kubelet。 kubectl get cs #查看集群健康状态,有2个组件不健康,需要修改对应组件的yaml文件 #如果 kubectl get cs 发现集群不健康,更改以下两个yaml文件 vim /etc/kubernetes/manifests/kube-scheduler.yaml ...... 16 - --bind-address=192.168.10.10 #修改成k8s的控制节点master的ip ...... 19 #- --port=0 # 搜索port=0,把这一行注释掉 ...... 24 httpGet: 25 host: 192.168.10.10 #修改成k8s的控制节点master的ip ...... 38 httpGet: 39 host: 192.168.10.10 #修改成k8s的控制节点master的ip vim /etc/kubernetes/manifests/kube-controller-manager.yaml 17 - --bind-address=192.168.10.10 #修改成k8s的控制节点master的ip ...... 26 #- --port=0 # 搜索port=0,把这一行注释掉 ...... 36 httpGet: 37 host: 192.168.10.10 #修改成k8s的控制节点master的ip ...... 50 httpGet: 51 host: 192.168.10.10 #修改成k8s的控制节点master的ip #重启kubelet systemctl restart kubelet #查看集群健康状态 kubectl get cs

1.5 所有节点部署网络插件flannel #在master节点查看所有节点状态,由于网络插件还没有部署,节点没有准备就绪,所以显示NotReady kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady control-plane,master 8m52s v1.20.11 node01 NotReady 7m9s v1.20.11 node02 NotReady 7m5s v1.20.11 #---所有节点部署网络插件flannel ##(1)方法一: #所有节点上传flannel镜像 flannel.tar 到 /opt 目录,master节点上传 kube-flannel.yml 文件。 #kube-flannel.yml 文件的下载地址https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml cd /opt docker load -i flannel.tar #所有节点导入镜像 #在 master 节点创建 flannel 资源 kubectl apply -f kube-flannel.yml --------------------------------------------------------------------------------------------- ##(2)方法二: kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml #在 node 节点上执行 kubeadm join 命令加入群集 kubeadm join 192.168.80.10:6443 --token rc0kfs.a1sfe3gl4dvopck5 \ --discovery-token-ca-cert-hash sha256:864fe553c812df2af262b406b707db68b0fd450dc08b34efb73dd5a4771d37a2 ------------------------------------------------------------------------------------------------- #现在在master节点查看节点状态,都已是Ready状态 kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready control-plane,master 136m v1.20.11 node01 Ready 98m v1.20.11 node02 Ready 92m v1.20.11 #查看各组件,都是Running状态 kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-74ff55c5b-788pc 1/1 Running 0 137m coredns-74ff55c5b-9hfnv 1/1 Running 0 137m etcd-master 1/1 Running 0 137m kube-apiserver-master 1/1 Running 0 137m kube-controller-manager-master 1/1 Running 0 45m kube-flannel-ds-8ck6r 1/1 Running 0 3m10s kube-flannel-ds-9svrq 1/1 Running 0 3m10s kube-flannel-ds-fxpwt 1/1 Running 0 3m10s kube-proxy-22mgq 1/1 Running 0 137m kube-proxy-2lx25 1/1 Running 0 93m kube-proxy-s5s75 1/1 Running 0 99m kube-scheduler-master 1/1 Running 0 62m

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

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

#1、先空跑命令,生成nginx的pod模板文件 kubectl run mynginx --image=nginx:1.14 --port=80 --dry-run=client -o yaml > nginx-pod.yaml #2、修改模板文件 --- apiVersion: v1 kind: Pod metadata: labels: run: nginx name: nginx01 spec: nodeName: node01 containers: - image: nginx name: nginx ports: - containerPort: 80 volumeMounts: - name: node1-html mountPath: /usr/share/nginx/html/ volumes: - name: node1-html hostPath: path: /data/ type: DirectoryOrCreate --- apiVersion: v1 kind: Pod metadata: labels: run: nginx name: nginx02 spec: nodeName: node02 containers: - image: nginx name: nginx ports: - containerPort: 80 volumeMounts: - name: node2-html mountPath: /usr/share/nginx/html/ volumes: - name: node2-html hostPath: path: /data/ type: DirectoryOrCreate #使用yaml文件创建自主式Pod资源 kubectl apply -f nginx-pod.yaml pod/nginx01 created pod/nginx02 created #查看创建的两个pod,被调度到了不同的node节点 kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx01 1/1 Running 0 2m11s 10.244.1.2 node01 nginx02 1/1 Running 0 2m11s 10.244.2.2 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.2 #访问Node02节点的Pod的IP

三、创建service资源

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

[root@master opt]# vim pod-nginx-service.yaml apiVersion: v1 kind: Service metadata: labels: run: nginx name: nginx-service spec: ports: - port: 80 protocol: TCP targetPort: 80 nodePort: 30000 selector: run: nginx type: NodePort [root@master opt]# kubectl apply -f pod-nginx-service.yaml service/nginx-service created [root@master opt]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 443/TCP 47m nginx-service NodePort 10.110.35.189 80:30000/TCP 7s [root@master opt]# kubectl describe svc kubernetes nginx-service [root@master opt]# kubectl describe svc nginx-service Name: nginx-service Namespace: default Labels: run=nginx Annotations: Selector: run=nginx Type: NodePort IP Families: IP: 10.110.35.189 IPs: 10.110.35.189 Port: 80/TCP TargetPort: 80/TCP NodePort: 30000/TCP Endpoints: 10.244.1.2:80,10.244.2.2:80 Session Affinity: None External Traffic Policy: Cluster Events:

[root@master opt]# curl 192.168.10.20:30000 this is node02 [root@master opt]# curl 192.168.10.10:30000 this is node02 [root@master opt]# curl 192.168.10.30:30000 this is node02 [root@master opt]# curl 192.168.10.10:30000 this is node01

四、搭建负载均衡层

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

lb01:192.168.10.40lb02:192.168.10.50VIP: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 upstream k8s-nodes { server 192.168.10.20:30000; #node01IP:nodePort server 192.168.10.30:30000; #node02IP:nodePort } server { listen 30000; #自定义监听端口 proxy_pass k8s-nodes; } } http { ...... #include /etc/nginx/conf.d/*.conf; #建议将这一行注释掉,否则会同时加载/etc/nginx/conf.d/default.conf文件中的内容,nginx会同时监听80端口。 } #检查配置文件语法是否正确 nginx -t #启动nginx服务,查看到已监听30000端口 systemctl start nginx systemctl enable nginx netstat -natp | grep nginx tcp 0 0 0.0.0.0:30000 0.0.0.0:* LISTEN 53751/nginx: master #------------2、两台负载均衡器配置keepalived-------- #安装keepalived yum install -y keepalived #在/etc/keepalived目录下创建nginx检测脚本 cd /etc/keepalived/ vim check_nginx.sh #!/bin/bash #检测nginx是否启动了 A=`ps -C nginx --no-header |wc -l` if [ $A -eq 0 ];then #如果nginx没有启动就启动nginx systemctl start nginx #重启nginx if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #nginx重启失败,则停掉keepalived服务,进行VIP转移 killall keepalived fi fi #给脚本执行权限 chmod +x check_nginx.sh #修改keepalived配置文件 vim keepalived.conf ! Configuration File for keepalived global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 #修改邮箱地址 smtp_connect_timeout 30 router_id NGINX_01 #修改主备id #删掉这里的四行vrrp } #加入周期性检测nginx服务脚本的相关配置 vrrp_script check_nginx{ script "/etc/keepalived/check_nginx.sh" #心跳执行的脚本,检测nginx是否启动 interval 2 #(检测脚本执行的间隔,单位是秒) } vrrp_instance VI_1 { state MASTER interface ens33 #修改网卡名称 virtual_router_id 51 priority 100 #优先级,主不改,备改成比100小就行 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.10.100 #修改VIP地址 } #添加跟踪(执行脚本) track_script{ check_nginx } } #重启服务 systemctl restart keepalived.service systemctl enable keepalived.service #备服务器下载好keepalived后,在主服务器上将脚本和keepalived配置文件传过去 [root@nginx01 keepalived]# scp * 192.168.10.50:`pwd` #传过去后修改三处 router_id NGINX_02 state BACKUP priority 90 #然后重启服务 systemctl restart keepalived.service systemctl enable keepalived.service

五、配置网关服务器

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

内网网卡ens33:192.168.10.1外网网卡ens32:12.0.0.1 ##两台负载均衡器,将网关地址修改为防火墙服务器的内网IP地址 vim /etc/sysconfig/network-scripts/ifcfg-ens33 GATEWAY="192.168.10.1" systemctl restart network #重启网络 ##配置防火墙服务器 #-------------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 ens32 -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 ens32 -d 12.0.0.1 -p tcp --dport 8080 -j DNAT --to 192.168.10.100:30000 #-A PREROUTING //在PREROUTING链中添加规则 #-i ens32 //入站网卡 #-d 12.0.0.254 //数据包的目的地址 #-p tcp --dport 3344 //数据包的目的端口 #-j DNAT --to 192.168.10.100:3344 //使用DNAT功能,将目的地址和端口转换成192.168.10.100:3344 #查看策略 [root@wall ~]# 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:8080 to:192.168.10.100:30000 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:8080 进行访问

配置客户端

做的匆忙,可能自己做的时候改了,截图没改过来,小错误,望指正!



【本文地址】


今日新闻


推荐新闻


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