最近一段時(shí)間很少更新了从隆,一方面是忙于推進(jìn)公司內(nèi)部私有云平臺(tái)的建設(shè),另一方面是公司搞Kubernetes的哥們離職了,這個(gè)重?fù)?dān)自然落在了我身上逻炊。由于時(shí)間關(guān)系,有很長(zhǎng)都沒(méi)登錄簡(jiǎn)書(shū)了犁享。其實(shí)年初選擇在簡(jiǎn)書(shū)上更新自己的工作記錄嗅骄,很重要的原因是簡(jiǎn)書(shū)的App在手機(jī)上格式渲染的很好,體驗(yàn)不錯(cuò)饼疙。加上自己也懶得花錢(qián)花時(shí)間去折騰博客溺森。有個(gè)簡(jiǎn)單的用著還不錯(cuò)的簡(jiǎn)書(shū)自然成了我的選擇。
好了窑眯,家常扯得也差不多了屏积,該干正事呢。
背景
這兩天在公司新機(jī)房你上線了幾十臺(tái)Ocata版本的OpenStack磅甩,和上次一樣炊林,監(jiān)控部門(mén)同事申請(qǐng)了十多臺(tái)機(jī)器做Zabbix Proxy的lvs集群。踩過(guò)之前的坑《解決OS虛擬機(jī)內(nèi)采用LVS-DR模式請(qǐng)求超時(shí)問(wèn)題》卷要,我就知道渣聚,這次分給業(yè)務(wù)放不僅僅只有一個(gè)VIP
和allowed_address_pairs
而已。
經(jīng)過(guò)上次在Mitaka上踩過(guò)的坑僧叉,發(fā)現(xiàn)lvs節(jié)點(diǎn)所在的宿主機(jī)上iptables對(duì)于OUTPUT的報(bào)文沒(méi)有做規(guī)則奕枝,導(dǎo)致客戶(hù)端請(qǐng)求在丟給RealServer時(shí)被丟棄。解決起來(lái)也很簡(jiǎn)單瓶堕,在neutron-openvswi-local
上添加accept語(yǔ)句就能解決這個(gè)問(wèn)題隘道。
這次更新了Ocata版本發(fā)現(xiàn)社區(qū)竟然還是沒(méi)有解決這個(gè)Bug,看來(lái)還得手動(dòng)再執(zhí)行一次。
現(xiàn)象
上線了Ocata版本發(fā)現(xiàn)谭梗,這次我在lvs節(jié)點(diǎn)的宿主機(jī)上添加了accept語(yǔ)句后客戶(hù)端仍然無(wú)法建立連接忘晤。這就奇怪了,難倒Ocata版的安全組規(guī)則實(shí)現(xiàn)機(jī)制有變動(dòng)激捏?
經(jīng)過(guò)我前后對(duì)比Ocata和Mitaka版本的安全組的iptables規(guī)則發(fā)現(xiàn)并無(wú)差異设塔,另一方面業(yè)務(wù)方的lvs部署都是標(biāo)準(zhǔn)的輸出,部署肯定沒(méi)問(wèn)題远舅。那問(wèn)題多半還是在Neutron上闰蛔。
排查過(guò)程
簡(jiǎn)單抓了下客戶(hù)端、LVS和RealServer這三臺(tái)服務(wù)器的流量發(fā)現(xiàn)表谊,RealServer能夠收到Client發(fā)送的三次握手的[S]
包钞护,同時(shí)RealServer也應(yīng)答了[S.]
。
這個(gè)時(shí)候爆办,問(wèn)題出現(xiàn)了难咕。RealServer在發(fā)出[S.]
包后,居然收到客戶(hù)端的[R]
報(bào)文距辆。根據(jù)解釋R是RESET(復(fù)位TCP連接)的意思余佃。我們知道正常的三次握手客戶(hù)端應(yīng)該回的是[.]
相應(yīng)報(bào)文,可是這里卻出現(xiàn)了[R]
.
問(wèn)題點(diǎn)很有可能是客戶(hù)端沒(méi)有收到來(lái)自RealServer的ack報(bào)文跨算。檢查了下客戶(hù)端的流量爆土,果然沒(méi)有收到。那么目前得出結(jié)論就是诸蚕,宿主機(jī)丟棄了RealServer響應(yīng)的報(bào)文步势。那么同理在宿主機(jī)上加一條accept語(yǔ)句,果然客戶(hù)端三次握手成功背犯,tcp建立連接碴裙。
坑啊吞歼,這個(gè)是個(gè)大坑怔球!
坑的不是需要我手動(dòng)去添加iptables規(guī)則他去,大坑的是neutron-openvswitch-agent會(huì)去刷新iptables規(guī)則,導(dǎo)致之前加的策略失效柱锹!
臨時(shí)解決
目前能夠知道會(huì)引發(fā)iptables刷新的策略有agent重啟和實(shí)例的增刪哪自。查了Neutron的代碼,本來(lái)想實(shí)現(xiàn)在刷新iptables之后再加一條accept規(guī)則禁熏。但是現(xiàn)在業(yè)務(wù)部門(mén)催得緊壤巷,再加上自己基礎(chǔ)不好,便先用運(yùn)維的方式解決匹层。
原理就是每隔2分鐘去Check一下規(guī)則是否存在隙笆,沒(méi)有就給加上锌蓄。
cat CheckIptablesRulesLvsDr.sh
#!/bin/bash
ChainsName='neutron-openvswi-local'
function IsChainExist()
{
/usr/sbin/iptables-save |grep $ChainsName > /dev/null 2>&1
[[ $? -eq 0 ]] && echo 0 || echo 1
}
function IsRulesExist()
{
/usr/sbin/iptables -C $ChainsName -j ACCEPT > /dev/null 2>&1
[[ $? -eq 0 ]] && echo 0 || echo 1
}
function AddRulesAccept()
{
/usr/sbin/iptables -A $ChainsName -j ACCEPT
}
[[ `IsChainExist` -ne 0 ]] && \
exit 0
[[ `IsRulesExist` -ne 0 ]] && \
AddRulesAccept
通過(guò)ansible-playbook推送下到計(jì)算節(jié)點(diǎn)即可
- name: Check Iptables Rules Used by Lvs Dr Mode
template: src=etc/neutron/CheckIptablesRulesLvsDr.sh dest=/etc/neutron/CheckIptablesRulesLvsDr.sh mode=755
tags:
- lvsdr
- name: Crontab to check iptables on compute nodes. it is used by lvs dr mode in instances
cron: name='checkiptables' minute='*/2' job="/bin/bash /etc/neutron/CheckIptablesRulesLvsDr.sh" user="root"
tags:
- lvsdrcron