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


    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 实现高可用方法

    etcdetcd群集至少是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 前置准备

    ServerIPCompoments
    Master01+Etcd01192.168.67.102kube-apiserver 、kube-controller-manager、kube-schedular、etcd
    Master02192.168.67.105kube-apiserver、kube-controller-manager、kube-schedular
    Node01+Etcd02192.168.67.103kubelet、kube-proxy、docker、flannel
    Node02+Etcd03192.168.67.104kubelet、kube-proxy、docker、flannel
    Nginx01节点192.168.67.100nginx、keepalived
    Nginx02节点192.168.2.67.101nginx、keepalived**

    2.2 系统初始化操作

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

    #关闭防火墙
    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 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

    #根据规划设置主机名
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.2.3 修改内核参数

    #调整内核参数
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.2.4 时间同步

     #时间同步
    yum install ntpdate -y
    ntpdate time.windows.com
    #与windows进行时间同步
    
    crontab -e
    */30 * * * * /usr/sbin/ntpdate  time.windows.com
    crontab -l
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

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

    #拷贝证书文件
    scp -r /opt/etcd/ root@192.168.67.105:/opt/
    
    • 1
    • 2

    在这里插入图片描述

    #拷贝master组件的配置文件
    scp -r /opt/kubernetes/ root@192.168.67.105:/opt
    
    • 1
    • 2

    在这里插入图片描述

    #拷贝服务管理文件
    scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@192.168.67.105:/usr/lib/systemd/system/
    
    • 1
    • 2

    在这里插入图片描述

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

    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地址
    ......
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

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

    #启动apiserver
    systemctl enable kube-apiserver.service --now
    
    • 1
    • 2

    在这里插入图片描述

    #启动scheduler
    systemctl enable kube-scheduler.service --now
    
    • 1
    • 2

    在这里插入图片描述

    #启动controller-manager
    systemctl enable kube-controller-manager.service --now 
    
    • 1
    • 2

    在这里插入图片描述

    2.6 apiserver的相关配置

    2.6.1 编辑配置生成脚本

    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 的环境项来作为配置。 如果配置了多个环境项,可以通过切换不同的环境项名字来访问到不同的集群环境。
    #########################################################
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    2.6.2 执行脚本,生成配置

    #拷贝证书
    mkdir -p /opt/k8s/k8s-cert -p
    
    scp master01:/opt/k8s/k8s-cert/admin.pem admin-key.pem  /opt/k8s/k8s-cert
    
    • 1
    • 2
    • 3
    • 4
    ln -s /opt/kubernetes/bin/* /usr/local/bin/
    #制作软连接
    
    • 1
    • 2
    ./admin.sh
    
    • 1

    在这里插入图片描述

    2.7 查看node节点状态

    kubectl get nodes
    kubectl get nodes -o wide			
    #-o=wide:输出额外信息;对于Pod,将输出Pod所在的Node名
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    此时在master02节点查到的node节点状态仅是从etcd查询到的信息,而此时node节点实际上并未与master02节点建立通信连接

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

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

    3.1 安装nginx

    #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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.2 编辑nginx的配置文件

    #配置四层反向代理负载均衡,指定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 {
    ......
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    在这里插入图片描述

    #语法检查
    nginx -t   
    
    • 1
    • 2

    在这里插入图片描述

    3.3 启动nginx服务

    nginx01与nginx02配置相同

    #启动nginx服务,查看已监听6443端口
    systemctl enable nginx --now
    ss -natp | grep nginx 
    
    • 1
    • 2
    • 3

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

    4. 部署Keepalived实现双机热备

    4.1 安装keepalived

    yum install keepalived -y
    
    • 1

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

    4.2 编辑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
       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配置的脚本
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

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

    4.3 编写nginx状态检查脚本

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    4.4 启动keepalived服务

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

    #启动keepalived
    systemctl enable keepalived --now
    
    ip a				#查看VIP是否生成
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    4.5 修改node节点的配置文件

    修改node节点上的bootstrap.kubeconfig,kubelet.kubeconfig配置文件为VIP
    node01、02节点做相同操作

    cd /opt/kubernetes/cfg/
    vim bootstrap.kubeconfig 
    server: https://192.168.67.200:6443
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    vim kubelet.kubeconfig
    server: https://192.168.67.200:6443
    
    • 1
    • 2

    在这里插入图片描述

    vim kube-proxy.kubeconfig
    server: https://192.168.67.200:6443
    
    • 1
    • 2

    在这里插入图片描述

    #重启kubelet和kube-proxy服务
    systemctl restart kubelet.service 
    systemctl restart kube-proxy.service
    
    • 1
    • 2
    • 3

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

    #切换到VIP所在的节点
    #查看nginx 和 node 、 master 节点的连接状态
    ss -natp | grep nginx
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    5 测试

    5.1 在master01节点创建测试pod

    #测试创建pod
    kubectl run nginx --image=nginx
    
    #查看Pod的状态信息
    kubectl get pods
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    5.2 获取Pod的Cluster IP 地址

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

    kubectl get pods -o wide
    
    • 1

    在这里插入图片描述

    5.3 访问测试

    #Pod属于node02节点,切换到node02访问
    curl http://10.244.1.5
    
    • 1
    • 2

    在这里插入图片描述

    6. 基于Web的Kubernetes用户界面

    6.1 编写配置文件 ---- 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    6.2 创建Kubernetes Dashboard

    kubectl apply -f recommended.yaml
    
    • 1

    在这里插入图片描述

    6.3 登录Dashboard

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

    #创建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
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    6.3.2 获取登录Token

    #获取 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。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

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

    #使用输出的token登录Dashboard
    #https://NodeIP:30001
    
    #以node02为例
    https://192.168.67.104:30001 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    eyJhbGciOiJSUzI1NiIsImtpZCI6IlpyWVZaaURLWUdUdmxJekVNcEluZ0dGNHZHbU5TVTRqcUxtOUUxUXVrWXcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tdHpsNWciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNDNmOTA4OGQtOTBmYy00ODE2LWI1NmYtOGI5MjhkZTE4NGZhIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.YduqE8Av6n5FXRM7EPp_8w2AfqkeD9lHGGB_YOQz05mJp6uU-GHxKvr3Hdnv3DCIXPFYNkZNG_D06ka63D-xhO5QsqeXxYM1JCmN1tBNT6udzQEuUwwKc2MTfSwtfJyMQQ1Ej-Hutk7tLK9Pb4MODJjNrRBamVxHxjsX_FljO0rHU7tzVLqhMAMgBMGdBdDUcW_YF_Z0SIAD2QRUGQD3Ji1jjb7AQP6r7REcEvZh-NAWgnYr0iJM8PVwcgIKlm223ITZGimcUC1PoN1ZjYTtuEGLIsiucLiX1ybrRp73fTrRplM4WE1BoW_5Ll51FWYuwEymE3cM9wk6dLtj-vL9QQ
    
    • 1

    在这里插入图片描述

  • 相关阅读:
    【计算机网络笔记】OSI参考模型中端-端层(传输层、会话层、表示层、应用层)功能介绍
    上周热点回顾(3.4-3.10)
    B树和B+树试题解析
    构建“零工市场小程序”,服务灵活就业“大民生”
    linux常见命令-文件目录类
    基础算法 第七课——归并排序
    2023年高企申报准备工作,明光市企业可以提前做这些准备
    零基础html学习-完结
    抓的是周树人,与我鲁迅有什么关系?
    ESP8266-Arduino编程实例-MAX6675冷端补偿K热电偶数字转换器驱动
  • 原文地址:https://blog.csdn.net/m0_74170357/article/details/134296581