实战【云原生】--- Kubernetes集群

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

    • 一、kubeadm 部署 K8S 集群架构
      • 1、关闭所有节点的防火墙 核心防护 iptables swap交换
      • 2、修改主机名
      • 3、调整内核参数
    • 二、安装Docker
      • 1、所有节点安装docker
      • 2、所有节点配置k8s源
      • 3、所有节点安装kubeadm,kubelet和kubectl
    • 三、部署k8s集群
      • 1、查看初始化需要的镜像
      • 2、初始化kubeadm
      • 3、设定kubectl
      • 4、在 node 节点上执行 kubeadm join 命令加入群集
      • 5、查看master节点状态
      • 6、测试创建资源pod
      • 7、暴露端口提供服务
    • 四、创建两个自主式pod
      • 1、在master节点创建yaml文件
      • 2、创建service资源
    • 五、搭建负载均衡
      • 1、关闭防火墙 核心防护
      • 2、配置nginx在线yum源
      • 3、两个Ib01 Ib02安装nginx
      • 4、修改nginx配置文件
      • 5、安装keepalive
      • 6、修改配置文件
    • 六、配置防火墙服务器
      • 1、修改网卡配置文件
      • 2、配置防火墙服务器
      • 3、开启路由转发功能
      • 4、配置iptables策略
      • 5、设置snat服务。解析源地址。修改nat表中的postrouting链
      • 6、修改网关服务器的网卡配置信息
      • 7、在客户端浏览器访问验证

实验需求

(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集群_第1张图片
实验环境

节点 IP地址 组件
master01 192.168.10.130 docker、kubeadm、kubelet、kubectl
node01 192.168.10.132 docker、kubeadm、kubelet、kubectl
node02 192.168.10.133 docker、kubeadm、kubelet、kubectl
Ib01 192.168.10.134 nginx,keepalived
Ib02 192.168.10.135 nginx,keepalived
网关服务器 192.168.10.136 iptables
Client 192.168.10.137

一、kubeadm 部署 K8S 集群架构

1、关闭所有节点的防火墙 核心防护 iptables swap交换

[root@master01 ~]#setenforce 0
setenforce: SELinux is disabled
[root@master01 ~]#systemctl disable  --now firewalld
[root@master01 ~]#sed -i 's/enforcing/disabled/' /etc/selinux/config
[root@master01 ~]#iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
[root@master01 ~]#swapoff -a
[root@master01 ~]#sed -ri 's/.*swap.*/#&/' /etc/fstab
[root@master01 ~]#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

实战【云原生】--- Kubernetes集群_第2张图片

2、修改主机名

并写入三台机子的hosts中
[root@master01 ~]#cat >> /etc/hosts << EOF
192.168.10.130 master
192.168.10.132 node01
192.168.10.133 node02
EOF

实战【云原生】--- Kubernetes集群_第3张图片
实战【云原生】--- Kubernetes集群_第4张图片
实战【云原生】--- Kubernetes集群_第5张图片

3、调整内核参数

[root@master01 ~]#cat > /etc/sysctl.d/kubernetes.conf << EOF
#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF
[root@master01 ~]#sysctl --system  

实战【云原生】--- Kubernetes集群_第6张图片
实战【云原生】--- Kubernetes集群_第7张图片

二、安装Docker

1、所有节点安装docker

[root@master01 ~]#yum install -y yum-utils device-mapper-persistent-data lvm2 
[root@master01 ~]#yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
[root@master01 ~]#mkdir /etc/docker/
[root@master01 ~]#cat > /etc/docker/daemon.json <

实战【云原生】--- Kubernetes集群_第8张图片

2、所有节点配置k8s源

[root@master01 ~]#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

实战【云原生】--- Kubernetes集群_第9张图片

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

[root@master01 ~]#yum install -y kubelet-1.20.11 kubeadm-1.20.11 kubectl-1.20.11
[root@master01 ~]#systemctl enable kubelet.service

实战【云原生】--- Kubernetes集群_第10张图片

三、部署k8s集群

1、查看初始化需要的镜像

[root@master01 ~]#kubeadm config images list
[root@master01 opt]#unzip v1.20.11.zip -d /opt/k8s/
[root@master01 opt]#cd /opt/k8s/v1.20.11/
[root@master01 v1.20.11]#for i in $(ls *.tar); do docker load -i $i; done
#复制镜像和脚本到 node 节点,并在 node 节点上执行脚本加载镜像文件
[root@master01 v1.20.11]#scp -r /opt/k8s/ [email protected]:/opt/
[root@master01 v1.20.11]#scp -r /opt/k8s/ [email protected]:/opt/
[root@node01 ~]# for i in $(ls *.tar); do docker load -i $i; done
[root@node02 ~]# for i in $(ls *.tar); do docker load -i $i; done

实战【云原生】--- Kubernetes集群_第11张图片

2、初始化kubeadm

[root@master01 v1.20.11]#kubeadm init \
 --apiserver-advertise-address=192.168.10.130 \
 --image-repository registry.aliyuncs.com/google_containers \
 --kubernetes-version=v1.20.11 \
 --service-cidr=10.96.0.0/16 \
 --pod-network-cidr=10.244.0.0/16 \
 --token-ttl=0

实战【云原生】--- Kubernetes集群_第12张图片

3、设定kubectl

[root@master01 v1.20.11]#mkdir -p $HOME/.kube
[root@master01 v1.20.11]#cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master01 v1.20.11]#chown $(id -u):$(id -g) $HOME/.kube/config
[root@master01 v1.20.11]#kubectl edit cm kube-proxy -n=kube-system  #修改mode为ipvs
[root@master01 v1.20.11]#kubectl get cs
#如果 kubectl get cs 发现集群不健康,更改以下两个文件
[root@master01 v1.20.11]#vim /etc/kubernetes/manifests/kube-scheduler.yaml 
[root@master01 v1.20.11]#vim /etc/kubernetes/manifests/kube-controller-manager.yaml 
把httpGet:字段下的hosts由127.0.0.1变成192.168.10.130(有两处)
#- --port=0					# 搜索port=0,把这一行注释掉
[root@master01 v1.20.11]#systemctl restart kubelet.service

实战【云原生】--- Kubernetes集群_第13张图片
实战【云原生】--- Kubernetes集群_第14张图片
实战【云原生】--- Kubernetes集群_第15张图片

[[email protected]]#kubectl  apply  -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

在这里插入图片描述

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

[root@node01 ~]# kubeadm join 192.168.10.130:6443 --token v9j0q9.qfqlv6blwhey7xkr \
>     --discovery-token-ca-cert-hash sha256:6a2e1807937153b2243535a0a3bb5d8002c8034f611f905fee3462ace2e8d0d6 

[root@node02 ~]#kubeadm join 192.168.10.130:6443 --token rc0kfs.a1sfe3gl4dvopck5     --discovery-token-ca-cert-hash sha256:864fe553c812df2af262b406b707db68b0fd450dc08b34efb73dd5a4771d37a2

实战【云原生】--- Kubernetes集群_第16张图片

5、查看master节点状态

[root@master01 v1.20.11]#systemctl restart kubelet
[root@master01 v1.20.11]#kubectl get nodes
[root@master01 v1.20.11]#kubectl get pods -n kube-system

实战【云原生】--- Kubernetes集群_第17张图片

6、测试创建资源pod

[root@master01 v1.20.11]#kubectl create deployment nginx --image=nginx
[root@master01 v1.20.11]#kubectl get pods -o wide
[root@master01 v1.20.11]#kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
nginx-6799fc88d8-n4jr7   1/1     Running   0          29s   10.244.2.2   node02              

在这里插入图片描述

7、暴露端口提供服务

[root@master01 v1.20.11]#kubectl expose deployment nginx --port=80 --type=NodePort
[root@master01 v1.20.11]#kubectl get svc

在这里插入图片描述

四、创建两个自主式pod

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

1、在master节点创建yaml文件

[root@master01 ~]#vim mynginx.yaml
---
 apiVersion: v1
 kind: Pod
 metadata:
   labels:
     app: zz-nginx
   name: zz-nginx01
 spec:
   nodeName: node01
   containers:
   - image: nginx:1.14
     name: mynginx
     ports:
     - containerPort: 80
     volumeMounts:
     - name: page01
       mountPath: /usr/share/nginx/html
       readOnly: false
   volumes:
   - name: page01
     hostPath:
       path: /data
       type: DirectoryOrCreate
---
 apiVersion: v1
kind: Pod
 metadata:
   labels:
     app: zz-nginx
   name: zz-nginx02
 spec:
   nodeName: 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:
       path: /data
       type: DirectoryOrCreate
#保存退出

实战【云原生】--- Kubernetes集群_第18张图片
实战【云原生】--- Kubernetes集群_第19张图片
实战【云原生】--- Kubernetes集群_第20张图片
实战【云原生】--- Kubernetes集群_第21张图片

2、创建service资源

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

[root@master01 ~]#vim myservice.yaml
apiVersion: v1
kind: Service
metadata:
    name: zz-nginx-svc
    namespace: default
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30000
  selector:
app: zz-nginx

实战【云原生】--- Kubernetes集群_第22张图片

五、搭建负载均衡

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

Ib01:192.168.10.134

Ib02:192.168.10.135

VIP:192.168.10.100

1、关闭防火墙 核心防护

[root@Ib01 ~]#setenforce 0
[root@Ib01 ~]#systemctl disable --now firewalld
[root@Ib01 ~]#sed -i 's/enforcing/disabled/' /etc/selinux/config

在这里插入图片描述
在这里插入图片描述

2、配置nginx在线yum源

[root@Ib01 ~]#cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
EOF
[root@Ib02 ~]#cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
EOF

实战【云原生】--- Kubernetes集群_第23张图片

3、两个Ib01 Ib02安装nginx

[root@Ib01 ~]#yum install nginx -y

实战【云原生】--- Kubernetes集群_第24张图片

4、修改nginx配置文件

配置四层反向代理负载均衡,指定k8s群集2台node的节点ip和30000端口
[root@Ib01 ~]#vim /etc/nginx/nginx.conf 
[root@Ib01 ~]#nginx -t
#在http模块上方添加stream
stream{
   upstream k8s-nodes {
       server 192.168.10.132:30000;
       server 192.168.10.133:30000;
   }
   server {
      listen 3322;
      proxy_pass k8s-nodes;
   }
}
[root@Ib01 ~]#systemctl start nginx
[root@Ib01 ~]#ss -natp | grep 3322
LISTEN     0      128          *:3322                     *:*                   users:(("nginx",pid=61768,fd=6),("nginx",pid=61767,fd=6),("nginx",pid=61766,fd=6),("nginx",pid=61765,fd=6),("nginx",pid=61764,fd=6))

实战【云原生】--- Kubernetes集群_第25张图片
实战【云原生】--- Kubernetes集群_第26张图片
实战【云原生】--- Kubernetes集群_第27张图片
实战【云原生】--- Kubernetes集群_第28张图片

5、安装keepalive

[root@Ib01 ~]#yum install keepalived.x86_64 -y

实战【云原生】--- Kubernetes集群_第29张图片

[root@Ib02 ~]#yum install keepalived.x86_64 -y

实战【云原生】--- Kubernetes集群_第30张图片

6、修改配置文件

[root@Ib01 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 Ib01
}
   vrrp_script check_nginx {
       script "/etc/nginx/check_nginx.sh"
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
    auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.100
    }
    track_script {
        check_nginx
    }
}

实战【云原生】--- Kubernetes集群_第31张图片

[root@Ib01 keepalived]#vim /etc/nginx/check_nginx.sh
#!/bin/bash
 #egrep -cv "grep|$$" 用于过滤掉包含grep 或者 $$ 表示的当前Shell进程ID
 count=$(ps -ef | grep nginx | egrep -cv "grep|$$")
 if [ "$count" -eq 0 ];then
     systemctl stop keepalived
 fi

实战【云原生】--- Kubernetes集群_第32张图片

[root@Ib01 keepalived]#chmod +x /etc/nginx/check_nginx.sh 
[root@Ib01 keepalived]#systemctl start keepalived.service 
[root@Ib01 keepalived]#systemctl enable keepalived.service
[root@Ib01 keepalived]#ip a

实战【云原生】--- Kubernetes集群_第33张图片
实战【云原生】--- Kubernetes集群_第34张图片
实战【云原生】--- Kubernetes集群_第35张图片

六、配置防火墙服务器

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

内网网卡ens33:192.168.10.1

外网网卡ens36:12.0.0.1

1、修改网卡配置文件

[root@Ib01 ~]#vim /etc/sysconfig/network-scripts/ifcfg-ens33

实战【云原生】--- Kubernetes集群_第36张图片
在这里插入图片描述

[root@Ib02 ~]#vim /etc/sysconfig/network-scripts/ifcfg-ens33

实战【云原生】--- Kubernetes集群_第37张图片
在这里插入图片描述

2、配置防火墙服务器

[root@iptables ~]#setenforce 0
[root@iptables ~]#systemctl disable  --now firewalld
[root@iptables ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config

在这里插入图片描述

3、开启路由转发功能

[root@iptables ~]#vim /etc/sysctl.conf 
[root@iptables ~]#sysctl -p
net.ipv4.ip_forward = 1

实战【云原生】--- Kubernetes集群_第38张图片

4、配置iptables策略

将原有的规则删除
[root@iptables ~]#iptables -F
[root@iptables ~]#iptables -t nat -F  && iptables -t mangle -F && iptables -X

5、设置snat服务。解析源地址。修改nat表中的postrouting链

[root@iptables ~]#iptables -t nat -A POSTROUTING  -s 192.168.10.100/24 -o ens37 -j SNAT  --to 12.0.0.1
[root@iptables ~]#iptables -t nat -A PREROUTING -i ens37 -d 12.0.0.1 -p tcp --dport 3322 -j DNAT --to 192.168.10.100:3322

实战【云原生】--- Kubernetes集群_第39张图片
实战【云原生】--- Kubernetes集群_第40张图片

6、修改网关服务器的网卡配置信息

修改之前需要添加一张网卡
实战【云原生】--- Kubernetes集群_第41张图片
实战【云原生】--- Kubernetes集群_第42张图片
实战【云原生】--- Kubernetes集群_第43张图片
实战【云原生】--- Kubernetes集群_第44张图片
实战【云原生】--- Kubernetes集群_第45张图片

7、在客户端浏览器访问验证

实战【云原生】--- Kubernetes集群_第46张图片
实战【云原生】--- Kubernetes集群_第47张图片

你可能感兴趣的:(kubernetes,云原生,docker)