不只能做蠶絲被 日本教授養蠶研發「口服」新冠疫苗

摘錄自2020年8月8日聯合新聞網報導

日經中文網報導,日本九州大學教授日下部宜宏打算養蠶研發新冠肺炎疫苗。

日下部嘗試將新冠病毒棘蛋白基因植入其他病毒,再注射到蠶身上,使蠶的脂肪組織細胞吸收後大量製造棘蛋白,作為注射用疫苗的原料。日下部表示,已找到可以高效率製作棘蛋白的蠶品種,這種方法的安全性比降低病毒毒性的疫苗更高。

日下部表示,利用蠶製造新冠病毒疫苗原料成本更低,且原料製造時程也縮短許多,希望明(2021)年年初能進入人體實驗。

日下部也將植入新冠病毒棘蛋白基因的病毒注入蠶蛹,製造出「可食用」口服疫苗,如果不敢食用蠶蛹,也能磨成粉服用。

生物多樣性
國際新聞
日本
蠶
經濟動物

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※產品缺大量曝光嗎?你需要的是一流包裝設計!

誰說自主SUV不行 這些SUV就配備了合資技術

中控台的整體設計較為傳統,飛翼型的布局看上去立體感十足,內飾用料也是十分厚道,大面積的軟性材料覆蓋提升了整體的質感,四門車窗一鍵升降的功能在同級車中來說非常少見,無鑰匙進入/啟動、倒車影像、車內氛圍燈等配置應有盡有。

縱觀目前火爆的SUV市場,自主SUV的佔比是越來越大了,也證明了自主品牌造車的技術逐漸趨於成熟,內飾上的用料比許多合資車要厚道,配置上比合資車豐富得多,但一些核心技術上仍處於一個較為落後的狀態,三大件方面要多學習學習了。

比如三菱的發動機是許多自主車的最愛

愛信的變速箱少部分車型會有搭載

還有一些集團旗下的品牌會共用的技術

接下來我們就推薦幾款擁有合資技術的自主品牌SUV,大家可以更放心的選擇了

一汽奔騰-奔騰X80

指導價:9.98-18.18萬

技術:愛信6擋手自一體自動變速器、馬自達底盤、馬自達技術發動機

“運動型”的奔騰X80外觀和其他版本有着較大的區別,在部分細節上使用了黑色風格的裝飾進行改造,使整車看上去更加動感、年輕化,蜂窩狀紅黑配色的中網,扁平化處理的大燈,看上去稜角分明,更有時代感。

懸浮式的8英寸中控屏幕是一大亮點,支持Carplay功能,簡潔的中控布局看上去更加美觀,中控台和車門內採用了大面積的軟質材料,手感比較柔軟,座椅加熱、定速巡航、倒車影像、上坡輔助、胎壓監測等配置較為齊全。

4620*1820*1695mm的車身尺寸,2675mm的軸距算是個標準的緊湊型SUV,但內部空間還是令人驚喜的,車頂掏空的設計頭部空間非常寬敞;提供了1.8T(186馬力)/2.0L(147馬力)發動機可供選擇,與之匹配的是6擋手動或者6擋手自一體變速器。

東風乘用車-東風風神AX7

指導價:9.97-14.17萬

技術:2.0L pSA發動機、愛信6擋手自一體自動變速器

作為風神的首款SUV車型,上市兩年的AX7對於大家並不陌生,外觀的原創性在自主SUV中較高,幾乎沒有模仿痕迹,雖然是定位城市SUV,但車身上仍保留着硬朗動感的元素,個人一種大氣沉穩的感覺。

中控台的整體設計較為傳統,飛翼型的布局看上去立體感十足,內飾用料也是十分厚道,大面積的軟性材料覆蓋提升了整體的質感,四門車窗一鍵升降的功能在同級車中來說非常少見,無鑰匙進入/啟動、倒車影像、車內氛圍燈等配置應有盡有。

風神AX7的車身尺寸為4690*1850*1727mm,軸距為2712mm,乘坐空間很充裕,儲物空間上也非常豐富,滿足日常家庭使用;動力方面提供了1.4T(140馬力)/2.0L(147馬力)發動機+5擋手動/6擋手自一體變速器的組合,兩款發動機無論是動力還是扭矩都非常的接近。

江鈴汽車-馭勝S330

指導價:8.88-14.08萬

技術:格特拉克6擋手自一體自動變速器

馭勝S330第一眼望去會有一種神似路虎的感覺,但仔細觀察其實還是有着自己家族很多特徵的,倒梯形的大嘴進氣格柵配合犀利的大燈和C字型日間行車燈,使得整個車頭非常兇悍,懸浮式的車頂設計搭配時尚的輪圈,顯得側面造型動感帥氣。

大量平直的線條運用到內飾上面,中控面板使用了一大塊觸控屏幕,簡約而時尚,仿碳纖維加上純黑的內飾,凸顯了一定的運動氛圍,自動頭燈、前排座椅加熱、全景天窗、無鑰匙進入/啟動、上坡輔助等配置非常豐富。

其長寬高為4588*1932*1676mm,軸距為2712mm,實際體驗S330后,才發現緊湊級SUV也可以這麼大,特別是腿部空間,令人滿意;採用借鑒福特研發流程的1.5T發動機最大功率163馬力,搭配6擋手動或者6擋手自一體變速箱,加之調教出色的底盤,行駛質感良好。

總結:這些自主SUV車型在某些方面採用了自家集團旗下的技術,在降低成本的同時又能保證質量,能讓消費者買到更可靠的車子,實在是一舉兩得啊。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計最專業,超強功能平台可客製化

【教授帶你玩買菜車】網紅榮威RX5到底好不好玩?

相信不少人都聽說過MG銳騰這一輛加速迅猛的SUV,實際上RX5和銳騰在加速方面的表現很相似,都能給人很強的推背感。由於雙離合變速箱有自我保護程序,所以無法撓胎起步,但RX5的實測百公里加速時間依然讓人驚嘆,低至8。9S。

關注內容的朋友都知道,在之前已經推出過兩篇分別關於思域和科魯茲的“帶你玩買菜車”專題文章。上兩輛都是在今年比較火的轎車,而每逢年底,人們總是習慣於總結和思考,既然有轎車,那自然就少不了SUV的總結,所以也做了一個SUV的“買菜車”選題,首先給大家帶來就是上市以來就備受矚目的國內首款互聯網汽車-榮威RX5。

值得一提的是,自7月上市以來,榮威RX5就成為了中國SUV銷量“增速王”, 首月交車近萬輛、次月交車近1.4萬輛,第三、四個月月銷量持續破2萬,連續兩個月挺進SUV熱銷榜前十;更讓人驚喜的是,在銷量如此火爆,車輛供不應求的情況下,上汽榮威依然推出了購置稅補貼優惠,簡而言之在2016年12月31日前,用戶訂購榮威RX5 20T車型,在2017年1月1日至4月30期間提車,即可享受購置稅減半優惠;而針對30T車型,凡是在2017年4月30日之前提車的用戶,將繼續享受7000元的購置稅補貼。

今天拿到了榮威RX5 2016款 30T 兩驅互聯網智享版的試駕車,接下來就通過一系列的測試告訴大家這輛車好不好玩。

既然叫“互聯網汽車”,那麼這輛車的多媒體功能就一定是他的賣點,所以也第一時間試用了這個YunOS系統,功能很豐富,涉及到手機的遠程控制、車載互聯網功能以及導航等等。簡單的體驗了一下,發現確實很實用。

首先在手機上下載App,輸入專屬的賬號,就可以實現近程和遠程的控制車輛。諸如遠程控制空調、車輛定位等功能都可以實現,另外,綁定了專屬賬號的手機還可以充當解鎖的鑰匙,車主即使是忘記了攜帶實體鑰匙,也可以通過手機App解鎖RX5,車主也可以通過授權別的手機開鎖RX5的權限,那麼借車給朋友的時候也就不一定要把實體鑰匙也給他,更加方便(pS:授權其他手機開鎖的功能暫時還未開通)。

車載的多媒體系統本身的功能也很豐富,如預約停車位、高精度導航、語音控制、預約保養等。高精度導航是基於高德地圖的,定位精確到具體的車道,相當實用;而語音控制也拓展到車輛的控制,如打開天窗等操作都可以通過語音控制來完成。整體來說,RX5的YunOS系統確實是目前試過的最有科技感的車載多媒體系統,值得點贊。

這次測試的RX5搭載的是2.0T的渦輪增壓發動機,搭配了6擋雙離合的變速箱,最大馬力為220ps。相信不少人都聽說過MG銳騰這一輛加速迅猛的SUV,實際上RX5和銳騰在加速方面的表現很相似,都能給人很強的推背感。由於雙離合變速箱有自我保護程序,所以無法撓胎起步,但RX5的實測百公里加速時間依然讓人驚嘆,低至8.9S。

測試完百公里加速,緊接着就馬上測試了RX5的百公里剎車距離,得出的成績為40.1m,這個成績和主流的合資緊湊型SUV比起來也不吃虧,符合要求。

水杯彎道測試是玩買菜車的一個特色項目,通過觀察開車劈彎後車內水杯的水位線,來讓大家更加直觀的了解這輛車在過彎時的側傾情況。下圖是測試前的水位狀況,水位線距杯口大概1厘米。

繞着這個半徑為2米左右的環島進行彎道測試,測試過程中感覺到這輛車的轉彎極限還是蠻高的,經過的一番蹂躪之後,我們看到水杯的水位大概位於杯口下2厘米的位置,這對於一輛SUV來說側傾程度不算特別嚴重。

上面的幾項測試讓我們對RX5的動態表現有個大概了解,記下來就看看乘坐空間和儲物空間方面的靜態表現吧。乘坐空間方面,身高175cm的體驗者在調整好坐姿之後在後排能取得一拳的頭部空間和兩拳的腿部空間,空間表現中規中矩。

儲物空間方面,前排的杯架和門板上的杯架都能輕鬆的放下一瓶500毫升的礦泉水,除了常規的手套箱和扶手箱,方向盤左側的卡片槽和扶手箱前方的儲物槽都很實用,至於後備箱,容積為595L,後排座椅也支持放倒,所以RX5的整體儲物空間相當實用,不用擔心。

最後,也是大家最關心的油耗環節了,首先把油箱加滿(加到跳槍),然後就在市區路況跑70公里,最後再去加油站加油加到跳槍,得出這70公里的油耗。根據測試結果,算了一下RX5的油耗大概是每百公里9.18L。

總結

經過測試,RX5給最深刻的印象就是那如猛獸般的提速,實測8.9秒的百公里加速,這已經跟很多合資的運動型轎車不相上下了。而在空間和油耗方面的表現也符合對於一輛家用車的預期,相信在優惠政策的推動下,RX5的銷量會更進一步的。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計最專業,超強功能平台可客製化

伊朗驚曝:核電廠遭「蓄意破壞」釀大火!國際原子能總署將訪德黑蘭

摘錄自2020年8月24日東森新聞報導

伊朗伊斯法罕省(Isfahan)納坦茲(Natanz)的核電廠於7月2日凌晨發生事故,影響高級鈾濃縮離心機的開發進度。該國原子能組織發言人卡馬萬迪(Behrouz Kamalvandi)於23日宣布,這次意外是因「蓄意破壞」引發火災導致。但是,他並未透露官方認為誰是幕後主使。

伊朗部分官員一開始認為,事故可能起因於網路破壞,揚言將對任何發動攻擊的國家採取報復。

國際原子能總署(IAEA)懷疑,伊朗在2000年左右曾在2處原子能場所進行核武開發相關活動。其總幹事格羅西(Rafael Grossi)於22日表示,他將於24日首度訪問伊朗,施壓當局批准查核人員進入上述場所。

污染治理
國際新聞
伊朗
核電廠

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計最專業,超強功能平台可客製化

最低7.98萬起 本周的新款SUV都高端的嚇人!

最後才是產品收益相較過去應有更大的改善。在採訪環節的開頭,李春榮說:“今年是東風乘用車九年了,明年翻過去就是十年,我們經常說十年磨一劍,這個用在我們東風風神身上非常貼切。”可以看出在過去近十年的時間里,東風風神為產品質量打下了紮實穩固的基礎。

2017年第一周,不少廠家選擇了在這周時間內搶先發布新款車型。這一周新上市的車型僅有幾款,但都是值得考慮的貨色!其中最賣力的要數東風本田!

12月29日,武漢正寒風凜凜,而此時東風風神卻熱情絲毫不減。當天受邀參加國家信息中心、搜狐汽車共同舉辦的“中國本土品牌創新之旅”,來到了位於武漢的東風風神廠區,共同見證“2016年度第15萬台整車發運暨第10萬台發動機下線”儀式。而這,也可視為東風乘用車公司為“十三五”開局之年畫上了一個圓滿的句號。

在過去的11個月,東風乘用車公司累計銷售超13萬輛,而現今第15萬台整車發運,意味着東風風神將邁上年銷15萬輛台階,同比增長速近50%。從銷量數據上看,東風風神AX7、AX5、AX3等組成的SUV軍團貢獻最大,合計銷量超過十萬輛,其中明星車型東風風神AX7穩步站上月銷7000輛台階,並向月銷過萬挺進。另外在海外市場也作出了好成績,年銷量超1.5萬輛,同比增長近4倍,成績斐然。

隨着東風風神在技術研發以及生產製造體系的不斷投入,東風風神已經形成完善的發動機製造價值鏈。如今,東風風神的發動機銷量佔東風公司自主發動機整體銷量近50%,成為公司最大的自主品牌發動機製造陣地。目前,東風風神研發生產的發動機主要分為A、B、C三個系列平台,其中A系列包含A16、A14T等型號,而A14T正是東風風神目前主打的1.4T渦輪增壓發動機,在未來的規劃中A系列平台也將會以1.4L為主進行研發。

李春榮表示,要當中國品牌的主力軍,得有幾個方面,首先產品質量要好,質量不好就是“游擊隊”,這一點在AX5的誕生地東風風神常州工廠有所體現,具備國際一流水平的自動化生產線和智能生產管理系統,工廠的生產標準與設備均向合資品牌東風日產看齊。其次是銷量規模,目前東風乘用車在中國汽車市場排名第31位,自主品牌排名第17位,李春榮坦言道明年銷量要做到20萬輛。再者是產品構架,東風風神要成為主力軍,明年將要在轎車、SUV、高端轎車、新能源車、海外市場5個方面均衡發展。最後才是產品收益相較過去應有更大的改善。

在採訪環節的開頭,李春榮說:“今年是東風乘用車九年了,明年翻過去就是十年,我們經常說十年磨一劍,這個用在我們東風風神身上非常貼切。”可以看出在過去近十年的時間里,東風風神為產品質量打下了紮實穩固的基礎。這裏用“博觀而約取,厚積而薄發”這句話來形容目前的東風乘用車是最合適不過了。

俗話說,40不惑,50知天命。作為成立48年的大型汽車企業,東風就像一個成熟穩重的中年人,沒有更多刻意追求數據的漂亮,而是着重穩定可靠和節油。對汽車企業來說,質量是最本質的東西。“我們已經是中國品牌的生力軍,接下來明年我們希望成為中國品牌的主力軍。”東風乘用車總經理李春榮說道。

久違的重逢,路虎發現神行安吉之旅

“遙憐十景試春遊,東嶺迢迢一徑幽。記得碧門村口去,籃輿輕度到杭州”所形容正是此時此刻的場景,駕駛全新路虎發現神行踏上了前往安吉的路上到處都是鬱郁蔥蔥的竹林、陽光透過竹恭弘=叶 恭弘灑在馬路上、竹恭弘=叶 恭弘沙沙作響。

“發現神行”作為路虎在國內投放的一款重磅中型SUV,自上市之初便飽受關注。無奈當時進口版過高的售價使得許多喜歡它的消費者都望而卻步,而在與奇瑞捷豹路虎“聯婚”后價格比起進口版直接下降十多萬,這可讓很多崇尚路虎品牌的車友們對它產生了極大的興趣。那麼國產之後的路虎又可否保持與進口版同樣的出色品質呢,讓來帶你們一探究竟。

身為一台路虎,與生俱來的越野能力毋庸置疑,但更多的城市用戶購買SUV只是為了更好的都市駕乘,在鋪裝路面的駕駛神行同樣為我們交上了一份滿意的答卷。全時四驅系統,能根據道路的實際狀況,在兩驅以及四驅之間自由切換,當檢測到到前輪打滑時它能迅速將動力分配到後輪,讓車輛在雨天濕滑路面擁有更好的循跡性。

而更值得一提的當屬是路虎家族名聲在外的全地形反饋適應系統了,只需簡單點擊按鈕即可在普通、草地-砂礫-雪地、泥濘-車轍、沙土、岩石五大駕駛模式中任意切換,讓駕駛員不必具有專業技術,也可以輕鬆應對各種路況。

“發現神行”是奇瑞捷豹路虎的第二款車型,一輛擁有優異的公路性和同級最強的四驅系統的七座中型SUV,通過大量的高科技配置和先進的技術應用,為此次安吉之旅保駕護航。

本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計最專業,超強功能平台可客製化

UniRx精講(一):UniRx簡介&定時功能實現

1.UniRx 簡介

UniRx 是一個 Unity3D 的編程框架。它專註於解決時間上異步的邏輯,使得異步邏輯的實現更加簡潔和優雅。

簡潔優雅如何體現?

比如,實現一個“只處理第一次鼠標點擊事件”這個功能,使用 UniRx 實現如下:

Observable.EveryUpdate()
			.Where(_ => Input.GetMouseButtonUp(0))
			.First()
			.Subscribe(_ => { // do something   });

代碼做的事情很簡單:

  1. 開啟一個 Update 的事件監聽。
  2. 每次 Update 事件被調用時,進行鼠標是否抬起的判斷。
  3. 如果判斷通過,則進行計數,並且只獲取第一次點擊事件。
  4. 訂閱/處理事件。

如果在 Unity 中,使用傳統的方式實現如上功能,首先要創建一個成員變量來記錄點擊次數/是否點擊過,然後在腳本中創建一個 Update 方法來監聽鼠標抬起的事件。

如果在 Update 方法中,除了實現鼠標事件監聽這個功能之外,還要實現其他的功能。那麼 Update 里就會充斥着大量的狀態判斷等邏輯。代碼非常不容易閱讀。

而 UniRx 提供了一種編程思維,使得平時一些比較難以實現的異步邏輯(比如以上這種),使用 UniRx 輕鬆搞定,並且不失代碼的可讀性。

當然 UniRx 的強大不僅僅如此。

它還可以:

  • 優雅實現 MVP(MVC)架構模式。
  • 對 UGUI/Unity API 提供了增強,很多需要寫大量代碼的 UI 邏輯,使用 UniRx 優雅實現。
  • 輕鬆完成非常複雜的異步任務處理。
  • ……

最最重要的是,它可以提高我們的編碼效率,同時還給我們的大腦提供一個強有力的編程模型。而 UniRx 本身的源碼非常值得研究學習,就連大名鼎鼎的 uFrame 框架,在 1.6 版本之後,使用 UniRx 進行了大幅重構,其事件/數據綁定層使用 UniRx 強力驅動。

筆者的 QFramework 也同樣引入了 UniRx,有一大批的框架用戶都是因為支持了 UniRx 慕名而來。

為什麼要用 UniRx ?

UniRx 就是 Unity 版本的 Reactive Extensions,Reactive Extensions 中文意思是:響應式擴展,響應式指的是觀察者和定時器,擴展指的是 LINQ 的操作符。Reactive Extensions 以擅長處理時間上異步的邏輯、以及極簡的 API 風格而聞名。

我們都知道,遊戲很多的系統都是在時間上異步的,所以 Unity 開發者所需要實現的異步邏輯是非常多的。這也是為什麼 Unity 官方在引擎層實現了 Coroutine(協程)這樣的概念。

在遊戲中,像動畫的播放、聲音的播放、網絡請求、資源加載/卸載、Tween 動畫、場景過渡等都是在時間上異步的邏輯。甚至是遊戲循環(Every Update、OnCollisionEnter 等)、傳感器數據(Kinect、Leap Motion、VR Input 等)都是時間上異步的邏輯(事件)。

當我們在項目中實現以上的邏輯的時候,往往使用的方式是用大量的回調實現,最終隨着項目的擴張會導致傳說中的”回調地獄”。

相對較好的方法則是使用消息/事件進行實現,結果導致“消息滿天飛”,導致代碼非常難以閱讀。

以上的任務使用 Coroutine 也是非常不錯的,但是 Coroutine 在 Unity 使用的時候,需要定義一個方法。寫起來是非常面向過程的。當邏輯稍微複雜一點,就很容易造成 Coroutine 嵌套 Coroutine,代碼是非常不容易閱讀的(強耦合)。

而 UniRx 的出現剛好解決了這個問題,它介於回調和事件之間。

它有事件的概念,只不過它的事件是像流水一樣流過來,而我們要做的則是簡單地對這些事件進行組織、變換、過濾、合併就可以得到我們想要的結果了。

它也用掉了回調,只不過它的回調是在事件經過組織之後,只需要調用一次就可以進行事件處理了。

它的原理和 Coroutine (迭代器模式)、LINQ 非常相似,但是比 Coroutine 強大得多。

UniRx 將時間上異步的事件轉化為響應式的事件序列,通過 LINQ操作可以很簡單地組合起來。

為什麼要用 UniRx? 答案就是遊戲本身有大量的在時間上異步的邏輯,而 UniRx 恰好擅長處理這類邏輯,使用 UniRx 可以節省我們的時間,同時讓代碼更簡潔易讀。

Rx 只是一套標準,其他的語言也有實現,如果在 Unity 中熟悉了這套標準,那麼在未來,大家在做別的語言的項目的時候,很容易獲得 Rx 的能力。

專欄內容:

  1. 實踐並講解開發中最常用的 UniRx API。
  2. 對 UniRx 進行一個全方面的簡介。
  3. 在每個階段結束后就會結合所學的知識進行項目實踐。
  4. UniRx 操作符大全。
  5. UniRx 源碼閱讀。
  6. UniRx 背後的設計原理及設計模式學習。
  7. LINQ、Coroutine 底層原理剖析。
  8. BindingsRx、uFrame 源碼閱讀。

OK,讓我們從下一篇開始,感受一下 UniRx 的魅力吧。

知識地圖

2.定時功能實現

在 Unity 開發中,延時是我們經常要實現的功能,這個功能對於有點經驗的開發者來說不難。

最常見的實現方式如下:

using UnityEngine;

public class CommonDelayExample : MonoBehaviour
{
	private float mStartTime;

	void Start()
	{
		mStartTime = Time.time;
	}

	void Update()
	{
		if (Time.time - mStartTime > 5)
		{
			DoSomething();
			// 避免再次執行
			mStartTime = float.MaxValue;
		}
	}

	void DoSomething()
	{
		Debug.Log("DoSomething");
	}
}

這是很多初學者剛入門時候的實現方式,而初學者們隨着深入學習後來接觸到了 Coroutine(協程),使用 Coroutine 實現定時功能會更容易,而且也是更好的選擇,實現如下:

using System;
using System.Collections;
using UnityEngine;

public class CoroutineDelayExample : MonoBehaviour
{
	void Start()
	{
		StartCoroutine(Timer(5, DoSomething));
	}

	IEnumerator Timer(float seconds, Action callback)
	{
		yield return new WaitForSeconds(seconds);
		callback();
	}

	void DoSomething()
	{
		Debug.Log("DoSomething");
	}
}

協程已經把代碼精簡了很多,不過接下來有更厲害的,使用 UniRx。

代碼如下:

Observable.Timer(TimeSpan.FromSeconds(5)).Subscribe(_ => { /* do something */ });

當然以上代碼是沒有和 MonoBehaviour 進行生命周期綁定的,也就是說當 MonoBehaviour 銷毀了之後,這個定時邏輯可能還在執行,這樣就會有造成空指針異常的風險。

要解決也很簡單,代碼如下:

Observable.Timer(TimeSpan.FromSeconds(5))
		.Subscribe(_ => { /* do something */ })
		.AddTo(this);

只要加上一個 AddTo(this) 就可以了。
這樣,當 this(MonoBehaviour) Destroy 的時候,這個延時邏輯也會銷毀掉,從而避免造成空指針異常。

三行代碼,寫下來大約 20 秒的時間,就搞定了一個實現起來比較麻煩的邏輯。

今天的內容就這些。

知識地圖

更多內容

  • QFramework 地址:https://github.com/liangxiegame/QFramework
  • QQ 交流群:623597263
  • 涼鞋的主頁:https://liangxiegame.com/zhuanlan
  • 關注公眾號:liangxiegame 獲取第一時間更新通知及更多的免費內容。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計最專業,超強功能平台可客製化

附022.Kubernetes_v1.18.3高可用部署架構一

kubeadm介紹

kubeadm概述

參考附003.Kubeadm部署Kubernetes。

kubeadm功能

參考附003.Kubeadm部署Kubernetes。

本方案描述

  • 本方案採用kubeadm部署Kubernetes 1.18.3版本;
  • etcd採用混部方式;
  • Keepalived:實現VIP高可用;
  • Nginx:以Pod形式運行與Kubernetes之上,即in Kubernetes模式,提供反向代理至3個master 6443端口;
  • 其他主要部署組件包括:
    • Metrics:度量;
    • Dashboard:Kubernetes 圖形UI界面;
    • Helm:Kubernetes Helm包管理工具;
    • Ingress:Kubernetes 服務暴露;
    • Longhorn:Kubernetes 動態存儲組件。

部署規劃

節點規劃

節點主機名 IP 類型 運行服務
master01 172.24.8.71 Kubernetes master節點 docker、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、kubelet、metrics、calico
master02 172.24.8.72 Kubernetes master節點 docker、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、kubelet、metrics、calico
master03 172.24.8.73 Kubernetes master節點 docker、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、kubelet、metrics、calico
worker01 172.24.8.74 Kubernetes worker節點 docker、kubelet、proxy、calico
worker02 172.24.8.75 Kubernetes worker節點 docker、kubelet、proxy、calico
worker03 172.24.8.76 Kubernetes worker節點 docker、kubelet、proxy、calico

Kubernetes的高可用主要指的是控制平面的高可用,即指多套Master節點組件和Etcd組件,工作節點通過負載均衡連接到各Master。

Kubernetes高可用架構中etcd與Master節點組件混布方式特點:

  • Etcd混布方式
  • 所需機器資源少
  • 部署簡單,利於管理
  • 容易進行橫向擴展
  • 風險大,一台宿主機掛了,master和etcd就都少了一套,集群冗餘度受到的影響比較大。

提示:本實驗使用Keepalived+Nginx架構實現Kubernetes的高可用。

初始準備

[root@master01 ~]# hostnamectl set-hostname master01 #其他節點依次修改

[root@master01 ~]# cat >> /etc/hosts << EOF
172.24.8.71 master01··
172.24.8.72 master02
172.24.8.73 master03
172.24.8.74 worker01
172.24.8.75 worker02
172.24.8.76 worker03
EOF

[root@master01 ~]# vi k8sinit.sh

#!/bin/sh
#****************************************************************#
# ScriptName: k8sinit.sh
# Author: xhy
# Create Date: 2020-05-30 16:30
# Modify Author: xhy
# Modify Date: 2020-05-30 16:30
# Version: 
#***************************************************************#
# Initialize the machine. This needs to be executed on every machine.

# Add docker user
useradd -m docker

# Disable the SELinux.
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

# Turn off and disable the firewalld.
systemctl stop firewalld
systemctl disable firewalld

# Modify related kernel parameters & Disable the swap.
cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.tcp_tw_recycle = 0
vm.swappiness = 0
vm.overcommit_memory = 1
vm.panic_on_oom = 0
net.ipv6.conf.all.disable_ipv6 = 1
EOF
sysctl -p /etc/sysctl.d/k8s.conf >&/dev/null
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
modprobe br_netfilter

# Add ipvs modules
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
modprobe -- nf_conntrack
EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules

# Install rpm
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget

# Install Docker Compose
sudo curl -L "http://down.linuxsb.com:8888/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# Update kernel
rpm --import http://down.linuxsb.com:8888/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://down.linuxsb.com:8888/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
yum --disablerepo="*" --enablerepo="elrepo-kernel" install -y kernel-ml
sed -i 's/^GRUB_DEFAULT=.*/GRUB_DEFAULT=0/' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
yum update -y

# Reboot the machine.
# reboot

提示:對於某些特性,可能需要升級內核,內核升級操作見《018.Linux升級內核》。4.19版及以上內核nf_conntrack_ipv4已經改為nf_conntrack。

互信配置

為了更方便遠程分發文件和執行命令,本實驗配置master節點到其它節點的 ssh 信任關係。

[root@master01 ~]# ssh-keygen -f ~/.ssh/id_rsa -N ''
[root@master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@master01
[root@master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@master02
[root@master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@master03
[root@master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@worker01
[root@master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@worker02
[root@master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@worker03

提示:此操作僅需要在master節點操作。

其他準備

[root@master01 ~]# vi environment.sh

#!/bin/sh
#****************************************************************#
# ScriptName: environment.sh
# Author: xhy
# Create Date: 2020-05-30 16:30
# Modify Author: xhy
# Modify Date: 2020-05-30 16:30
# Version: 
#***************************************************************#
# 集群 MASTER 機器 IP 數組
export MASTER_IPS=(172.24.8.71 172.24.8.72 172.24.8.73)

# 集群 MASTER IP 對應的主機名數組
export MASTER_NAMES=(master01 master02 master03)

# 集群 NODE 機器 IP 數組
export NODE_IPS=(172.24.8.74 172.24.8.75 172.24.8.76)

# 集群 NODE IP 對應的主機名數組
export NODE_NAMES=(worker01 worker02 worker03)

# 集群所有機器 IP 數組
export ALL_IPS=(172.24.8.71 172.24.8.72 172.24.8.73 172.24.8.74 172.24.8.75 172.24.8.76)

# 集群所有IP 對應的主機名數組
export ALL_NAMES=(master01 master02 master03 worker01 worker02 worker03)
[root@master01 ~]# source environment.sh
[root@master01 ~]# chmod +x *.sh
[root@master01 ~]# for all_ip in ${ALL_IPS[@]}
  do
    echo ">>> ${all_ip}"
    scp -rp /etc/hosts root@${all_ip}:/etc/hosts
    scp -rp k8sinit.sh root@${all_ip}:/root/
    ssh root@${all_ip} "bash /root/k8sinit.sh"
  done

集群部署

Docker安裝

[root@master01 ~]# for all_ip in ${ALL_IPS[@]}
  do
    echo ">>> ${all_ip}"
    ssh root@${all_ip} "yum -y install yum-utils device-mapper-persistent-data lvm2"
    ssh root@${all_ip} "yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo"
    ssh root@${all_ip} "yum -y install docker-ce"
    ssh root@${all_ip} "mkdir /etc/docker"
    ssh root@${all_ip} "cat > /etc/docker/daemon.json <<EOF
{
  \"registry-mirrors\": [\"https://dbzucv6w.mirror.aliyuncs.com\"],
  \"exec-opts\": [\"native.cgroupdriver=systemd\"],
  \"log-driver\": \"json-file\",
  \"log-opts\": {
    \"max-size\": \"100m\"
  },
  \"storage-driver\": \"overlay2\",
  \"storage-opts\": [
    \"overlay2.override_kernel_check=true\"
  ]
}
EOF"
    ssh root@${all_ip} "systemctl restart docker"
    ssh root@${all_ip} "systemctl enable docker"
    ssh root@${all_ip} "systemctl status docker"
    ssh root@${all_ip} "iptables -nvL"
  done

提示:如上僅需Master01節點操作,從而實現所有節點自動化安裝。

相關組件包

需要在每台機器上都安裝以下的軟件包:

  • kubeadm: 用來初始化集群的指令;
  • kubelet: 在集群中的每個節點上用來啟動 pod 和 container 等;
  • kubectl: 用來與集群通信的命令行工具。

kubeadm不能安裝或管理 kubelet 或 kubectl ,所以得保證他們滿足通過 kubeadm 安裝的 Kubernetes控制層對版本的要求。如果版本沒有滿足要求,可能導致一些意外錯誤或問題。
具體相關組件安裝見;附001.kubectl介紹及使用書

提示:Kubernetes 1.18版本所有兼容相應組件的版本參考:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md。

正式安裝

[root@master01 ~]# for all_ip in ${ALL_IPS[@]}
  do
    echo ">>> ${all_ip}"
    ssh root@${all_ip} "cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF"
    ssh root@${all_ip} "yum install -y kubeadm-1.18.3-0.x86_64 kubelet-1.18.3-0.x86_64 kubectl-1.18.3-0.x86_64 --disableexcludes=kubernetes"
    ssh root@${all_ip} "systemctl enable kubelet"
done

[root@master01 ~]# yum search -y kubelet --showduplicates #查看相應版本

提示:如上僅需Master01節點操作,從而實現所有節點自動化安裝,同時此時不需要啟動kubelet,初始化的過程中會自動啟動的,如果此時啟動了會出現報錯,忽略即可。

說明:同時安裝了cri-tools, kubernetes-cni, socat三個依賴: socat:kubelet的依賴; cri-tools:即CRI(Container Runtime Interface)容器運行時接口的命令行工具。

部署高可用組件I

Keepalived安裝

[root@master01 ~]# for master_ip in ${MASTER_IPS[@]}
  do
    echo ">>> ${master_ip}"
    ssh root@${master_ip} "yum -y install gcc gcc-c++ make libnl libnl-devel libnfnetlink-devel openssl-devel"
    ssh root@${master_ip} "wget http://down.linuxsb.com:8888/software/keepalived-2.0.20.tar.gz"
    ssh root@${master_ip} "tar -zxvf keepalived-2.0.20.tar.gz"
    ssh root@${master_ip} "cd keepalived-2.0.20/ && ./configure --sysconf=/etc --prefix=/usr/local/keepalived && make && make install"
    ssh root@${master_ip} "systemctl enable keepalived && systemctl start keepalived"
  done

提示:如上僅需Master01節點操作,從而實現所有節點自動化安裝。

創建配置文件

[root@master01 ~]# wget http://down.linuxsb.com:8888/ngkek8s.sh		#拉取自動部署腳本
[root@master01 ~]# chmod u+x ngkek8s.sh
[root@master01 ~]# vi ngkek8s.sh
#!/bin/sh
#****************************************************************#
# ScriptName: k8s_ha.sh
# Author: xhy
# Create Date: 2020-05-13 16:32
# Modify Author: xhy
# Modify Date: 2020-06-12 12:53
# Version: v2
#***************************************************************#

#######################################
# set variables below to create the config files, all files will create at ./config directory
#######################################

# master keepalived virtual ip address
export K8SHA_VIP=172.24.8.100

# master01 ip address
export K8SHA_IP1=172.24.8.71

# master02 ip address
export K8SHA_IP2=172.24.8.72

# master03 ip address
export K8SHA_IP3=172.24.8.73

# master01 hostname
export K8SHA_HOST1=master01

# master02 hostname
export K8SHA_HOST2=master02

# master03 hostname
export K8SHA_HOST3=master03

# master01 network interface name
export K8SHA_NETINF1=eth0

# master02 network interface name
export K8SHA_NETINF2=eth0

# master03 network interface name
export K8SHA_NETINF3=eth0

# keepalived auth_pass config
export K8SHA_KEEPALIVED_AUTH=412f7dc3bfed32194d1600c483e10ad1d

# kubernetes CIDR pod subnet
export K8SHA_PODCIDR=10.10.0.0

# kubernetes CIDR svc subnet
export K8SHA_SVCCIDR=10.20.0.0

[root@master01 ~]# ./ngkek8s.sh

解釋:如上僅需Master01節點操作。執行ngkek8s.sh腳本后,會自動生成以下配置文件:

  • kubeadm-config.yaml:kubeadm初始化配置文件,位於當前目錄
  • keepalived:keepalived配置文件,位於各個master節點的/etc/keepalived目錄
  • nginx-lb:nginx-lb負載均衡配置文件,位於各個master節點的/etc/kubernetes/nginx-lb/目錄
  • calico.yaml:calico網絡組件部署文件,位於config/calico/目錄
[root@master01 ~]# cat kubeadm-config.yaml		#檢查集群初始化配置
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
networking:
  serviceSubnet: "10.20.0.0/16"			     	#設置svc網段
  podSubnet: "10.10.0.0/16"			        #設置Pod網段
  dnsDomain: "cluster.local"
kubernetesVersion: "v1.18.3"			    	#設置安裝版本
controlPlaneEndpoint: "172.24.8.100:16443"		#設置相關API VIP地址
apiServer:
  certSANs:
  - master01
  - master02
  - master03
  - 127.0.0.1
  - 172.24.8.71
  - 172.24.8.72
  - 172.24.8.73
  - 172.24.8.100
  timeoutForControlPlane: 4m0s
certificatesDir: "/etc/kubernetes/pki"
imageRepository: "k8s.gcr.io"
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
  SupportIPVSProxyMode: true
mode: ipvs

提示:如上僅需Master01節點操作,更多config文件參考:https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2。
此kubeadm部署初始化配置更多參考:https://pkg.go.dev/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2?tab=doc。

啟動Keepalived

[root@master01 ~]# cat /etc/keepalived/check_apiserver.sh	#確認Keepalived配置
[root@master01 ~]# for master_ip in ${MASTER_IPS[@]}
  do
    echo ">>> ${master_ip}"
    ssh root@${master_ip} "systemctl start keepalived.service && systemctl enable keepalived.service"
    ssh root@${master_ip} "systemctl status keepalived.service | grep Active"
  done
[root@master01 ~]# for all_ip in ${ALL_IPS[@]}
  do
    echo ">>> ${all_ip}"
    ssh root@${all_ip} "ping -c1 172.24.8.100"
  done								#等待10s左右執行檢查

提示:如上僅需Master01節點操作,從而實現所有節點自動啟動服務。

啟動Nginx

執行ngkek8s.sh腳本后,nginx-lb的配置文件會自動複製到各個master的節點的/etc/kubernetes/nginx-lb目錄。

[root@master01 ~]# for master_ip in ${MASTER_IPS[@]}
  do
    echo ">>> ${master_ip}"
    ssh root@${master_ip} "cd /etc/kubernetes/nginx-lb/ && docker-compose up -d"
    ssh root@${master_ip} "docker-compose ps"
  done

提示:如上僅需Master01節點操作,從而實現所有節點自動啟動服務。

初始化集群-Master

拉取鏡像

[root@master01 ~]# kubeadm --kubernetes-version=v1.18.3 config images list #列出所需鏡像

[root@master01 ~]# cat config/downimage.sh			#確認版本,提前下載鏡像
#!/bin/sh
#****************************************************************#
# ScriptName: downimage.sh
# Author: xhy
# Create Date: 2020-05-29 19:55
# Modify Author: xhy
# Modify Date: 2020-05-30 16:07
# Version: v2
#***************************************************************#

KUBE_VERSION=v1.18.3
CALICO_VERSION=v3.14.1
CALICO_URL=calico
KUBE_PAUSE_VERSION=3.2
ETCD_VERSION=3.4.3-0
CORE_DNS_VERSION=1.6.7
GCR_URL=k8s.gcr.io
METRICS_SERVER_VERSION=v0.3.6
INGRESS_VERSION=0.32.0
CSI_PROVISIONER_VERSION=v1.4.0
CSI_NODE_DRIVER_VERSION=v1.2.0
CSI_ATTACHER_VERSION=v2.0.0
CSI_RESIZER_VERSION=v0.3.0 
ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containers
UCLOUD_URL=uhub.service.ucloud.cn/uxhy
QUAY_URL=quay.io

kubeimages=(kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION}
coredns:${CORE_DNS_VERSION}
metrics-server-amd64:${METRICS_SERVER_VERSION}
)

for kubeimageName in ${kubeimages[@]} ; do
docker pull $UCLOUD_URL/$kubeimageName
docker tag $UCLOUD_URL/$kubeimageName $GCR_URL/$kubeimageName
docker rmi $UCLOUD_URL/$kubeimageName
done

calimages=(cni:${CALICO_VERSION}
pod2daemon-flexvol:${CALICO_VERSION}
node:${CALICO_VERSION}
kube-controllers:${CALICO_VERSION})

for calimageName in ${calimages[@]} ; do
docker pull $UCLOUD_URL/$calimageName
docker tag $UCLOUD_URL/$calimageName $CALICO_URL/$calimageName
docker rmi $UCLOUD_URL/$calimageName
done

ingressimages=(nginx-ingress-controller:${INGRESS_VERSION})

for ingressimageName in ${ingressimages[@]} ; do
docker pull $UCLOUD_URL/$ingressimageName
docker tag $UCLOUD_URL/$ingressimageName $QUAY_URL/kubernetes-ingress-controller/$ingressimageName
docker rmi $UCLOUD_URL/$ingressimageName
done

csiimages=(csi-provisioner:${CSI_PROVISIONER_VERSION}
csi-node-driver-registrar:${CSI_NODE_DRIVER_VERSION}
csi-attacher:${CSI_ATTACHER_VERSION}
csi-resizer:${CSI_RESIZER_VERSION}
)

for csiimageName in ${csiimages[@]} ; do
docker pull $UCLOUD_URL/$csiimageName
docker tag $UCLOUD_URL/$csiimageName $QUAY_URL/k8scsi/$csiimageName
docker rmi $UCLOUD_URL/$csiimageName
done
[root@master01 ~]# for all_ip in ${ALL_IPS[@]}
  do
    echo ">>> ${all_ip}"
    scp -rp config/downimage.sh root@${all_ip}:/root/
    ssh root@${all_ip} "bash downimage.sh &"
  done

提示:如上僅需Master01節點操作,從而實現所有節點自動拉取鏡像。
[root@master01 ~]# docker images #確認驗證

Master上初始化

[root@master01 ~]# kubeadm init --config=kubeadm-config.yaml --upload-certs  

保留如下命令用於後續節點添加:
You can now join any number of the control-plane node running the following command on each as root:

  kubeadm join 172.24.8.100:16443 --token xb9wda.v0yf7tlsgo8mdrhk \
    --discovery-token-ca-cert-hash sha256:249884d81a23bd821e38d3345866a99e6d55e443b545825c3c448f30f8e52c3b \
    --control-plane --certificate-key e30428776a47ed2c7e18c9e2951d9e40e068c9ecec5a4858457f1475f1a2a39a

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 172.24.8.100:16443 --token xb9wda.v0yf7tlsgo8mdrhk \
    --discovery-token-ca-cert-hash sha256:249884d81a23bd821e38d3345866a99e6d55e443b545825c3c448f30f8e52c3b

注意:如上token具有默認24小時的有效期,token和hash值可通過如下方式獲取: kubeadm token list 如果 Token 過期以後,可以輸入以下命令,生成新的 Token:

kubeadm token create
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'***

[root@master01 ~]# mkdir -p $HOME/.kube [root@master01 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@master01 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

[root@master01 ~]# cat << EOF >> ~/.bashrc
export KUBECONFIG=$HOME/.kube/config
EOF							#設置KUBECONFIG環境變量
[root@master01 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@master01 ~]# source ~/.bashrc

附加:初始化過程大致步驟如下:

  1. [kubelet-start] 生成kubelet的配置文件”/var/lib/kubelet/config.yaml”
  2. [certificates]生成相關的各種證書
  3. [kubeconfig]生成相關的kubeconfig文件
  4. [bootstraptoken]生成token記錄下來,後邊使用kubeadm join往集群中添加節點時會用到

提示:初始化僅需要在master01上執行,若初始化異常可通過kubeadm reset && rm -rf $HOME/.kube重置。

添加其他master節點

[root@master02 ~]# kubeadm join 172.24.8.100:16443 --token xb9wda.v0yf7tlsgo8mdrhk \
    --discovery-token-ca-cert-hash sha256:249884d81a23bd821e38d3345866a99e6d55e443b545825c3c448f30f8e52c3b \
    --control-plane --certificate-key e30428776a47ed2c7e18c9e2951d9e40e068c9ecec5a4858457f1475f1a2a39a
[root@master02 ~]# mkdir -p $HOME/.kube
[root@master02 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master02 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
 [root@master02 ~]# cat << EOF >> ~/.bashrc`
export KUBECONFIG=$HOME/.kube/config
EOF						               	#設置KUBECONFIG環境變量
[root@master02 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@master02 ~]# source ~/.bashrc

提示:master03也如上執行添加至集群的controlplane。
提示:若添加異常可通過kubeadm reset && rm -rf $HOME/.kube重置。

安裝NIC插件

NIC插件介紹

  • Calico 是一個安全的 L3 網絡和網絡策略提供者。
  • Canal 結合 Flannel 和 Calico, 提供網絡和網絡策略。
  • Cilium 是一個 L3 網絡和網絡策略插件, 能夠透明的實施 HTTP/API/L7 策略。 同時支持路由(routing)和疊加/封裝( overlay/encapsulation)模式。
  • Contiv 為多種用例提供可配置網絡(使用 BGP 的原生 L3,使用 vxlan 的 overlay,經典 L2 和 Cisco-SDN/ACI)和豐富的策略框架。Contiv 項目完全開源。安裝工具同時提供基於和不基於 kubeadm 的安裝選項。
  • Flannel 是一個可以用於 Kubernetes 的 overlay 網絡提供者。 +Romana 是一個 pod 網絡的層 3 解決方案,並且支持 NetworkPolicy API。Kubeadm add-on 安裝細節可以在這裏找到。
  • Weave Net 提供了在網絡分組兩端參与工作的網絡和網絡策略,並且不需要額外的數據庫。
  • CNI-Genie 使 Kubernetes 無縫連接到一種 CNI 插件,例如:Flannel、Calico、Canal、Romana 或者 Weave。
    提示:本方案使用Calico插件。

設置標籤

[root@master01 ~]# kubectl taint nodes --all node-role.kubernetes.io/master- #允許master部署應用

提示:部署完內部應用后可使用kubectl taint node master01 node-role.kubernetes.io/master=””:NoSchedule重新設置Master為Master Only 狀態。

部署calico

[root@master01 ~]# cat config/calico/calico.yaml	#檢查配置
……
            - name: CALICO_IPV4POOL_CIDR
              value: "10.10.0.0/16"		        #檢查Pod網段
……
            - name: IP_AUTODETECTION_METHOD
              value: "interface=eth.*"		     	#檢查節點之間的網卡
# Auto-detect the BGP IP address.
            - name: IP
              value: "autodetect"
……
[root@master01 ~]# kubectl apply -f config/calico/calico.yaml
[root@master01 ~]# kubectl get pods --all-namespaces -o wide		#查看部署
[root@master01 ~]# kubectl get nodes

修改node端口範圍

[root@master01 ~]# vi /etc/kubernetes/manifests/kube-apiserver.yaml
……
    - --service-node-port-range=1-65535
……

部署高可用組件II

高可用說明

高可用kubernetes集群步驟三已完成配置,但是使用docker-compose方式啟動nginx-lb由於無法提供kubernetes集群的健康檢查和自動重啟功能,nginx-lb作為高可用kubernetes集群的核心組件建議也作為kubernetes集群中的一個pod來進行管理。

污點和標籤

[root@master01 ~]# kubectl taint node master01 node-`role.kubernetes.io/master="":NoSchedule
[root@master01 ~]# kubectl taint node master02 node-role.kubernetes.io/master="":NoSchedule
[root@master01 ~]# kubectl taint node master03 node-role.kubernetes.io/master="":NoSchedule
[root@master01 ~]# kubectl label nodes master01 node-role.kubernetes.io/master="true" --overwrite
[root@master01 ~]# kubectl label nodes master02 node-role.kubernetes.io/master="true" --overwrite
[root@master01 ~]# kubectl label nodes master02 node-role.kubernetes.io/master="true" --overwrite

容器化實現高可用

[root@master01 ~]# for master_ip in ${MASTER_IPS[@]}
  do
    echo ">>> ${master_ip}"
    ssh root@${master_ip} "systemctl stop kubelet"
    ssh root@${master_ip} "docker stop nginx-lb && docker rm nginx-lb"
    scp -rp /root/config/k8s-nginx-lb.yaml root@${master_ip}:/etc/kubernetes/manifests/
    ssh root@${master_ip} "systemctl restart kubelet docker"
  done

提示:如上僅需Master01節點操作,從而實現所有Master節點自動啟動服務。

[root@master01 ~]# kubectl -n kube-system get pods -o wide | grep -E 'NAME|nginx'

添加Worker節點

添加Worker節點

[root@master01 ~]# source environment.sh

[root@master01 ~]# for node_ip in ${NODE_IPS[@]}
  do
    echo ">>> ${node_ip}"
    ssh root@${node_ip} "kubeadm join 172.24.8.100:16443 --token xb9wda.v0yf7tlsgo8mdrhk \
    --discovery-token-ca-cert-hash sha256:249884d81a23bd821e38d3345866a99e6d55e443b545825c3c448f30f8e52c3b"
    ssh root@${node_ip} "systemctl enable kubelet.service"
  done

提示:如上僅需Master01節點操作,從而實現所有Worker節點添加至集群,若添加異常可通過如下方式重置:

[root@node01 ~]# kubeadm reset
[root@node01 ~]# ifconfig cni0 down
[root@node01 ~]# ip link delete cni0
[root@node01 ~]# ifconfig flannel.1 down
[root@node01 ~]# ip link delete flannel.1
[root@node01 ~]# rm -rf /var/lib/cni/

確認驗證

[root@master01 ~]# kubectl get nodes			         	#節點狀態
[root@master01 ~]# kubectl get cs			             	#組件狀態
[root@master01 ~]# kubectl get serviceaccount		     	        #服務賬戶
[root@master01 ~]# kubectl cluster-info			         	#集群信息
[root@master01 ~]# kubectl get pod -n kube-system -o wide	        #所有服務狀態

提示:更多Kubetcl使用參考:https://kubernetes.io/docs/reference/kubectl/kubectl/ https://kubernetes.io/docs/reference/kubectl/overview/
更多kubeadm使用參考:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

Metrics部署

Metrics

Kubernetes的早期版本依靠Heapster來實現完整的性能數據採集和監控功能,Kubernetes從1.8版本開始,性能數據開始以Metrics API的方式提供標準化接口,並且從1.10版本開始將Heapster替換為Metrics Server。在Kubernetes新的監控體系中,Metrics Server用於提供核心指標(Core Metrics),包括Node、Pod的CPU和內存使用指標。 對其他自定義指標(Custom Metrics)的監控則由Prometheus等組件來完成。

開啟聚合層

有關聚合層知識參考:https://blog.csdn.net/liukuan73/article/details/81352637 kubeadm方式部署默認已開啟。

獲取部署文件

[root@master01 ~]# mkdir metrics
[root@master01 ~]# cd metrics/
[root@master01 metrics]# wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml
[root@master01 metrics]# vi components.yaml
……
apiVersion: apps/v1
kind: Deployment
……
spec:
  replicas: 3						        	#根據集群規模調整副本數
……
    spec:
      hostNetwork: true
……
      - name: metrics-server
        image: k8s.gcr.io/metrics-server-amd64:v0.3.6
        imagePullPolicy: IfNotPresent
        args:
          - --cert-dir=/tmp
          - --secure-port=4443
          - --kubelet-insecure-tls				        #追加此args
          - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP	#追加此args
……

正式部署

[root@master01 metrics]# kubectl apply -f components.yaml
[root@master01 metrics]# kubectl -n kube-system get pods -l k8s-app=metrics-server
NAME                              READY   STATUS    RESTARTS   AGE
metrics-server-7b97647899-ghnxw   1/1     Running   0          11s
metrics-server-7b97647899-nqwvq   1/1     Running   0          10s
metrics-server-7b97647899-zkmxs   1/1     Running   0          10s

查看資源監控

[root@k8smaster01 ~]# kubectl top nodes
[root@k8smaster01 ~]# kubectl top pods --all-namespaces

提示:Metrics Server提供的數據也可以供HPA控制器使用,以實現基於CPU使用率或內存使用值的Pod自動擴縮容功能。
部署參考:https://linux48.com/container/2019-11-13-metrics-server.html 有關metrics更多部署參考: https://kubernetes.io/docs/tasks/debug-application-cluster/resource-metrics-pipeline/
開啟開啟API Aggregation參考: https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/
API Aggregation介紹參考: https://kubernetes.io/docs/tasks/access-kubernetes-api/configure-aggregation-layer/

Nginx ingress部署

參考附020.Nginx-ingress部署及使用,建議採用社區版。

Dashboard部署

設置標籤

[root@master01 ~]# kubectl label nodes master01 dashboard=yes
[root@master01 ~]# kubectl label nodes master02 dashboard=yes
[root@master01 ~]# kubectl label nodes master03 dashboard=yes

創建證書

本實驗已獲取免費一年的證書,免費證書獲取可參考:https://freessl.cn。

[root@master01 ~]# mkdir -p /root/dashboard/certs
[root@master01 ~]# cd /root/dashboard/certs
[root@master01 certs]# mv k8s.odocker.com tls.crt
[root@master01 certs]# mv k8s.odocker.com tls.crt
[root@master01 certs]# ll
total 8.0K
-rw-r--r-- 1 root root 1.9K Jun  8 11:46 tls.crt
-rw-r--r-- 1 root root 1.7K Jun  8 11:46 tls.ke

提示:也可手動如下操作創建自簽證書:

[root@master01 ~]# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/C=CN/ST=ZheJiang/L=HangZhou/O=Xianghy/OU=Xianghy/CN=k8s.odocker.com"

手動創建secret

[root@master01 ~]# kubectl create ns kubernetes-dashboard	#v2版本dashboard獨立ns
[root@master01 ~]# kubectl create secret generic kubernetes-dashboard-certs --from-file=$HOME/dashboard/certs/ -n kubernetes-dashboard
[root@master01 ~]# kubectl get secret kubernetes-dashboard-certs -n kubernetes-dashboard -o yaml		#查看新證書`

下載yaml

[root@master01 ~]# cd /root/dashboard
[root@master01 dashboard]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.1/aio/deploy/recommended.yaml

修改yaml

[root@master01 dashboard]# vi recommended.yaml
……
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort			       	#新增
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001				#新增
  selector:
    k8s-app: kubernetes-dashboard
---
……						#如下全部註釋
#apiVersion: v1
#kind: Secret
#metadata:
#  labels:
#    k8s-app: kubernetes-dashboard
#  name: kubernetes-dashboard-certs
#  namespace: kubernetes-dashboard
#type: Opaque
……
kind: Deployment
……
  replicas: 3					        #適當調整為3副本
……
          imagePullPolicy: IfNotPresent		        #修改鏡像下載策略
          ports:
            - containerPort: 8443
              protocol: TCP
          args:
            - --auto-generate-certificates
            - --namespace=kubernetes-dashboard
            - --tls-key-file=tls.key
            - --tls-cert-file=tls.crt
            - --token-ttl=3600	       		        #追加如上args
……
      nodeSelector:
        "beta.kubernetes.io/os": linux
        "dashboard": "yes"	        		#部署在master節點
……
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: dashboard-metrics-scraper
  name: dashboard-metrics-scraper
  namespace: kubernetes-dashboard
spec:
  type: NodePort	             			#新增
  ports:
    - port: 8000
      nodePort: 30000		         		#新增
      targetPort: 8000
  selector:                                                                                  
    k8s-app: dashboard-metrics-scraper
……
   replicas: 3			            		#適當調整為3副本
……
      nodeSelector:
        "beta.kubernetes.io/os": linux
        "dashboard": "yes"	        		#部署在master節點
……

正式部署

[root@master01 dashboard]# kubectl apply -f recommended.yaml
[root@master01 dashboard]# kubectl get deployment kubernetes-dashboard -n kubernetes-dashboard
[root@master01 dashboard]# kubectl get services -n kubernetes-dashboard
[root@master01 dashboard]# kubectl get pods -o wide -n kubernetes-dashboard

提示:master01 NodePort 30001/TCP映射到 dashboard pod 443 端口。

創建管理員賬戶

提示:dashboard v2版本默認沒有創建具有管理員權限的賬戶,可如下操作創建。

[root@master01 dashboard]# vi dashboard-admin.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard

[root@master01 dashboard]# kubectl apply -f dashboard-admin.yaml

ingress暴露dashboard

創建ingress tls

[root@master01 ~]# cd /root/dashboard/certs
[root@master01 certs]# kubectl -n kubernetes-dashboard create secret tls kubernetes-dashboard-tls --cert=tls.crt --key=tls.key
[root@master01 certs]# kubectl -n kubernetes-dashboard describe secrets kubernetes-dashboard-tls

創建ingress策略

[root@master01 ~]# cd /root/dashboard/
[root@master01 dashboard]# vi dashboard-ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: kubernetes-dashboard-ingress
  namespace: kubernetes-dashboard
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    #nginx.ingress.kubernetes.io/secure-backends: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
    nginx.ingress.kubernetes.io/configuration-snippet: |
      proxy_ssl_session_reuse off;
spec:
  rules:
  - host: k8s.odocker.com
    http:
      paths:
      - path: /
        backend:
          serviceName: kubernetes-dashboard
          servicePort: 443
  tls:
  - hosts:
    - k8s.odocker.com
    secretName: kubernetes-dashboard-tls
[root@master01 dashboard]# kubectl apply -f dashboard-ingress.yaml
[root@master01 dashboard]# kubectl -n kubernetes-dashboard get ingress

訪問dashboard

導入證書

將k8s.odocker.com導入瀏覽器,並設置為信任,導入操作略。

創建kubeconfig文件

使用token相對複雜,可將token添加至kubeconfig文件中,使用KubeConfig文件訪問dashboard。

[root@master01 dashboard]# ADMIN_SECRET=$(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}') 
[root@master01 dashboard]# DASHBOARD_LOGIN_TOKEN=$(kubectl describe secret -n kubernetes-dashboard ${ADMIN_SECRET} | grep -E '^token' | awk '{print $2}') 
[root@master01 dashboard]# kubectl config set-cluster kubernetes \
  --certificate-authority=/etc/kubernetes/pki/ca.crt \
  --embed-certs=true \
  --server=172.24.8.100:16443 \
  --kubeconfig=local-ngkek8s-dashboard-admin.kubeconfig		# 設置集群參數
 [root@master01 dashboard]# kubectl config set-credentials dashboard_user \
  --token=${DASHBOARD_LOGIN_TOKEN} \
  --kubeconfig=local-ngkek8s-dashboard-admin.kubeconfig		# 設置客戶端認證參數,使用上面創建的 Token
[root@master01 dashboard]# kubectl config set-context default \
  --cluster=kubernetes \
  --user=dashboard_user \
  --kubeconfig=local-ngkek8s-dashboard-admin.kubeconfig		# 設置上下文參數
[root@master01 dashboard]# kubectl config use-context default --kubeconfig=local-ngkek8s-dashboard-admin.kubeconfig		# 設置默認上下文

將local-ngkek8s-dashboard-admin.kubeconfig文件導入,以便於瀏覽器使用該文件登錄。

測試訪問dashboard

本實驗採用ingress所暴露的域名:https://k8s.odocker.com 方式訪問。使用local-ngkek8s-dashboard-admin.kubeconfig文件訪問。

提示: 更多dashboard訪問方式及認證可參考附004.Kubernetes Dashboard簡介及使用。 dashboard登錄整個流程可參考:https://www.cnadn.net/post/2613.html

Longhorn存儲部署

Longhorn概述

Longhorn是用於Kubernetes的開源分佈式塊存儲系統。
提示:更多介紹參考:https://github.com/longhorn/longhorn。

Longhorn部署

[root@master01 ~]# source environment.sh
[root@master01 ~]# for all_ip in ${ALL_IPS[@]}
  do
    echo ">>> ${all_ip}"
    ssh root@${all_ip} "yum -y install iscsi-initiator-utils &"
  done

提示:所有節點都需要安裝。

[root@master01 ~]# mkdir longhorn
[root@master01 ~]# cd longhorn/
[root@master01 longhorn]# wget \
https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/longhorn.yaml
[root@master01 longhorn]# vi longhorn.yaml
#……
---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: longhorn-ui
  name: longhorn-frontend
  namespace: longhorn-system
spec:
  type: NodePort			#修改為nodeport
  selector:
    app: longhorn-ui
  ports:
  - port: 80
    targetPort: 8000
    nodePort: 30002
---
……
kind: DaemonSet
……
        imagePullPolicy: IfNotPresent
……
#……
[root@master01 longhorn]# kubectl apply -f longhorn.yaml
[root@master01 longhorn]# kubectl -n longhorn-system get pods -o wide

提示:若部署異常可刪除重建,若出現無法刪除namespace,可通過如下操作進行刪除:

wget https://github.com/longhorn/longhorn/blob/master/uninstall/uninstall.yaml
rm -rf /var/lib/longhorn/
kubectl apply -f uninstall.yaml
kubectl delete -f longhorn.yaml

動態sc創建

提示:默認longhorn部署完成已創建一個sc,也可通過如下手動編寫yaml創建。

 [root@master01 longhorn]# kubectl get sc
NAME                   PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
……
longhorn               driver.longhorn.io      Delete          Immediate              true                   15m
[root@master01 longhorn]# vi longhornsc.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: longhornsc
provisioner: rancher.io/longhorn
parameters:
  numberOfReplicas: "3"
  staleReplicaTimeout: "30"
  fromBackup: "" 

[root@master01 longhorn]# kubectl create -f longhornsc.yaml

測試PV及PVC

[root@master01 longhorn]# vi longhornpod.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: longhorn-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn
  resources:
    requests:
      storage: 2Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: longhorn-pod
  namespace: default
spec:
  containers:
  - name: volume-test
    image: nginx:stable-alpine
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: volv
      mountPath: /data
    ports:
    - containerPort: 80
  volumes:
  - name: volv
    persistentVolumeClaim:
      claimName: longhorn-pvc
[root@master01 longhorn]# kubectl apply -f longhornpod.yaml
[root@master01 longhorn]# kubectl get pods
[root@master01 longhorn]# kubectl get pvc
[root@master01 longhorn]# kubectl get pv

創建ingress訪問UI

[root@master01 longhorn]# yum -y install httpd-tools
[root@master01 longhorn]# htpasswd -c auth xhy			#創建用戶名和密碼

提示:也可通過如下命令創建:
USER=xhy; PASSWORD=x120952576; echo "${USER}:$(openssl passwd -stdin -apr1 <<< ${PASSWORD})" >> auth

[root@master01 longhorn]# kubectl -n longhorn-system create secret generic longhorn-basic-auth --from-file=auth
[root@master01 longhorn]# vi longhorn-ingress.yaml		#創建ingress規則
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: longhorn-ingress
  namespace: longhorn-system
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: longhorn-basic-auth
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required '
spec:
  rules:
  - host: longhorn.odocker.com
    http:
      paths:
      - path: /
        backend:
          serviceName: longhorn-frontend
          servicePort: 80

[root@master01 longhorn]# kubectl apply -f longhorn-ingress.yaml

確認驗證

瀏覽器訪問:longhorn.odocker.com,並輸入賬號和密碼。

登錄查看。

Helm安裝

參考053.集群管理-Helm工具

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計最專業,超強功能平台可客製化

「三棵樹為花、兩棵樹為蝴蝶」 日本建商推庭院改革 鼓勵種植原生種

文:宋瑞文

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※南投搬家公司費用需注意的眉眉角角,別等搬了再說!

※教你寫出一流的銷售文案?

如果只買日系車,7-50萬人生不同階段你會選這8台車嗎?

預算15-18萬本田思域辣評:18萬以內最值得年輕人選擇的車型,擁有超越同級別的動力水準,本田大法是無敵的。馬自達昂克賽拉辣評:其實還是推薦2。0L版本,畢竟單純操控好動力跟不上一樣很煩心。如果家中有條件的消費者,銳志、阿特茲(2。

你會發現這樣一個規律:不同地域的消費者在選車時都會有不同程度的系別偏好,譬如我們最常說到的“北方愛德系、南方愛日系”的說法,而且也有人通過一系列的統計調查,也證實了這一句話的真實性,簡單來說,南方人確實偏向於選擇日系車型。

儘管有不少愛國人士在主觀上認為

買日系車=不愛國

但實際上並非如此,消費者受到地域、文化、經濟、交通等多方面影響,導致南方人和北方人購車觀念截然不同。買日系車其實並沒有錯(況且如今大多都是中日合資),拋開所謂的愛國情懷來說,日系車一直以來都是“可靠性高、省油”的代名詞,譬如我們最熟悉的“車到山前必有路,有路必有豐田車”這一類關於質量的廣告語。

在此之前,我們出了一篇文章,在30歲之前如果一定要買大眾車,該怎麼選(傳送門–鏈接到:網傳30歲前該買這9款車!看完淚崩…)?引起了網友的熱議,而這次我們繼續借題發揮:

對於一個南方人來說,在不同的年齡層次應該選擇一台什麼樣的日系車?

18-25歲的年輕消費者

是人生當中最應該衝動的階段

你應該以滿足自己需求為主

簡單來說,年輕人再不瘋狂就要老了!是實話,其實在這個年齡層次能買得起車的消費者主要有兩類:

第一類是家中的經濟條件不錯,畢業工作了,也是應該買台車(普遍的南方家庭都有這樣的想法)。

另外一類就是有獨立的商業頭腦以及機遇、掙錢了自己買。

值得一說的是,剛畢業不久、拿着實習生的工資還打算獨立買車?確實比較困難。對於前者來說,說句實話,應該買什麼車全看家裡給多少錢,但對於普遍家庭來說,一般都會將購車預算控制在18萬以內。針對於此,對於不少年輕消費者而言,其實實際用車環境都是日常出行,而且常載人數大多是1-2人,所以在選車時會更偏向於動力強、操控感強的車型。至於空間,其實關注度並不高。

預算10萬以內

本田飛度

辣評:10級別以內動力表現最佳而且極具改裝潛力的車型,神車地位無可撼動、

預算15萬以內

豐田卡羅拉

辣評:動力表現並不突出,純粹屬於一台家用車型,讓你無比省心,當然也是跑滴滴快車的神器之一。

預算15-18萬

本田思域

辣評:18萬以內最值得年輕人選擇的車型,擁有超越同級別的動力水準,本田大法是無敵的!

馬自達昂克賽拉

辣評:其實還是推薦2.0L版本,畢竟單純操控好動力跟不上一樣很煩心。

如果家中有條件的消費者,銳志、阿特茲(2.5L版本)、思鉑睿(2.4L版本)這一類的運動型B級車也是一個非常不錯的選擇。

針對於另外一部分的人群,在這個階段能夠自己創造出條件購車除了機遇占很大一部分之外,更多的是個人的能力,而相信這部分人群在選車時的起步點也會隨之提高,譬如可以直接考慮更高一個級別的車型。

來到25-30歲的消費者

大多數都有一定的事業基礎

而且大多數都是有家庭之人

針對這部分消費者來說,其實在選車理念方面也會發生相應的變化,譬如在選購時並非以自己為主,而更多的去考慮到家庭的需求,所以在選車方面以舒適、空間為主。另外,根據中國消費者的習性,換車也必須得越換越好。

18-26萬左右居家人士首選

本田雅閣

辣評:在擁有足夠大氣的外觀滿足你日常商務需求的同時,超大的乘坐空間更能夠滿足到你家庭日常所需。宜商宜家,成功人士首選車型。

針對於實用性,不少消費者也將目光投向SUV,譬如

豐田漢蘭達

辣評:一直加價從不停歇,但就是這麼受歡迎,最大的賣點便是空間極大、質量極好、車子極為大氣上檔次。

30歲以上的消費者

其實正處於整個人生的巔峰期

有家庭、有事業

對生活更有追求!

對於這部分消費者來說,隨着生活質量提高也會逐漸變為享受型,到了這時候一輛車子不再是滿足日常出行代步需求,更能與你自身的氣質相輔相成,在這個級別的消費者大多會直接選擇豪華品牌。只是價格越往上走你會發現,可以選擇的豪華日系車並不多!而在很多南方消費者看來,人的一生總應該擁有一輛雷克薩斯!而針對這部分有條件的消費者,選車怎麼也得從ES以上的車型開始選擇!

說到最後,如果你的家底十分豐厚或者突然成了拆遷戶,以上所有推薦都可以直接推翻,至於買什麼車?喜歡就好啦!

本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計最專業,超強功能平台可客製化

Docker_01

目錄

  • 1.1 Docker簡介
    • 1.1.1 為什麼會有Docker的出現?
    • 1.1.2 Docker理念
    • 1.1.3 Docker or 虛擬機?
  • 2.1 Docker安裝
  • 3.1 Docker基本使用
    • 3.1.1 什麼是鏡像?
    • 3.1.2 Docker鏡像加載原理
    • 3.1.3 常用命令
  • 4.1 重要知識點

1.1 Docker簡介

1.1.1 為什麼會有Docker的出現?

一款產品從開發到上線,從操作系統,到運行環境,再到應用配置。作為開發+運維之間的協作我們需要關心很多東西,這也是很多互聯網公司都不得不面對的問題,特別是各種版本的迭代之後,不同版本環境的兼容,對運維人員都是考驗
Docker之所以發展如此迅速,也是因為它對此給出了一個標準化的解決方案。
環境配置如此麻煩,換一台機器,就要重來一次,費力費時。很多人想到,能不能從根本上解決問題。軟件可以帶環境安裝?1. 也就是說,安裝的時候,把原始環境一模一樣地複製過來。開發人員利用 Docker 可以消除協作編碼時“在我的機器上可正常工作”的問題。

1.1.2 Docker理念

Docker是基於Go語言實現的雲開源項目。
Docker的主要目標是“Build,Ship and Run Any App,Anywhere”,也就是通過對應用組件的封裝、分發、部署、運行等生命周期的管理,使用戶的APP(可以是一個WEB應用或數據庫應用等等)及其運行環境能夠做到“一次封裝,到處運行”。
Linux 容器技術的出現就解決了這樣一個問題,而 Docker 就是在它的基礎上發展過來的。將應用運行在 Docker 容器上面,而 Docker 容器在任何操作系統上都是一致的,這就實現了跨平台、跨服務器。只需要一次配置好環境,換到別的機子上就可以一鍵部署好,大大簡化了操作。

總而言之:解決了運行環境和配置問題軟件容器,方便做持續集成並有助於整體發布的容器虛擬化技術。

1.1.3 Docker or 虛擬機?

虛擬機(virtual machine)就是帶環境安裝的一種解決方案。
它可以在一種操作系統裏面運行另一種操作系統,比如在Windows 系統裏面運行Linux 系統。應用程序對此毫無感知,因為虛擬機看上去跟真實系統一模一樣,而對於底層系統來說,虛擬機就是一個普通文件,不需要了就刪掉,對其他部分毫無影響。這類虛擬機完美的運行了另一套系統,能夠使應用程序,操作系統和硬件三者之間的邏輯不變。 
但是虛擬機有很多缺點:1.資源佔用多2.冗餘步驟多3.啟動慢

由於前面虛擬機存在這些缺點,Linux 發展出了另一種虛擬化技術:Linux 容器(Linux Containers,縮寫為 LXC)。
Linux 容器不是模擬一個完整的操作系統,而是對進程進行隔離。有了容器,就可以將軟件運行所需的所有資源打包到一個隔離的容器中。容器與虛擬機不同,不需要捆綁一整套操作系統,只需要軟件工作所需的庫資源和設置。系統因此而變得高效輕量並保證部署在任何環境中的軟件都能始終如一地運行。
 
比較了 Docker 和傳統虛擬化方式的不同之處:

  • 傳統虛擬機技術是虛擬出一套硬件后,在其上運行一個完整操作系統,在該系統上再運行所需應用進程;
  • 而容器內的應用進程直接運行於宿主的內核,容器內沒有自己的內核,而且也沒有進行硬件虛擬。因此容器要比傳統虛擬機更為輕便。
  • 每個容器之間互相隔離,每個容器有自己的文件系統 ,容器之間進程不會相互影響,能區分計算資源。

對於開發和運維來說Docker的特點:

  • 更快速的應用交付和部署:傳統的應用開發完成后,需要提供一堆安裝程序和配置說明文檔,安裝部署后需根據配置文檔進行繁雜的配置才能正常運行。Docker化之後只需要交付少量容器鏡像文件,在正式生產環境加載鏡像並運行即可,應用安裝配置在鏡像里已經內置好,大大節省部署配置和測試驗證時間。
  • 更便捷的升級和擴縮容:隨着微服務架構和Docker的發展,大量的應用會通過微服務方式架構,應用的開發構建將變成搭樂高積木一樣,每個Docker容器將變成一塊“積木”,應用的升級將變得非常容易。當現有的容器不足以支撐業務處理時,可通過鏡像運行新的容器進行快速擴容,使應用系統的擴容從原先的天級變成分鐘級甚至秒級。
  • 更簡單的系統運維:應用容器化運行后,生產環境運行的應用可與開發、測試環境的應用高度一致,容器會將應用程序相關的環境和狀態完全封裝起來,不會因為底層基礎架構和操作系統的不一致性給應用帶來影響,產生新的BUG。當出現程序異常時,也可以通過測試環境的相同容器進行快速定位和修復。
  • 更高效的計算資源利用: Docker是內核級虛擬化,其不像傳統的虛擬化技術一樣需要額外的Hypervisor支持,所以在一台物理機上可以運行很多個容器實例,可大大提升物理服務器的CPU和內存的利用率。

2.1 Docker安裝

安裝地址有兩個:

  • docker官網:(http://www.docker.com)
  • docker中文官網:(https://www.docker-cn.com/)
    跟github一樣docker也有自己的中心倉庫Docker Hub官網: https://hub.docker.com/
    Linux環境下安裝的話可能要注意套個CDN加速一般選擇阿里雲或者網易的鏡像庫。

安裝命令:

$ sudo yum install -y yum-utils

$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
These repositories are included in the docker.repo file above but are disabled by default. You can enable them alongside the stable repository. The following command enables the nightly repository.

$ sudo yum-config-manager --enable docker-ce-nightly
To enable the test channel, run the following command:

$ sudo yum-config-manager --enable docker-ce-test
You can disable the nightly or test repository by running the yum-config-manager command with the --disable flag. To re-enable it, use the --enable flag. The following command disables the nightly repository.

$ sudo yum-config-manager --disable docker-ce-nightly

具體方法參考官網:https://docs.docker.com/engine/install/centos/

3.1 Docker基本使用

3.1.1 什麼是鏡像?

鏡像是一種輕量級、可執行的獨立軟件包,用來打包軟件運行環境和基於運行環境開發的軟件,它包含運行某個軟件所需的所有內容,包括代碼、運行時、庫、環境變量和配置文件。
在Docker打包一個鏡像的時候會使用一個叫UnionFS(聯合文件系統)的文件系統:UnionFS(聯合文件系統):Union文件系統(UnionFS)是一種分層、輕量級並且高性能的文件系統,它支持對文件系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統下(unite several directories into a single virtual filesystem)。Union 文件系統是 Docker 鏡像的基礎。鏡像可以通過分層來進行繼承,基於基礎鏡像(沒有父鏡像),可以製作各種具體的應用鏡像。
特性:一次同時加載多個文件系統,但從外面看起來,只能看到一個文件系統,聯合加載會把各層文件系統疊加起來,這樣最終的文件系統會包含所有底層的文件和目錄。

3.1.2 Docker鏡像加載原理

Docker鏡像加載原理:
docker的鏡像實際上由一層一層的文件系統組成,這種層級的文件系統UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引導加載kernel, Linux剛啟動時會加載bootfs文件系統,在Docker鏡像的最底層是bootfs。這一層與我們典型的Linux/Unix系統是一樣的,包含boot加載器和內核。當boot加載完成之後整個內核就都在內存中了,此時內存的使用權已由bootfs轉交給內核,此時系統也會卸載bootfs。

rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系統中的 /dev, /proc, /bin, /etc 等標準目錄和文件。rootfs就是各種不同的操作系統發行版,比如Ubuntu,Centos等等。

平時我們安裝進虛擬機的CentOS都是好幾個G,為什麼docker這裏才200M??
對於一個精簡的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序庫就可以了,因為底層直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可見對於不同的linux發行版, bootfs基本是一致的, rootfs會有差別, 因此不同的發行版可以公用bootfs。

分層的鏡像:以我們的pull為例,在下載的過程中我們可以看到docker的鏡像好像是在一層一層的在下載.

為什麼 Docker 鏡像要採用這種分層結構呢?
最大的一個好處就是 – 共享資源
 
比如:有多個鏡像都從相同的 base 鏡像構建而來,那麼宿主機只需在磁盤上保存一份base鏡像,
同時內存中也只需加載一份 base 鏡像,就可以為所有容器服務了。而且鏡像的每一層都可以被共享。

3.1.3 常用命令

1.幫助命令:

  • docker version
  • docker info
  • docker –help

2.鏡像命令:

  • docker images OPTIONS說明:-a :列出本地所有的鏡像(含中間映像層)-q :只显示鏡像ID –digests :显示鏡像的摘要信息 –no-trunc :显示完整的鏡像信息。

  • docker search 某個XXX鏡像名字 OPTIONS說明:–no-trunc : 显示完整的鏡像描述 -s : 列出收藏數不小於指定值的鏡像 –automated : 只列出 automated build類型的鏡像;

  • docker pull 某個XXX鏡像名字

  • docker rmi 某個XXX鏡像名字ID 刪除鏡像
    3.容器命令:

  • 新建並啟動容器:
    docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
    OPTIONS說明(常用):有些是一個減號,有些是兩個減號
     
    –name=”容器新名字”: 為容器指定一個名稱;
    -d: 後台運行容器,並返回容器ID,也即啟動守護式容器;
    -i:以交互模式運行容器,通常與 -t 同時使用;
    -t:為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
    -P: 隨機端口映射;
    -p: 指定端口映射,有以下四種格式
          ip:hostPort:containerPort
          ip::containerPort
          hostPort:containerPort
          containerPort

  • 列出當前所有正在運行的容器
    docker ps [OPTIONS]
    OPTIONS說明(常用):
     
    -a :列出當前所有正在運行的容器+歷史上運行過的
    -l :显示最近創建的容器。
    -n:显示最近n個創建的容器。
    -q :靜默模式,只显示容器編號。
    –no-trunc :不截斷輸出。

  • 退出容器
    exit:容器停止退出。 ctrl+P+Q:容器不停止退出

  • 啟動容器
    docker start 容器ID或者容器名

  • 重啟容器
    docker restart 容器ID或者容器名

  • 停止容器
    docker stop 容器ID或者容器名

  • 強制停止容器
    docker kill 容器ID或者容器名

  • 刪除已停止的容器
    docker rm 容器ID(一次性刪除多個容器:1.docker rm -f $(docker ps -a -q)2.docker ps -a -q | xargs docker rm)

4.1 重要知識點

1.關於docker ps -a命令它不會列出你後台啟動的進程也就是說你用守護進程方式啟動容器的話:docker run -d 容器名是不會被ps出來的。
這個是docker的機制問題,比如你的web容器,我們以nginx為例,正常情況下,我們配置啟動服務只需要啟動響應的service即可。例如service nginx start但是,這樣做,nginx為後台進程模式運行,就導致docker前台沒有運行的應用,這樣的容器後台啟動后,會立即自殺因為他覺得他沒事可做了.所以,最佳的解決方案是,將你要運行的程序以前台進程的形式運行。
2.如何重新進入已經啟動的容器
有兩個法子:

  • docker exec -it 容器ID bashShell
  • docker attach 容器ID

上述兩個區別:

  • attach 直接進入容器啟動命令的終端,不會啟動新的進程
  • exec 是在容器中打開新的終端,並且可以啟動新的進程
    3.從容器內拷貝文件到主機上
    docker cp 容器ID:容器內路徑 目的主機路徑。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計最專業,超強功能平台可客製化