[云原生案例2.3 ] Kubernetes的部署安装 【多master集群架构高可用 ---- (二进制安装部署)】

文章目录

  • [1. Kubernetes多Master集群高可用方案](#1. Kubernetes多Master集群高可用方案)
    • [1.1 多节点Master高可用的实现过程](#1.1 多节点Master高可用的实现过程)
    • [1.2 实现高可用方法](#1.2 实现高可用方法)
  • [2. 新Master节点的部署](#2. 新Master节点的部署)
    • [2.1 前置准备](#2.1 前置准备)
    • [2.2 系统初始化操作](#2.2 系统初始化操作)
      • [2.2.1 关闭防火墙、selinux和swap分区](#2.2.1 关闭防火墙、selinux和swap分区)
      • [2.2.2 修改主机名,添加域名映射](#2.2.2 修改主机名,添加域名映射)
      • [2.2.3 修改内核参数](#2.2.3 修改内核参数)
      • [2.2.4 时间同步](#2.2.4 时间同步)
    • [2.3 从master01节点拷贝相关配置与证书文件](#2.3 从master01节点拷贝相关配置与证书文件)
    • [2.4 修改配置文件kube-apiserver中的IP](#2.4 修改配置文件kube-apiserver中的IP)
    • [2.5 在 master02 节点上启动各服务并设置开机自启](#2.5 在 master02 节点上启动各服务并设置开机自启)
    • [2.6 apiserver的相关配置](#2.6 apiserver的相关配置)
      • [2.6.1 编辑配置生成脚本](#2.6.1 编辑配置生成脚本)
      • [2.6.2 执行脚本,生成配置](#2.6.2 执行脚本,生成配置)
    • [2.7 查看node节点状态](#2.7 查看node节点状态)
  • [3. 部署nginx以实现负载均衡](#3. 部署nginx以实现负载均衡)
    • [3.1 安装nginx](#3.1 安装nginx)
    • [3.2 编辑nginx的配置文件](#3.2 编辑nginx的配置文件)
    • [3.3 启动nginx服务](#3.3 启动nginx服务)
  • [4. 部署Keepalived实现双机热备](#4. 部署Keepalived实现双机热备)
    • [4.1 安装keepalived](#4.1 安装keepalived)
    • [4.2 编辑keepalived配置文件](#4.2 编辑keepalived配置文件)
    • [4.3 编写nginx状态检查脚本](#4.3 编写nginx状态检查脚本)
    • [4.4 启动keepalived服务](#4.4 启动keepalived服务)
    • [4.5 修改node节点的配置文件](#4.5 修改node节点的配置文件)
  • [5 测试](#5 测试)
    • [5.1 在master01节点创建测试pod](#5.1 在master01节点创建测试pod)
    • [5.2 获取Pod的Cluster IP 地址](#5.2 获取Pod的Cluster IP 地址)
    • [5.3 访问测试](#5.3 访问测试)
  • [6. 基于Web的Kubernetes用户界面](#6. 基于Web的Kubernetes用户界面)
    • [6.1 编写配置文件 ---- master01节点](#6.1 编写配置文件 ---- master01节点)
    • [6.2 创建Kubernetes Dashboard](#6.2 创建Kubernetes Dashboard)
    • [6.3 登录Dashboard](#6.3 登录Dashboard)
      • [6.3.1 授予dashboard-admin 集群管理员权限](#6.3.1 授予dashboard-admin 集群管理员权限)
      • [6.3.2 获取登录Token](#6.3.2 获取登录Token)
    • [6.4 登录,进入Dashboard登录引导界面](#6.4 登录,进入Dashboard登录引导界面)

1. Kubernetes多Master集群高可用方案

1.1 多节点Master高可用的实现过程

  • 从maste01复制etcd,k8s的证书,可执行文件,配置文件,master组件的服务管理文件 到 master02节点
  • 再Masters节点修改apiserver的配置,修改为自己的配置
  • 启动master相关组件
  • 部署keepalived + LB (nginx , haproxy)实现高可用 和 负载均衡
  • keepalived需要健康检查脚本来实现自动的故障切换
  • 在所有Node节点上修改 node相关组件的 Kubeconfig 文件配置 ,把对接的 server ip 指定为VIP

1.2 实现高可用方法

etcd:etcd群集至少是3副本,奇数台,通过raft算法,保证数据的一致性
node节点:承载业务,跟Master进行对接
master节点:高可用使用keepalived+LB方案,keepalived能够提供VIP和主备,LB实现负载均衡,使用nginx+haproxy,将master加入nginx地址池,由nginx转发到对应的apiserver,再通过schduleer调度到相应的node节点,使用轮询算法。

2. 新Master节点的部署

基于单Master节点继续部署,部署过程详见[云原生案例2.1 ] Kubernetes的部署安装 【单master集群架构 ---- (二进制安装部署)】节点部分

2.1 前置准备

Server IP Compoments
Master01+Etcd01 192.168.67.102 kube-apiserver 、kube-controller-manager、kube-schedular、etcd
Master02 192.168.67.105 kube-apiserver、kube-controller-manager、kube-schedular
Node01+Etcd02 192.168.67.103 kubelet、kube-proxy、docker、flannel
Node02+Etcd03 192.168.67.104 kubelet、kube-proxy、docker、flannel
Nginx01节点 192.168.67.100 nginx、keepalived
Nginx02节点 192.168.2.67.101 nginx、keepalived**

2.2 系统初始化操作

2.2.1 关闭防火墙、selinux和swap分区

bash 复制代码
#关闭防火墙
systemctl disable firewalld --now
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
 
#关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config
 
#关闭swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab 

2.2.2 修改主机名,添加域名映射

bash 复制代码
#根据规划设置主机名
hostnamectl set-hostname master02
su

#在master添加hosts(添加到整个k8s集群的主机上,保证其他主机均有该映射)
cat >> /etc/hosts << EOF
192.168.67.102 master01
192.168.67.105 master02
192.168.67.103 node01
192.168.67.104 node02
EOF

2.2.3 修改内核参数

bash 复制代码
#调整内核参数
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

2.2.4 时间同步

bash 复制代码
 #时间同步
yum install ntpdate -y
ntpdate time.windows.com
#与windows进行时间同步

crontab -e
*/30 * * * * /usr/sbin/ntpdate  time.windows.com
crontab -l

2.3 从master01节点拷贝相关配置与证书文件

bash 复制代码
#拷贝证书文件
scp -r /opt/etcd/ [email protected]:/opt/
bash 复制代码
#拷贝master组件的配置文件
scp -r /opt/kubernetes/ [email protected]:/opt
bash 复制代码
#拷贝服务管理文件
scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service [email protected]:/usr/lib/systemd/system/

2.4 修改配置文件kube-apiserver中的IP

bash 复制代码
vim /opt/kubernetes/cfg/kube-apiserver

KUBE_APISERVER_OPTS="--logtostderr=true \
--v=4 \
--etcd-servers=https://192.168.67.102:2379,https://192.168.67.103:2379,https://192.168.67.104:2379 \
--bind-address=192.168.67.105 \				#修改为master02地址
--secure-port=6443 \
--advertise-address=192.168.67.105 \			#修改为master02地址
......

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

bash 复制代码
#启动apiserver
systemctl enable kube-apiserver.service --now
bash 复制代码
#启动scheduler
systemctl enable kube-scheduler.service --now
bash 复制代码
#启动controller-manager
systemctl enable kube-controller-manager.service --now 

2.6 apiserver的相关配置

2.6.1 编辑配置生成脚本

bash 复制代码
vim /opt/admin.sh

#!/bin/bash
mkdir /root/.kube
KUBE_CONFIG="/root/.kube/config"
KUBE_APISERVER="https://192.168.67.105:6443"

#切换到k8s证书目录操作
cd /opt/k8s/k8s-cert/

#配置kubernetes集群参数
kubectl config set-cluster kubernetes \
  --certificate-authority=/opt/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=${KUBE_CONFIG}
#配置客户端认证参数
kubectl config set-credentials admin \
  --client-certificate=./admin.pem \
  --client-key=./admin-key.pem \
  --embed-certs=true \
  --kubeconfig=${KUBE_CONFIG}
#设置设置一个环境项,配置上下文参数
kubectl config set-context default \
  --cluster=kubernetes \
  --user=admin \
  --kubeconfig=${KUBE_CONFIG}
#设置默认环境上下文
kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
#生成的 kubeconfig 被保存到 /root/.kube/config 文件

#########################################################
#集群参数
#本段设置了所需要访问的集群的信息。使用set-cluster设置了需要访问的集群,如上为kubernetes,这只是个名称,实际为--server指向的apiserver;--certificate-authority设置了该集群的公钥;--embed-certs为true表示将--certificate-authority证书写入到kubeconfig中;--server则表示该集群的kube-apiserver地址

#用户参数
#本段主要设置用户的相关信息,主要是用户证书。如上的用户名为admin,证书为:/opt/kubernetes/ssl/admin.pem,私钥为:/opt/kubernetes/ssl/admin-key.pem。注意客户端的证书首先要经过集群CA的签署,否则不会被集群认可。此处使用的是ca认证方式,也可以使用token认证,如kubelet的 TLS Boostrap 机制下的 bootstrapping 使用的就是token认证方式。上述kubectl使用的是ca认证,不需要token字段

#上下文参数
#集群参数和用户参数可以同时设置多对,在上下文参数中将集群参数和用户参数关联起来。上面的上下文名称为default,集群为kubenetes,用户为admin,表示使用admin的用户凭证来访问kubenetes集群的default命名空间,也可以增加--namspace来指定访问的命名空间。

#最后使用 kubectl config use-context default 来使用名为 default 的环境项来作为配置。 如果配置了多个环境项,可以通过切换不同的环境项名字来访问到不同的集群环境。
#########################################################

2.6.2 执行脚本,生成配置

bash 复制代码
#拷贝证书
mkdir -p /opt/k8s/k8s-cert -p

scp master01:/opt/k8s/k8s-cert/admin.pem admin-key.pem  /opt/k8s/k8s-cert
bash 复制代码
ln -s /opt/kubernetes/bin/* /usr/local/bin/
#制作软连接
bash 复制代码
./admin.sh

2.7 查看node节点状态

bash 复制代码
kubectl get nodes
kubectl get nodes -o wide			
#-o=wide:输出额外信息;对于Pod,将输出Pod所在的Node名

此时在master02节点查到的node节点状态仅是从etcd查询到的信息,而此时node节点实际上并未与master02节点建立通信连接。

因此需要使用一个VIP将node节点与master节点都关联起来

3. 部署nginx以实现负载均衡

3.1 安装nginx

bash 复制代码
#yum安装nginx
#配置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

3.2 编辑nginx的配置文件

bash 复制代码
#配置四层反向代理负载均衡,指定k8s群集2台master的节点ip和6443端口

#修改nginx配置文件,
vim /etc/nginx/nginx.conf
events {
    worker_connections  1024;
}

#添加
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.102:6443;
        server 192.168.67.105:6443;
    }
    server {
        listen 6443;
        proxy_pass k8s-apiserver;
    }
}

http {
......
bash 复制代码
#语法检查
nginx -t   

3.3 启动nginx服务

nginx01与nginx02配置相同

bash 复制代码
#启动nginx服务,查看已监听6443端口
systemctl enable nginx --now
ss -natp | grep nginx 


4. 部署Keepalived实现双机热备

4.1 安装keepalived

bash 复制代码
yum install keepalived -y


4.2 编辑keepalived配置文件

bash 复制代码
vim /etc/keepalived/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 NGINX_MASTER	#lb01节点的为 NGINX_MASTER,lb02节点的为 NGINX_BACKUP
}

#添加一个周期性执行的脚本
vrrp_script check_nginx {
    script "/etc/nginx/check_nginx.sh"	#指定检查nginx存活的脚本路径
}

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.200/24	#指定 VIP
    }
    track_script {
        check_nginx			#指定vrrp_script配置的脚本
    }
}


4.3 编写nginx状态检查脚本

bash 复制代码
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


chmod +x /etc/nginx/check_nginx.sh

4.4 启动keepalived服务

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

bash 复制代码
#启动keepalived
systemctl enable keepalived --now

ip a				#查看VIP是否生成

4.5 修改node节点的配置文件

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

node01、02节点做相同操作

bash 复制代码
cd /opt/kubernetes/cfg/
vim bootstrap.kubeconfig 
server: https://192.168.67.200:6443
bash 复制代码
vim kubelet.kubeconfig
server: https://192.168.67.200:6443
bash 复制代码
vim kube-proxy.kubeconfig
server: https://192.168.67.200:6443
bash 复制代码
#重启kubelet和kube-proxy服务
systemctl restart kubelet.service 
systemctl restart kube-proxy.service


bash 复制代码
#切换到VIP所在的节点
#查看nginx 和 node 、 master 节点的连接状态
ss -natp | grep nginx

5 测试

5.1 在master01节点创建测试pod

bash 复制代码
#测试创建pod
kubectl run nginx --image=nginx

#查看Pod的状态信息
kubectl get pods

5.2 获取Pod的Cluster IP 地址

在 Kubernetes 中,每个 Pod 都会被分配一个集群IP 地址,用于在集群内部网络中进行通信。

bash 复制代码
kubectl get pods -o wide

5.3 访问测试

bash 复制代码
#Pod属于node02节点,切换到node02访问
curl http://10.244.1.5

6. 基于Web的Kubernetes用户界面

6.1 编写配置文件 ---- master01节点

bash 复制代码
#上传 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

6.2 创建Kubernetes Dashboard

bash 复制代码
kubectl apply -f recommended.yaml

6.3 登录Dashboard

6.3.1 授予dashboard-admin 集群管理员权限

bash 复制代码
#创建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

6.3.2 获取登录Token

bash 复制代码
#获取 kube-system 命名空间中 dashboard-admin 相关的 Secret 的详细信息
#生成用于在 Kubernetes 仪表板中登录的 token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

#这是用于身份验证的 Secret
#其中包含了一个用于在 Kubernetes 仪表板中登录的 token
#ca.crt:Kubernetes 证书颁发机构(CA)的证书。
#namespace:ServiceAccount 所属的命名空间。
#token:用于身份验证的 token。

6.4 登录,进入Dashboard登录引导界面

bash 复制代码
#使用输出的token登录Dashboard
#https://NodeIP:30001

#以node02为例
https://192.168.67.104:30001 
bash 复制代码
eyJhbGciOiJSUzI1NiIsImtpZCI6IlpyWVZaaURLWUdUdmxJekVNcEluZ0dGNHZHbU5TVTRqcUxtOUUxUXVrWXcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tdHpsNWciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNDNmOTA4OGQtOTBmYy00ODE2LWI1NmYtOGI5MjhkZTE4NGZhIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.YduqE8Av6n5FXRM7EPp_8w2AfqkeD9lHGGB_YOQz05mJp6uU-GHxKvr3Hdnv3DCIXPFYNkZNG_D06ka63D-xhO5QsqeXxYM1JCmN1tBNT6udzQEuUwwKc2MTfSwtfJyMQQ1Ej-Hutk7tLK9Pb4MODJjNrRBamVxHxjsX_FljO0rHU7tzVLqhMAMgBMGdBdDUcW_YF_Z0SIAD2QRUGQD3Ji1jjb7AQP6r7REcEvZh-NAWgnYr0iJM8PVwcgIKlm223ITZGimcUC1PoN1ZjYTtuEGLIsiucLiX1ybrRp73fTrRplM4WE1BoW_5Ll51FWYuwEymE3cM9wk6dLtj-vL9QQ
相关推荐
沉登c2 小时前
第 3 章 事务处理
架构
阿里云云原生2 小时前
LLM 不断提升智能下限,MCP 不断提升创意上限
云原生
阿里云云原生3 小时前
GraalVM 24 正式发布阿里巴巴贡献重要特性 —— 支持 Java Agent 插桩
云原生
数据智能老司机5 小时前
CockroachDB权威指南——CockroachDB SQL
数据库·分布式·架构
数据智能老司机5 小时前
CockroachDB权威指南——开始使用
数据库·分布式·架构
云上艺旅6 小时前
K8S学习之基础七十四:部署在线书店bookinfo
学习·云原生·容器·kubernetes
c无序6 小时前
【Docker-7】Docker是什么+Docker版本+Docker架构+Docker生态
docker·容器·架构
数据智能老司机6 小时前
CockroachDB权威指南——CockroachDB 架构
数据库·分布式·架构
矿渣渣6 小时前
RM Cortex-A7 架构中“SEV”汇编指令解析
汇编·架构
uhakadotcom7 小时前
Flutter入门指南:快速构建高性能移动应用
面试·架构·github