目录
一、环境准备
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节点的初始化操作
1.2 部署master02 节点
1.2.1准备好master节点所需要的文件
etcd数据库所需要的ssl证书、master01节点的kubernetes安装目录(二进制文件、组件与apiserver通信的集群引导文件、启动参数配置文件)、kubectl与apiserver通信的集群引导文件、各组件被systemd管理的service文件
从 master01 节点上拷贝证书文件、各master组件的配置文件和服务管理文件到 master02
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/
根据您提供的信息,看起来是一个文件传输的输出日志。这个日志的文件名是 kube-apiserver.master01.root.log.ERROR.20240515-163831.505,并且传输完成了。
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 \ #修改
......
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节点都关联起来
二、负载均衡部署(nginx+keepalived)
配置load balancer集群双机热备负载均衡(nginx实现负载均衡,keepalived实现双机热备)
2.1部署nginx服务
两台nginx都要操作哦
在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
修改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的修改
#检查配置文件语法
nginx -t
#启动nginx服务,查看已监听6443端口
systemctl start nginx
systemctl enable nginx
netstat -natp | grep nginx
这边需要等一等,过滤端口的时候
2.2 部署keepalived服务
yum install keepalived -y
2.2.1修改keepalived配置文件
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配置文件
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
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是否生成
检测下是否高可用(虚拟ip漂移)
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
2.3.2修改node节点上的kubelet.kubeconfig 配置文件为VIP
2.3.3修改node节点上的kube-proxy.kubeconfig配置文件为VIP
node02操作:
2.3.4 重启kubelet和kube-proxy服务
systemctl restart kubelet.service
systemctl restart kube-proxy.service
在 nginx01 上查看 nginx 和 node 、 master 节点的连接状态
netstat -natp | grep nginx
nginx02查看
2.4在 master01 节点上操作
测试创建pod
kubectl run nginx --image=nginx
查看Pod的状态信息
kubectl get pods
kubectl get pods -o wide
在对应网段的node节点上操作,可以直接使用浏览器或者curl命令访问
curl 10.244.0.3
这时在master01节点上查看nginx日志
kubectl logs nginx
在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节点上操作
在node02节点上操作
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
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}')
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://192.168.246.11:30001/ 浏览器不太行么,进入虚拟机
总结
多master集群架构的部署过程
首先 部署master02等其他master节点 master01配置文件拷贝(私钥、服务、执行文件)到master02
搭建nginx/Haproxy + keepalived 高可用负载均衡器对master节点
修改 node节点上kubelet kube-proxy的 kubeconfig配置文件对接VIP
kubectl 的配置文件也要对接VIP或者当前的节点