一、介紹
阿里雲不支持使用keepalived等服務器的vip使用,所以只能使用阿里雲的ENI(彈性網卡)來實現
彈性網卡(Elastic Network Interface,簡稱ENI)是一種可以附加到專有網絡VPC類型ECS實例上的虛擬網卡。通過彈性網卡,您可以在任何阿里雲地域下實現高可用集群搭建、低成本故障轉移和精細化的網絡管理。
官方文檔:https://help.aliyun.com/document_detail/58496.html?spm=a2c4g.11186623.6.824.771060e0Ke0wH1
二、創建彈性網卡
三、使用彈性網卡
綁定完幾秒鍾后內網就能通了
四、控制ENI的demo(python3)
1、python3 SDK 安裝
pip3 install aliyun-python-sdk-core pip3 install aliyun-python-sdk-ecs
2、訪問控制權限
管理阿里雲ECS權限
3、控制ENI的demo
#!/usr/bin/env python3 #coding=utf-8 from aliyunsdkcore.client import AcsClient from aliyunsdkcore.acs_exception.exceptions import ClientException from aliyunsdkcore.acs_exception.exceptions import ServerException from aliyunsdkecs.request.v20140526.AttachNetworkInterfaceRequest import AttachNetworkInterfaceRequest from aliyunsdkecs.request.v20140526.DetachNetworkInterfaceRequest import DetachNetworkInterfaceRequest import sys from time import sleep AccessKeyId = 'AccessKeyId' AccessKeySecret = 'AccessKeySecret' Endpoint = 'cn-qingdao' remove_ecs_id = sys.argv[1] #傳遞移除網卡的ecs_id ENI_ID = 'xxxx' #彈性輔助網卡ENI的id ECS_ID_LIST = ['xxxx','xxxxx'] #ENI網卡綁定的ecs集群列表 try: ECS_ID_LIST.remove(remove_ecs_id) except Exception as e: print(e) exit(1) add_ecs_id = ECS_ID_LIST[0] #選一個可以用的ecs的id,做為網卡綁定的服務器 def remove_vip(remove_ecs_id,ENI_ID): '''解綁函數''' client = AcsClient(AccessKeyId,AccessKeySecret,Endpoint) #建議不要使用變量,直接輸入字符串 request = DetachNetworkInterfaceRequest() request.set_accept_format('json') request.set_InstanceId(remove_ecs_id) request.set_NetworkInterfaceId(ENI_ID) try: response = client.do_action_with_exception(request) except Exception as e: print(e) exit(2) print(str(response, encoding='utf-8')) return True def add_vip(add_ecs_id,ENI_ID): '''綁定函數''' client = AcsClient(AccessKeyId,AccessKeySecret,Endpoint) #建議不要使用變量,直接輸入字符串 request = AttachNetworkInterfaceRequest() request.set_accept_format('json') request.set_NetworkInterfaceId(ENI_ID) request.set_InstanceId(add_ecs_id) try: response = client.do_action_with_exception(request) except Exception as e: print(e) exit(3) print(str(response, encoding='utf-8')) if __name__ == '__main__': ret = remove_vip(remove_ecs_id,ENI_ID) if ret: add_vip(add_ecs_id,ENI_ID)
五、結合keepalived的單播模式使用
1、keepalived試例配置文件

! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc #發送郵箱 } notification_email_from Alexandre.Cassen@firewall.loc #郵箱地址 smtp_server 127.0.0.1 #郵件服務器地址 smtp_connect_timeout 30 router_id LVS_DEVEL-01 #主機名,每個節點不同即可 } vrrp_instance VI_1 { state MASTER #節點主從,在另一個節點上為BACKUP interface eth0 #IP地址漂移到的網卡 virtual_router_id 51 #多個節點必須相同 priority 100 #優先級,備用節點的值必須低於主節點的值 advert_int 1 #通告間隔1秒 authentication { auth_type PASS #預共享密鑰認證 auth_pass 1111 #密鑰 } unicast_src_ip 172.31.0.204 #本機地址 unicast_peer { 172.31.0.205 #目標地址 } virtual_ipaddress { 192.168.1.100/24 dev eth0 #VIP地址 } }

! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL-02 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } unicast_src_ip 172.31.0.205 unicast_peer { 172.31.0.204 } virtual_ipaddress { 192.168.1.100/24 dev eth0 } }
2、檢查腳本(未測試過的腳本,可以根據思路自己修改或測試)
結合了rsync使用
#!/bin/bash source /etc/init.d/functions vip=192.168.1.100 #虛擬vip local_ip=172.31.0.204 #本機ip rsync_module_ip=172.31.0.205 #rsync目標的ip ecs_id_file=/tmp/ecs_id.txt #保存彈性網卡所在的ecs的id名稱(ecsID) declare -A arr arr["172.31.0.204"]="ecs的id" #內網ip作為key,ecs的id作為value arr["172.31.0.205"]="ecs的id" if [ `ip a s eth0|egrep -o ${vip}|wc -l` -eq 1 ];then #判斷是否擁有vip if [ `cat ${ecs_id_file}|wc -l` -eq 1 ];then #判斷文件是否有內容 if `cat ${ecs_id_file}` != ${arr[${local_ip}]};then #判斷ecs_id_file文件中記錄的ecsID和本機的ecsID是否相同 python3 ENI.py ${arr[${rsync_module_ip}]} #執行腳本(python控制ENI的腳本) echo ${arr[${local_ip}]} > ${ecs_id_file} rsync -avz ${ecs_id_file} module_user@${rsync_module_ip}::aliyun_eni_module --password-file=/etc/rsync.password else rsync -avz ${ecs_id_file} module_user@${rsync_module_ip}::aliyun_eni_module --password-file=/etc/rsync.password fi else # unset arr[${local_ip}] #刪除arr中的本機的變量內容 python3 ENI.py ${arr[${rsync_module_ip}]} #執行腳本(python控制ENI的腳本) if [ $? -eq 0 ];then #判斷執行是否失敗 #腳本執行成功,覆蓋文件內容 echo ${arr[${local_ip}]} > ${ecs_id_file} #rsync覆蓋給另一台服務器的ecs_id_file文件(建議使用rsync的demon) rsync -avz ${ecs_id_file} module_user@${rsync_module_ip}::aliyun_eni_module --password-file=/etc/rsync.password else #執行失敗了操作 action "python3 scripts carried out Fail ${rsync_module_ip}" /bin/false fi fi fi