• 【云原生Kubernetes项目部署】k8s集群+高可用负载均衡层+防火墙


    目录

    环境准备

    拓朴图

    项目需求

    一、Kubernetes 区域可采用 Kubeadm 方式进行安装

    1.1所有节点master、node01、node02

    1.2所有节点安装docker

    1.3所有节点安装kubeadm,kubelet和kubectl

    1.4部署K8S集群

    1.4.1复制镜像和脚本到 node 节点,并在 node 节点上执行脚本 

    1.4.2初始化kubeadm

    1.4.3master 开启集群,等待node节点加入

    1.4.4提示成功,然后出现操作提示信息

    在 node01和node02 节点上执行 kubeadm join 命令加入群集

    1.4.5修改配置文件

    1.5所有节点部署网络插件flannel

    1.6查看安装

    二、

    2.1创建yaml文件

    2.2使用yaml文件创建自主式Pod资源

    2.3两个node节点的存储卷,写入不同的html文件内容

    2.4验证访问网页

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

    3.1编写service对应的yaml文件

    3.2启动yaml文件

    3.3访问测试

    四、

    4.1安装nginx服务

    4.2安装keepalived服务

    4.3修改keepalived的配置文件

    4.4访问检测

    4.5检测下是否高可用

    五、

    5.1防火墙服务器配置双网卡

    5.1.1添加网卡

    5.1.2修改地址

    5.2开启路由转发

    5.3客户端配置地址

    5.4修改nginx+keepalived机器的网卡地址

    5.5访问测试


    环境准备

    k8s集群
    k8s集群node01192.168.246.11
    k8s集群node02192.168.246.12
    k8s集群master  192.168.246.10
    k8s集群nginx+keepalive
    负载均衡nginx+keepalive01(master)192.168.246.13
    负载均衡nginx+keepalive02(backup)192.168.246.14
    VIP 192.168.246.100
    iptables防火墙服务器192.168.246.7
    客户机12.0.0.12

    拓朴图

    项目需求

    (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服务。

    一、Kubernetes 区域可采用 Kubeadm 方式进行安装

    1.1所有节点master、node01、node02

    关闭防火墙规则,关闭selinux,关闭swap交换

    1. systemctl stop firewalld
    2. systemctl disable firewalld
    3. setenforce 0
    4. sed -i 's/enforcing/disabled/' /etc/selinux/config
    5. iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
    6. swapoff -a #交换分区必须要关闭
    7. sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭swap分区,&符号在sed命令中代表上次匹配的结果
    8. #加载 ip_vs 模块
    9. 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
    10. #修改主机名
    11. hostnamectl set-hostname master01
    12. hostnamectl set-hostname node01
    13. hostnamectl set-hostname node02
    14. #所有节点修改hosts文件
    15. vim /etc/hosts
    16. 192.168.246.10 master01
    17. 192.168.246.11 node01
    18. 192.168.246.12 node02
    19. #所有节点调整内核参数

    1.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. mkdir /etc/docker
    5. cat > /etc/docker/daemon.json <<EOF
    6. {
    7. "registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],
    8. "exec-opts": ["native.cgroupdriver=systemd"],
    9. "log-driver": "json-file",
    10. "log-opts": {
    11. "max-size": "100m"
    12. }
    13. }
    14. EOF
    15. #使用Systemd管理的Cgroup来进行资源控制与管理,因为相对Cgroupfs而言,Systemd限制CPU、内存等资源更加简单和成熟稳定。
    16. #日志使用json-file格式类型存储,大小为100M,保存在/var/log/containers目录下,方便ELK等日志系统收集和管理日志。
    17. systemctl daemon-reload
    18. systemctl restart docker.service
    19. systemctl enable docker.service
    20. docker info | grep "Cgroup Driver"
    21. Cgroup Driver: systemd

    1.3所有节点安装kubeadm,kubelet和kubectl

    1. #定义kubernetes源
    2. cat > /etc/yum.repos.d/kubernetes.repo << EOF
    3. [kubernetes]
    4. name=Kubernetes
    5. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    6. enabled=1
    7. gpgcheck=0
    8. repo_gpgcheck=0
    9. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    10. EOF
    11. yum install -y kubelet-1.20.11 kubeadm-1.20.11 kubectl-1.20.11
    12. #开机自启kubelet
    13. systemctl enable kubelet.service
    14. #K8S通过kubeadm安装出来以后都是以Pod方式存在,即底层是以容器方式运行,所以kubelet必须设置开机自启
    systemctl enable kubelet.service

    1.4部署K8S集群

    1. #查看初始化需要的镜像
    2. kubeadm config images list
    3. #在 master01 节点上传 v1.20.11.zip 压缩包至 /opt 目录
    4. unzip v1.20.11.zip -d /opt/k8s
    5. cd /opt/k8s/v1.20.11
    6. for i in $(ls *.tar); do docker load -i $i; done
    7. #复制镜像和脚本到 node 节点,并在 node 节点上执行脚本加载镜像文件
    8. scp -r /opt/k8s root@node01:/opt
    9. scp -r /opt/k8s root@node02:/opt

    1.4.1复制镜像和脚本到 node 节点,并在 node 节点上执行脚本 

    1. 复制镜像和脚本到 node 节点,并在 node 节点上执行脚本加载镜像文件
    2. scp -r /opt/k8s root@node01:/opt
    3. scp -r /opt/k8s root@node02:/opt
    4. #然后到各个node节点执行
    5. for i in $(ls *.tar); do docker load -i $i; done

    1.4.2初始化kubeadm

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

    1.4.3master 开启集群,等待node节点加入

    1. kubeadm init --config=kubeadm-config.yaml --upload-certs| tee kubeadm-init.log
    2. #--experimental-upload-certs 参数可以在后续执行加入节点时自动分发证书文件,K8S V1.16版本开始替换为 --upload-certs
    3. #tee kubeadm-init.log 用以输出日志
    4. less kubeadm-init.log #查看 kubeadm-init 日志
    5. ls /etc/kubernetes/ #kubernetes配置文件目录
    6. ls /etc/kubernetes/pki #存放ca等证书和密码的目录

    1.4.4提示成功,然后出现操作提示信息

    1. Your Kubernetes control-plane has initialized successfully!
    2. To start using your cluster, you need to run the following as a regular user:
    3. mkdir -p $HOME/.kube
    4. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    5. sudo chown $(id -u):$(id -g) $HOME/.kube/config
    6. Alternatively, if you are the root user, you can run:
    7. export KUBECONFIG=/etc/kubernetes/admin.conf
    8. You should now deploy a pod network to the cluster.
    9. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
    10. https://kubernetes.io/docs/concepts/cluster-administration/addons/
    11. Then you can join any number of worker nodes by running the following on each as root:
    12. kubeadm join 192.168.246.10:6443 --token abcdef.0123456789abcdef \
    13. --discovery-token-ca-cert-hash sha256:764f6f1c1cce7eef4fbfb1585c2e1353e04429de7c6163a4fab16a1f96a6b9a5
    14. #设定kubectl
    15. kubectl需经由API server认证及授权后方能执行相应的管理操作,kubeadm 部署的集群为其生成了一个具有管理员权限的认证配置文件 /etc/kubernetes/admin.conf,它可由 kubectl 通过默认的 “$HOME/.kube/config” 的路径进行加载。
    16. mkdir -p $HOME/.kube
    17. cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    18. chown $(id -u):$(id -g) $HOME/.kube/config
    在 node01和node02 节点上执行 kubeadm join 命令加入群集
    1. kubeadm join 192.168.246.10:6443 --token abcdef.0123456789abcdef \
    2. --discovery-token-ca-cert-hash sha256:764f6f1c1cce7eef4fbfb1585c2e1353e04429de7c6163a4fab16a1f96a6b9a5

    1.4.5修改配置文件

    1. 如果 kubectl get cs 发现集群不健康,更改以下两个文件
    2. vim /etc/kubernetes/manifests/kube-scheduler.yaml
    3. vim /etc/kubernetes/manifests/kube-controller-manager.yaml
    4. # 修改如下内容
    5. 把--bind-address=127.0.0.1变成--bind-address=192.168.246.10
    6. #修改成k8s的控制节点master01的ip
    7. 把httpGet:字段下的hosts由127.0.0.1变成192.168.246.10(有两处)
    8. #- --port=0 # 搜索port=0,把这一行注释掉
    9. systemctl restart kubelet

    1.5所有节点部署网络插件flannel

    1. cd /opt
    2. 上传安装包 kuadmin.zip
    3. unzip kuadmin.zip #解压
    4. 拷贝到node节点
    5. scp flannel-cni-v1.2.0.tar flannel-v0.22.2.tar 192.168.246.11:/opt
    6. scp flannel-cni-v1.2.0.tar flannel-v0.22.2.tar 192.168.246.12:/opt
    7. 加载
    8. docker load -i flannel-v0.22.2.tar
    9. docker load -i flannel-cni-v1.2.0.tar
    10. ​kubectl apply -f kube-flannel.yml

    1.6查看安装

    二、

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

    2.1创建yaml文件

    1. [root@master01 ~]#kubectl run mynginx --image=nginx:1.14 --port=80 --dry-run=client -o yaml > nginx-pod.yaml
    2. [root@master01 ~]#cd /opt
    3. [root@master01 opt]#mkdir /opt/kaoshi
    4. [root@master01 opt]#cd
    5. [root@master01 ~]#mv nginx-pod.yaml /opt/kaoshi/
    6. [root@master01 ~]#cd /opt/kaoshi/
    7. [root@master01 kaoshi]#ls
    8. nginx-pod.yaml
    9. [root@master01 kaoshi]#vim nginx-pod.yaml
    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. labels:
    5. run: nginx
    6. name: nginx01
    7. spec:
    8. nodeName: node01
    9. containers:
    10. - image: nginx
    11. name: nginx
    12. ports:
    13. - containerPort: 80
    14. volumeMounts:
    15. - name: node01-html
    16. mountPath: /usr/share/nginx/html
    17. readOnly: false
    18. volumes:
    19. - name: node01-html
    20. hostPath:
    21. path: /data
    22. type: DirectoryOrCreate
    23. ---
    24. apiVersion: v1
    25. kind: Pod
    26. metadata:
    27. labels:
    28. run: nginx
    29. name: nginx02
    30. spec:
    31. nodeName: node02
    32. containers:
    33. - image: nginx
    34. name: nginx
    35. ports:
    36. - containerPort: 80
    37. volumeMounts:
    38. - name: node02-html
    39. mountPath: /usr/share/nginx/html
    40. readOnly: false
    41. volumes:
    42. - name: node02-html
    43. hostPath:
    44. path: /data
    45. type: DirectoryOrCreate

    2.2使用yaml文件创建自主式Pod资源

    1. [root@master01 kaoshi]#kubectl apply -f nginx-pod.yaml
    2. pod/nginx01 created
    3. pod/nginx02 created

    查看调度

    #查看创建的两个pod,被调度到了不同的node节点

    1. [root@master01 kaoshi]#kubectl get pods -o wide|grep nginx
    2. nginx01 1/1 Running 0 3m46s 10.244.1.14 node01 <none> <none>
    3. nginx02 1/1 Running 0 3m46s 10.244.2.9 node02 <none> <none>

    2.3两个node节点的存储卷,写入不同的html文件内容

    2.4验证访问网页

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

    3.1编写service对应的yaml文件

    [root@master01 kaoshi]#vim pod-nginx-service.yaml
    
    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. labels:
    5. run: nginx
    6. name: nginx-service
    7. spec:
    8. type: NodePort
    9. ports:
    10. - protocol: TCP
    11. port: 80
    12. targetPort: 80
    13. nodePort: 30000
    14. selector:
    15. run: nginx

    3.2启动yaml文件

    3.3访问测试

    四、

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

    k8s集群nginx+keepalive
    负载均衡nginx+keepalive01(master)192.168.246.13
    负载均衡nginx+keepalive02(backup)192.168.246.14

    两台机器都要操作

    4.1安装nginx服务

    1. cat > /etc/yum.repos.d/nginx.repo << 'EOF'
    2. [nginx]
    3. name=nginx repo
    4. baseurl=http://nginx.org/packages/centos/7/$basearch/
    5. gpgcheck=0
    6. EOF
    7. yum install nginx -y

    这边也可以使用nginx的七层负载均衡upstream模块,此文章采用stream模块做四层负载均衡

    1. stream {
    2. log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sen
    3. t';
    4. access_log /var/log/nginx/k8s-access.log main;
    5. upstream k8s-nodes {
    6. server 192.168.246.11:30000;
    7. server 192.168.246.12:30000;
    8. }
    9. server {
    10. listen 30000;
    11. proxy_pass k8s-nodes;
    12. }
    13. }
    1. nginx -t
    2. systemctl start nginx
    3. systemctl enable nginx
    4. netstat -natp | grep nginx

    4.2安装keepalived服务

    yum install keepalived -y

    4.3修改keepalived的配置文件

    1. ! Configuration File for keepalived
    2. global_defs { # 接收邮件地址
    3. notification_email {
    4. acassen@firewall.loc
    5. failover@firewall.loc
    6. sysadmin@firewall.loc
    7. }
    8. notification_email_from Alexandre.Cassen@firewall.loc # 邮件发送地址
    9. smtp_server 127.0.0.1 #修改
    10. smtp_connect_timeout 30
    11. router_id NGINX_MASTER # #nginx01节点的为NGINX_MASTER,nginx02节点的为NGINX_BACKUP
    12. }
    13. vrrp_script check_nginx { #添加一个周期性执行的脚本
    14. script "/etc/nginx/check_nginx.sh" #指定检查nginx存活的脚本路径
    15. }
    16. vrrp_instance VI_1 {
    17. state MASTER #nginx01节点的为 MASTER,nginx02节点的为 BACKUP
    18. interface ens33 #指定网卡名称 ens33
    19. virtual_router_id 51 #指定vrid,两个节点要一致
    20. priority 100 #nginx01节点的为 100,nginx02节点的为 80
    21. advert_int 1
    22. authentication {
    23. auth_type PASS
    24. auth_pass 1111
    25. }
    26. virtual_ipaddress { #指定虚拟ip地址
    27. 192.168.246.100/24
    28. }
    29. track_script { #指定vrrp_script配置的脚本
    30. check_nginx
    31. }
    32. }
    1. #!/bin/bash
    2. killall -0 nginx
    3. if [ $? -ne 0 ];then
    4. systemctl stop keepalived
    5. fi

    此脚本有缺陷,就是每次都要重启keepalived服务,如下有方法二,可以自动进行漂移

    1. chmod +x /etc/nginx/check_nginx.sh
    1. #重启服务
    2. systemctl restart keepalived.service
    3. systemctl enable keepalived.service

    4.4访问检测

    4.5检测下是否高可用

    虚拟ip又回到主7-7上面了,

    方法二:这里是keepalived的配置文件

    1. ! Configuration File for keepalived
    2. global_defs { # 接收邮件地址
    3. notification_email {
    4. acassen@firewall.loc
    5. failover@firewall.loc
    6. sysadmin@firewall.loc
    7. }
    8. notification_email_from Alexandre.Cassen@firewall.loc # 邮件发送地址
    9. smtp_server 127.0.0.1 #修改
    10. smtp_connect_timeout 30
    11. router_id NGINX_MASTER # #nginx01节点的为NGINX_MASTER,nginx02节点的为NGINX_BACKUP
    12. }
    13. vrrp_script check_nginx { #添加一个周期性执行的脚本
    14. script "/etc/nginx/check_nginx.sh" #指定检查nginx存活的脚本路径
    15. }
    16. vrrp_script check_down {
    17. script "/etc/nginx/check_nginx.sh"
    18. interval 1
    19. weight -30
    20. fall 3
    21. rise 2
    22. timeout 2
    23. }
    24. vrrp_instance VI_1 {
    25. state MASTER #nginx01节点的为 MASTER,nginx02节点的为 BACKUP
    26. interface ens33 #指定网卡名称 ens33
    27. virtual_router_id 51 #指定vrid,两个节点要一致
    28. priority 100 #nginx01节点的为 100,nginx02节点的为 80
    29. advert_int 1
    30. authentication {
    31. auth_type PASS
    32. auth_pass 1111
    33. }
    34. virtual_ipaddress { #指定虚拟ip地址
    35. 192.168.246.100/24
    36. }
    37. track_script { #指定vrrp_script配置的脚本
    38. check_nginx
    39. }
    40. }

    编辑脚本

    1. ​vim /etc/nginx/check_nginx.sh
    2. killall -0 nginx
    3. chmod +x /etc/nginx/check_nginx.sh
    4. #这个命令killall -0 nginx的作用是向所有名为nginx的进程发送一个信号0,用于检查进程是否存在且是否具有权限。发送信号0不会实际杀死进程,只是用来检查进程是否存在。

    采用方法二,当master停掉nginx服务,可以进行虚拟ip自动漂移,当master开启nginx服务,它又会自动漂移到master服务上来,不需要重启keepalived服务,所以此处建议采用方法二进行配置

    五、

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

    iptables防火墙服务器192.168.246.7

    5.1防火墙服务器配置双网卡

    5.1.1添加网卡

    5.1.2修改地址

    这边要把DNS解析注释掉,它用网关的ip 进行解析

    systemctl restart network

    5.2开启路由转发

    1. vim /etc/sysctl.conf
    2. net.ipv4.ip_forward = 1

    1. [root@localhost network-scripts]#iptables -t nat -A POSTROUTING -o ens36 -s 192.168.246.0/24 -j SNAT --to 12.0.0.1
    2. [root@localhost network-scripts]#iptables -t nat -A PREROUTING -i ens36 -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.246.100:30000

    5.3客户端配置地址

    客户机12.0.0.12

    systemctl restart network

    5.4修改nginx+keepalived机器的网卡地址

    修改nginx+keepalived机器的网卡地址,指向iptables机器的ip地址

    开启路由转发

    1. vim /etc/sysctl.conf
    2. net.ipv4.ip_forward = 0
    3. net.ipv4.conf.all.send_redirects = 0
    4. net.ipv4.conf.default.send_redirects = 0
    5. net.ipv4.conf.ens33.send_redirects = 0
    6. sysctl -p

    5.5访问测试

  • 相关阅读:
    初识Java 18-2 泛型
    Survey on Cooperative Perception in an Automotive Context 论文阅读
    Alibaba内部传出的面试秘技,秋招offer尽收囊中
    java-net-php-python-32jspm手机销售网站程序计算机毕业设计程序
    Spring4 升级 spring5, Hibernate4 升级 Hibernate5 相关问题总结以及修改注意点
    ES6模块化
    MMDet3D——报错解决:KeyError: ‘XXX is not in the models registry‘
    Python——基本数据类型的转换
    leetcode 236.二叉树的最近公共祖先
    git 常用命令分享
  • 原文地址:https://blog.csdn.net/zzzxxx520369/article/details/139514970