部落格

  • 上海松江首座太陽能公共充電站啟用 年底再建10座

    上海松江首座太陽能公共充電站啟用 年底再建10座

    由賽特康集團投資50萬元人民幣(約新臺幣250萬)建設的10kW太陽能公共超級充電站在上海市松江區落成啟用。在今年年底前,上海市松江區還將陸續建成10座類似的充電站。截至10月底,今年上海已推廣新能源車6091輛,新建了465個充電設施。   這個超級充電站的四台充電樁是基於國家充電標準進行開發的,能同時適用於中國、歐洲、北美三大主流車系,可為不同地區的不同新能源車型充電。這套太陽能發電系統在正常情況下每天所發的電量可滿足2.5輛電動汽車的充電需求,且充電站與電網併網運行,如太陽能電不足,系統將自動切換到電網供電。   為了增強用戶體驗,賽特康還與銀聯合作,將銀聯閃付功能集成於每一台充電樁上,可以通過銀行卡付費充電,同時還能選擇手機支付、會員支付等。此外,充電站的互聯功能,還能實現遠端監控和維護,用戶還可通過手機APP預約充電。   (照片來源:中國松江報)

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

    【其他文章推薦】

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

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

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

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

    新北清潔公司,居家、辦公、裝潢細清專業服務

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

  • 重量級演講嘉賓匯聚2014中國高新汽車國際峰會

    關注未來汽車發展趨勢,聚焦零部件產業升級——第三屆中國高新汽車國際峰會將於2014年12月9日在上海浦東嘉里大酒店隆重開幕。今年論壇將圍繞整車企業與汽車零部件企業之間的供需與技術研發展開高峰對話。

    本屆峰會由法蘭克福展覽(上海)有限公司主辦,現已確認來自整車廠的豪華演講嘉賓陣容包括:

    • 吳碧瑄,特斯拉全球副總裁(中國區總裁)
    • 古文龍,寶馬(中國)汽車貿易有限公司業務擴展部電動車組中國地區項目總監
    • 張科偉,沃爾沃汽車銷售(上海)有限公司客戶服務副總裁
    • 楊培強,上海汽車集團股份有限公司乘用車公司集團營銷部總監
    • 邱振傑 ,上海大眾汽車有限公司 IT高級經理
    • 張勇,北京新能源汽車股份有限公司副總經理
    • 張金漢 ,安徽江淮汽車股份有限公司 乘用車營銷公司副總經理

    其他來自非整車廠的重量級演講嘉賓有:

    • Christian Heep,德國電動交通協會(BEM)營銷總監
    • 梁沛端,北汽大洋電機有限公司總經理
    • 魏學哲,蘇州星恆電源有限公司副總經理
    • 丁滬生,美國GCT汽車公司總經理
    • 莫凡博士,上海友德節能技術發展有限公司董事長
    • 丁衛南,天津德盛鎂有限公司總經理
      (以上名單更新至11月,最終演講嘉賓由主辦方確認)

    匯聚來自汽車及零部件行業的企業決策層、技術及研發高管、中國政府高層官員和海外專家等,共同探討中國汽車零部件產業的發展趨勢及未來方向。此外,來自國家發改委、工信部、科技部以及上海市政府相關領導屆時也將一同出席本次峰會。

    同時,峰會已確認逾100家企業報名參加,其中包括寶馬、特斯拉、沃爾沃、上汽、大眾、江淮、北京新能源汽車、北汽大洋、上海友德、天津德盛鎂、蘇州星恆電源、暢博電子、美國GCT汽車、大陸、博世、法雷奧、泛亞汽車、卡爾世達、美嘉帕拉斯特、JETRO、上海海馬、日電產、Atech Vertriebs Gmbh、萊頓汽車部件、天合汽車部件等知名企業。

    與 2014 年中國高新汽車國際峰會同期舉行的 Automechanika Shanghai上海國際汽車零配件、維修檢測診斷設備及服務用品展覽會,將於 2014 年 12 月 9 至 12 日在上海新國際博覽中心舉辦。今年Automechanika Shanghai將啟用上海新國際博覽中心全部17個標準室內展館及10個室外臨時展館,整體展示面積達220,000平方米。預計今年展會將齊聚全球約4,800家參展企業,迎接超過86,000名來自全產業鏈的專業觀眾,其中包括汽車製造商、經銷商、4S店、維修廠、汽車護理服務中心乃至零售商等。

    2014 年中國高新汽車國際峰會報名活動目前仍在持續進行中,另還有更多廣告及贊助機會。

    欲瞭解更多有關峰會詳情,敬請訪問官方網站

    或發郵件至。

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

    【其他文章推薦】

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

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

    ※想知道最厲害的網頁設計公司"嚨底家"!

    ※幫你省時又省力,新北清潔一流服務好口碑

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

  • 太魯閣與日月潭分別推出電動公車與電動船

    太魯閣與日月潭分別推出電動公車與電動船

    知名的台灣景點太魯閣國家公園與日月潭,為了進一步推動綠能、低碳意識,分別推出電動公車以及遊憩電動船,將先後於本月投入營運。電動交通工具除了具有環保功能,其安靜、清潔的特質,也有助維護風景區環境品質。

    日月潭國家風景區於14、15日分別展開兩艘電動船「娜魯灣號」與「希望之星」的啟航儀式。娜魯灣號是日月潭休閒育樂公司所有,採取低阻力雙胴體船型設計,提升電池的續航力。而希望之星則隸屬於湛岸沙蓮遊船公司,是日月潭第一艘20噸以上的大型電動客船,最多可容納85名乘客。在這兩艘電動船投入使用後,日月潭風景區已有七艘電動船隻。

    另一方面,由花蓮縣政府與太魯閣客運公司合作推出的國家公園綠能電動公車則標榜零排放、零污染、低噪音的綠能精神。花蓮縣政府已於今年三月推出「東華大學線」的綠能公車,並將於本月底啟動「太魯閣線」試營運,往返新城火車站與天祥,服務前往太魯閣的遊客。太魯閣客運總經理林志晟表示,太魯閣線公車係全電動車,採用西門子馬達系統,還有低平台、輪椅升降設備等無障礙設計。太魯閣線未來的目標是投入100輛電動公車,以取代遊覽車與自小客車。

    (照片:新城~天祥電動公車路線啟用。照片來源:)

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

    【其他文章推薦】

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

    新北清潔公司,居家、辦公、裝潢細清專業服務

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

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

    ※超省錢租車方案

  • 特斯拉大舉安裝機器人 「X 戰警」投入產能將拉高 50%

    特斯拉大舉安裝機器人 「X 戰警」投入產能將拉高 50%

      美國豪華電動車製造商特斯拉 (Tesla) 宣佈,位於加州費利蒙 (Fremont) 的廠房最近進行了一次大改造、大舉採納機器人,預期到了 2015 年底年產能可望從今年的 35,000 台進一步攀升 50%。   特斯拉 Fremont 組裝廠最近一度暫停生產 2 週、以便升級組裝設備,而最大的變化就在組裝線改採先進的機器人,可把整輛車以最精確的方式舉高,還能節省空間。這些最新的機器人應該很快就能替汽車安裝電池,讓人類不必再負擔如此吃重的工作,同時還能將安裝的時間從原本的 4 分鐘縮短至 2 分鐘。   特斯拉並以電影「X 戰警」的角色為這些機器人命名:查爾斯 (Xavier) 是組裝線入口處的舉重機,任務是把汽車從電軌挪至地板;金鋼狼 (Wolverine)、猛獸 (Beast) 是舉重力量更為強大的機器人;暴風女 (Storm)、鋼人 (Colossus) 位在底盤組裝線的最末端;火神 (Vulcan)、法官 (Havok) 則組隊把車送回電軌。   除了機器人之外,特斯拉也把組裝線改造的更為流暢與自動化,現在一週已能生產約 1,000 輛車,未來有機會透過小幅度的修正把產能進一步拉高。特斯拉本次在 2 週的改造期間內總計安裝了 10 台全球最大的機器人。
    在動力系統 (powertrain) 的製作方面,特斯拉也增添了高階機器人,可將電池的日處理量從原本的 80 萬顆拉升至 100 萬顆。     (Source:

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

    【其他文章推薦】

    新北清潔公司,居家、辦公、裝潢細清專業服務

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

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

    ※超省錢租車方案

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

  • Model X 鷹翼門問題多 恐延至 2017 年問世

    Model X 鷹翼門問題多 恐延至 2017 年問世

      美國豪華電動車製造商特斯拉 (Tesla ) 為何要將電動休旅車 Model X  的發表時間點從原先的 2015 年第二季延後到第三季?大摩(Morgan Stanley) 認為,這可能是與 Model X 的鷹翼門 (falcon doors) 有關。   MarketWatch、ValueWalk 18 日報導,大摩分析師 Adam Jonas 17 日發表研究報告指出,鷹翼門的設計與機械原理頗為複雜,它擁有 2 個鏈接點,而傳統的鷗翼門 (gull-wing doors) 則只有一個鏈接點。   使用鷹翼門的目的是要讓 Model X 在狹窄的空間 (例如停車場與車庫) 也能順利開門。不過,大摩認為,鷹翼門有 2 個鏈接點,開啟後所需的空間恐怕會比鷗翼門還要多。   大摩猜測,特斯拉可能會再度推延 Model X 的發表時程,也許會遞延至 2017 年初。不過,該證券認為特斯拉不會輕易放棄鷗翼門,因為這會是 Model X 的一大賣點。     (Source:

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

    【其他文章推薦】

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

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

    ※回頭車貨運收費標準

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

    ※超省錢租車方案

  • 第五屆新能源汽車峰會暨展覽會2014完美落幕好評如潮

    第五屆新能源汽車峰會暨展覽會2014於11月12-14日在中國北京海航大廈萬豪酒店召開。大會由中國汽車工業協會和決策者會議聯合主辦,交通大學汽車工程研究院協辦。主題為新增長局勢下的中國新能源汽車產業動態聚焦,來自國家環保部、國家發改委、北京市科委、中國汽車工業協會、全國乘用車市場訊息聯席會、中國一汽、北汽、吉利、重慶長安新能源、奇瑞新能源汽車、海堅電機、三菱電機、海科新能源等政府協會整車廠商和核心零部件公司、科研機構和媒體機構等集聚一堂,探討新能源整車商專案、戰略規劃以及對核心設備的需求、對於新能源汽車電氣以及動力系統、電控系統、智慧汽車創新、動力電池沖換電基建建設系統的案例分析以及核心技術。

    第五屆新能源汽車峰會暨展覽會2014自確定舉辦以來,一直受到了業內廣泛關注。它的成長與輝煌離不開您的大力支持。對此,我們要特別感謝所有的支持機構,使大會更具專業性;所有的嘉賓,在大會上與所有行業人士分享最新資訊與觀點;所有的贊助商,對於大會工作的理解與支持;所有的媒體朋友們,在大會前夕所做的宣傳與付出的努力。

    三天的會議期間,我們聆聽到了眾多演講嘉賓精彩紛呈的演說。

    中國汽車工業協會副秘書長葉盛基上臺致大會歡迎詞,他對本屆峰會召開表示熱烈的祝賀,對各位的到來和深度的參與表示衷心的感謝,同時對長期以來支持和關注中國汽車工業發展,以及中國新能源汽車發展的各界人士表示誠摯的謝意。
    國家環境保護部落實大氣污染防治司大氣處副處長汪濤為大家分享了落實大氣污染防治行動,加強機動車環保達標監管的這方面課題。
    國家發展和改革委員會能源研究所清潔發展機制項目管理中心康豔兵給我們作關於生態文明背景下我國新能源汽車產業發展的主題分享。
    北京市科學技術委員會新能源與新材料處處長許心超發言的題目是北京新能源汽車產業發展實踐。
    中國第一汽車集團技術中心電動車部的部長劉明輝博士做了一汽新能源汽車技術創新與展望的報告。
    重慶長安新能源汽車有限公司副總經理周安健的演講題目是長安新能源電控系統的自主研發。
    奇瑞新能源汽車技術有限公司副總經理孫衛健演講的題目是電商時代-新能源汽車行銷模式之探索。
    吉利電子傳動有限公司技術部部長于海生的演講主題是CHS混合動力系統平臺開發。
    上海中科深江電動車輛有限公司總經理、中科院電動汽車研發中心副主任孫江明演講主題是新能源汽車動力總成系統的集成創新。
    北京汽車集團有限公司新能源汽車管理部高級工程師王智文分享了新能源發力元年的北汽集團純電動汽車產業佈局。
    上海中科力帆電動汽車有限公司副總經理夏先明分享了力帆新能源汽車產業模式與創新技術—換電。
    全國乘用車市場訊息聯席會秘書長助理孫木子的演講是關於從市場角度談新能源汽車乘用車的熱門話題。
    山東省汽車行業協會常務副會長兼秘書長魏學勤就山東省新能源汽車產業發展現狀與趨勢進行演講。
    中國電源工業協會常務副理事長方英民分享的主題是新能源汽車與鋰電池成組管理。
    Kopis Group總裁Tim WEAVER的演講主題是政府刺激和政策導向在新能源汽車推廣中的作用。
    北京理工大學機械與車輛學院車輛工程系副主任何洪文的演講主題是汽車混合動力系統控制及能量管理。
    高工產業研究院(GGII)院長張小飛分享了新能源汽車巡迴成果報告。
    國家863電動車重大專項動力電池測試中心主任王子冬圍繞電動車的商業模式開發動力電池系統進行主題分享。
    清華大學汽車安全與節能國家重點實驗室副主任陳全世探討了中國新能源汽車技術及產業發展的幾個問題。
    李爾集團高功率電子開發工程經理狄新輝的演講主題是車載充電機——技術領先成本優化的新能源技術。
    海堅電機首席執行官Jae Hak KIM的演講主題是非稀土磁鐵永磁電機在電動汽車上的應用。
    常州海科新能源技術有限公司董事長兼總經理廖越峰的演講主題是飛輪動力技術的研發現狀及發展方向。
    安徽巨一自動化裝備有限公司M&C事業部總經理王淑旺分享了ISO26262 在電驅動產品開發中的應用。
    富華德電子(東莞)有限公司總工程師王樹曉分享了超級電容在汽車上的應用
    微宏動力系統(湖州)有限公司技術中心主任鄭卓群博士的演講主題是快速充電電池技術在電動汽車上的應用。
    上海國際汽車城(集團)有限公司副總經理曹光宇分享了上海電動汽車國際示範區商業模式探索。
    電車匯創始人辛蒂嘉就新能源汽車與互聯網展開討論。
    三菱電機機電(上海)有限公司汽車電源模組事業部副經理及設計部部長Khalid HUSSEIN先生的演講主題是應用於電動汽車的先進功率模組。

    大會現場,我們收到了許多人的贊許:

    中國汽車工業協會副秘書長葉盛基說到:”我注意到峰會的內容,我覺得既有戰略方面的論壇和研討,也有關於技術的一個應用和融合,我認為非常好,一個論壇應該涉及到不同的層面,而且不同的廣泛程度和深度去研討整個產業發展過程中的重點事件、焦點事件和關鍵事件以及我們產業發展所共鳴的事件,我認為是非常有意義的,對新能源汽車產業的發展有積極的促進作用。”

    中國第一汽車股份有限公司技術中心電動車部劉明輝部長:”這個會我感覺辦的還比較專業,參加會議的都是新能源汽車方面的一些主要的參與者,這裡有整車廠也有一些重要的零部件供應商,說的比較專業的話就是都是一些落實新能源汽車產業化的主要的參與者在這裡,這樣可以讓大家在一個比較好的環境下溝通交流,從我自身感覺通過參加這個會跟很多整車廠有一個很好的交流,同時跟這些零件供應商也有很好的交流。”

    Hofer GmbH & Co. KG陳原:”這是一個交流的很好的場合,我看到有很多的主機廠都在這邊,所有的主機廠都有他們新能源的項目在開展,不僅僅是Hofer公司,當然對Hofer公司來講可以很好的介紹公司的經驗給所以的主機廠,那麼對於產業來講也是一個很好的機會促進溝通,包括一些政府法規的頒佈都是一個非常好的場合。”

    上海鷹峰電子徐颯:”本次峰會,客戶對來的人的專業度還是不錯的,對於我們一個新興的產品來說,關注度和互動還是頗有成效的,我們會考慮明年會繼續參加這個會議的。

    全國乘用車市場訊息聯席會孫木子讚歎道:“非常榮幸參加在北京舉辦的新能源汽車盛會!我們相信隨著用戶接受度的逐步提升,新能源汽車在中國發展將越來越好!”

    Jochem KUEHNLE from DANA said that “Very well organized conference! Excellent presenters and a handed by various technical experts and decision makers of the automobile industry.Different with conference participants would be of interest for the next years’ event! Thanks again to CDMC and everybody else envolved in organizing this great event!”

    上海中科力帆電動汽車有限公司夏先明贊許道:”非常高興參加新能源汽車峰會。受益很大,希望下次再會!”

    吉利電子傳動有限公司於海生表示:”非常榮幸參加此次會議,感謝主辦方的辛勤勞動,對本次會議總體感覺較好。但需要加強對內容和演講嘉賓的要求,對模組進行規劃和梳理。祝大會越辦越好!”

    亞普汽車部件有限公司王傳寶說:“非常專業,對新能源汽車的發展趨勢很有用。”

    重慶長安新能源汽車有限公司萬豔寬表示:“各位領導演講的內容很多,資訊很全,演講人都是本領域的專家、領導,給新能源汽車的發展指明了方向。”

    上海先鋒電聲器材有限公司吳銘亮讚歎道:“非常好的交流平臺,對國內新能源車市友有了全面認識。”

    第一電動網薑永傑贊許道:“大會很國際化,乾貨十足。”

    李爾公司薑慧表示:“Quite deep dive from technology side。”

    除此以外,媒體也是我們大會的一大主角。

    大會合作了共60家行業媒體如:第一電動網、中國汽車要聞、電車匯、蓋世汽車網、AI《汽車製造業》、新華信汽車、節能與新能源汽車網、高工鋰電、中國電動汽車時代網、新能源汽車網、電動汽車網、電動汽車資源網、輕量化線上、汽車材料網、汽車供應商網、汽車製造網、集邦能源、華人電池網、電池中國、車典網、電車之家、中國新能源網、電動汽車獵頭網、中華汽配網、環球汽車網、北極星電力網、赤浪綠色新能源網、全球節能環保網、前瞻網、企業網景、中商情報網、中國商業活動網、價值中國等媒體的支持。

    作為會議主辦方,此次大會飽含著CDMC整個團隊對行業的熱情並全力付出。同時,我們也對行業未來的蓬勃發展寄予殷切的希望!最後,我們想誠懇地邀請各位,在參加大會的同時,不吝為我們提出寶貴的意見,以助我們能在未來新能源汽車峰會上為大家奉獻更多精彩。

    我們也熱切地期盼著,新能源汽車峰會的每一次盛放,都能看見您的身影。

    相約2015,老友再相會、新朋共參與!明年,我們將舉辦從規格到規模、從內容到形式、從資訊到社交更加高大上的新能源汽車峰會暨展覽會。

    第六屆新能源汽車峰會暨展覽會2015大會聯繫:
    邱小姐(Elva Qiu)
    電話:021 63931899轉2041
    手機:18930215786
    QQ:1147789586
    e-mail:

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

    【其他文章推薦】

    ※超省錢租車方案

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

    ※回頭車貨運收費標準

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

  • 一起玩轉微服務(13)——AOP

    一起玩轉微服務(13)——AOP

    一、什麼是AOP編程

    AOP: Aspect Oriented Programming 面向切面編程。   面向切面編程(也叫面向方面):Aspect Oriented Programming(AOP),是目前軟件開發中的一個熱點。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。   AOP是OOP的延續,是(Aspect Oriented Programming)的縮寫,意思是面向切面(方面)編程。   主要的功能是:日誌記錄,性能統計,安全控制,事務處理,異常處理等等。   主要的意圖是:將日誌記錄,性能統計,安全控制,事務處理,異常處理等代碼從業務邏輯代碼中劃分出來,通過對這些行為的分離,我們希望可以將它們獨立到非指導業務邏輯的方法中,進而改 變這些行為的時候不影響業務邏輯的代碼。

     

     注意:AOP不是一種技術,實際上是編程思想。凡是符合AOP思想的技術,都可以看成是AOP的實現。

    二、AOP編程思想

    功能: 讓關注點代碼與業務代碼分離!

    • 關注點
      關注點,重複代碼就叫做關注點;
    • 切面
      關注點形成的類,就叫切面(類)!
      面向切面編程,就是指 對很多功能都有的重複的代碼抽取,再在運行的時候網業務方法上動態植入“切面類代碼”。
    • 切入點
      執行目標對象方法,動態植入切面代碼。
      可以通過切入點表達式,指定攔截哪些類的哪些方法; 給指定的類在運行的時候植入切面類代碼。

    三、AOP原理剖析

    在軟件業,AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,是軟件開發中的一個熱點,也是Spring框架中的一個重要內容,是函數式編程的一種衍生范型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。

     

     

    AOP把軟件系統分為兩個部分:核心關注點和橫切關注點。業務處理的主要流程是核心關注點,與之關係不大的部分是橫切關注點。橫切關注點的一個特點是,它們經常發生在核心關注點的多處,而各處都基本相似,比如權限認證、日誌、事務處理。AOP 的作用在於分離系統中的各種關注點,將核心關注點和橫切關注點分離開來。
    AOP中的一些名詞如下:

      • 切面(Aspect):一個關注點的模塊化,這個關注點可能會橫切多個對象。事務管理是J2EE應用中一個關於橫切關注點的很好的例子。在Spring AOP中,切面可以使用基於模式或者基於@Aspect註解的方式來實現。
      • 連接點(Joinpoint):在程序執行過程中某個特定的點,比如某方法調用的時候或者處理異常的時候。在Spring AOP中,一個連接點總是表示一個方法的執行。
      • 通知(Advice):在切面的某個特定的連接點上執行的動作。其中包括了“around”、“before”和“after”等不同類型的通知(通知的類型將在後面部分進行討論)。許多AOP框架(包括Spring)都是以攔截器做通知模型,並維護一個以連接點為中心的攔截器鏈。
      • 切入點(Pointcut):匹配連接點的斷言。通知和一個切入點表達式關聯,並在滿足這個切入點的連接點上運行(例如,當執行某個特定名稱的方法時)。切入點表達式如何和連接點匹配是AOP的核心:Spring缺省使用AspectJ切入點語法進行匹配。
      • 引入(Introduction):用來給一個類型聲明額外的方法或屬性(也被稱為連接類型聲明(inter-type declaration))。Spring允許引入新的接口(以及一個對應的實現)到任何被代理的對象。例如,你可以使用引入來使一個bean實現IsModified接口,以便簡化緩存機制。
      • 目標對象(Target Object):被一個或者多個切面所通知的對象。也被稱做被通知(advised)對象。既然Spring AOP是通過運行時代理實現的,這個對象永遠是一個被代理(proxied)對象。
      • AOP代理(AOP Proxy):AOP框架創建的對象,用來實現切面契約(例如通知方法執行等等)。在Spring中,AOP代理可以是JDK動態代理或者CGLIB代理。
      • 織入(Weaving):把切面連接到其它的應用程序類型或者對象上,並創建一個被通知的對象。這些可以在編譯時(例如使用AspectJ編譯器),類加載時和運行時完成。Spring和其他純Java AOP框架一樣,在運行時完成織入。

    四、AOP編程使用

    註解版本實現AOP

    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>  開啟事物註解權限
    @Aspect                         指定一個類為切面類       
    @Pointcut("execution(* com.service.UserService.add(..))")  指定切入點表達式
    @Before("pointCut_()")              前置通知: 目標方法之前執行
    @After("pointCut_()")               後置通知:目標方法之後執行(始終執行)
    @AfterReturning("pointCut_()")       返回后通知: 執行方法結束前執行(異常不執行)
    @AfterThrowing("pointCut_()")           異常通知:  出現異常時候執行
    @Around("pointCut_()")              環繞通知: 環繞目標方法執行
    ​
    ​
    @Component
    @Aspect
    public class AopLog {
    ​
        // 前置通知
        @Before("execution(* com.service.UserService.add(..))")
        public void begin() {
            System.out.println("前置通知");
        }
    ​
    ​
        // 後置通知
        @After("execution(* com.service.UserService.add(..))")
        public void commit() {
            System.out.println("後置通知");
        }
    ​
        // 運行通知
        @AfterReturning("execution(* com.service.UserService.add(..))")
        public void returning() {
            System.out.println("運行通知");
        }
    ​
        // 異常通知
        @AfterThrowing("execution(* com.service.UserService.add(..))")
        public void afterThrowing() {
            System.out.println("異常通知");
        }
    ​
        // 環繞通知
        @Around("execution(* com.service.UserService.add(..))")
        public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
            System.out.println("環繞通知開始");
            proceedingJoinPoint.proceed();
            System.out.println("環繞通知結束");
        }
    }

     

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

    【其他文章推薦】

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

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

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

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

    新北清潔公司,居家、辦公、裝潢細清專業服務

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

  • Day11-微信小程序實戰-交友小程序-附近的人(地圖的形式)及位置獲取

    Day11-微信小程序實戰-交友小程序-附近的人(地圖的形式)及位置獲取

    回顧:在下面的tabbar中,我們已經實現了首頁 消息 我的,就剩下”附近“頁面了

     

    ”附近“的頁面主要是用地圖來進行展示的(可以显示我的位置,也可以显示周圍附近的人的位置)

     

     (在地圖裡面點擊它的頭像的話,就可以看到詳情頁了,然後也可以知道它的位置)

    1、首先要利用 地圖 組件-這個是小程序給我們提供的一個組件:

    https://developers.weixin.qq.com/miniprogram/dev/component/map.html

    地圖中的scale就是級別的意思,這個級別越大,在地圖裡面显示的就越詳細了

    <map id="map" longitude="113.324520" latitude="23.099994" scale="14" controls="{{controls}}" bindcontroltap="controltap" markers="{{markers}}" bindmarkertap="markertap" polyline="{{polyline}}" bindregionchange="regionchange" show-location style="width: 100%; height: 300px;"></map>

    ”附近“這個頁面,我們在near文件裏面進行操作的

    最簡單的實現就是,通過代碼:

    <!--miniprogram/pages/near/near.wxml-->
    <view class="map">
      <map id="map" longitude="113.324520" latitude="23.099994" scale="14"></map>
    </view>

     

    之後通過隊wxss的樣式設置

    /* miniprogram/pages/near/near.wxss */
    .map{
      position: absolute;
      left: 0;
      top: 0;
      width: 100%;
      height: 100%;
    }
    .map map{
       width: 100%;
      height: 100%; 
    }

    效果圖:

    之後就要變成我當前的地理位置了

    那個地圖屬性 scale 就是詳細的程度:

    上面是等於14的情況,如果是==2的時候

    詳細程度就更低了

     

     

    2、之後就要把經緯度改成我們自己的了,就要在js文件中定義,經緯度的變量

    之後還要定義一個getlocation的函數,這個函數在一開始的時候就要被調用了,也就是在onload的時候被調用了

    並且下一次切換到地圖的時候,可能也要再次的觸發,所以在onshow裏面也要執行這個函數了

    3、獲取用戶的經緯度,微信提供了API,可以直接調用的

    https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.getLocation.html

     

     

     可以看到,它是想要進行授權的,我們是通過全局的app.json添加上permission來實現的

    https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.getLocation.html

    "permission": {
        "scope.userLocation": {
          "desc": "你的位置信息將用於小程序位置接口的效果展示" 
        }
      }

     注意在json文件裏面的話不能有註釋的

    寫好之後,就可以調用我們的getLocation函數了

     

    wx.getLocation({
     type: 'wgs84',
     success (res) {
       const latitude = res.latitude
       const longitude = res.longitude
       const speed = res.speed
       const accuracy = res.accuracy
     }
    })

    上面的代碼中 默認的是用 wgs84,但是在開發者文檔的下面有一句話:

     

     

     但是,直接用這個函數的話:

     getLocation(){
        wx.getLocation({
          type: 'gcj02',
          success(res) {
            const latitude = res.latitude
            const longitude = res.longitude
            this.setData({
              longitude,
              latitude
            });
          }
        })
        
      }

    會報錯,因為這裏的this指向不對,success要用一個箭頭函數才行的,設置為如下的代碼才行:

     getLocation(){
        wx.getLocation({
          type: 'gcj02',
          success:(res)=> {
            const latitude = res.latitude
            const longitude = res.longitude
            this.setData({
              longitude,
              latitude
            });
          }
        })
        
      }

    得到的效果就是,可以直接定位到我的位置了:

     

     

     但是我們並不知道我們具體在地圖上面的哪一塊–其實微信也棒我們想好了,就是可以直接在map這個標籤裏面,添加一個 show-location 屬性

    <view class="map">
      <map show-location id="map" longitude="{{ longitude }}" latitude="{{ latitude }}" scale="14"></map>
    </view>

    效果圖:

     

    (注意:其實這個效果在真機上显示的效果會更好,可以直接掃碼在真機上面進行測試的

    4、獲取我自己的位置之後,接下來就是,怎麼獲取到周圍附近的人的信息呢,然後還要把用戶的頭像显示出來了

    ===這個微信也提供了,就是可以直接用map標籤的屬性 markers,也就是可以添加標記點,包括圖片和圖標這種的

     

      ===然後因為我們是要通過用戶的經緯度來獲得用戶的位置的,整體的邏輯,就是我們獲得了用戶的經緯度,和用戶的頭像,還有id等等信息,然後在地圖中標記出來,所以users數據庫中就要添加兩個字段了,分別是經緯度

    5、在user.js中創立數據庫字段的時候,就通過:

    longitude : this.longitude, latitude : this.latitude   然後在合格js文件裏面,定義一個方法來給data中的經緯度賦值。這個方法和我們在near.js裏面定義的方法是很像的 所以在user.js裏面就可以這樣定義了

     getLocation(){
        wx.getLocation({
          type: 'gcj02',
          success: (res) => {
            this.latitude = res.latitude
            this.longitude = res.longitude
           
          }
        })
      }

    效果圖:我們把users我的數據刪掉之後,重新登陸微信,可以看到數據庫頁進行了更新

     

     之後就是把這個經緯度讀取出來,然後渲染到我們的地圖上面即可了(然後出現了一個問題就是,我們要讀取的是附近的人,如果把數據庫中去用戶的經緯度都讀取出來,然後渲染了,這個是沒有意義的,我們就是要看到哪一塊,那一塊的用戶就显示出來這樣的,就是有一個範圍的  

    ====其實小程序中給了我們這樣的功能

    文檔-》雲開發->command

    https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.getLocation.html

     

    並且有一個要求:

    這樣的索引,其實和我們在數據庫中創立字段是差不多的

    再次查看文檔中:

    https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/database/geo/Geo.Point.html

     

     

     我們在user.js的 bindGetUserInfo(ev) 函數中,設置:

    location: db.Geo.Point(this.longitude, this.latitude)

    這個location設置完之後,就可以設置數據庫裏面的索引值了

    因為在數據庫添加了location這個字段,所以我們要把users裏面的數據再次刪除掉,之後重新的微信用戶登陸,再進入數據庫中

    (就可以看到location:

     

     之後就可以在數據可以中打開-》索引管理了

     

    點擊添加索引

    命名為_location 然後設置為”非唯一“也就是不僅僅可以得到自己的,還可以得到其他用戶的location,索引的字段就是我們剛剛在數據庫中建立的要映射的location了,並且選擇”地理位置“

     

     

     (其實這個地理索引的設置 是為了 提高性能的,沒有也是可以的)

    再回到near.js文件中

     在後面添加一個方法 getNearUsers

     然後在獲取了經緯度之後,就可以調用這個方法了 

    這個函數方法的書寫,可以參考

    微信文檔裏面的demo

    const _ = db.command
    db.collection('restaurants').where({
      location: _.geoNear({
        geometry: db.Geo.Point(113.323809, 23.097732),
        minDistance: 1000,
        maxDistance: 5000,
      })
    }).get()

    所以還要在near.js文件開頭的時候 獲取一下 db.command下劃線

      getNearUsers(){
        db.collection('users').where({
          location: _.geoNear({
            geometry: db.Geo.Point(this.data.longitude, this.data.latitude),
            minDistance: 1000,
            maxDistance: 5000
            //這1000和5000的單位是米
          })
        });
      }

    就寫好了

    並且還要注意一個點,我們在”個人中心“-》”編輯個人信息“裏面設置了一個共享位置的打開和關閉

     

    通過isLocation字段來設置的,就是是否開啟共享位置,所以除了找到附近的人以外,還要看這個用戶有沒有開啟”共享位置“

    所以獲取到的用戶,既要在我們的範圍以內,又要是”開啟了共享位置“的

    所以就還要添加一個這樣的條件才可以的

     

     

    getNearUsers(){
        db.collection('users').where({
          location: _.geoNear({
            geometry: db.Geo.Point(this.data.longitude, this.data.latitude),
            minDistance: 1000,
            maxDistance: 5000
            //這1000和5000的單位是米
          }),
          islocation : true
        }).field({
          longitude : true,
          latitude : true ,
          userPhoto : true
        }).get().then((res)=>{
          console.log(res.data);
        });
      }

    然後編譯之後,可以看到,返回的res.data是空的

     

    主要就是因為我們周圍是沒人的,才返回了空的字段了

    然後我們設置的也有問題,就是1000~5000,就是距離我1000米到5000米以內的人,就不包括自己了,所以先把minDistance設置為0

    看看能不能把自己打印出來咯

    下面我們就來奧marker的圖片標註了

     

     要在map標籤裏面添加一個 markers 這樣的標籤了

    然後還要在near.js裏面給markers定義一個初始值 為一個空數組

     

    因為在示例代碼中,看到的就是數組來的

     

    getNearUsers(){
        db.collection('users').where({
          location: _.geoNear({
            geometry: db.Geo.Point(this.data.longitude, this.data.latitude),
            minDistance: 0,
            maxDistance: 1000
            //這1000和5000的單位是米
          }),
          islocation : true
        }).field({
          longitude : true,
          latitude : true ,
          userPhoto : true
        }).get().then((res)=>{
          console.log(res.data);
          let data = res.data;
          let result = [];
          if(data.length){
            for(let i=0;i<data.length;i++){
              result.push({
                iconPath: data[i].userPhoto,
                id: data[i]._id,
                latitude: data[i].latitude,
                longitude: data[i].longitude,
                width: 30,
                height: 30
              });
            }
            this.setData({
              markers : result
            });
          }
        });
      }

     

    效果:

    目前微信小程序還不支持把那個地圖裡面的圖片變成是圓形的

    目前是只能通過,對width和height進行矩形的渲染了

    通過多賬號進行一下測試:

     

     因為測試號和我的主號都是在同一個地方的,所以我們手動的把後面的88改成是89,就可以得到效果:

     

     

     

     

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

    【其他文章推薦】

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

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

    ※想知道最厲害的網頁設計公司"嚨底家"!

    ※幫你省時又省力,新北清潔一流服務好口碑

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

  • 設計模式系列之一:簡單工廠模式

    設計模式系列之一:簡單工廠模式

    1.1 定義

     簡單工廠模式屬於創建型模式,又稱為靜態工廠方法模式,在簡單工廠模式中,可以根據參數的不同,來返回不同類的實例,簡單工廠模式專門定義一個類來負責創建子類的實例,被創建的類通常有一個共同的父類

    1.2 簡單工廠模式結構圖(簡版)

                                 

     Factory:工廠類,簡單工廠模式的核心,它負責實現創建所有實例的內部邏輯。工廠類的創建產品類的方法可以被外界直接調用,創建所需的產品對象

     IProduct:抽象產品類,簡單工廠模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口

     Product:具體產品類,是簡單工廠模式的目標類

    1.3 簡單工廠的實現一

     假設有一個電腦的代工生產商,它目前已經可以代工生產聯想電腦了,隨着業務的拓展,這個代工生產商還要生產惠普和mac電腦;

     這樣我們就需要用一個單獨的類來專門生產電腦,這就用到了簡單工廠模式,同時用到了繼承、封裝、多態等面向對象編程的思想,下面我們來實現簡單工廠模式

    1.3.1 產品抽象類

    public abstract class Computer {
        /**
         * 產品的抽象方法,由具體的產品類去實現
         */
        public abstract void start();
    
    }

     

    1.3.2  具體實現類

    public class LenovoComputer extends Computer {
    
        @Override
        public void start() {
            System.out.println("lenovo computer run");
        }
    }
    public class MacComputer extends Computer {
        @Override
        public void start() {
            System.out.println("Mac computer run");
        }
    }
    public class HpComputer extends Computer {
        @Override
        public void start() {
            System.out.println("hp computer run");
        }
    }

    1.3.3  工廠類

    public class ComputerFactory {
        public static Computer createComputer(String type) {
            Computer computer = null;
            switch (type) {
                case "lenovo":
                    computer = new LenovoComputer();
                    break;
                case "hp":
                    computer = new HpComputer();
                    break;
                case "Mac":
                    computer = new MacComputer();
                    break;
                default:
                    break;
            }
            return computer;
        }
    }

    1.3.4  UML類圖

                              

    1.4 優缺點

     優點:

     1. 工廠類含有必要的判斷邏輯,可以決定在什麼時候創建哪一個產品類的實例,客戶端可以免除直接創建產品對象的責任,而僅僅“消費”產品;實現了對責任的分割,它提供了專門的工廠類用於創建對象

     2. 客戶端無須知道所創建的具體產品類的類名,只需要知道具體產品類所對應的參數即可,對於一些複雜的類名,通過簡單工廠模式可以減少使用者的記憶量。

     3. 通過引入配置文件,可以在不修改任何客戶端代碼的情況下更換和增加新的具體產品類,在一定程度上提高了系統的靈活性。

    缺點:

     1. 由於工廠類集中了所有產品創建邏輯,一旦不能正常工作,整個系統都要受到影響。

     2. 使用簡單工廠模式將會增加系統中類的個數,在一定程序上增加了系統的複雜度和理解難度。

     3. 系統擴展困難,一旦添加新產品就不得不修改工廠邏輯,同樣破壞了“開閉原則”;在產品類型較多時,有可能造成工廠邏輯過於複雜,不利於系統的擴展和維護

     4. 簡單工廠模式由於使用了靜態工廠方法,造成工廠角色無法形成基於繼承的等級結構

    1.5 適用場景

     1. 工廠類負責創建的對象比較少:由於創建的對象較少,不會造成工廠方法中的業務邏輯太過複雜。

     2. 客戶端只知道傳入工廠類的參數,對於如何創建對象不關心:客戶端既不需要關心創建細節,甚至連類名都不需要記住,只需要知道類型所對應的參數

    1.6 模式應用

     1. JDK類庫中廣泛使用了簡單工廠模式,如工具類java.text.DateFormat,它用於格式化一個本地日期或者時間

    public final static DateFormat getDateInstance(); 
    public final static DateFormat getDateInstance(int style); 
    public final static DateFormat getDateInstance(int style,Locale locale);

     2. 獲取不同加密算法的密鑰生成器

    KeyGenerator keyGen=KeyGenerator.getInstance("DESede");

    1.7 開閉原則

     對於上面兩種簡單工廠模式的實現方法,如果我們要添加新的 parser,那勢必要改動到 RuleConfigParserFactory 的代碼,那這是不是違反開閉原則呢?

     實際上,如果不是需要頻繁地添加新的 parser,只是偶爾修改一下 RuleConfigParserFactory 代碼,稍微不符合開閉原則,也是完全可以接受的

     儘管簡單工廠模式的代碼實現中,有多處 if 分支判斷邏輯,違背開閉原則,但權衡擴展性和可讀性,這樣的代碼實現在大多數情況下(比如,不需要頻繁地添加 parser,也沒有太多的 parser)是沒有問題的

     

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

    【其他文章推薦】

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

    新北清潔公司,居家、辦公、裝潢細清專業服務

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

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

    ※超省錢租車方案

  • 03 . 二進制部署kubernetes1.18.4

    03 . 二進制部署kubernetes1.18.4

    簡介

    目前生產部署kubernetes集群主要兩種方式

    kubeadm

    Kubeadm是一個K8s部署工具,提供kubeadm init和kubeadm join,用於快速部署Kubernetes集群。

    二進制包

    從github下載發行版的二進制包,手動部署每個組件,組成Kubernetes集群。

    Kubeadm降低部署門檻,但屏蔽了很多細節,遇到問題很難排查。如果想更容易可控,推薦使用二進制包部署Kubernetes集群,雖然手動部署麻煩點,期間可以學習很多工作原理,也利於後期維護。

    二進制部署K8s

    List
    CentOS7.3
    cni-plugins-linux-amd64-v0.8.6.tgz
    etcd-v3.4.9-linux-amd64.tar.gz
    kube-flannel.yml
    kubernetes-server-linux-amd64.tar.gz
    
    角色 IP 組件
    master 192.168.31.71 kube-apiserver,kube-controller-manager,kube-scheduler,etcd
    Node1 192.168.31.74 kube-apiserver,kube-controller-manager,kube-scheduler
    Node2 192.168.31.72 kubelet,kube-proxy,docker etcd

    初始化環境

    # 初始化
    init_security() {
    systemctl stop firewalld
    systemctl disable firewalld &>/dev/null
    setenforce 0
    sed -i '/^SELINUX=/ s/enforcing/disabled/'  /etc/selinux/config
    sed -i '/^GSSAPIAu/ s/yes/no/' /etc/ssh/sshd_config
    sed -i '/^#UseDNS/ {s/^#//;s/yes/no/}' /etc/ssh/sshd_config
    systemctl enable sshd crond &> /dev/null
    rpm -e postfix --nodeps
    echo -e "\033[32m [安全配置] ==> OK \033[0m"
    }
    init_security
    
    init_yumsource() {
    if [ ! -d /etc/yum.repos.d/backup ];then
        mkdir /etc/yum.repos.d/backup
    fi
    mv /etc/yum.repos.d/* /etc/yum.repos.d/backup 2>/dev/null
    if ! ping -c2 www.baidu.com &>/dev/null    
    then
        echo "您無法上外網,不能配置yum源"
        exit    
    fi
        curl -o /etc/yum.repos.d/163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo &>/dev/null
        curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo &>/dev/null
        yum clean all
        timedatectl set-timezone Asia/Shanghai
        echo "nameserver 114.114.114.114" > /etc/resolv.conf
        echo "nameserver 8.8.8.8" >> /etc/resolv.conf
        chattr +i /etc/resolv.conf
        yum -y install ntpdate
        ntpdate -b  ntp1.aliyun.com        # 對時很重要
        echo -e "\033[32m [YUM Source] ==> OK \033[0m"
    }
    init_yumsource
    
    # 關掉swap分區
    swapoff -a
    # 如果想永久關掉swap分區,打開如下文件註釋掉swap哪一行即可.
    sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab #永久
    
    # 配置主機名解析
    tail -3 /etc/hosts
    192.168.0.121 master
    192.168.0.123 node1
    192.168.0.124 node2
    
    # 將橋接的IPv4流量傳遞到iptables的鏈
    cat > /etc/sysctl.d/k8s.conf << EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    sysctl --system  # 生效
    
    
    # 升級內核(非必須,只是性能更好)
    wget https://cbs.centos.org/kojifiles/packages/kernel/4.9.220/37.el7/x86_64/kernel-4.9.220-37.el7.x86_64.rpm
      
    rpm -ivh kernel-4.9.220-37.el7.x86_64.rpm
    reboot
    
    

    部署etcd集群

    Etcd 是一個分佈式鍵值存儲系統,Kubernetes使用Etcd進行數據存儲,所以先準備一個Etcd數據庫,為解決Etcd單點故障,應採用集群方式部署,這裏使用3台組建集群,可容忍1台機器故障,當然,你也可以使用5台組建集群,可容忍2台機器故障。

    節點名稱 IP
    etcd-1 192.168.31.71
    etcd-2 192.168.31.72
    etcd-3 192.168.31.73

    注:為了節省機器,這裏與K8s節點機器復用。也可以獨立於k8s集群之外部署,只要apiserver能連接到就行。

    準備cfssl證書生成工具

    cfssl是一個開源的證書管理工具,使用json文件生成證書,相比openssl更方便使用。

    找任意一台服務器操作,這裏用Master節點。

    wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
    wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
    wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
    chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
    mv cfssl_linux-amd64 /usr/local/bin/cfssl
    mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
    mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
    
    生成etcd證書
    創建工作目錄
    mkdir -p ~/TLS/{etcd,k8s}
    
    cd TLS/etcd
    
    自簽CA
    cat > ca-config.json << EOF
    {
      "signing": {
        "default": {
          "expiry": "87600h"
        },
        "profiles": {
          "www": {
             "expiry": "87600h",
             "usages": [
                "signing",
                "key encipherment",
                "server auth",
                "client auth"
            ]
          }
        }
      }
    }
    EOF
    
    cat > ca-csr.json << EOF
    {
        "CN": "etcd CA",
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "CN",
                "L": "Beijing",
                "ST": "Beijing"
            }
        ]
    }
    EOF
    
    生成證書
    cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
    
    ls *pem
    ca-key.pem  ca.pem
    
    使用自簽CA簽發etcd https證書

    創建證書申請文件

    cat > server-csr.json << EOF
    {
        "CN": "etcd",
        "hosts": [
        "192.168.0.121",
        "192.168.0.123",
        "192.168.0.124"
        ],
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "CN",
                "L": "BeiJing",
                "ST": "BeiJing"
            }
        ]
    }
    EOF
    

    注:上述文件hosts字段中IP為所有etcd節點的集群內部通信IP,一個都不能少!為了方便後期擴容可以多寫幾個預留的IP。

    生成證書
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
    
    ls server*pem
    server-key.pem  server.pem
    
    下載etcd二進制文件
    wget https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-amd64.tar.gz
    
    創建工作目錄並解壓二進制包
    mkdir /opt/etcd/{bin,cfg,ssl} -p
    tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
    mv etcd-v3.4.9-linux-amd64/{etcd,etcdctl} /opt/etcd/bin/
    
    # 配置etcd
    cat /opt/etcd/cfg/etcd.conf 
    #[Member]
    ETCD_NAME="etcd-1"
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    ETCD_LISTEN_PEER_URLS="https://192.168.0.121:2380"
    ETCD_LISTEN_CLIENT_URLS="https://192.168.0.121:2379"
    #[Clustering]
    ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.0.121:2380"
    ETCD_ADVERTISE_CLIENT_URLS="https://192.168.0.121:2379"
    ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.0.121:2380,etcd-2=https://192.168.0.123:2380,etcd-3=https://192.168.0.124:2380"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
    ETCD_INITIAL_CLUSTER_STATE="new"
    
    # ETCD_NAME:節點名稱,集群中唯一
    # ETCD_DATA_DIR:數據目錄
    # ETCD_LISTEN_PEER_URLS:集群通信監聽地址
    # ETCD_LISTEN_CLIENT_URLS:客戶端訪問監聽地址
    # ETCD_INITIAL_ADVERTISE_PEER_URLS:集群通告地址
    # ETCD_ADVERTISE_CLIENT_URLS:客戶端通告地址
    # ETCD_INITIAL_CLUSTER:集群節點地址
    # ETCD_INITIAL_CLUSTER_TOKEN:集群Token
    # ETCD_INITIAL_CLUSTER_STATE:加入集群的當前狀態,new是新集群,existing表示加入已有集群
    
    systemd管理etcd
    cat > /usr/lib/systemd/system/etcd.service << EOF
    [Unit]
    Description=Etcd Server
    After=network.target
    After=network-online.target
    Wants=network-online.target
    [Service]
    Type=notify
    EnvironmentFile=/opt/etcd/cfg/etcd.conf
    ExecStart=/opt/etcd/bin/etcd \
    --cert-file=/opt/etcd/ssl/server.pem \
    --key-file=/opt/etcd/ssl/server-key.pem \
    --peer-cert-file=/opt/etcd/ssl/server.pem \
    --peer-key-file=/opt/etcd/ssl/server-key.pem \
    --trusted-ca-file=/opt/etcd/ssl/ca.pem \
    --peer-trusted-ca-file=/opt/etcd/ssl/ca.pem \
    --logger=zap
    Restart=on-failure
    LimitNOFILE=65536
    [Install]
    WantedBy=multi-user.target
    EOF
    
    拷貝剛生成證書及生成的文件拷貝到節點2,節點3
    cp ~/TLS/etcd/ca*pem ~/TLS/etcd/server*pem /opt/etcd/ssl/
    
    scp -r /opt/etcd/ node1:/opt/
    scp -r /opt/etcd/ node2:/opt/
    scp /usr/lib/systemd/system/etcd.service node1:/usr/lib/systemd/system/
    scp /usr/lib/systemd/system/etcd.service node2:/usr/lib/systemd/system/
    
    修改節點2和節點3etcd.conf配置文件
    node-1
    cat /opt/etcd/cfg/etcd.conf 
    #[Member]
    ETCD_NAME="etcd-2"
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    ETCD_LISTEN_PEER_URLS="https://192.168.0.123:2380"
    ETCD_LISTEN_CLIENT_URLS="https://192.168.0.123:2379"
    #[Clustering]
    ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.0.123:2380"
    ETCD_ADVERTISE_CLIENT_URLS="https://192.168.0.123:2379"
    ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.0.121:2380,etcd-2=https://192.168.0.123:2380,etcd-3=https://192.168.0.124:2380"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
    ETCD_INITIAL_CLUSTER_STATE="new"
    
    
    # node-2
    #[Member]
    ETCD_NAME="etcd-3"
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    ETCD_LISTEN_PEER_URLS="https://192.168.0.124:2380"
    ETCD_LISTEN_CLIENT_URLS="https://192.168.0.124:2379"
    #[Clustering]
    ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.0.124:2380"
    ETCD_ADVERTISE_CLIENT_URLS="https://192.168.0.124:2379"
    ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.0.121:2380,etcd-2=https://192.168.0.123:2380,etcd-3=https://192.168.0.124:2380"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
    ETCD_INITIAL_CLUSTER_STATE="new"
    
    # 啟動服務並設置開機自啟
    systemctl daemon-reload
    systemctl start etcd
    systemctl enable etcd
    
    驗證etcd集群狀態
     /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.0.121:2379,https://192.168.0.123:2379,https://192.168.0.124:2379" endpoint healthhttps://192.168.0.124:2379 is healthy: successfully committed proposal: took = 13.213712ms
    https://192.168.0.121:2379 is healthy: successfully committed proposal: took = 12.907787ms
    https://192.168.0.123:2379 is healthy: successfully committed proposal: took = 12.168703ms
            
    # 如果輸出上面信息,就說明集群部署成功。如果有問題第一步先看日誌:/var/log/message 或 journalctl -u etcd
    

    安裝docker

    下載安裝docker
    sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    yum -y install docker-ce-19.03.9-3.el7
    
    配置docker鏡像源
    mkdir /etc/docker
    cat > /etc/docker/daemon.json << EOF
    {
      "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
    }
    EOF
    
    啟動並設置開機自啟
    systemctl daemon-reload
    systemctl start docker
    systemctl enable docker
    

    部署Master Node

    生成kube-apiserver證書

    1. 自簽證書頒發機構(CA)

    cat > ca-config.json << EOF
    {
      "signing": {
        "default": {
          "expiry": "87600h"
        },
        "profiles": {
          "kubernetes": {
             "expiry": "87600h",
             "usages": [
                "signing",
                "key encipherment",
                "server auth",
                "client auth"
            ]
          }
        }
      }
    }
    EOF
    cat > ca-csr.json << EOF
    {
        "CN": "kubernetes",
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "CN",
                "L": "Beijing",
                "ST": "Beijing",
                "O": "k8s",
                "OU": "System"
            }
        ]
    }
    EOF
    
    # 生成證書
    cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
    
    ls *pem
    ca-key.pem  ca.pem
    
    使用自簽CA簽發kube-apiserver https 證書
    cat /root/TLS/k8s/server-csr.json 
    {
        "CN": "kubernetes",
        "hosts": [
          "10.0.0.1",
          "127.0.0.1",
          "192.168.0.121",
          "192.168.0.123",
          "192.168.0.124",
          "192.168.0.125",
          "192.168.0.100",
          "kubernetes",
          "kubernetes.default",
          "kubernetes.default.svc",
          "kubernetes.default.svc.cluster",
          "kubernetes.default.svc.cluster.local"
        ],
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "CN",
                "L": "BeiJing",
                "ST": "BeiJing",
                "O": "k8s",
                "OU": "System"
            }
        ]
    }
    
    # 上述文件hosts字段中IP為所有Master/LB/VIP IP,一個都不能少!為了方便後期擴容可以多寫幾個預留的IP。
    
    # 生成證書
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server
    
    ls server*pem
    server-key.pem  server.pem
    
    下載解壓二進制包
    wget https://dl.k8s.io/v1.18.4/kubernetes-server-linux-amd64.tar.gz
    mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs} 
    tar zxvf kubernetes-server-linux-amd64.tar.gz
    cd kubernetes/server/bin
    cp kube-apiserver kube-scheduler kube-controller-manager /opt/kubernetes/bin
    cp kubectl /usr/bin/
    
    部署kube-apiserver
    cat /opt/kubernetes/cfg/kube-apiserver.conf 
    KUBE_APISERVER_OPTS="--logtostderr=false \
    --v=2 \
    --log-dir=/opt/kubernetes/logs \
    --etcd-servers=https://192.168.0.121:2379,https://192.168.0.123:2379,https://192.168.0.124:2379 \
    --bind-address=192.168.0.121 \
    --secure-port=6443 \
    --advertise-address=192.168.0.121 \
    --allow-privileged=true \
    --service-cluster-ip-range=10.0.0.0/24 \
    --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \
    --authorization-mode=RBAC,Node \
    --enable-bootstrap-token-auth=true \
    --token-auth-file=/opt/kubernetes/cfg/token.csv \
    --service-node-port-range=30000-32767 \
    --kubelet-client-certificate=/opt/kubernetes/ssl/server.pem \
    --kubelet-client-key=/opt/kubernetes/ssl/server-key.pem \
    --tls-cert-file=/opt/kubernetes/ssl/server.pem  \
    --tls-private-key-file=/opt/kubernetes/ssl/server-key.pem \
    --client-ca-file=/opt/kubernetes/ssl/ca.pem \
    --service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \
    --etcd-cafile=/opt/etcd/ssl/ca.pem \
    --etcd-certfile=/opt/etcd/ssl/server.pem \
    --etcd-keyfile=/opt/etcd/ssl/server-key.pem \
    --audit-log-maxage=30 \
    --audit-log-maxbackup=3 \
    --audit-log-maxsize=100 \
    --audit-log-path=/opt/kubernetes/logs/k8s-audit.log"
    
    
    # –logtostderr:啟用日誌
    # —v:日誌等級
    # –log-dir:日誌目錄
    # –etcd-servers:etcd集群地址
    # –bind-address:監聽地址
    # –secure-port:https安全端口
    # –advertise-address:集群通告地址
    # –allow-privileged:啟用授權
    # –service-cluster-ip-range:Service虛擬IP地址段
    # –enable-admission-plugins:准入控制模塊
    # –authorization-mode:認證授權,啟用RBAC授權和節點自管理
    # –enable-bootstrap-token-auth:啟用TLS bootstrap機制
    # –token-auth-file:bootstrap token文件
    # –service-node-port-range:Service nodeport類型默認分配端口範圍
    # –kubelet-client-xxx:apiserver訪問kubelet客戶端證書
    # –tls-xxx-file:apiserver https證書
    # –etcd-xxxfile:連接Etcd集群證書
    # –audit-log-xxx:審計日誌
    
    拷貝剛生成證書
    cp ~/TLS/k8s/ca*pem ~/TLS/k8s/server*pem /opt/kubernetes/ssl/
    
    啟用TLS Bootstrapping機制

    TLS Bootstraping:Master apiserver啟用TLS認證后,Node節點kubelet和kube-proxy要與kube-apiserver進行通信,必須使用CA簽發的有效證書才可以,當Node節點很多時,這種客戶端證書頒發需要大量工作,同樣也會增加集群擴展複雜度。為了簡化流程,Kubernetes引入了TLS bootstraping機制來自動頒發客戶端證書,kubelet會以一個低權限用戶自動向apiserver申請證書,kubelet的證書由apiserver動態簽署。所以強烈建議在Node上使用這種方式,目前主要用於kubelet,kube-proxy還是由我們統一頒發一個證書

    TLS bootstraping 工作流程

    創建上述配置文件中token文件

    cat > /opt/kubernetes/cfg/token.csv << EOF
    c47ffb939f5ca36231d9e3121a252940,kubelet-bootstrap,10001,"system:node-bootstrapper"
    EOF
    
    # 格式:token,用戶名,UID,用戶組
    

    token也可自行生成替換

    head -c 16 /dev/urandom | od -An -t x | tr -d ' '
    
    systemd管理apiserver
    cat > /usr/lib/systemd/system/kube-apiserver.service << EOF
    [Unit]
    Description=Kubernetes API Server
    Documentation=https://github.com/kubernetes/kubernetes
    [Service]
    EnvironmentFile=/opt/kubernetes/cfg/kube-apiserver.conf
    ExecStart=/opt/kubernetes/bin/kube-apiserver \$KUBE_APISERVER_OPTS
    Restart=on-failure
    [Install]
    WantedBy=multi-user.target
    EOF
    
    啟動設置開機啟動
    systemctl daemon-reload
    systemctl start kube-apiserver
    systemctl enable kube-apiserver
    
    授權kubelet-bootstrap用戶允許請求證書
    kubectl create clusterrolebinding kubelet-bootstrap \
    --clusterrole=system:node-bootstrapper \
    --user=kubelet-bootstrap
    

    部署kube-controller-manager

    創建配置文件
    cat /opt/kubernetes/cfg/kube-controller-manager.conf 
    KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=false \
    --v=2 \
    --log-dir=/opt/kubernetes/logs \
    --leader-elect=true \
    --master=127.0.0.1:8080 \
    --bind-address=127.0.0.1 \
    --allocate-node-cidrs=true \
    --cluster-cidr=10.244.0.0/16 \
    --service-cluster-ip-range=10.0.0.0/24 \
    --cluster-signing-cert-file=/opt/kubernetes/ssl/ca.pem \
    --cluster-signing-key-file=/opt/kubernetes/ssl/ca-key.pem  \
    --root-ca-file=/opt/kubernetes/ssl/ca.pem \
    --service-account-private-key-file=/opt/kubernetes/ssl/ca-key.pem \
    --experimental-cluster-signing-duration=87600h0m0s"
    
    # –master:通過本地非安全本地端口8080連接apiserver。
    # –leader-elect:當該組件啟動多個時,自動選舉(HA)
    # –cluster-signing-cert-file/–cluster-signing-key-file:自動為kubelet頒發證書的CA,與apiserver保持一致
    
    systemd管理controller-manager
    cat > /usr/lib/systemd/system/kube-controller-manager.service << EOF
    [Unit]
    Description=Kubernetes Controller Manager
    Documentation=https://github.com/kubernetes/kubernetes
    [Service]
    EnvironmentFile=/opt/kubernetes/cfg/kube-controller-manager.conf
    ExecStart=/opt/kubernetes/bin/kube-controller-manager \$KUBE_CONTROLLER_MANAGER_OPTS
    Restart=on-failure
    [Install]
    WantedBy=multi-user.target
    EOF
    
    啟動設置開機啟動
    systemctl daemon-reload
    systemctl start kube-controller-manager
    systemctl enable kube-controller-manager
    

    部署kube-scheduler

    創建配置文件
    cat /opt/kubernetes/cfg/kube-scheduler.conf 
    KUBE_SCHEDULER_OPTS="--logtostderr=false --v=2 --log-dir=/opt/kubernetes/logs --leader-elect --master=127.0.0.1:8080 --bind-address=127.0.0.1"
    
    # –master:通過本地非安全本地端口8080連接apiserver。
    # –leader-elect:當該組件啟動多個時,自動選舉(HA)
    
    systemd管理scheduler
    cat > /usr/lib/systemd/system/kube-scheduler.service << EOF
    [Unit]
    Description=Kubernetes Scheduler
    Documentation=https://github.com/kubernetes/kubernetes
    [Service]
    EnvironmentFile=/opt/kubernetes/cfg/kube-scheduler.conf
    ExecStart=/opt/kubernetes/bin/kube-scheduler \$KUBE_SCHEDULER_OPTS
    Restart=on-failure
    [Install]
    WantedBy=multi-user.target
    EOF
    
    啟動並設置開機自啟動
    systemctl daemon-reload
    systemctl start kube-scheduler
    systemctl enable kube-scheduler
    
    查看集群狀態
    # 所有組件都已經啟動成功,通過kubectl工具查看當前集群組件狀態:
    kubectl get cs
    NAME                 STATUS    MESSAGE             ERROR
    scheduler            Healthy   ok                  
    controller-manager   Healthy   ok                  
    etcd-2               Healthy   {"health":"true"}   
    etcd-1               Healthy   {"health":"true"}   
    etcd-0               Healthy   {"health":"true"} 
    

    部署worker node

    下面還是在Master Node上操作,即同時作為Worker Node

    創建工作目錄並拷貝二進制文件

    在所有worker node創建工作目錄

    mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs} 
    

    從master節點拷貝

    cd kubernetes/server/bin
    cp kubelet kube-proxy /opt/kubernetes/bin   # 本地拷貝,註釋這裏操作還是master節點,
    

    部署kubelet

    創建配置文件
    cat /opt/kubernetes/cfg/kubelet.conf 
    KUBELET_OPTS="--logtostderr=false \
    --v=2 \
    --log-dir=/opt/kubernetes/logs \
    --hostname-override=master \
    --network-plugin=cni \
    --kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \
    --bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \
    --config=/opt/kubernetes/cfg/kubelet-config.yml \
    --cert-dir=/opt/kubernetes/ssl \
    --pod-infra-container-image=lizhenliang/pause-amd64:3.0"
    
    
    # –hostname-override:显示名稱,集群中唯一
    # –network-plugin:啟用CNI
    # –kubeconfig:空路徑,會自動生成,後面用於連接apiserver
    # –bootstrap-kubeconfig:首次啟動向apiserver申請證書
    # –config:配置參數文件
    # –cert-dir:kubelet證書生成目錄
    # –pod-infra-container-image:管理Pod網絡容器的鏡像
    
    配置參數文件
    cat > /opt/kubernetes/cfg/kubelet-config.yml << EOF
    kind: KubeletConfiguration
    apiVersion: kubelet.config.k8s.io/v1beta1
    address: 0.0.0.0
    port: 10250
    readOnlyPort: 10255
    cgroupDriver: cgroupfs
    clusterDNS:
    - 10.0.0.2
    clusterDomain: cluster.local 
    failSwapOn: false
    authentication:
      anonymous:
        enabled: false
      webhook:
        cacheTTL: 2m0s
        enabled: true
      x509:
        clientCAFile: /opt/kubernetes/ssl/ca.pem 
    authorization:
      mode: Webhook
      webhook:
        cacheAuthorizedTTL: 5m0s
        cacheUnauthorizedTTL: 30s
    evictionHard:
      imagefs.available: 15%
      memory.available: 100Mi
      nodefs.available: 10%
      nodefs.inodesFree: 5%
    maxOpenFiles: 1000000
    maxPods: 110
    EOF
    
    生成bootstrap.kubeconfig文件
    KUBE_APISERVER="https://192.168.0.121:6443" # apiserver IP:PORT
    
    TOKEN="c47ffb939f5ca36231d9e3121a252940" # 與token.csv里保持一致
    
    # 生成 kubelet bootstrap kubeconfig 配置文件
    kubectl config set-cluster kubernetes \
      --certificate-authority=/opt/kubernetes/ssl/ca.pem \
      --embed-certs=true \
      --server=${KUBE_APISERVER} \
      --kubeconfig=bootstrap.kubeconfig
      
      
    kubectl config set-credentials "kubelet-bootstrap" \
      --token=${TOKEN} \
      --kubeconfig=bootstrap.kubeconfig
      
      
    kubectl config set-context default \
      --cluster=kubernetes \
      --user="kubelet-bootstrap" \
      --kubeconfig=bootstrap.kubeconfig
      
      
    kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
    
    # 拷貝到配置文件路徑
    cp bootstrap.kubeconfig /opt/kubernetes/cfg
    
    systemd管理kubelet
    cat > /usr/lib/systemd/system/kubelet.service << EOF
    [Unit]
    Description=Kubernetes Kubelet
    After=docker.service
    [Service]
    EnvironmentFile=/opt/kubernetes/cfg/kubelet.conf
    ExecStart=/opt/kubernetes/bin/kubelet \$KUBELET_OPTS
    Restart=on-failure
    LimitNOFILE=65536
    [Install]
    WantedBy=multi-user.target
    EOF
    
    啟動並設置開機自啟
    systemctl daemon-reload
    systemctl start kubelet
    systemctl enable kubelet
    
    批准kubelet證書並加入集群
    # 查看kubelet證書請求
    kubectl get csr
    NAME                                                   AGE    SIGNERNAME                                    REQUESTOR           CONDITION
    node-csr-uCEGPOIiDdlLODKts8J658HrFq9CZ--K6M4G7bjhk8A   6m3s   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Pending
    
    # 批准申請
    kubectl certificate approve node-csr-uCEGPOIiDdlLODKts8J658HrFq9CZ--K6M4G7bjhk8A
    
    # 查看節點
    kubectl get node
    NAME     STATUS   ROLES    AGE    VERSION
    master   Ready    <none>   123m   v1.18.4
    
    # 由於網絡插件還沒有部署,節點會沒有準備就緒 NotReady
    

    部署kube-proxy

    創建配置文件
    cat > /opt/kubernetes/cfg/kube-proxy.conf << EOF
    KUBE_PROXY_OPTS="--logtostderr=false \\
    --v=2 \\
    --log-dir=/opt/kubernetes/logs \\
    --config=/opt/kubernetes/cfg/kube-proxy-config.yml"
    EOF
    
    創建參數文件
    cat > /opt/kubernetes/cfg/kube-proxy-config.yml << EOF
    kind: KubeProxyConfiguration
    apiVersion: kubeproxy.config.k8s.io/v1alpha1
    bindAddress: 0.0.0.0
    metricsBindAddress: 0.0.0.0:10249
    clientConnection:
      kubeconfig: /opt/kubernetes/cfg/kube-proxy.kubeconfig
    hostnameOverride: k8s-master
    clusterCIDR: 10.0.0.0/24
    EOF
    
    生成kube-proxy.kubeconfig文件

    生成kube-proxy證書

    # 切換工作目錄
    cd TLS/k8s
    
    # 創建證書請求文件
    cat > kube-proxy-csr.json << EOF
    {
      "CN": "system:kube-proxy",
      "hosts": [],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "L": "BeiJing",
          "ST": "BeiJing",
          "O": "k8s",
          "OU": "System"
        }
      ]
    }
    EOF
    
    # 生成證書
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
    
    ls kube-proxy*pem
    kube-proxy-key.pem  kube-proxy.pem
    
    生成kubeconfig文件
    KUBE_APISERVER="https://192.168.0.121:6443"
    
    kubectl config set-cluster kubernetes \
      --certificate-authority=/opt/kubernetes/ssl/ca.pem \
      --embed-certs=true \
      --server=${KUBE_APISERVER} \
      --kubeconfig=kube-proxy.kubeconfig
      
    kubectl config set-credentials kube-proxy \
      --client-certificate=./kube-proxy.pem \
      --client-key=./kube-proxy-key.pem \
      --embed-certs=true \
      --kubeconfig=kube-proxy.kubeconfig
      
    kubectl config set-context default \
      --cluster=kubernetes \
      --user=kube-proxy \
      --kubeconfig=kube-proxy.kubeconfig
      
    kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
    
    # 拷貝配置文件到指定路徑
    cp kube-proxy.kubeconfig /opt/kubernetes/cfg/
    
    systemd管理kube-proxy
    cat > /usr/lib/systemd/system/kube-proxy.service << EOF
    [Unit]
    Description=Kubernetes Proxy
    After=network.target
    [Service]
    EnvironmentFile=/opt/kubernetes/cfg/kube-proxy.conf
    ExecStart=/opt/kubernetes/bin/kube-proxy \$KUBE_PROXY_OPTS
    Restart=on-failure
    LimitNOFILE=65536
    [Install]
    WantedBy=multi-user.target
    EOF
    
    啟動並設置開機啟動
    systemctl daemon-reload
    systemctl start kube-proxy
    systemctl enable kube-proxy
    

    部署CNI網絡

    準備二進制文件
    wget https://github.com/containernetworking/plugins/releases/download/v0.8.6/cni-plugins-linux-amd64-v0.8.6.tgz
      
    # 解壓二進制文件並移動到默認工作目錄
    mkdir /opt/cni/bin
    tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin
    
    # 部署cni網絡
    wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    sed -i -r "s#quay.io/coreos/flannel:.*-amd64#lizhenliang/flannel:v0.12.0-amd64#g" kube-flannel.yml
    
    # 默認鏡像地址無法訪問,修改為docker hub鏡像倉庫。
    kubectl apply -f kube-flannel.yml
    
    kubectl get pods -n kube-system
    NAME                          READY   STATUS    RESTARTS   AGE
    kube-flannel-ds-amd64-2pc95   1/1     Running   0          72s
    
    kubectl get node
    NAME         STATUS   ROLES    AGE   VERSION
    master   Ready    <none>   41m   v1.18.4
    # 部署好網絡插件,Node準備就緒
    
    授權apiserver訪問kubelet
    cat > apiserver-to-kubelet-rbac.yaml << EOF
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      annotations:
        rbac.authorization.kubernetes.io/autoupdate: "true"
      labels:
        kubernetes.io/bootstrapping: rbac-defaults
      name: system:kube-apiserver-to-kubelet
    rules:
      - apiGroups:
          - ""
        resources:
          - nodes/proxy
          - nodes/stats
          - nodes/log
          - nodes/spec
          - nodes/metrics
          - pods/log
        verbs:
          - "*"
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: system:kube-apiserver
      namespace: ""
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: system:kube-apiserver-to-kubelet
    subjects:
      - apiGroup: rbac.authorization.k8s.io
        kind: User
        name: kubernetes
    EOF
    
    kubectl apply -f apiserver-to-kubelet-rbac.yaml
    
    新增加Worker Node

    拷貝已部署好的Node相關文件到新節點

    scp -r /opt/kubernetes/ node1:/opt/
    scp -r /usr/lib/systemd/system/{kubelet,kube-proxy}.service node1:/usr/lib/systemd/system
    
    scp -r /opt/cni/ node1:/opt/
    scp /opt/kubernetes/ssl/ca.pem node1:/opt/kubernetes/ssl
    
    刪除kubelet證書和kubeconfig文件
    rm -f /opt/kubernetes/cfg/kubelet.kubeconfig 
    rm -f /opt/kubernetes/ssl/kubelet*
    
    # 這幾個文件是證書申請審批后自動生成的,每個Node不同,必須刪除重新生成。
    
    修改主機名並設置開機自啟動
    vi /opt/kubernetes/cfg/kubelet.conf
    --hostname-override=node1
    
    vi /opt/kubernetes/cfg/kube-proxy-config.yml
    hostnameOverride: node1
    
    # 啟動並設置開機啟動
    systemctl daemon-reload
    systemctl start kubelet
    systemctl enable kubelet
    systemctl start kube-proxy
    systemctl enable kube-proxy
    
    再master上批准Node kubelet證書申請
    kubectl get csr
    NAME                                                   AGE   SIGNERNAME                                    REQUESTOR           CONDITION
    node-csr-4zTjsaVSrhuyhIGqsefxzVoZDCNKei-aE2jyTP81Uro   89s   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Pending
    
    kubectl certificate approve node-csr-4zTjsaVSrhuyhIGqsefxzVoZDCNKei-aE2jyTP81Uro
    
    kubectl get node
    NAME     STATUS   ROLES    AGE    VERSION
    master   Ready    <none>   138m   v1.18.4
    node1    Ready    <none>   120m   v1.18.4
    node2    Ready    <none>   112m   v1.18.4
    

    部署Dashboard

    下載dashboard.yaml文件
    wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
    
    修改yaml配置文件使其端口暴露外部訪問
    wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
      
    # 默認Dashboard只能集群內部訪問,修改Service為NodePort類型,暴露到外部:
    
    vi recommended.yaml
    kind: Service
    apiVersion: v1
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
      name: kubernetes-dashboard
      namespace: kubernetes-dashboard
    spec:
      ports:
        - port: 443
          targetPort: 8443
          nodePort: 30001  # 修改這裏
      type: NodePort   # 修改這裏
      selector:
        k8s-app: kubernetes-dashboard
    
    kubectl apply -f recommended.yaml
    
    kubectl get pods,svc -n kubernetes-dashboard
    NAME                                             READY   STATUS    RESTARTS   AGE
    pod/dashboard-metrics-scraper-694557449d-69x7g   1/1     Running   0          111m
    pod/kubernetes-dashboard-9774cc786-kwgkt         1/1     Running   0          111m
    
    NAME                                TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)         AGE
    service/dashboard-metrics-scraper   ClusterIP   10.0.0.3     <none>        8000/TCP        111m
    service/kubernetes-dashboard        NodePort    10.0.0.122   <none>        443:30001/TCP   111m
    
    創建service account並綁定默認cluster-admin管理員集群角色
    kubectl create serviceaccount dashboard-admin -n kube-system
    kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
    kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
    
    # 接下來訪問https://node ip:30001
    # 然後將上面過濾出來的token複製上面即可訪問dashboard
    
    # 我們可以部署個Nginx測試下集群可用性
    kubectl run --generator=run-pod/v1 nginx-test2 --image=daocloud.io/library/nginx --port=80 --replicas=1
    
    kubectl get pods -o wide
    kubectl get pods -o wide
    NAME          READY   STATUS    RESTARTS   AGE   IP           NODE    NOMINATED NODE   READINESS GATES
    nginx-test2   1/1     Running   0          89m   10.244.2.2   node2   <none>           <none>
    
    # 我們去相應的節點訪問指定IP即可訪問
    [root@node1 ~]# curl -I -s  10.244.2.2 |grep 200
    HTTP/1.1 200 OK
    

    部署CoreDNS

    CoreDNS用於集群內部Service名稱解析

    kubectl apply -f coredns.yaml 
    serviceaccount/coredns created
    clusterrole.rbac.authorization.k8s.io/system:coredns created
    clusterrolebinding.rbac.authorization.k8s.io/system:coredns 
    configmap/coredns created
    deployment.apps/coredns created
    
    DNS解析測試
    kubectl run -it --rm dns-test --image=busybox:1.28.4 sh
    If you don't see a command prompt, try pressing enter.
    / # nslookup kubernetes
    Server:    10.0.0.2
    Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local
    
    Name:      kubernetes
    Address 1: 10.0.0.1 kubernetes.default.svc.cluster.local
    

    此篇文章借鑒於公眾號DevOps技術棧 ,作者阿良

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

    【其他文章推薦】

    新北清潔公司,居家、辦公、裝潢細清專業服務

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

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

    ※超省錢租車方案

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