csdn0811 2025-02-13 15:16 采纳率: 60.7%
浏览 7

部署的高可用没有起到作用? 我必须两台管理节点都运行才能够执行命令(关闭一台keepalived也行),但就是不能关机其中一台管理节点

我有两台k8s高可用管理节点,master1和master2,使用的是keepalived和nginx,,我模拟master2故障,把它关机,然后在再master1节点上执行命令,kubectl get nodes,报错:

2489 memcache.go:265] "Unhandled Error" err="couldn't get current server API group list: Get \"https://192.168.205.250:16443/api?timeout=32s\": EOF"

执行 kubectl get po -A 报错:

E0213 14:58:57.583157    3012 memcache.go:265] "Unhandled Error" err="couldn't get current server API group list: Get \"https://192.168.205.250:16443/api?timeout=32s\": EOF"

nginx配置如下:

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.205.141:6443;
        server 192.168.205.142:6443;
    }
    server {
        listen 16443;
        proxy_pass k8s-apiserver;
    }
}

master1 keepliaved配置如下:

vrrp_instance VI_1 {
    state MASTER
    interface ens160 
    virtual_router_id 51 
    priority 255  
    advert_int 1  
    authentication {
     # auth_type PASS 
     # auth_pass 1111
    }
    virtual_ipaddress {
        192.168.205.250/24 
    }
    track_script {
        check_nginx  
    }
}

master2 keepliaved配置如下:

vrrp_instance VI_1 {
    state BACKUP    
    interface ens160
    virtual_router_id 51
    priority 90   
    advert_int 1
    authentication {
    #    auth_type PASS
    #    auth_pass 1111
    }
    virtual_ipaddress {
        192.168.205.250/24 
    }

    track_script {
        check_nginx
    }
}

我模拟故障把master2关机,目前master1中的nginx和keeplived都在运行,虚拟地址也正常出现:

[root@k8s-master01 ~]# ip addr show ens160
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:25:ed:a9 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.205.141/24 brd 192.168.205.255 scope global dynamic noprefixroute ens160
       valid_lft 1009sec preferred_lft 1009sec
    inet 192.168.205.250/24 scope global secondary ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe25:eda9/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

执行客户端的kubectl命令是不能执行的:

img

为什么我部署的高可用没有起到作用? 我必须两台管理节点都运行才能够执行命令(关闭一台keepalived也行),但就是不能关机其中一台管理节点,求各位帮助解决一下,十分感谢!

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2025-02-13 15:19
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    部署的高可用没有起到作用?

    你遇到的问题是:你有两台k8s高可用管理节点,master1和master2,使用的是keepalived和nginx,但是你模拟master2故障,把它关机,然后在再master1节点上执行命令,kubectl get却不能执行。

    可能的原因是:

    1. keepalived配置不正确:keepalived需要正确配置,包括VIP的设置、检测超时时间、健康检查等。如果配置不正确,keepalived可能无法正确地切换VIP。
    2. nginx配置不正确:nginx需要正确配置,包括VIP的设置、健康检查等。如果配置不正确,nginx可能无法正确地路由流量。
    3. k8s配置不正确:k8s需要正确配置,包括master节点的设置、VIP的设置等。如果配置不正确,k8s可能无法正确地选择master节点。

    解决方案:

    1. 检查keepalived配置:检查keepalived的配置文件,确保VIP的设置、检测超时时间、健康检查等正确。
    2. 检查nginx配置:检查nginx的配置文件,确保VIP的设置、健康检查等正确。
    3. 检查k8s配置:检查k8s的配置文件,确保master节点的设置、VIP的设置等正确。
    4. 使用kubectl drain命令:使用kubectl drain命令可以将master节点从集群中剥离,避免在master节点上执行命令。
    5. 使用kubectl get命令的--server参数:使用kubectl get命令的--server参数可以指定要连接的master节点。

    例如:

    kubectl get --server=http://master1:8080
    

    这将连接到master1节点上执行kubectl get命令。

    代码示例

    # 检查keepalived配置
    cat /etc/keepalived/keepalived.conf
    
    # 检查nginx配置
    cat /etc/nginx/nginx.conf
    
    # 检查k8s配置
    cat /etc/kubernetes/manifests/master.yaml
    
    # 使用kubectl drain命令
    kubectl drain master2 --delete-local-data
    
    # 使用kubectl get命令的--server参数
    kubectl get --server=http://master1:8080
    

    结论

    高可用性是k8s集群的重要组件,需要正确配置keepalived、nginx和k8s。通过检查配置文件和使用kubectl drain命令和--server参数,可以解决高可用性问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月13日