目录

一、环境准备

1.1完成master02节点的初始化操作

1.2 部署master02 节点

1.2.1准备好master节点所需要的文件

1.2.2进入master02操作修改配置文件kube-apiserver中的IP

1.2.3在 master02 节点上启动各服务并设置开机自启

1.2.4在master02查看node节点状态

二、负载均衡部署(nginx+keepalived)

2.1部署nginx服务

    2.2 部署keepalived服务

2.2.1修改keepalived配置文件

2.2.2创建nginx状态检查脚本 

2.2.3启动keepalived服务

2.3修改所有node节点配置文件

2.3.1修改node节点上的bootstrap.kubeconfig  配置文件为VIP

2.3.2修改node节点上的kubelet.kubeconfig  配置文件为VIP

2.3.3修改node节点上的kube-proxy.kubeconfig配置文件为VIP

2.3.4 重启kubelet和kube-proxy服务

 2.4在 master01 节点上操作 

三、部署 Dashboard

3.1Dashboard 介绍

3.2部署 Dashboard

3.2.1node1、node2操作

3.2.2在 master01 节点上操作

3.2.2.1创建服务账户

3.2.2.2列出令牌的详细信息

3.3使用输出的token登录Dashboard


一、环境准备

环境准备:(红色为新增的服务器)

服务器类型

系统和IP地址

备注

master02

192.168.246.9

kube-apiserver,kube-controller-manager,kube-scheduler,etcd

master01

192.168.246.10

kube-apiserver、kube-controller-manager、kube-scheduler、etcd

node01

192.168.246.11

etcd 、kubelet、kube-proxy、docker 

node02

192.168.246.12

etcd 、kubelet、kube-proxy、docker 

负载均衡nginx+keepalive01(master)

192.168.246.13

Nginx  、keepalived

负载均衡nginx+keepalive02(backup)

192.168.246.14

Nginx  、keepalived

之前已经完成了单master节点的部署,现在需要完成多master节点以及实现k8s集群负载均衡的高可用

1.1完成master02节点的初始化操作

怎么给k8s ingress配负载均衡 k8s实现负载均衡_负载均衡

怎么给k8s ingress配负载均衡 k8s实现负载均衡_容器_02

1.2 部署master02 节点

1.2.1准备好master节点所需要的文件

etcd数据库所需要的ssl证书、master01节点的kubernetes安装目录(二进制文件、组件与apiserver通信的集群引导文件、启动参数配置文件)、kubectl与apiserver通信的集群引导文件、各组件被systemd管理的service文件

从 master01 节点上拷贝证书文件、各master组件的配置文件和服务管理文件到 master02 

怎么给k8s ingress配负载均衡 k8s实现负载均衡_kubernetes_03

scp -r /opt/etcd/ root@192.168.246.9:/opt/
scp -r /opt/kubernetes/ root@192.168.246.9:/opt
scp -r /root/.kube root@192.168.246.9:/root
scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@192.168.246.9:/usr/lib/systemd/system/

怎么给k8s ingress配负载均衡 k8s实现负载均衡_负载均衡_04

怎么给k8s ingress配负载均衡 k8s实现负载均衡_容器_05

根据您提供的信息,看起来是一个文件传输的输出日志。这个日志的文件名是 kube-apiserver.master01.root.log.ERROR.20240515-163831.505,并且传输完成了。

怎么给k8s ingress配负载均衡 k8s实现负载均衡_容器_06

1.2.2进入master02操作修改配置文件kube-apiserver中的IP

vim /opt/kubernetes/cfg/kube-apiserver

KUBE_APISERVER_OPTS="--logtostderr=true \
--v=4 \
--etcd-servers=https://192.168.10.80:2379,https://192.168.10.18:2379,https://192.168.10.19:2379 \
--bind-address=192.168.10.20 \                #修改
--secure-port=6443 \
--advertise-address=192.168.10.20 \            #修改
......

怎么给k8s ingress配负载均衡 k8s实现负载均衡_怎么给k8s ingress配负载均衡_07

怎么给k8s ingress配负载均衡 k8s实现负载均衡_nginx_08

1.2.3在 master02 节点上启动各服务并设置开机自启

systemctl start kube-apiserver.service
systemctl enable kube-apiserver.service
systemctl start kube-controller-manager.service
systemctl enable kube-controller-manager.service
systemctl start kube-scheduler.service
systemctl enable kube-scheduler.service

1.2.4在master02查看node节点状态

ln -s /opt/kubernetes/bin/* /usr/local/bin/
kubectl get nodes
kubectl get nodes -o wide			#-o=wide:输出额外信息;对于Pod,将输出Pod所在的Node名
#此时在master02节点查到的node节点状态仅是从etcd查询到的信息,而此时node节点实际上并未与master02节点建立通信连接,因此需要使用一个VIP把node节点与master节点都关联起来

怎么给k8s ingress配负载均衡 k8s实现负载均衡_容器_09

二、负载均衡部署(nginx+keepalived)

配置load balancer集群双机热备负载均衡(nginx实现负载均衡,keepalived实现双机热备)

2.1部署nginx服务

两台nginx都要操作哦

怎么给k8s ingress配负载均衡 k8s实现负载均衡_kubernetes_10

 在nginx01、nginx02节点上都要操作 

配置nginx的官方在线yum源,配置本地nginx的yum源
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

怎么给k8s ingress配负载均衡 k8s实现负载均衡_容器_11

修改nginx配置文件,配置四层反向代理负载均衡

指定k8s群集2台master的节点ip和6443端口

stream {
    log_format  main  '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';

        access_log  /var/log/nginx/k8s-access.log  main;

    upstream k8s-apiserver {
        server 192.168.246.10:6443;
        server 192.168.246.9:6443;
    }
    server {
        listen 6443;
        proxy_pass k8s-apiserver;
    }
}

此处仅展示nginx02的修改

怎么给k8s ingress配负载均衡 k8s实现负载均衡_kubernetes_12

#检查配置文件语法
nginx -t   

#启动nginx服务,查看已监听6443端口
systemctl start nginx
systemctl enable nginx
netstat -natp | grep nginx

怎么给k8s ingress配负载均衡 k8s实现负载均衡_容器_13

怎么给k8s ingress配负载均衡 k8s实现负载均衡_怎么给k8s ingress配负载均衡_14

这边需要等一等,过滤端口的时候

    2.2 部署keepalived服务

yum install keepalived -y

怎么给k8s ingress配负载均衡 k8s实现负载均衡_kubernetes_15

2.2.1修改keepalived配置文件

怎么给k8s ingress配负载均衡 k8s实现负载均衡_容器_16

master配置文件

! 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
    }
}

backup配置文件

怎么给k8s ingress配负载均衡 k8s实现负载均衡_nginx_17

2.2.2创建nginx状态检查脚本 

vim /etc/nginx/check_nginx.sh

#!/bin/bash
#egrep -cv "grep|$$" 用于过滤掉包含grep 或者 $$ 表示的当前Shell进程ID,即脚本运行的当前进程ID号
count=$(ps -ef | grep nginx | egrep -cv "grep|$$")

if [ "$count" -eq 0 ];then
    systemctl stop keepalived
fi

怎么给k8s ingress配负载均衡 k8s实现负载均衡_nginx_18

怎么给k8s ingress配负载均衡 k8s实现负载均衡_容器_19

怎么给k8s ingress配负载均衡 k8s实现负载均衡_nginx_20

怎么给k8s ingress配负载均衡 k8s实现负载均衡_nginx_21

2.2.3启动keepalived服务

(一定要先启动了nginx服务,再启动keepalived服务)

chmod +x /etc/nginx/check_nginx.sh

#启动keepalived服务(一定要先启动了nginx服务,再启动keepalived服务)
systemctl start keepalived
systemctl enable keepalived
ip a           #查看VIP是否生成

怎么给k8s ingress配负载均衡 k8s实现负载均衡_负载均衡_22

怎么给k8s ingress配负载均衡 k8s实现负载均衡_怎么给k8s ingress配负载均衡_23

怎么给k8s ingress配负载均衡 k8s实现负载均衡_容器_24

检测下是否高可用(虚拟ip漂移)

怎么给k8s ingress配负载均衡 k8s实现负载均衡_容器_25

2.3修改所有node节点配置文件

修改所有node节点上的bootstrap.kubeconfig、kubelet.kubeconfig配置文件为VIP

cd /opt/kubernetes/cfg/

vim bootstrap.kubeconfig 
server: https://192.168.246.100:6443
                      
vim kubelet.kubeconfig
server: https://192.168.246.100:6443
                        
vim kube-proxy.kubeconfig
server: https://192.168.246.100:6443

#重启kubelet和kube-proxy服务
systemctl restart kubelet.service 
systemctl restart kube-proxy.service

node01

2.3.1修改node节点上的bootstrap.kubeconfig  配置文件为VIP

怎么给k8s ingress配负载均衡 k8s实现负载均衡_容器_26

2.3.2修改node节点上的kubelet.kubeconfig  配置文件为VIP

怎么给k8s ingress配负载均衡 k8s实现负载均衡_nginx_27

2.3.3修改node节点上的kube-proxy.kubeconfig配置文件为VIP

怎么给k8s ingress配负载均衡 k8s实现负载均衡_负载均衡_28

怎么给k8s ingress配负载均衡 k8s实现负载均衡_nginx_29

node02操作:

怎么给k8s ingress配负载均衡 k8s实现负载均衡_kubernetes_30

怎么给k8s ingress配负载均衡 k8s实现负载均衡_怎么给k8s ingress配负载均衡_31

怎么给k8s ingress配负载均衡 k8s实现负载均衡_nginx_32

2.3.4 重启kubelet和kube-proxy服务
systemctl restart kubelet.service 
systemctl restart kube-proxy.service

怎么给k8s ingress配负载均衡 k8s实现负载均衡_nginx_33

在 nginx01 上查看 nginx 和 node 、 master 节点的连接状态


netstat -natp | grep nginx


怎么给k8s ingress配负载均衡 k8s实现负载均衡_kubernetes_34

nginx02查看

怎么给k8s ingress配负载均衡 k8s实现负载均衡_容器_35

 2.4在 master01 节点上操作 

测试创建pod

kubectl run nginx --image=nginx

怎么给k8s ingress配负载均衡 k8s实现负载均衡_nginx_36

查看Pod的状态信息

kubectl get pods 

kubectl get pods -o wide

怎么给k8s ingress配负载均衡 k8s实现负载均衡_怎么给k8s ingress配负载均衡_37

怎么给k8s ingress配负载均衡 k8s实现负载均衡_容器_38

在对应网段的node节点上操作,可以直接使用浏览器或者curl命令访问

curl 10.244.0.3

怎么给k8s ingress配负载均衡 k8s实现负载均衡_容器_39

这时在master01节点上查看nginx日志

kubectl logs nginx

怎么给k8s ingress配负载均衡 k8s实现负载均衡_怎么给k8s ingress配负载均衡_40

在master02节点上同样可以进行操作,创建pod等、看日志等

三、部署 Dashboard

3.1Dashboard 介绍

仪表板是基于Web的Kubernetes用户界面。您可以使用仪表板将容器化应用程序部署到Kubernetes集群,对容器化应用程序进行故障排除,并管理集群本身及其伴随资源。

您可以使用仪表板来概述群集上运行的应用程序,以及创建或修改单个Kubernetes资源(例如deployment,job,daemonset等)。例如,您可以使用部署向导扩展部署,启动滚动更新,重新启动Pod或部署新应用程序。

仪表板还提供有关群集中Kubernetes资源状态以及可能发生的任何错误的信息。

3.2部署 Dashboard

3.2.1node1、node2操作

 准备Dashboard 和 metrics-scraper.tar压缩包

上传dashboard.tar与metrics-scraper.tar包到node01节点与node02节点的/opt/目录下,用于生成镜像文件


dashboard

Kubernetes Dashboard 是一个基于 Web 的用户界面,用于管理 Kubernetes 集群。通过 Dashboard,用户可以查看集群的状态、管理资源(如部署、Pod、服务等)、以及查看集群的日志和事件。

metrics-scraper

在 Kubernetes Dashboard 中,Metrics Scraper 是一个用于从 Kubernetes 集群中收集度量数据(如 Pod 和节点的 CPU、内存使用情况)的组件。这些数据然后可以在 Dashboard 中显示,帮助用户更好地了解集群的状态和性能

在node01节点上操作

怎么给k8s ingress配负载均衡 k8s实现负载均衡_kubernetes_41

在node02节点上操作

怎么给k8s ingress配负载均衡 k8s实现负载均衡_怎么给k8s ingress配负载均衡_42

3.2.2在 master01 节点上操作

#上传 recommended.yaml 文件到 /opt/k8s 目录中

cd /opt/k8s
vim recommended.yaml  #默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001     #添加
  type: NodePort          #添加
  selector:
    k8s-app: kubernetes-dashboard


kubectl apply -f recommended.yaml

怎么给k8s ingress配负载均衡 k8s实现负载均衡_怎么给k8s ingress配负载均衡_43

怎么给k8s ingress配负载均衡 k8s实现负载均衡_nginx_44

3.2.2.1创建服务账户

创建service account并绑定默认cluster-admin管理员集群角色

kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

怎么给k8s ingress配负载均衡 k8s实现负载均衡_nginx_45

kubectl create serviceaccount dashboard-admin -n kube-system
#kubectl create:创建
#ServiceAccount:创建类型为服务账号
#dashboard-admin:创建服务账号名称,一般为dashboard-admin,具有管理员权限的服务账号
#-n kube-system:指定命名空间kube-system
'命令含义'
#在kube-system命名空间中创建了一个名为dashboard-admin的ServiceAccount(服务账号)
#ServiceAccount是Kubernetes中用于Pod访问API资源的身份。
 
 
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
#kubectl create:创建资源
#clusterrolebinding:用于将ClusterRole绑定到一个或多个服务账号、用户或者组,从而授予它们对集群中资源的访问权限
#dashboard-admin:创建的ClusterRoleBinding的自定义名称,在整个集群中必须是唯一的
#--clusterrole=cluster-admin:标志,用于指定要绑定的ClusterRole的名称
#--serviceaccount=kube-system:dashboard-admin:标志,用于指定服务账号的名称和命名空间
 
'命令含义'
#这个命令创建了一个ClusterRoleBinding,将cluster-admin这个ClusterRole绑定到kube-system命名空间中的dashboard-admin这个ServiceAccount上。
#cluster-admin是一个预定义的ClusterRole,它拥有集群中几乎所有的权限。这意味着与dashboard-admin这个ServiceAccount关联的Pod将能够执行集群中的任何操作。
3.2.2.2列出令牌的详细信息

列出令牌详细信。获取token输出的内容,用于登录dashboard

kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
 
 
#kubectl -n kube-system get secret:列出kube-system命名空间中的所有secrets。
'Secret 是 Kubernetes 中的一个资源对象,用于存储敏感信息,如密码、OAuth令牌和SSH密钥。
这些信息可以以明文或加密的形式存储在Secret中,通常它们会被Base64编码以符合Secret的数据格式'
 
#awk '/dashboard-admin/{print $1}':
使用awk命令过滤输出,只打印与dashboard-adminServiceAccount相关的secret的名称
#默认是dashboard-admin-token-xxxxx,其中xxxxx是一个随机字符串。
 
kubectl describe secrets -n kube-system $(...):
#使用上一步得到的secret名称,描述这个secret的详细信息。
#这通常包括secret的类型(在这种情况下是kubernetes.io/service-account-token),
#以及与ServiceAccount关联的token(这个token通常用于身份验证和授权)。

这条命令是用来查询 Kubernetes 集群中与 dashboard-admin 服务账户相关的秘密(secrets)详细信息的。命令分为两部分,我们逐一解析:

获取 Secret 名称:

kubectl -n kube-system get secret: 这部分命令用于列出 kube-system 命名空间中的所有秘密。
| awk '/dashboard-admin/{print $1}': 这里使用管道 (|) 将前一个命令的输出作为 awk 命令的输入。awk 是一个强大的文本分析工具,这里使用的规则是,如果输出行中包含 "dashboard-admin"(这通常意味着与 dashboard-admin 服务账户相关的秘密),则打印该行的第一列(即Secret的名称)。
描述 Secret 信息:

kubectl describe secrets -n kube-system $(...): 这部分利用上一步得到的 Secret 名称(通过命令替换 $() 实现),在 kube-system 命名空间中执行 describe 命令来展示这些秘密的详细信息。describe 命令提供了关于资源的更详尽视图,包括其元数据、标签、选择器等属性,对于秘密来说,还会展示其类型、数据等敏感内容的加密表示。
总结来说,整个命令的作用是查找 kube-system 命名空间中与 dashboard-admin 服务账户相关的所有秘密,并详细描述这些秘密的信息。这对于调试、审计或理解服务账户认证和授权设置特别有用。

3.3使用输出的token登录Dashboard

https://NodeIP:30001

https://192.168.246.11:30001/  浏览器不太行么,进入虚拟机

怎么给k8s ingress配负载均衡 k8s实现负载均衡_怎么给k8s ingress配负载均衡_46

怎么给k8s ingress配负载均衡 k8s实现负载均衡_容器_47

怎么给k8s ingress配负载均衡 k8s实现负载均衡_nginx_48

怎么给k8s ingress配负载均衡 k8s实现负载均衡_容器_49

总结

多master集群架构的部署过程

首先 部署master02等其他master节点  master01配置文件拷贝(私钥、服务、执行文件)到master02

搭建nginx/Haproxy + keepalived 高可用负载均衡器对master节点

修改 node节点上kubelet kube-proxy的 kubeconfig配置文件对接VIP

kubectl 的配置文件也要对接VIP或者当前的节点