環境資訊中心綜合外電;黃鈺婷 編譯;林大利 審校
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※為什麼 USB CONNECTOR 是電子產業重要的元件?
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※台北網頁設計公司全省服務真心推薦
※想知道最厲害的網頁設計公司"嚨底家"!
※推薦評價好的iphone維修中心
北部有線電視-提供穩定的寬頻光纖上網、高畫質HD數位頻道、第四台電視、數位電視,現在申辦免費體驗3個月"HD99高畫質套餐"
環境資訊中心綜合外電;姜唯 編譯;林大利 審校
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能
※台北網頁設計公司這麼多該如何選擇?
※智慧手機時代的來臨,RWD網頁設計為架站首選
※評比南投搬家公司費用收費行情懶人包大公開
※回頭車貨運收費標準
摘錄自2020年9月30日自由時報報導
根據《CNN》報導,英國樸茨茅斯大學(University of Portsmouth)發布聲明指出,研究團隊將PET水解酶與另一種酶結合,創造出全新的人造酶,這種新產物可對聚對苯二甲酸乙二酯(PET)快速作用,使得原本需要百年才能分解的PET,在短短數日內就被分解為基礎組成,可重複製造成全新的塑膠製品。
樸茨茅斯大學酶創新中心主任麥吉漢(John McGeehan)表示,對於全球性回收塑膠及減少塑膠污染行動,新創造出來的超級酶是一大突破,目前雖仍無法商業量產,但在研究資金充裕的情況下,前景十分樂觀。
麥吉漢表示,考量到超級酶分解PET的超強能力,若能成功開發量產,意味著可回收現有的塑膠製品重複使用,節省大量能源的同時,還可以解決苦惱全球的垃圾及碳排放問題。
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※帶您來了解什麼是 USB CONNECTOR ?
※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面
※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!
※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※教你寫出一流的銷售文案?
摘錄自2020年9月30日中央社報導
巴西農業部29日指出,接獲8州36起民眾收到從國外寄來、未經訂購的不明種子郵包的投訴案例,已展開調查。
根據巴西新聞網站G1報導,這些神秘的種子通常裝在塑膠袋裡,夾帶在透過網路、網站或應用程式購買的產品一起寄給消費者。包裹來源都是中國、馬來西亞和香港等亞洲國家。
所有可疑種子包裹將由戈恩尼亞(Goiânia)聯邦農業防禦實驗室進行分析。巴西農業部要求民眾小心謹慎,無論來源國是哪裡,都不要打開未經訂購的不明種子郵包或直接丟棄,避免種子與土壤接觸,否則可能破壞環境和農業地區。這些種子應交給農業部在各州的辦事處或農業防禦單位。
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※為什麼 USB CONNECTOR 是電子產業重要的元件?
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※台北網頁設計公司全省服務真心推薦
※想知道最厲害的網頁設計公司"嚨底家"!
※推薦評價好的iphone維修中心
摘錄自2020年9月30日中央社報導
路透社報導,掌管慈善團體的英國慈善委員會(Charity Commission)29日發表聲明,國際鳥盟已提交事件報告,委員會將檢視所有提交資訊進行調查,以決定下一步動作。
中華鳥會自1996年成為全球最大的鳥類保育組織「國際鳥盟」(BirdLife International)會員。但國際鳥盟全球理事會2週前決議,由於中華鳥會的中文名稱「中華民國野鳥學會」對國際鳥盟的夥伴關係造成經營上的「風險」,因此將中華鳥會自正式夥伴關係中移除。
儘管國際鳥盟將中華鳥會除名,但許多組織仍表示將繼續與中華鳥會合作,包括國際鳥盟的重要夥伴英國皇家鳥類保護協會(Royal Society for the Protection of Birds)。
國際鳥盟禁止員工就此事發表評論,並未立即回應。
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能
※台北網頁設計公司這麼多該如何選擇?
※智慧手機時代的來臨,RWD網頁設計為架站首選
※評比南投搬家公司費用收費行情懶人包大公開
※回頭車貨運收費標準
不管是在現實生活還是當今遊戲中,各式各樣的排名層出不窮。如果我們做好一款遊戲,卻沒有實現排行榜,一定是不完美的。排行榜不僅是玩家了解自己實力的途徑,也是遊戲運營刺激用戶留存的一種途徑。在微信小遊戲中普遍存以下兩種排名
其中好友的排名,需要通過微信子域實現。在子域上下文中,只能調用微信提供相關的api,且數據傳輸只能進不能出。即使在子域中調用雲函數也不行。這個對數據很嚴格,開發略為複雜。但好處也很明顯
儘管這樣,我們還是先實現世界排行。世界排行需要用戶授權。早期只需要調用wx.authorize就可以實現,現在很不穩定(好像廢棄了)。所以不得不通過生成一個授權按鈕來實現
微信小遊戲為開發者提供了一部分免費的雲環境。可以實現文件存儲,數據存儲以及通過雲函數實現服務端接口。開通方式也很簡單,這裏不做說明。既然要實現排名,優先選用雲函數來實現對應的api。要實現雲函數,需要在project.config.json文件中通過屬性cloudfunctionRoot指定雲函數目錄。由於,是通過cocoscretor開發,每次構建發布都會清空輸出內容。為了解決人肉複製粘貼,我們需要通過定製小遊戲構建模板實現微信小遊戲所有代碼的管理。小遊戲地心俠士構建模板如下
從圖中,可以看到獲取openid、獲取世界排名、保存用戶授權信息等雲函數都放在cocoscreator代碼環境中。這樣在開發完成后,通過cocoscreator構建發布,對應的雲函數也會一起打包過去
首先在構建模板的cloud-functions文件件中,使用npm初始一個名為getOpenId的node項目。初始好以後,運行npm install wx-server-sdk@latest --save。這樣就建立好了一個雲函數的基本框架。
我們在index.js文件,輸入以下代碼
// author:herbert 464884492 // project:地心俠士 獲取用戶openid const cloud = require('wx-server-sdk') cloud.init() exports.main = async (event, context) => { const wxContext = cloud.getWXContext() return { event, openid: wxContext.OPENID, appid: wxContext.APPID, unionid: wxContext.UNIONID, } }
調用雲函數時,上下文中便可以得到玩家openid和uninid。玩家進入遊戲就先調用此函數,得到玩家的openid用於後邊更新玩家數據和獲取世界排行的條件。
小遊戲端調用雲函數前,需要初始雲環境。因為採用定製構建模板,所以我們直接在模板的game.js文件末尾初始我的雲環境
// author:herbert 464884492
// 地心俠士 初始雲環境
....
wxDownloader.init();
window.boot();
//初始化雲調用
this.wx.cloud.init({
traceUser: true,
env: 'dxxs-dxxs'
});
...
後續調用雲函數中,第一步都是要獲取openid,這裏定義一個全局變量將其保存起來,調用方法如下
// author:herbert 464884492 // 地心俠士 玩家openid private static openId: string = null; private static initenv() { return new Promise((resolve, reject) => { if (!this.wx) reject(); //直接使用本地緩存 if (this.openId != null) resolve(); // 調用雲函數獲取 this.wx.cloud.callFunction({ name: 'getOpenId', complete: res => { this.openId = res.result.openid; resolve(); } }); }); }
先看下地心俠士布局界面
上圖中可以看到,地心俠士虛擬了一個遊戲操作區域。玩家聚焦到世界排行時,需要渲染一個授權按鈕在確定的位置。需求很簡單,可考慮到移動端多分辨率,這個操作就變得複雜了。需要做屏幕適配。地心俠士採用自適應寬度的適配策略,配置如下圖
遊戲運行時獲取實際分辨率的寬度與設計的寬度相除,變可知道當前寬度變化比列,鍵盤容器九宮格使用了主鍵widget底部111px,高度161px。確定按鈕寬度105px
微信小遊戲以左上角為原點,通過top和left確定位置。然而,cocoscreator以左下角為原點,所以在計算top值時需要用屏幕寬度 – box上邊緣y坐標。適配代碼如下
// author:herbert 464884492 // 地心俠士 動態生成透明授權按鈕 initUserInfoButton() { // 獲取設計尺寸 let desingSize: cc.Size = cc.view.getDesignResolutionSize(); // 獲取實際屏幕尺寸 let screenSize: cc.Size = cc.view.getFrameSize(); // 獲取寬度倍率 let widthRate = screenSize.width / desingSize.width; // 獲取當前倍率下九宮格鍵盤實際高度 let halfKcHeight = 161 * widthRate / 2; // 獲取當前倍率下確定按鈕實際寬度 let btnwidth = this.btnKeySuer.width * widthRate; WxCloudFun.createUserinfoButton("", // 確定按鈕中心點對應小遊戲left值 (屏幕寬度-確定按鈕實際寬度)/2 // 定義實際授權按鈕size為105*40,所以還必須加上對應的偏差值 // 以下代碼中left體現整體適配過程,不考慮中間過程可以直接使用 // (屏幕寬度-授權按鈕)/2 即可得到left值 screenSize.width / 2 - 52.5 * widthRate + (btnwidth - 105) / 2, // Canvas 適配策略是 Fit Width,所以Canvas下邊沿不一定就是屏幕邊緣 // 通過111*widthRate得到具體下沿值,在加上虛擬鍵盤一半高度,可得到中心位置 // 由於微信原點在左上角,需要保持按鈕處於中心位置,坐標還需要上移一半按鈕高度 screenSize.height - (111 * widthRate + halfKcHeight + 20), () => { this.keyCode = cc.macro.KEY.r; this.scheduleOnce(async () => { this.dlgRank.active = true; // 獲取排名數據 await this.getRankInfo(); }, 0); }); }
經過上一步驟的適配操作,只要玩家聚焦到【世界排行】,地心俠士虛擬鍵盤的確定按鈕正上方會覆蓋一個透明的userInfoButton,玩家點擊確定就會喚起授權對話框,然後在對應的回調函數就可以完成用戶數據保存操作
// author:herbert 464884492 // 地心俠士 獲取玩家基本信息 public static createUserinfoButton(text: string, left: number, top: number, cb: Function) { this.userInfoButton = this.wx.createUserInfoButton({ type: 'text', text: text, style: { left: left, top: top, height: 40, width: 105, lineHeight: 40, textAlign: 'center', fontSize: 16, backgroundColor: '#ff000000',// 透明 color: '#ffffff', } }); this.userInfoButton.hide(); this.userInfoButton.onTap((res) => { // 將獲取到的用戶數據提交到雲端 this.wx.cloud.callFunction({ name: 'putUserinfo', data: { ...res.userInfo, openid: this.openId } }); this.hideUserInfoButton(); cb.call(); }); }
在代碼中,除了傳入玩家微信信息外。我還額外傳遞進入遊戲時就獲取的openid。正常情況下不需要的,因為,雲函數中天然會告訴你openid。不過,我們在後端使用了got獲取玩家頭像保存到雲端文件存儲中。引入此包后,後端就獲取不到openid了,相當奇怪。對應雲平台雲函數代碼如下
// author:herbert 464884492 // 地心俠士 雲函數保存玩家基本信息 const cloud = require('wx-server-sdk') const got = require('got') cloud.init() // 雲函數入口函數 exports.main = async(event, context) => { const { nickName, avatarUrl, gender, openid } = event; let wxContext = cloud.getWXContext(); // 如果後端拿不到openid就採用前端傳入的openid wxContext.OPENID = wxContext.OPENID || openid; const log = cloud.logger() log.info({ tip: `正在請求頭像地址[${avatarUrl}]` }) // 獲取頭像數據流 const stream = await got.stream(avatarUrl); let chunks = []; let size = 0; const body = await (async() => { return new Promise((res, reg) => { stream.on('data', chunk => { chunks.push(chunk) size += chunk.length log.info({ tip: `正在讀取圖片流信息:[${chunk.length}]` }) }) stream.on('end', async() => { const body = Buffer.concat(chunks, size) log.info({ tip: `正在保存頭像文件:[${size}]` }) res(body) }) }) })() //保存頭像到雲存儲 const { fileID } = await cloud.uploadFile({ cloudPath: `avatars/${wxContext.OPENID}.jpg`, fileContent: body }) // 添加或更新玩家信息到數據庫 const db = cloud.database() const { data } = await db.collection("dxxs").where({ _openid: wxContext.OPENID }).get() const updateData = { fileId: fileID, nickName: nickName, sex: gender == 1 ? '男' : '女', avatarUrl: avatarUrl } if (data.length > 0) { log.info({ tip: `正在修改數據庫信息:[${size}]` }) await db.collection("dxxs").doc(data[0]._id).update({ data: updateData }) } else { log.info({ tip: `正在添加數據庫信息:[${size}]` }) await db.collection("dxxs").add({ data: { ...updateData, _openid: openid } }) } return { openid: wxContext.OPENID, appid: wxContext.APPID, unionid: wxContext.UNIONID } }
保存完用戶數據后,通過一個回調函數,實現了玩家排名數據獲取。細心的朋友可以在前邊授權按鈕適配的章節看到await this.getRankInfo();這句代碼。後端雲函數就是一個簡單數據查詢。效果圖如下
從上圖可以看到,我實現了三個維度排名,需要在前端需要傳入排名字段。對應代碼如下
// author:herbert 464884492 // 地心俠士 獲取排名信息 public static async getWorldRanking(field: string = "level") { const { result } = await this.wx.cloud.callFunction({ name: 'getWordRanking', data: { order: field } }); return result.ranks; }
雲函數代碼如下
// author:herbert 464884492 // 地心俠士 雲函數返回排名信息 const cloud = require('wx-server-sdk') cloud.init() exports.main = async (event, context) => { const wxContext = cloud.getWXContext() const db = cloud.database(); const { order = "level" } = event; const openData = await db.collection("dxxs") .orderBy(order, "asc") .get() const ranks = openData.data.map(item => { return { openid: item._openid, [order]: item[order], nickName: item.nickName, fileId: item.fileId, avatarUrl: item.avatarUrl } }); return { ranks: ranks, openid: wxContext.OPENID, appid: wxContext.APPID, unionid: wxContext.UNIONID } }
這裡有一個CoscosCreator遊戲開發群,歡迎喜歡聊技術的朋友加入
歡迎感興趣的朋友關注我的訂閱號“小院不小”,或點擊下方二維碼關注。我將多年開發中遇到的難點,以及一些有意思的功能,體會都會一一發布到我的訂閱號中
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※帶您來了解什麼是 USB CONNECTOR ?
※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面
※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!
※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※教你寫出一流的銷售文案?
論文提出NASH方法來進行神經網絡結構搜索,核心思想與之前的EAS方法類似,使用網絡態射來生成一系列效果一致且繼承權重的複雜子網,本文的網絡態射更豐富,而且僅需要簡單的爬山算法輔助就可以完成搜索,耗時0.5GPU day
來源:曉飛的算法工程筆記 公眾號
論文: Simple And Efficient Architecture Search for Convolutional Neural Networks
論文目標在於大量減少網絡搜索的計算量並保持結果的高性能,核心思想與EAS算法類似,主要貢獻如下:
$\mathcal{N}(\mathcal{X})$為$\mathcal{X}\in \mathbb{R}^n$上的一系列網絡,網絡態射(network morphism)為映射$M: \mathcal{N}(\mathcal{X}) \times \mathbb{R}^k \to \mathcal{N}(\mathcal{X}) \times \mathbb{R}^j$,從參數為$w\in \mathbb{R}k$的網絡$fw \in \mathcal{N}(\mathcal{X})$轉換為參數為$\tilde{w} \in \mathbb{R}j$的網絡$g\tilde{w} \in \mathcal{N}(\mathcal{X})$,並且滿足公式1,即對於相同的輸入,網絡的輸出不變。
下面給出幾種標準網絡結構的網絡態射例子:
將$f^w$進行公式2的替換,$\tilde{w}=(w_i, C, d)$,為了滿足公式1,設定$A=1$和$b=0$,可用於添加全連接層。
另外一種複雜點的策略如公式3,$\tilde{w}=(w_i, C, d)$,設定$C=A^{-1}$和$d=-Cb$,可用於表達BN層,其中$A$和$b$表示統計結構,$C$和$d$為可學習的$\gamma$和$\beta$。
假設$f_i{w_i}$可由任何函數$h$表示,即$f_i{w_i}=Ah^{w_h}(x)+b$
則可以將$f^w$,$w_i = (w_h, A, b)$配合任意函數$\tilde{h}{w_{\tilde{h}}}(x)$根據公式4替換為$\tilde{f}{\tilde{w}i}$,$\tilde{w}=(w_i, w{\tilde{h}}, \tilde{A})$,設定$\tilde{A}=0$。這個態射可以表示為兩種結構:
任何冪等的函數$f_i^{w_i}$都可以通過公式5進行替換,初始化$\tilde{w}_i=w_i$,公式5在無權重的冪等函數上也成立,比如ReLU。
任何層$f_i^{w_i}$都可以配合任意函數$h$進行公式6的替換,初始化$\lambda=1$,可用於結合任意函數,特別是非線性函數,也可以用於加入additive型的skip connection。
此外,不同的網絡態射組合也可以產生新的態射,比如可以通過公式2、3和5在ReLU層後面插入”Conv-BatchNorm-Relu”的網絡結構。
NASH方法基於爬山算法,先從小網絡開始,對其進行網絡態射生成更大的子網絡,由於公式1的約束,子網的性能與原網絡是一樣的,後續子網進行簡單的訓練看是否有更好的性能,最後選擇性能優異的子網進行重複的操作。
圖1可視化了NASH方法的一個step,算法1的ApplyNetMorph(model, n)包含n個網絡態射操作,每個為以下方法的隨機一種:
由於使用了網絡態射,子網繼承了原網絡的權重且性能一致,NASH方法優勢在於能夠很快的評估子網的性能,論文使用了簡單的爬山算法,當然也可以選擇其它的優化策略。
論文提出NASH方法來進行神經網絡結構搜索,核心思想與之前的EAS方法類似,使用網絡態射來生成一系列效果一致且繼承權重的複雜子網,本文的網絡態射更豐富,而且僅需要簡單的爬山算法輔助就可以完成搜索,耗時0.5GPU day
如果本文對你有幫助,麻煩點個贊或在看唄~
更多內容請關注 微信公眾號【曉飛的算法工程筆記】
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※為什麼 USB CONNECTOR 是電子產業重要的元件?
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※台北網頁設計公司全省服務真心推薦
※想知道最厲害的網頁設計公司"嚨底家"!
※推薦評價好的iphone維修中心
本文轉自Rancher Labs
作者介紹
王海龍,Rancher中國社區技術經理,負責Rancher中國技術社區的維護和運營。擁有6年的雲計算領域經驗,經歷了OpenStack到Kubernetes的技術變革,無論底層操作系統Linux,還是虛擬化KVM或是Docker容器技術都有豐富的運維和實踐經驗。
Rancher提供兩種安裝方法,單節點和高可用安裝。單節點安裝允許用戶快速部署適用於短期開發測試為目的的安裝工作。高可用部署明顯更適合Rancher的長期使用。
在實際使用中可能會遇到需要將Rancher Server遷移到其他的節點或local集群去管理的情況。 雖然可以使用最簡單的import集群方式納管,但帶來的問題是後續無法做集群的管理和升級維護,而且一些namespace和project的關聯關係將會消失。所以本文主要介紹如何將Rancher Server遷移到其他節點或local集群。
本文主要針對3個場景去講解如何遷移Rancher Server:
Rancher單節點安裝遷移至其他主機
Rancher單節點安裝遷移至高可用安裝
Rancher高可用安裝遷移至其他Local集群
Rancher 官方文檔文檔中並沒有說明支持以下場景的遷移,本文檔只是利用一些Rancher和RKE現有的功能實現遷移。
如果您在此過程中遇到問題,則應該熟悉Rancher架構/故障排除
遷移非常危險,遷移前一定剛要做好備份,以免發生意外無法恢復
您應該熟悉單節點安裝和高可用安裝之間的體繫結構差異
本文檔基於Rancher 2.4.x測試,其他版本操作可能會略有不同
本文檔主要講解Rancher Server的遷移,遷移過程中不會影響業務集群的使用
默認情況下, Rancher UI 上複製的 kubeconfig 通過cluster agent代理連接到 kubernetes 集群。變更 Rancher Server會導致cluster agent無法連接 Rancher Server,從而導致kubectl無法使用 Rancher UI 上複製的 kubeconfig 去操作 kubernetes 集群。但可以使用kubectl –context <CLUSTER_NAME>-fqdn 直接連接kubernetes集群進行操作。所以在執行遷移之前,請準備好所有集群的直連 kubeconfig 配置文件。
Rancher v2.2.2以及之後的版本,可以直接從UI上下載kubeconfig文件。
Rancher v2.2.2之前的版本,請參考:恢復 kubectl 配置文件
Rancher單節點安裝遷移至其他主機,只需要將舊集群Rancher Server容器的/var/lib/rancher目錄打包,然後替換到新Rancher Server對應的目錄,最後啟動新Rancher Server容器之後再更新agent相關配置即可。
1. Rancher 單節點安裝
提示:以下步驟創建用於演示遷移的 Rancher 單節點環境,如果您需要遷移正式環境可以跳過此步驟。
執行以下 docker 命令運行單節點 Rancher Server 服務
docker run -itd -p 80:80 -p 443:443 --restart=unless-stopped rancher/rancher:v2.4.3
等容器初始化完成后,通過節點 IP 訪問 Rancher Server UI,設置密碼並登錄。
2. 創建自定義集群
提示: 以下步驟創建用於演示的業務集群,用來驗證 Rancher 遷移后數據是否丟失,如果您需要遷移正式環境可以跳過此步驟。
登錄 Rancher UI 后,添加一個自定義集群
授權集群訪問地址設置為啟用,FQDN 和證書可以不用填寫。
注意:
這一步很關鍵。因為Rancher 遷移后,地址或者 token 或者證書的變更,將會導致 agent 無法連接 Rancher Server。遷移后,需要通過 kubectl 去編輯配置文件更新一些 agent 相關的參數。默認 UI 上的 kubeconfig文件是通過 agent 代理連接到 Kubernetes,如果 agent 無法連接 Rancher Server,則通過這個 kubeconfig 文件也無法訪問 Kubernetes 集群。開啟授權集群訪問地址功能會生成多個 Contexts Cluster,這些 Contexts Cluster 是直連 Kubernetes,不通過 agent 代理。如果業務集群未開啟這個功能,可以通過編輯集群來開啟這個功能。
點擊下一步,根據預先分配的節點角色選擇需要的角色,然後複製命令到主機終端執行。
集群部署完成后,進入集群首頁,點擊kubeconfig文件按鈕。在彈窗頁面中複製 kubeconfg 配置文件備用。
3.部署測試應用
部署一個nginx workload。再從應用商店部署一個測試應用。
4. 備份單節點Racher Server數據
docker create --volumes-from <RANCHER_CONTAINER_NAME> --name rancher-data-<DATE> rancher/rancher:<RANCHER_CONTAINER_TAG>
docker run --volumes-from rancher-data-<DATE> -v $PWD:/backup:z busybox tar pzcvf /backup/rancher-data-backup-<RANCHER_VERSION>-<DATE>.tar.gz -C /var/lib rancher
詳細請參考Rancher中文官網單節點備份指南。
5. 將生成的rancher-data-backup-<RANCHER_VERSION>-<DATE>.tar.gz複製到新的Rancher Server節點
scp rancher-data-backup-<RANCHER_VERSION>-<DATE>.tar.gz root@<new_rancher_ip>:/opt/
6. 使用備份數據啟動新節點Rancher Server
如果原Rancher Server通過使用已有的自簽名證書或使用已有的可信證書安裝,遷移時,需要將證書一起複制到新Rancher Server,使用相同啟動命令掛載證書和備份數據啟動Rancher Server。
cd /opt && tar -xvz -f rancher-data-backup-<RANCHER_VERSION>-<DATE>.tar.gz
docker run -itd -p 80:80 -p 443:443 -v /opt/rancher:/var/lib/rancher --restart=unless-stopped rancher/rancher:v2.4.3
7. 更新Rancher Server IP或域名
注意:
如果您的環境使用自簽名證書或Let’s Encrypt 證書,並且配置域名訪問Rancher Server。遷移之後集群狀態為
Active,請直接跳到第9步去驗證集群。
此時訪問新的Rancher Server就可以看見已經被管理的Kubernetes集群了,但此時集群狀態是unavailable,因為agent還連的是舊Rancher Server所以需要更新agent信息。
依次訪問全局 > 系統設置,頁面往下翻找到server-url文件
單擊右側的省略號菜單,選擇升級
修改server-url地址為新Rancher Server的地址
8. 更新agent配置
通過新域名或IP登錄 Rancher Server;
通過瀏覽器地址欄查詢集群ID, c/後面以c開頭的字段即為集群 ID,本例的集群ID為c-4wzvf;
訪問https://<新的server_url>/v3/clusters/<集群ID>/clusterregistrationtokens頁面;
打開clusterRegistrationTokens頁面后,定位到data字段;找到insecureCommand字段,複製 YAML 連接備用;
可能會有多組
"baseType": "clusterRegistrationToken",如上圖。這種情況以createdTS最大、時間最新的一組為準,一般是最後一組。
使用kubectl工具,通過前文中準備的直連kubeconfig配置文件和上面步驟中獲取的 YAML 文件,執行以下命令更新agent相關配置。
curl --insecure -sfL <替換為上面步驟獲取的YAML文件鏈接> | kubectl --context=xxx apply -f -
關於--context=xxx說明請參考直接使用下游集群進行身份驗證。
9. 驗證
過一會,集群變為Active狀態,然後驗證我們之前部署的應用是否可用。
從單個節點遷移到Rancher的高可用性安裝的過程可以概括為以下幾個步驟:
在Rancher單節點實例上:
備份Rancher單節點容器
備份etcd快照
停止舊的Rancher單節點容器
在RKE Local集群上:
使用RKE啟動Rancher Local集群
利用rke etcd snapshot-restore,將單節點備份的etcd快照恢復到RKE HA
在RKE Local集群中安裝Rancher
更新Local集群和業務集群的相關配置,使agent可以連接到正確的Rancher Server
1. Rancher 單節點安裝
提示: 以下步驟創建用於演示遷移的 Rancher 環境,如果您需要遷移正式環境可以跳過此步驟。
執行以下 docker 命令運行單節點 Rancher Server 服務
docker run -itd -p 80:80 -p 443:443 --restart=unless-stopped rancher/rancher:v2.4.3
等容器初始化完成后,通過節點 IP 訪問 Rancher Server UI,設置密碼並登錄。
2. 創建自定義集群
提示: 以下步驟創建用於演示的業務集群,用來驗證 Rancher 遷移后數據是否丟失,如果您需要遷移正式環境可以跳過此步驟。
登錄 Rancher UI 后,添加一個自定義集群
授權集群訪問地址設置為啟用,FQDN 和證書可以不用填寫。
注意: 這一步很關鍵。因為Rancher 遷移后,地址或者 token 或者證書的變更,將會導致 agent 無法連接 Rancher Server。遷移后,需要通過 kubectl 去編輯配置文件更新一些 agent 相關的參數。默認 UI 上的 kubeconfig文件是通過 agent 代理連接到 Kubernetes,如果 agent 無法連接 Rancher Server,則通過這個 kubeconfig 文件也無法訪問 Kubernetes 集群。開啟授權集群訪問地址功能會生成多個 Contexts Cluster,這些 Contexts Cluster 是直連 Kubernetes,不通過 agent 代理。如果業務集群未開啟這個功能,可以通過編輯集群來開啟這個功能。
點擊 下一步 ,根據預先分配的節點角色選擇需要的角色,然後複製命令到主機終端執行。
集群部署完成后,進入集群首頁,點擊kubeconfig文件按鈕。在彈窗頁面中複製 kubeconfg 配置文件備用。
3. 部署測試應用
部署一個nginx workload。再從應用商店部署一個測試應用。
4. 創建將單節點etcd快照
docker exec -it <RANCHER_CONTAINER_NAME> bash
root@78efdcbe08a6:/# cd /
root@78efdcbe08a6:/# ETCDCTL_API=3 etcdctl snapshot save single-node-etcd-snapshot
root@78efdcbe08a6:/# exit
docker cp <RANCHER_CONTAINER_NAME>:/single-node-etcd-snapshot .
5. 關閉單節點Rancher Server
docker stop <RANCHER_CONTAINER_NAME>
1. RKE部署Local Kubernetes 集群
根據RKE示例配置 創建 RKE 配置文件 cluster.yml:
nodes:
- address: 99.79.49.94
internal_address: 172.31.13.209
user: ubuntu
role: [controlplane, worker, etcd]
- address: 35.183.174.120
internal_address: 172.31.8.28
user: ubuntu
role: [controlplane, worker, etcd]
- address: 15.223.49.238
internal_address: 172.31.0.199
user: ubuntu
role: [controlplane, worker, etcd]
執行 rke 命令創建 Local Kubernetes 集群
rke up --config cluster.yml
檢查 Kubernetes 集群運行狀態
使用kubectl檢查節點狀態,確認節點狀態為Ready
kubectl get nodes
NAME STATUS ROLES AGE VERSION
15.223.49.238 Ready controlplane,etcd,worker 93s v1.17.6
35.183.174.120 Ready controlplane,etcd,worker 92s v1.17.6
99.79.49.94 Ready controlplane,etcd,worker 93s v1.17.6
檢查所有必需的 Pod 和容器是否狀況良好,然後可以繼續進行
kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
ingress-nginx default-http-backend-67cf578fc4-9vjq4 1/1 Running 0 67s
ingress-nginx nginx-ingress-controller-8g7kq 1/1 Running 0 67s
ingress-nginx nginx-ingress-controller-8jvsd 1/1 Running 0 67s
ingress-nginx nginx-ingress-controller-lrt57 1/1 Running 0 67s
kube-system canal-68j4r 2/2 Running 0 100s
kube-system canal-ff4qg 2/2 Running 0 100s
kube-system canal-wl9hd 2/2 Running 0 100s
kube-system coredns-7c5566588d-bhbmm 1/1 Running 0 64s
kube-system coredns-7c5566588d-rhjpv 1/1 Running 0 87s
kube-system coredns-autoscaler-65bfc8d47d-tq4gj 1/1 Running 0 86s
kube-system metrics-server-6b55c64f86-vg7qs 1/1 Running 0 79s
kube-system rke-coredns-addon-deploy-job-fr2bx 0/1 Completed 0 92s
kube-system rke-ingress-controller-deploy-job-vksrk 0/1 Completed 0 72s
kube-system rke-metrics-addon-deploy-job-d9hlv 0/1 Completed 0 82s
kube-system rke-network-plugin-deploy-job-kf8bn 0/1 Completed 0 103s
2. 將生成的單節點etcd快照從Rancher單節點實例傳到RKE Local集群節點上
在RKE HA Local節點上創建一個/opt/rke/etcd-snapshots目錄,並將single-node-etcd-snapshot文件複製到該目錄:
mkdir -p /opt/rke/etcd-snapshots
scp root@<old_rancher_ip>:/root/single-node-etcd-snapshot /opt/rke/etcd-snapshots
3. 使用RKE將單節點etcd快照還原到新的HA節點
rke etcd snapshot-restore --name single-node-etcd-snapshot --config cluster.yml
4. Rancher HA 安裝
參考安裝文檔安裝 Rancher HA。
5. 為Rancher HA配置NGINX 負載均衡
參考NGINX 配置示例為Rancher HA配置負載均衡。
Nginx 配置:
worker_processes 4;
worker_rlimit_nofile 40000;
events {
worker_connections 8192;
}
stream {
upstream rancher_servers_http {
least_conn;
server 172.31.11.95:80 max_fails=3 fail_timeout=5s;
server 172.31.0.201:80 max_fails=3 fail_timeout=5s;
server 172.31.15.236:80 max_fails=3 fail_timeout=5s;
}
server {
listen 80;
proxy_pass rancher_servers_http;
}
upstream rancher_servers_https {
least_conn;
server 172.31.11.95:443 max_fails=3 fail_timeout=5s;
server 172.31.0.201:443 max_fails=3 fail_timeout=5s;
server 172.31.15.236:443 max_fails=3 fail_timeout=5s;
}
server {
listen 443;
proxy_pass rancher_servers_https;
}
}
Nginx啟動后,我們就可以通過配置的域名/IP去訪問Rancher UI。可以看到業務集群demo為Unavailable狀態,local集群雖然為Active,但cluster-agent和node-agent均啟動失敗。
這兩種情況都是因為agent依然連接的舊的Rancher Server。
6. 更新Rancher Server IP或域名
依次訪問全局 > 系統設置,頁面往下翻找到server-url文件
單擊右側的省略號菜單,選擇升級
修改server-url地址為新Rancher server的地址
7. 更新local集群和業務集群的agent配置
通過新域名或IP登錄 Rancher Server;
通過瀏覽器地址欄查詢集群ID, c/後面以c開頭的字段即為集群 ID,本例的集群ID為c-hftcn;
訪問https://<新的server_url>/v3/clusters/<集群ID>/clusterregistrationtokens頁面;
打開clusterRegistrationTokens頁面后,定位到data字段;找到insecureCommand字段,複製 YAML 連接備用;
可能會有多組
"baseType": "clusterRegistrationToken",如上圖。這種情況以createdTS最大、時間最新的一組為準,一般是最後一組。
使用kubectl工具,通過前文中準備的直連kubeconfig配置文件和上面步驟中獲取的 YAML 文件,執行以下命令更新agent相關配置。
注意:
更新local集群和業務集群使用的kubeconfig是不同的,請針對不通集群選擇需要的kubeconfig。
關於
--context=xxx說明請參考直接使用下游集群進行身份驗證。
curl --insecure -sfL <替換為上面步驟獲取的YAML文件鏈接> | kubectl --context=xxx apply -f -
業務集群agent更新成功后,使用相同的方法更新local集群agent配置。
9. 驗證
過一會,local和demo集群都變為Active狀態:
Local集群的cluster-agent和node-agent啟動成功
Demo集群的cluster-agent和node-agent啟動成功
然後驗證我們之前部署的應用是否可用。
Rancehr高可用安裝遷移至其他Local集群,可以藉助rke的更新功能完成。通過rke將原來的3節點local集群擴展成6個節點,此時etcd數據將自動同步到local集群內的6個節點上,然後再使用rke將原有的3台節點移除,再次更新。這樣就將Rancher Server可以平滑的遷移到新的Rancher local集群。
1. RKE部署Local Kubernetes 集群
根據RKE示例配置創建 RKE 配置文件 cluster.yml:
nodes:
- address: 3.96.52.186
internal_address: 172.31.11.95
user: ubuntu
role: [controlplane, worker, etcd]
- address: 35.183.186.213
internal_address: 172.31.0.201
user: ubuntu
role: [controlplane, worker, etcd]
- address: 35.183.130.12
internal_address: 172.31.15.236
user: ubuntu
role: [controlplane, worker, etcd]
執行 rke 命令創建 Local Kubernetes 集群
rke up --config cluster.yml
檢查 Kubernetes 集群運行狀態
使用kubectl檢查節點狀態,確認節點狀態為Ready
kubectl get nodes
NAME STATUS ROLES AGE VERSION
3.96.52.186 Ready controlplane,etcd,worker 71s v1.17.6
35.183.130.12 Ready controlplane,etcd,worker 72s v1.17.6
35.183.186.213 Ready controlplane,etcd,worker 72s v1.17.6
檢查所有必需的 Pod 和容器是否狀況良好,然後可以繼續進行
kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
ingress-nginx default-http-backend-67cf578fc4-gnt5c 1/1 Running 0 72s
ingress-nginx nginx-ingress-controller-47p4b 1/1 Running 0 72s
ingress-nginx nginx-ingress-controller-85284 1/1 Running 0 72s
ingress-nginx nginx-ingress-controller-9qbdz 1/1 Running 0 72s
kube-system canal-9bx8k 2/2 Running 0 97s
kube-system canal-l2fjb 2/2 Running 0 97s
kube-system canal-v7fzs 2/2 Running 0 97s
kube-system coredns-7c5566588d-7kv7b 1/1 Running 0 67s
kube-system coredns-7c5566588d-t4jfm 1/1 Running 0 90s
kube-system coredns-autoscaler-65bfc8d47d-vnrzc 1/1 Running 0 90s
kube-system metrics-server-6b55c64f86-r4p8w 1/1 Running 0 79s
kube-system rke-coredns-addon-deploy-job-lx667 0/1 Completed 0 94s
kube-system rke-ingress-controller-deploy-job-r2nw5 0/1 Completed 0 74s
kube-system rke-metrics-addon-deploy-job-4bq76 0/1 Completed 0 84s
kube-system rke-network-plugin-deploy-job-gjpm8 0/1 Completed 0 99s
2. Rancher HA 安裝
參考安裝文檔安裝 Rancher HA。
3. 為Rancher HA配置NGINX 負載均衡
參考NGINX 配置示例為Rancher HA配置負載均衡。
Nginx 配置:
worker_processes 4;
worker_rlimit_nofile 40000;
events {
worker_connections 8192;
}
stream {
upstream rancher_servers_http {
least_conn;
server 172.31.11.95:80 max_fails=3 fail_timeout=5s;
server 172.31.0.201:80 max_fails=3 fail_timeout=5s;
server 172.31.15.236:80 max_fails=3 fail_timeout=5s;
}
server {
listen 80;
proxy_pass rancher_servers_http;
}
upstream rancher_servers_https {
least_conn;
server 172.31.11.95:443 max_fails=3 fail_timeout=5s;
server 172.31.0.201:443 max_fails=3 fail_timeout=5s;
server 172.31.15.236:443 max_fails=3 fail_timeout=5s;
}
server {
listen 443;
proxy_pass rancher_servers_https;
}
}
Nginx啟動后,我們就可以通過配置的域名/IP去訪問Rancher UI。可以導航到local->Nodes 查看到local集群三個節點的狀態:
4. 部署測試集群及應用
添加測試集群,Node Role同時選中etcd、Control Plane、Worker
等待測試集群添加成功后,部署一個nginx workload。再從應用商店部署一個測試應用。
5. 將新集群的節點添加到Local集群
修改剛才創建local集群所使用的rke配置文件,增加新集群的配置。
cluster.yml:
nodes:
- address: 3.96.52.186
internal_address: 172.31.11.95
user: ubuntu
role: [controlplane, worker, etcd]
- address: 35.183.186.213
internal_address: 172.31.0.201
user: ubuntu
role: [controlplane, worker, etcd]
- address: 35.183.130.12
internal_address: 172.31.15.236
user: ubuntu
role: [controlplane, worker, etcd]
# 以下內容為新增節點的配置
- address: 52.60.116.56
internal_address: 172.31.14.146
user: ubuntu
role: [controlplane, worker, etcd]
- address: 99.79.9.244
internal_address: 172.31.15.215
user: ubuntu
role: [controlplane, worker, etcd]
- address: 15.223.77.84
internal_address: 172.31.8.64
user: ubuntu
role: [controlplane, worker, etcd]
更新集群,將local集群節點擴展到6個
rke up --cluster.yml
檢查 Kubernetes 集群運行狀態
使用kubectl測試您的連通性,並確認原節點(3.96.52.186、35.183.186.213、35.183.130.12)和新增節點(52.60.116.56、99.79.9.244、15.223.77.84)都處於Ready狀態
kubectl get nodes
NAME STATUS ROLES AGE VERSION
15.223.77.84 Ready controlplane,etcd,worker 33s v1.17.6
3.96.52.186 Ready controlplane,etcd,worker 88m v1.17.6
35.183.130.12 Ready controlplane,etcd,worker 89m v1.17.6
35.183.186.213 Ready controlplane,etcd,worker 89m v1.17.6
52.60.116.56 Ready controlplane,etcd,worker 101s v1.17.6
99.79.9.244 Ready controlplane,etcd,worker 67s v1.17.6
檢查所有必需的 Pod 和容器是否狀況良好,然後可以繼續進行
kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
cattle-system cattle-cluster-agent-68898b5c4d-lkz5m 1/1 Running 0 46m
cattle-system cattle-node-agent-9xrbs 1/1 Running 0 109s
cattle-system cattle-node-agent-lvdlf 1/1 Running 0 46m
cattle-system cattle-node-agent-mnk76 1/1 Running 0 46m
cattle-system cattle-node-agent-qfwcm 1/1 Running 0 75s
cattle-system cattle-node-agent-tk66h 1/1 Running 0 2m23s
cattle-system cattle-node-agent-v2vpf 1/1 Running 0 46m
cattle-system rancher-749fd64664-8cg4w 1/1 Running 1 58m
cattle-system rancher-749fd64664-fms8x 1/1 Running 1 58m
cattle-system rancher-749fd64664-rb5pt 1/1 Running 1 58m
ingress-nginx default-http-backend-67cf578fc4-gnt5c 1/1 Running 0 89m
ingress-nginx nginx-ingress-controller-44c5z 1/1 Running 0 61s
ingress-nginx nginx-ingress-controller-47p4b 1/1 Running 0 89m
ingress-nginx nginx-ingress-controller-85284 1/1 Running 0 89m
ingress-nginx nginx-ingress-controller-9qbdz 1/1 Running 0 89m
ingress-nginx nginx-ingress-controller-kp7p6 1/1 Running 0 61s
ingress-nginx nginx-ingress-controller-tfjrw 1/1 Running 0 61s
kube-system canal-9bx8k 2/2 Running 0 89m
kube-system canal-fqrqv 2/2 Running 0 109s
kube-system canal-kkj7q 2/2 Running 0 75s
kube-system canal-l2fjb 2/2 Running 0 89m
kube-system canal-v7fzs 2/2 Running 0 89m
kube-system canal-w7t58 2/2 Running 0 2m23s
kube-system coredns-7c5566588d-7kv7b 1/1 Running 0 89m
kube-system coredns-7c5566588d-t4jfm 1/1 Running 0 89m
kube-system coredns-autoscaler-65bfc8d47d-vnrzc 1/1 Running 0 89m
kube-system metrics-server-6b55c64f86-r4p8w 1/1 Running 0 89m
kube-system rke-coredns-addon-deploy-job-lx667 0/1 Completed 0 89m
kube-system rke-ingress-controller-deploy-job-r2nw5 0/1 Completed 0 89m
kube-system rke-metrics-addon-deploy-job-4bq76 0/1 Completed 0 89m
kube-system rke-network-plugin-deploy-job-gjpm8 0/1 Completed 0 89m
從上面的信息可以確認現在local集群已經擴展到6個,並且所有workload均正常運行。
6. 再次更新集群,剔除掉原Local集群節點
再次修改local集群所使用的rke配置文件,將原local集群節點配置註釋掉。
cluster.yml:
nodes:
# - address: 3.96.52.186
# internal_address: 172.31.11.95
# user: ubuntu
# role: [controlplane, worker, etcd]
# - address: 35.183.186.213
# internal_address: 172.31.0.201
# user: ubuntu
# role: [controlplane, worker, etcd]
# - address: 35.183.130.12
# internal_address: 172.31.15.236
# user: ubuntu
# role: [controlplane, worker, etcd]
# 以下內容為新增節點
- address: 52.60.116.56
internal_address: 172.31.14.146
user: ubuntu
role: [controlplane, worker, etcd]
- address: 99.79.9.244
internal_address: 172.31.15.215
user: ubuntu
role: [controlplane, worker, etcd]
- address: 15.223.77.84
internal_address: 172.31.8.64
user: ubuntu
role: [controlplane, worker, etcd]
更新集群,完成遷移。
rke up --cluster.yml
檢查 Kubernetes 集群運行狀態
使用kubectl檢查節點狀態為Ready,可以看到local集群的節點已經替換成了以下3個:
kubectl get nodes
NAME STATUS ROLES AGE VERSION
15.223.77.84 Ready controlplane,etcd,worker 11m v1.17.6
52.60.116.56 Ready controlplane,etcd,worker 13m v1.17.6
99.79.9.244 Ready controlplane,etcd,worker 12m v1.17.6
檢查所有必需的 Pod 和容器是否狀況良好,然後可以繼續進行
kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
cattle-system cattle-cluster-agent-68898b5c4d-tm6db 1/1 Running 3 3m14s
cattle-system cattle-node-agent-9xrbs 1/1 Running 0 14m
cattle-system cattle-node-agent-qfwcm 1/1 Running 0 14m
cattle-system cattle-node-agent-tk66h 1/1 Running 0 15m
cattle-system rancher-749fd64664-47jw2 1/1 Running 0 3m14s
cattle-system rancher-749fd64664-jpqdd 1/1 Running 0 3m14s
cattle-system rancher-749fd64664-xn6js 1/1 Running 0 3m14s
ingress-nginx default-http-backend-67cf578fc4-4668g 1/1 Running 0 3m14s
ingress-nginx nginx-ingress-controller-44c5z 1/1 Running 0 13m
ingress-nginx nginx-ingress-controller-kp7p6 1/1 Running 0 13m
ingress-nginx nginx-ingress-controller-tfjrw 1/1 Running 0 13m
kube-system canal-fqrqv 2/2 Running 0 14m
kube-system canal-kkj7q 2/2 Running 0 14m
kube-system canal-w7t58 2/2 Running 0 15m
kube-system coredns-7c5566588d-nmtrn 1/1 Running 0 3m13s
kube-system coredns-7c5566588d-q6hlb 1/1 Running 0 3m13s
kube-system coredns-autoscaler-65bfc8d47d-rx7fm 1/1 Running 0 3m14s
kube-system metrics-server-6b55c64f86-mcx9z 1/1 Running 0 3m14s
從上面的信息可以確認現在local集群已經遷移成功,並且所有workload均正常運行。
修改nginx負載均衡配置,將新節點的信息更新到nginx配置文件中
worker_processes 4;
worker_rlimit_nofile 40000;
events {
worker_connections 8192;
}
stream {
upstream rancher_servers_http {
least_conn;
server 172.31.14.146:80 max_fails=3 fail_timeout=5s;
server 172.31.8.64:80 max_fails=3 fail_timeout=5s;
server 172.31.15.215:80 max_fails=3 fail_timeout=5s;
}
server {
listen 80;
proxy_pass rancher_servers_http;
}
upstream rancher_servers_https {
least_conn;
server 172.31.14.146:443 max_fails=3 fail_timeout=5s;
server 172.31.8.64:443 max_fails=3 fail_timeout=5s;
server 172.31.15.215:443 max_fails=3 fail_timeout=5s;
}
server {
listen 443;
proxy_pass rancher_servers_https;
}
}
7. 驗證
確認local集群和業務集群狀態為Active
確認Local集群節點已被替換
原集群節點IP分別為:3.96.52.186、35.183.186.213、35.183.130.12
然後驗證我們之前部署的應用是否可用。
開源一直是Rancher的產品理念,我們也一向重視與開源社區用戶的交流,為此創建了20個微信交流群。本篇文章的誕生源於和社區用戶的多次交流,發現許多Rancher用戶都有類似的問題。於是,我總結了三個場景並經過反覆測試,最終完成這篇教程。我們也十分歡迎各位Rancher用戶以各種形式分享自己的使用經驗,一起共建愉快的開源社區。
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能
※台北網頁設計公司這麼多該如何選擇?
※智慧手機時代的來臨,RWD網頁設計為架站首選
※評比南投搬家公司費用收費行情懶人包大公開
※回頭車貨運收費標準
摘錄自2020年10月7日中央社報導
俄羅斯國營的俄羅斯天然氣工業公司架設通往德國的北溪天然氣2號管線,波蘭反托拉斯當局今(7日)決定罰款76億美元,原因是這項計畫不利波蘭消費者且增加歐盟對俄國進口的仰賴。
美聯社報導,俄羅斯天然氣工業公司(Gazprom)表示,將就波蘭競爭及消費者保護署(OCCP)的這項裁決提起上訴。波蘭競爭及消費者保護署也對其他5家參與這項方案的跨國公司,處以總額6100萬美元(約新台幣17億4900萬元)的罰款。
波蘭競爭及消費者保護署表示,參與這項計畫的各家公司,未取得共同闢建這條管線及融資的必要許可,這違反了反托拉斯法。這項裁決迫使6家公司取消為這項計畫籌募資金的合約。
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※為什麼 USB CONNECTOR 是電子產業重要的元件?
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※台北網頁設計公司全省服務真心推薦
※想知道最厲害的網頁設計公司"嚨底家"!
※推薦評價好的iphone維修中心