目录
1.2 修改kube-apiserver 配置文件的IP地址
2.4 在 lb01 上查看 nginx 和 node 、master 节点的连接状态
3.2.2 读取并解析recommended.yaml 文件,创建
多master集群架构
为了避免单点故障,做多master集群架构
企业中master最少4核8G;node跑业务8核32G
企业中通过nginx 来实现负载均衡,node可以随时增加
例子:试一下怎么增加node
一、master02 节点部署
1.0 环境准备
#根据规划设置主机名
hostnamectl set-hostname master02
su
#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
#关闭selinux
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
#关闭swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
#在master添加hosts
cat >> /etc/hosts << EOF
192.168.67.30 master01
192.168.67.11 master02
192.168.67.12 node01
192.168.67.13 node02
EOF
cat /etc/hosts
#调整内核参数
cat > /etc/sysctl.d/k8s.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
sysctl --system
#时间同步
yum install ntpdate -y
timedatectl set-timezone Asia/Shanghai
ntpdate time.windows.com
1.1 拷贝证书文件到新的master节点
//从 master01 节点上拷贝证书文件、各master组件的配置文件和服务管理文件到 master02 节点
cat /etc/hosts
scp -r /opt/etcd/ root@192.168.67.11:/opt/
scp -r /opt/kubernetes/ root@192.168.67.11:/opt/
scp -r /root/.kube/ root@192.168.67.11:/root
scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@192.168.67.11:/usr/lib/systemd/system/
.kube 文件:里面存的kubeconfig的配置文件、令牌什么的
node会带着配置文件去请求master
1.2 修改kube-apiserver 配置文件的IP地址
//master02;修改配置文件kube-apiserver中的IP
vim /opt/kubernetes/cfg/kube-apiserver
KUBE_APISERVER_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/opt/kubernetes/logs \
--etcd-servers=https://192.168.67.30:2379,https://192.168.67.12:2379,https://192.168.67.13:2379 \
--bind-address=192.168.67.11 \
--secure-port=6443 \
--advertise-address=192.168.67.11 \
1.3 启动服务并设置开机自启
//在 master02 节点上启动各服务并设置开机自启
systemctl start kube-apiserver.service
systemctl enable kube-apiserver.service
systemctl status kube-apiserver.service
systemctl start kube-controller-manager.service
systemctl enable kube-controller-manager.service
systemctl status kube-controller-manager.service
systemctl start kube-scheduler.service
systemctl enable kube-scheduler.service
systemctl status kube-scheduler.service
1.4 给master02的服务做软连接
//给master的服务做软连接
ln -s /opt/kubernetes/bin/* /usr/local/bin/
ll /usr/local/bin/
1.5 查看node节点状态
kubectl get nodes
#-o=wide:输出额外信息;对于Pod,将输出Pod所在的Node名
kubectl get node -o wide
//此时在master02节点查到的node节点状态仅是从etcd查询到的信息,而此时node节点实际上并未与master02节点建立通信连接,因此需要使用一个VIP把node节点与master节点都关联起来
二、负载均衡部署
配置load balancer集群双机热备负载均衡(nginx实现负载均衡,keepalived实现双机热备)
2.1 在lb01、lb02节点上部署nginx
VIP:192.168.67.35
负载均衡nginx+keepalive01(master):192.168.67.21
负载均衡nginx+keepalive02(backup):192.168.67.22
#修改(master)主机名
hostnamectl set-hostname lb01
su
#关闭防火墙
systemctl stop firewalld.service
systemctl enable firewalld.service
setenforce 0
#修改(backup)主机名
hostnamectl set-hostname lb02
su
#关闭防火墙
systemctl stop firewalld.service
systemctl enable firewalld.service
setenforce 0
2.1.1 配置nginx 的 yum源
//配置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
cat /etc/yum.repos.d/nginx.repo
yum -y install nginx
2.1.2配置四层反向代理负载均衡
//修改nginx配置文件,配置四层反向代理负载均衡,指定k8s群集2台master的节点ip和6443端口
vim /etc/nginx/nginx.conf
#在events 模块下添加
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.67.30:6443;
server 192.168.67.11:6443;
}
server {
listen 6443;
proxy_pass k8s-apiserver;
}
}
systemctl start nginx
systemctl enable nginx
netstat -natp | grep nginx
2.2 部署keepalived服务
yum -y install keepalived
2.2.1 修改keepalived配置文件
vim /etc/keepalived/keepalived.conf
! 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 #lb01节点的为 NGINX_MASTER,lb02节点的为 NGINX_BACKUP router_id NGINX_MASTER }
#添加一个周期性执行的脚本 vrrp_script check_nginx { #指定检查nginx存活的脚本路径 script "/etc/nginx/check_nginx.sh" }
vrrp_instance VI_1 { state MASTER #lb01节点的为 MASTER,lb02节点的为 BACKUP interface ens33 #指定网卡名称 ens33 virtual_router_id 51 #指定vrid,两个节点要一致 priority 100 #lb01节点的为 100,lb02节点的为 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.67.35/24 #指定 VIP } track_script { check_nginx #指定vrrp_script配置的脚本 } }
以下的内容全部删除,200dd
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添加执行权限
chmod +x /etc/nginx/check_nginx.sh
ll /etc/nginx/check_nginx.sh
2.2.4 lb02同lb01 操作
//在lb01 节点执行
scp /etc/keepalived/keepalived.conf root@192.168.67.22:/etc/keepalived/keepalived.conf scp /etc/nginx/check_nginx.sh root@192.168.67.22:/etc/nginx/
//在lb02 上操作
vim /etc/keepalived/keepalived.conf
查看check_nginx.sh脚本文件;(传过来有执行权限,就不用加了)
2.2.5 启动keepalived服务
(一定要先启动了nginx服务,再启动keepalived服务)
systemctl start keepalived
systemctl enable keepalived
#查看VIP是否生成
ip a
2.3 修改node 节点上配置文件的IP为VIP
//修改node节点上的bootstrap.kubeconfig,kubelet.kubeconfig配置文件为VIP
cd /opt/kubernetes/cfg/
ls /opt/kubernetes/cfg/
vim bootstrap.kubeconfig
#修改IP地址为VIP地址
server: https://192.168.67.35:6443
vim kubelet.kubeconfig
#修改IP地址为VIP地址
server: https://192.168.67.35:6443
vim kube-proxy.kubeconfig
#修改IP地址为VIP地址
server: https://192.168.67.35:6443
可以尝试写一个脚本来实现IP地址的修改
2.3.1重启kubelet和kube-proxy服务
systemctl restart kubelet.service
systemctl status kubelet.service
systemctl restart kube-proxy.service
systemctl status kube-proxy.service
2.4 在 lb01 上查看 nginx 和 node 、master 节点的连接状态
netstat -natp | grep nginx
2.5 在 master01 节点上操作
2.5.1 测试创建pod
kubectl run nginx --image=nginx
2.5.2 查看Pod的状态信息
kubectl get pods
kubectl get pods -o wide
状态:
ContainerCreating:正在创建中
Running:创建完成,运行中
//READY为1/1,表示这个Pod中有1个容器
2.5.3 访问
//在对应网段的node节点上操作,可以直接使用浏览器或者curl命令访问
curl 10.244.168.195
#二进制安装只能在node节点访问到,后面通过yum一键式安装的可以在master节点访问
2.5.4 查看日志
//访问nginx页面后,可以在master01节点上通过Pod的name来查看nginx的日志
kubectl logs nginx
#通过node02访问nginx,日志中的IP地址是nginx的IP地址?为什么?
三、部署 Dashboard
3.0 Dashboard 介绍
仪表板是基于Web的Kubernetes用户界面。您可以使用仪表板将容器化应用程序部署到Kubernetes集群,对容器化应用程序进行故障排除,并管理集群本身及其伴随资源。
您可以使用仪表板来概述群集上运行的应用程序,以及创建或修改单个Kubernetes资源(例如deployment,job,daemonset等)。
例如,您可以使用部署向导扩展部署,启动滚动更新,重新启动Pod或部署新应用程序。
仪表板还提供有关群集中Kubernetes资源状态以及可能发生的任何错误的信息。
3.1 在 node节点操作
node1、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 中显示,帮助用户更好地了解集群的状态和性能
3.1.1 在node01节点上操作
cd /opt
ls
#上传dashboard.tar与metrics-scraper.tar包到node01节点与node02节点的/opt/目录下
docker load -i dashboard.tar
docker load -i metrics-scraper.tar
docker images
3.1.2 在node02节点上操作
cd /opt
ls
#上传dashboard.tar与metrics-scraper.tar包到node01节点与node02节点的/opt/目录下
docker load -i dashboard.tar
docker load -i metrics-scraper.tar
docker images
3.2 在 master01 节点上操作
3.2.1 暴露node 端口到外部
#上传 recommended.yaml 文件到 /opt/k8s 目录中
cd /opt/k8s
vim recommended.yaml
nodePort: 30001 到两千多个地址,就没有了
需要带着令牌来访问
secret:密文
通过descreb 访问令牌
#默认Dashboard只能集群内部访问,修改Service为的类型为:NodePort,暴露到外部:
3.2.2 读取并解析recommended.yaml 文件,创建
kubectl apply -f recommended.yaml
#表示读取
recommended.yaml
文件中定义的资源配置,并在集群中创建、更新或删除相应的资源。这可以包括部署、服务、配置映射等#做错时可以通过 delete 来删除创建的
kubectl delete -f recommended.yaml
3.2.3 创建服务账户
#创建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}')
用于创建一个名为
dashboard-admin
的服务账户,并将其绑定到默认的cluster-admin
集群角色;这将授予该服务账户对 Kubernetes 集群中所有资源的完全访问权限①创建一个名为
dashboard-admin
的服务账户,并将其放置在kube-system
命名空间中。服务账户是一种 Kubernetes 资源,用于代表应用程序或其他服务与 Kubernetes API 进行交互②创建一个名为
dashboard-admin
的集群角色绑定,将cluster-admin
集群角色授予该服务账户。集群角色是一种 Kubernetes 资源,用于定义对集群范围内资源的访问权限③使用
describe
命令查看dashboard-admin
服务账户的凭据信息。这将显示一个包含该服务账户的访问令牌的密钥值对列表,以及其他相关信息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将能够执行集群中的任何操作。
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通常用于身份验证和授权)。
3.2.4 浏览器访问
#使用输出的token登录Dashboard
https://192.168.67.12:30001
#使用输出的token登录Dashboard
https://NodeIP:30001
通过https访问,会提示站点不安全,点击【详细信息】,点击【继续跳转网页】
选择【Token】,输入【Token 令牌】,点击【登录】