准备:
-
登录腾讯云申请HAVIP 私有网络 高可用虚拟 IP 概述 - 操作指南 - 文档中心 - 腾讯云
- 申请通过后,刷新页面,选择 云产品 -> 网络 -> 私有网络 -> IP与网卡 -> 高可用虚拟IP
新建vip,选择自己的私有网络。此时通过自己的vpc无法访问vip(vip未绑定到自己的vpc上),
通过keepalive配置好vip后其它vpc才能ping 通vip。 - 注意vip申请后如果不绑定eip会默认绑定到一台服务器上,并且会扣费的,购买一个eip然后绑定到vip上就可以通过外网访问高可用环境了。
1. 主机规划
节点 | 主机名 | 内网ip |
主节点1 | k8s-master01 | 172.17.0.8 |
主节点2 | k8s-master02 | 172.17.0.9 |
HAVIP | www.k8s.com | 172.17.0.250(腾讯云申请-免费) |
EIP | www.k8s.com | 110.xx.xxx.2x9 (腾讯云公网ip-购买) |
主节点1和主节点2都需要部署keepalived和haproxy。下面配置为主节点1的配置。
主节点2的keepalived配置基本同主节点1,需要修改的地方参考配置中的注释。主节点2的haproxy配置同主节点1的配置
2. 部署keepalived
- 安装keepalived
yum install -y keepalived
- 配置keepalived
vim /etc/keepalived/keepalived.conf 内容如下: ! Configuration File for keepalived global_defs { notification_email { wangfenlei@sina.cn } notification_email_from keepalived@ptmind.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id k8s-master01 # 主节点2改为 k8s-master02 } vrrp_script check_apiserver { # script "/cron-sh.d/check_apiserver.sh" # script可以指定要执行的shell脚本。 script "killall -0 haproxy" # 检测ha是否存在。 interval 5 weight -20 fall 3 rise 1 } vrrp_instance VI_1 { state MASTER # 主节点2改为 BACKUP interface eth0 virtual_router_id 1 priority 101 # 主节点2改为 99 advert_int 1 unicast_src_ip 172.17.0.8 #当前节点的内网ip 主节点2改为 172.17.0.9 unicast_peer { 172.17.0.9 # 主节点2的内网ip 主节点2改为 172.17.0.8 #x.x.x.x 主节点3的内网ip 如果有多个主节点可以继续添加 } authentication { auth_type PASS auth_pass 1111 } track_script { check_apiserver } virtual_ipaddress { 172.17.0.250 # 腾讯云申请vip } } # 脚本demo. vrrp_script 中用 vim /cron-sh.d/check_apiserver.sh 内容如下 #!/bin/bash #exit 1 if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then systemctl start haproxy fi sleep 3 if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then systemctl stop keepalived fi
- 配置keepalived日志输出路径
# keepalived日志路径配置 (local0中的0 对应-S 后面的0) 1. vim /etc/sysconfig/keepalived KEEPALIVED_OPTIONS="-D -d -S 0" (修改) 2. vim /etc/rsyslog.conf local0.* /var/log/keepalived.log (文件末添加)
3. 部署haproxy
- 安装haproxy
yum install -y haproxy
- 配置haproxy
vim /etc/haproxy/haproxy.cfg 内容如下: # Global settings global # 2) configure local2 events to go to the /var/log/haproxy.log # local2.* /var/log/haproxy.log # log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon spread-checks 3 nbproc 1 # 默认是1,可以不配。 # turn on stats unix socket stats socket /var/lib/haproxy/stats # defaults setting 其他配置会继承默认配置,默认配置里的配置项也可以在其它配置里被重写 defaults log global option dontlognull option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 # ui 这里bind用* 没问题(外网ip+端口可以直接访问监控页面)。用0.0.0.0页面访问不了 listen stats bind *:8444 stats enable mode http maxconn 10 stats refresh 30s stats uri / stats hide-version stats realm HAproxy stats auth admin:admin stats admin if TRUE #--------------------------------------------------------------------- # kubernetes apiserver frontend which proxys to the backends #--------------------------------------------------------------------- frontend kubernetes-apiserver mode tcp bind *:8443 option tcplog default_backend kubernetes-apiserver #--------------------------------------------------------------------- # round robin balancing between the various backends #--------------------------------------------------------------------- backend kubernetes-apiserver mode tcp balance roundrobin server k8s-master01 172.17.0.8:6443 check server k8s-master02 172.17.0.9:6443 check # listen #listen ha-apache-server # bind *:81 # mode tcp # balance roundrobin # server k8s-master01 172.17.0.8:81 check port 81 inter 5000 rise 1 fall 3 # server k8s-master02 172.17.0.9:81 check port 81 inter 5000 rise 1 fall 3
- 配置haproxy日志输出路径
# haproxy日志路径配置 (local2中的2 与 /etc/haproxy/haproxy.cfg 中log配置的local2对应) 1. vim /etc/rsyslog.conf $ModLoad imudp (修改) $UDPServerRun 514 (修改) local2.* /var/log/haproxy.log (文件末添加)
4. 排查网络问题相关命令
# 1. tcp 抓取vip数据包 keepalived 的vip绑在eth0网卡上的
tcpdump -i eth0 vrrp -n
# 2. 查看vip绑定
ip addr show dev eth0
# 3. 列举所有vip
ipvsadm -ln
# 4. 列举所有vip连接
ipvsadm -Lnc
# 5. 查看所有的处于监听状态的tcp连接并且显示pid和对应应用名称
netstat -nltp