1. 程式人生 > >把專案遷移到Kubernetes上的5個小技巧

把專案遷移到Kubernetes上的5個小技巧

我們將在本文中提供5個訣竅幫你將專案遷移到Kubernetes上,這些訣竅來源於過去12個月中OpenFaas社群的經驗。下文的內容與Kubernetes 1.8相容,並且已經應用於OpenFaaS - Serverless Functions Made Simple的實踐中。

免責宣告
因為Kubernetes 的API更新的特別頻繁,請參考官方文件獲得最新資訊。

1. 將所有的內容都放進Docker

第一步操作是給以獨立程序方式執行的每個元件建立一個Dockerfile,這看起來是顯而易見的。如果你已經這麼做了,那麼你已經快人一步了。

但是如果你還沒有開始這麼做,那麼請確保你的每一個元件都在使用多階段構建。一個多階段的構建要用到兩個Docker映象: 一個是構建時;一個是執行時。舉例來說,基礎的映象可能是一個Go SDK用來編譯二進位制檔案,最後階段則是一個類似Alpine Linux的最小的Linux映象。我們將二進位制檔案拷貝到最終階段的映象中,安裝類似CA證書這樣的軟體包,然後設定入口(entry-point)。這樣你最後得到的映象體積很小而且不會包括不需要的軟體包。


這裡給出一個例子: Go寫的OpenFaaS API gateway 元件的多階段構建。你會注意到它裡面包含的一些其它實踐:
  • 使用一個非root使用者的執行時
  • 將構建時的階段命名為類似build
  • 指定構建的基礎架構,比如linux
  • 使用版本做標籤,比如3.6。 如果你使用latest,那會導致不可預知的情況。

例子如下:
FROM golang:1.9.4 as build
WORKDIR /go/src/github.com/openfaas/faas/gateway

COPY .   .

RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o gateway .

FROM alpine:3.6

RUN addgroup -S app \
&& adduser -S -g app app

WORKDIR /home/app

EXPOSE 8080
ENV http_proxy      ""
ENV https_proxy     ""

COPY --from=build /go/src/github.com/openfaas/faas/gateway/gateway    .
COPY assets     assets

RUN chown -R app:app ./

USER app

CMD ["./gateway"]


注意:
如果你想要使用OpenShift(一個Kubernetes的發行版),那麼你必須保證你所有的Docker映象都是以非root使用者執行的。

1.1 獲得Kubernetes

你需要在你的筆記本或者開發機上裝好Kubernetes。 可以閱讀我寫的一篇博文,描述了在Mac上執行Docker和Kubernetes的所有常用選項。

如果你之前已經用過Docker了,那麼你可能已經熟悉容器這個詞了。在Kubernetes的詞彙表裡面你會很少直接操作容器,取而代之的是抽象為Pod的概念。

一個Pod是一個到多個容器組成的一個組,裡面的這些容器被集中的排程和部署並通過環回介面127.0.0.1互相訪問。

這裡給出一個例子,說明Pod抽象的用處:比方說你有一個傳統的應用,本身沒有TLS/SSL支援。它可以與一個配置了TLS的Nginx或者其它Web伺服器部署到一個Pod中。這麼做的優點是可以將多個容器部署到一起來擴充套件它的功能而不會帶來破壞性改變。

2. 建立YAML檔案

在你有了Dockerfile和映象之後,下一步你就需要開始寫Kubernetes格式的YAML檔案了。叢集會讀取這些檔案來部署應用然後維持你專案的狀態。

這與Docker本身的Compose files是不同的,剛開始你可能會覺得困難。我的建議是到文件裡面找一些例子或者其它的專案試著模仿跟隨它們的樣式和方法。好訊息就是隨著經驗增長你會覺得越來越容易。

每一個Docker映象都需要在Deployment物件裡面定義,指定需要執行的容器和它需要的資源。一個Deployment會建立和維持Pod來執行你的程式碼,如果Pod已經存在它會為你重起。

如果你想要通過HTTP/TCP來訪問,那麼需要為每一個元件建立一個Service物件。

你可以將多個Kubernetes定義寫到一個檔案裡面,然後資源之間通過---和一個新行來分隔。但是更加普遍的做法是將定義寫到多個檔案裡面去,每個檔案代表叢集中的一個API物件。

例如:
  • gateway-svc.yml //代表一個service服務
  • gateway-dep //代表一個deployment

如果所有的檔案都在一個目錄下,那麼你可以通過一條命令來應用它們所有檔案:
kubectl apply -f ./yaml/

當你需要執行在其它的作業系統或者架構(類似Raspberry Pi)時,我們推薦將檔案放到一個新的目錄裡面,類似yaml_arm的目錄名。

Deployment的例子

這裡給出一個Deployment的例子,用來部署 NATS Streaming(一個輕量級的分發工作的流平臺):
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nats
namespace: openfaas
spec:
replicas: 1
template:
metadata:
  labels:
    app: nats
spec:
  containers:
  - name:  nats
    image: nats-streaming:0.6.0
    imagePullPolicy: Always
    ports:
    - containerPort: 4222
      protocol: TCP
    - containerPort: 8222
      protocol: TCP
    command: ["/nats-streaming-server"]
    args:
      - --store
      - memory
      - --cluster_id
      - faas-cluster

一個deployment也可以宣告在啟動時給service(服務)建立多個副本或者例項。

Service 定義

apiVersion: v1
kind: Service
metadata:
name: nats
namespace: openfaas
labels:
app: nats
spec:
type: ClusterIP
ports:
- port: 4222
  protocol: TCP
  targetPort: 4222
selector:
app: nats

Service提供了一種機制可以在你的Deployment的多個副本之間對請求做負載均衡。在之前的例子中我們只有單副本的NATS Streaming,但是如果我們有多個副本,它們每個都有獨立的IP地址,追蹤它們就會變成問題。使用Service的優點是它可以有一個靜態IP地址和DNS入口,通過它們可以隨時訪問到任意一個副本。

Service不是直接對映到Deployment的,它對映到label(標籤)上。在上面的例子中Service會尋找app=nats的標籤。標籤可以在執行時狀態下從Deployment(或者其它API物件)上增加或者刪除,這樣在你的叢集中重定向流量就相當容易。這些可以方便的啟用A/B測試或者滾動釋出。

學習Kubernetes相關YAML語法的最好方式是檢視官方文件裡面相關的API物件的章節,你可以從中找到YAML或者kubectl使用的例子。

更多API物件的文件請檢視:https://kubernetes.io/docs/concepts/

2.1 Helm

Helm說它自己是Kubernetes的包管理器。 從我的觀點來看它主要提供了兩個主要功能:

分發你的應用(在一個Chart裡面)

一旦你已經準備好分發你專案的yaml檔案時,你可以將它們打包提交到Helm倉庫中。這樣其它人就可以找到你的應用,通過一條命令就可以安裝。Chart本身可以有版本控制,也可以指定依賴與其它的Chart。

這裡有三個Chart的例子:OpenFaaSKakfaMinio

讓編輯更簡單

Helm支援Go語言的內嵌模板,你可以將通用的配置專案放到一個檔案裡面。所以如果你釋出了一組新的Docker映象需要做更新,你只需要在一個地方做修改。你也可以寫條件判斷語句,這樣將flag和helm命令一起使用可以在部署時啟用不同的配置項和feature。

在正常的Yaml檔案裡面我們這樣定義容器映象:
image: functions/gateway:0.7.5

使用Helm模板我們這樣做:
image: {{ .Values.images.gateway }} 

然後在一個單獨的檔案中我們可以定義imags.gateway的值。Helm能讓我們做的另一件事情是使用條件判斷——當要支援多個架構或者feature時非常有用。

下面再給一個例子展現如何選擇應用ClusterIP或者NodePort,這是暴露叢集中某個服務的兩種不同方式。NodePort會將服務暴露到叢集以外,所以你可能需要控制什麼時候要這個功能。

如果我們使用常規的YAML檔案,那意味著我們需要兩組配置檔案:
spec:
type: {{ .Values.serviceType }}
ports:
- port: 8080
  protocol: TCP
  targetPort: 8080
  {{- if contains "NodePort" .Values.serviceType }}
  nodePort: 31112
  {{- end }} 

在這個例子裡面“.serviceType”可以是ClusterIP或者NodePort,下面的語句說明在條件滿足時將nodePort元素加入到YAML中。

3. 使用ConfigMaps

在Kubernetes中你可以通過ConfigMap將配置檔案載入到叢集中。ConfigMap比“bind mounting”的方式要好因為配置檔案的資料會被複制到整個叢集中,保證了魯棒性。如果資料是通過bind mount方式從一臺主機上掛載的,那麼你必須要事先把資料放置到這臺主機中,並且同步好。這兩種方式都要比把配置檔案直接打進映象的方式好,因為那樣更新配置檔案很不方便。

一個ConfigMap可以通過kubectl或者YAML檔案按需呼叫。一旦叢集中建好了一個ConfigMap,那麼它就可以被新增進容器或者Pod中。

下面是一個為Prometheus定義的ConfigMap的例子:
kind: ConfigMap
apiVersion: v1
metadata:
labels:
app: prometheus
name: prometheus-config
namespace: openfaas
data:
prometheus.yml: |
scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 5s
    static_configs:
      - targets: ['localhost:9090']

你可以將它載入進一個Deployment或者Pod中:
volumeMounts:
    - mountPath: /etc/prometheus/prometheus.yml
      name: prometheus-config
      subPath: prometheus.yml
  volumes:
    - name: prometheus-config
      configMap:
        name: prometheus-config
        items:
          - key: prometheus.yml
            path: prometheus.yml
            mode: 0644

檢視完整例子:ConfigMap Prometheus config

更多文件檢視:https://kubernetes.io/docs/tas ... gmap/

4. 使用安全的Secret

為了保證你密碼,API Key,token等的私密性和安全性,你需要使用Kubernetes的secret管理機制。

如果你已經熟悉了ConfigMaps的使用,那麼有一個好訊息,secret的使用方式基本一樣:
  • 在叢集中定義secret
  • 通過mount載入進一個Deployment/Pod中

當你需要從一個私有的Docker映象倉庫拉映象下來時,你可能會用到的其它的secret型別。這被稱之為ImagePullSecret, 更多資訊參見這裡

關於如何建立和管理secret在官方文件裡面有更多資訊:https://kubernetes.io/docs/con ... cret/

5. 實現健康檢查health-checks

Kubernetes通過liveness和readiness的檢查來實現健康檢查。我們需要利用這些機制來確保我們叢集的自愈和失效保護。它們的工作方式:通過一個探針(probe)來在Pod裡面執行一個命令或者呼叫一個預先定義好的HTTP入口。

Liveness

一個liveness檢查可以檢視程式是否在執行。針對OpenFaaS functions我們會在function啟動時建立一個/tmp/.lock的鎖檔案。如果我們發現非健康狀態,我們會將這個檔案刪除,Kubernetes就會給我們重新排程這個function。

另外一種常用方式是增加一個新的HTTP路由類似/_/healthz。使用/_/是一種傳統做法因為這樣不會跟已經存在的其它路由衝突。

Readiness

如果你在Kubernetes裡面啟用了readiness檢查,那麼它只會給通過測試條件的容器轉發流量。

readiness檢查可以是定期的執行,這與health-check不同。一個容器即使在高負載下也可以是健康的——只是這種情況我們定義為“Not ready"這樣Kubernetes就會停止給它轉發流量直到它恢復。

官方文件有更多關於這方面的資訊:https://kubernetes.io/docs/tas ... obes/

總結

在這篇文章中,我們列出了一些當要把專案遷移到Kubernetes上要做的一些核心工作。這包括:
  • 建立好的Docker映象
  • 書寫好的Kubernetes清單(YAML檔案)
  • 使用ConfigMap來將配置和程式碼解耦
  • 使用Secret來保護API Key這樣的隱私資料
  • 使用liveness 和readiness探針來實現彈性和自愈

接下來你可以閱讀我寫的Docker Swarm vs Kubernetes的比較和快速搭建一個叢集的指南:

比較Docker Kubernetes和Swarm, 得的一個從CLI到網路到元件的工具概覽。

如果你想要在一個VM或者雲主機上執行Kubernetes, 這可能是將一個開發叢集跑起來最快速的方式了。

Java架構師學習公眾號!

一個專注分享架構乾貨的微信公眾號


相關推薦

專案遷移Kubernetes5技巧

我們將在本文中提供5個訣竅幫你將專案遷移到Kubernetes上,這些訣竅來源於過去12個月中OpenFaas社群的經驗。下文的內容與Kubernetes 1.8相容,並且已經應用於OpenFaaS - Serverless Functions Made Simple的實踐中

5技巧讓你寫出更好的 JavaScript 條件語句

來源:掘金,譯者:Hopsken 連結:https://juejin.im/post/5bb9e3085188255c352d7326 作者:@Jecelyn Yeen 原文:https://scotch.io/tutorials/5-tips-to-write-better-conditi

Java面試的5技巧

1. 筆試筆試這個環節是很容易,幾張試卷,一共也就十幾道題。一般由5至10個選擇題+2至5個論述題+1至2個程式設計題組成。平靜心態--瀏覽所有題目--開答答題的時候,要先把自己會的快速的答上來,選擇題自然不多說了,論述題根據自己的理解大致說明一下,多少會給你自己加分的。程式

面試的5技巧

轉行做程式設計也有一年多了。最近幾個月裡,我參加了幾次面試,作為面試者,遇到了若干不靠譜的人;作為被面試者,倒是成功率滿高的.. 雖然都是相對初級的職位,但想想園子裡也有一些正在轉行或者打算換工作的萌新,因此,我要把自己總結的5個面試小技巧寫出來,分享給大家參考。它們分別是

Excel表中常用5技巧,看似不起眼操作很強大

Excel技巧是辦公必備,在職場中手裡沒點硬貨,怎樣能在高強度的工作中“奮戰”狀態。相信熟練使用工作中的軟體會加分很多吧,不僅時間

JQuery基礎以及5案例

進行 change 遍歷 selectall 獲得 idea 獲取 設置 html 1.JQ完成定時彈出廣告   步驟分析 創建html文檔 在頁面中創建一個廣告部分的div,設置div隱藏 設置定時操作,1秒執行一個顯示的方法 設置定時操作.1秒執行一個隱藏方法 /

中國歷史5謠言,單是第1條就騙了不少人!

內部 說明 道理 技術分享 -i 取代 統一 三國 並不是 謠言1:嘉慶要殺和珅,和珅拿出乾隆留下的保命密信,打開一看卻傻了眼,上邊寫著三個字:“留全屍”。 【真相】:這個橋段其實是小說和電視劇裏杜撰的,只是為了增加劇情的需要,但卻被當成了歷史上的真事。身為清朝第一

【廣州服務器回收】服務器維護過程中,你需要了解的5常識

windows ron 就是 圖片 渲染 天都 驚人的 領域 其他人 大多數人認為,服務器僅僅是升級後的臺式機。但任何在數據中心工作過的人都知道,它們的差別挺大的。 盡管web服務器每天都要承擔數百萬訪問者的負載,但對於普通用戶來說,它們仍然神秘莫測。以下是關於服務器你可能

分享5眾實用神器APP,值得你去下載,知道的人沒多少

好久沒給大家分享軟體了,今天給大家分享幾款比較實用優質一點的,每一個功能都比較強大。 ▶▶▶ 1、每日影視 這是一個可以免費看影視資源的APP。 軟體可以免費看最新電影、電視劇、動漫等資源,並且可以看電視直播、搜尋資源。 軟體最大的特點就是速度十分的快,並且軟體的介面也十分的簡潔。 ▶

5眾且實用性超高的國產APP,每一個都是良心分享!

手機APP是大家都用用到的一些軟體,而隨著APP的快速興起,越大越多的APP讓人挑的眼花繚亂,因此,今天小編為大家分享5個小眾且實用性超高的國產APP,每一個都是良心分享哦! 1.收趣:一款高效的閱讀整理應用 ——分類收藏:集中收藏,杜絕分散,一鍵即可分類全文搜尋; ——離線閱讀:先收藏,後閱讀; —

vue 專案中常見的幾問題

(1).H5頁面在iOS網頁中手機號碼顏色改變 H5頁面在iOS網頁中的數字被識別為電話號碼,原因在於Safari瀏覽器的問題:解決該問題只需在head標籤中新增如下程式碼即可解決。 <metaname="format-detection"content="telephone=no"&

專案放在github的步驟

  開啟github(https://github.com)網站,登陸網站 新建一個倉庫,出現以下圖片 在git命令裡面打以下程式碼 git init git add README.md git commit -m "first commit"("f

類Unix5最佳開源備份工具 Bacula/Amanda/Backupninja/Backuppc/UrBackup

當為一個企業選擇備份工具的時候,你都考慮什麼呢?確定你正在部署的軟體具有下面的特性     開源軟體 – 你務必要選擇那些原始碼可以免費獲得,並且可以修改的軟體。確信可以恢復你的資料,即使是軟體供應商/專案停止繼續維護這個軟體,或者是拒絕繼續為這個軟體提供補丁。  &n

求出100以內的素數,並將這些書在螢幕5一行地顯示出來。

class prime{ public boolean prime(int n){ for(int i=2;i<n;i++) { if(n%i==0) return false; } return true; } } public class

大型C++專案必須注意的幾問題

有些問題對於小型的C++專案來說可能無關緊要,但對於大中型C++專案來講,這些問題卻成了大問題。什麼樣的專案算是小型專案呢,什麼樣的算是大中型專案呢,我認為10萬LOC以下為小型專案,10-50萬LOC為中型專案,50萬LOC以上為大型專案。當然,不能單純地以程式碼行數作為衡

用python(2.7)文字文件分成幾文件

    在今天下了一個.txt格式的檔案,不過內容很多有12M,所以想分成幾個小的檔案。想到用python,查了一下,用了很磋的辦法,不管啦,關鍵是達到目的麼,以後有更好的辦法再更新麼^_^ inputFile = file("xianni.txt","r") partNu

總結自己使用shell命令行經常使用到的8技巧

技巧 span get ash lan host tab localhost 沒有 原創blog,轉載請註明出處 Shell是命令解釋器 [[email protected]/* */ ~]# cat /etc/shells 查看本系統共支持哪些shel

五十技巧提高PHP執行效率(一)

雙引號 超時 而不是 也會 per 遠程 設置 作用 我們 在項目開發過程中,經常遇到了一些PHP處理程序性能底下的情況,程序運行在centos+nginx環境,雖然這個有很多的原因如:服務器本身配置,運行環境nginx服務,php-fpm配置等等,更多有一點仍然是PHPe

作為運營新人,取標題的這10技巧你需要掌握

運營當我們一看到“ 標題黨 ” 這三個字,不用多說,心裏絕對都是壞的印象。一篇 shit 一樣的文章,靠一個好的標題,是可以獲得不錯的點擊量,但 內容運營 的最終目的是為了數據好看嗎?起一個好的標題確實是一個文章能否獲得關註和點擊率的關鍵,但如何在不成為“ 標題黨 ” 的前提下取 好標題呢?近日fansir

jquery操作復選框(checkbox)的12技巧總結

== 索引 復選框 小技巧 rst jquery操作 radio rem val 1、獲取單個checkbox選中項(三種寫法) $("input:checkbox:checked").val() 或者 $("input:[type=‘checkbox‘]:checked