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

目录

环境准备

拓朴图

项目需求

[一、Kubernetes 区域可采用 Kubeadm 方式进行安装](#一、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.1复制镜像和脚本到 node 节点,并在 node 节点上执行脚本)

1.4.2初始化kubeadm

[1.4.3master 开启集群,等待node节点加入](#1.4.3master 开启集群,等待node节点加入)

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

[在 node01和node02 节点上执行 kubeadm join 命令加入群集](#在 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服务发布出去。](#三、编写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集群node01 | 192.168.246.11 | |
| k8s集群node02 | 192.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交换

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 master01
hostnamectl set-hostname node01
hostnamectl set-hostname node02

#所有节点修改hosts文件
vim /etc/hosts 
192.168.246.10 master01
192.168.246.11 node01
192.168.246.12 node02

#所有节点调整内核参数

1.2所有节点安装docker

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

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

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

systemctl enable kubelet.service

1.4部署K8S集群

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

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

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

1.4.2初始化kubeadm

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

1.4.3master 开启集群,等待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 用以输出日志  
 
 
less kubeadm-init.log   #查看 kubeadm-init 日志
 
ls /etc/kubernetes/   #kubernetes配置文件目录
 
ls /etc/kubernetes/pki	  #存放ca等证书和密码的目录

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

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

1.4.5修改配置文件

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

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

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

1.6查看安装

二、

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

2.1创建yaml文件

[root@master01 ~]#kubectl run mynginx --image=nginx:1.14 --port=80 --dry-run=client -o yaml > nginx-pod.yaml
[root@master01 ~]#cd /opt
[root@master01 opt]#mkdir /opt/kaoshi
[root@master01 opt]#cd 
[root@master01 ~]#mv nginx-pod.yaml /opt/kaoshi/
[root@master01 ~]#cd /opt/kaoshi/
[root@master01 kaoshi]#ls
nginx-pod.yaml
[root@master01 kaoshi]#vim nginx-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: nginx
  name: nginx01
spec:
  nodeName: node01
  containers:
  - image: nginx
    name: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: node01-html
      mountPath: /usr/share/nginx/html
      readOnly: false
  volumes:
  - name: node01-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: node02-html
      mountPath: /usr/share/nginx/html
      readOnly: false
  volumes:
  - name: node02-html
    hostPath:
      path: /data
      type: DirectoryOrCreate

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

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

查看调度

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

[root@master01 kaoshi]#kubectl get pods -o wide|grep nginx
nginx01                            1/1     Running   0          3m46s   10.244.1.14   node01   <none>           <none>
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

apiVersion: v1
kind: Service
metadata:
  labels:
    run: nginx
  name: nginx-service
spec:
  type: NodePort
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30000
  selector:
    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服务

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

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

stream {
    log_format  main  '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sen
t'; 
 
        access_log  /var/log/nginx/k8s-access.log  main;
        
    upstream k8s-nodes {
        server 192.168.246.11:30000;
        server 192.168.246.12:30000;
    }   
    server {
        listen 30000;
        proxy_pass k8s-nodes;
    }   
}

nginx -t   
 
systemctl start nginx
systemctl enable nginx
netstat -natp | grep nginx

4.2安装keepalived服务

yum install keepalived -y

4.3修改keepalived的配置文件

! Configuration File for keepalived
 
global_defs {                     # 接收邮件地址
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc     # 邮件发送地址
   smtp_server 127.0.0.1    #修改
   smtp_connect_timeout 30  
   router_id NGINX_MASTER  # #nginx01节点的为NGINX_MASTER,nginx02节点的为NGINX_BACKUP
}
   vrrp_script check_nginx {              #添加一个周期性执行的脚本
     script "/etc/nginx/check_nginx.sh"   #指定检查nginx存活的脚本路径
}
 
vrrp_instance VI_1 {
    state MASTER              #nginx01节点的为 MASTER,nginx02节点的为 BACKUP
    interface ens33           #指定网卡名称 ens33
    virtual_router_id 51      #指定vrid,两个节点要一致
    priority 100              #nginx01节点的为 100,nginx02节点的为 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
virtual_ipaddress {           #指定虚拟ip地址
        192.168.246.100/24
    }
 
    track_script {                   #指定vrrp_script配置的脚本
        check_nginx
    }
}

#!/bin/bash
killall -0 nginx
if [ $? -ne 0 ];then
    systemctl stop keepalived
fi

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

chmod +x /etc/nginx/check_nginx.sh

#重启服务
systemctl restart keepalived.service
systemctl enable keepalived.service

4.4访问检测

4.5检测下是否高可用

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

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

​
! Configuration File for keepalived
 
global_defs {                     # 接收邮件地址
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc     # 邮件发送地址
   smtp_server 127.0.0.1    #修改
   smtp_connect_timeout 30  
   router_id NGINX_MASTER  # #nginx01节点的为NGINX_MASTER,nginx02节点的为NGINX_BACKUP
}

   vrrp_script check_nginx {              #添加一个周期性执行的脚本
     script "/etc/nginx/check_nginx.sh"   #指定检查nginx存活的脚本路径
}
vrrp_script check_down {
        script "/etc/nginx/check_nginx.sh"
        interval 1
        weight -30
        fall 3
        rise 2
        timeout 2
}
 
vrrp_instance VI_1 {
    state MASTER              #nginx01节点的为 MASTER,nginx02节点的为 BACKUP
    interface ens33           #指定网卡名称 ens33
    virtual_router_id 51      #指定vrid,两个节点要一致
    priority 100              #nginx01节点的为 100,nginx02节点的为 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
virtual_ipaddress {           #指定虚拟ip地址
        192.168.246.100/24
    }
 
    track_script {                   #指定vrrp_script配置的脚本
        check_nginx
    }
}

编辑脚本

​vim /etc/nginx/check_nginx.sh
killall -0 nginx

chmod +x /etc/nginx/check_nginx.sh

#这个命令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开启路由转发

vim /etc/sysctl.conf
net.ipv4.ip_forward = 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
[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地址

开启路由转发

vim /etc/sysctl.conf

net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0

sysctl -p

5.5访问测试

相关推荐
dessler19 分钟前
Docker-run命令详细讲解
linux·运维·后端·docker
群联云防护小杜32 分钟前
如何给负载均衡平台做好安全防御
运维·服务器·网络·网络协议·安全·负载均衡
PyAIGCMaster1 小时前
ubuntu装P104驱动
linux·运维·ubuntu
奈何不吃鱼1 小时前
【Linux】ubuntu依赖安装的各种问题汇总
linux·运维·服务器
icy、泡芙1 小时前
T527-----音频调试
linux·驱动开发·音视频
aherhuo1 小时前
kubevirt网络
linux·云原生·容器·kubernetes
爱码小白1 小时前
网络编程(王铭东老师)笔记
服务器·网络·笔记
zzzhpzhpzzz1 小时前
Ubuntu如何查看硬件型号
linux·运维·ubuntu
蜜獾云1 小时前
linux firewalld 命令详解
linux·运维·服务器·网络·windows·网络安全·firewalld
陌北v11 小时前
Docker Compose 配置指南
运维·docker·容器·docker-compose