歡迎光臨
每天分享高質量文章

使用 Kubernetes 在 Windows 10 上建立本地叢集

最近我的一個客戶在他們的核心基礎設施中開始嘗試使用 Kubernetes,可能有些讀者對 Kubernetes 不太熟悉,Kubernetes 是由 Google 開發的 DevOps 工具,可以用以管理容器化的服務。 所有跡象都表明 Kubernetes 在 DevOps 中正在成為一顆新星,所以我覺得我也要研究一下。
老實說,我原以為容器的概念會是下一個潮流。對我來說,工作中使用容器進行抽象並沒有獲得多大好處。這麼說的部分原因是我對科技潮流的憤世嫉俗,另一方面源自我對系統管理有限的經驗。事實證明,容器的概念會保留下來,至少現在會。

標的

我的標的是使用 Kubernetes 啟動一個簡單的節點應用,以便可以更好地理解 Kubernetes 是如何執行的。節點應用是一個簡單的 REST API,只有一個 endpoint,除了幾個 package 外沒有其他實際的依賴或環境要求。為了在學習曲線上增加點難度,我將在 Kubernetes 叢集上使用 Helm Chart 來管理,定義和安裝程式。

建立本地叢集

與許多開發者不同,我主要在 Windows 上工作。 請不要誤解,我不是一個受虐狂,我所有的開發都是在 VirtualBox 中的 Ubuntu VM 上進行的。但是,這樣做讓我在區域網上設定 Kubernetes 叢集時處於劣勢。與大多數開源工具一樣,Kubernetes 是為在 unix 環境中工作而設計的,因此在某些方面上存在一些衝突。
首先在我的機器上安裝 Minikube。 Minikube 的開發人員友好地提供了多種作業系統的版本,包括 Windows。安裝 Minikube 本身很簡單,並且已經安裝了 VirtualBox,所以我可以馬上嘗試啟動並執行叢集。
安裝 minikube 和 kubectl:
  • 下載 Windows 版本安裝檔案[1],並執行

  • 下載[2]並安裝 kubectl,我簡單加了一個自定義的 bin 檔案夾,用於存放環境變數

  • 開啟 CMD,鍵入 minikube start, 一旦 minikube 啟動,叢集安裝,就可以使用 kubectl cluster-info 來確認

Minikube 非常棒,因為儘管 Kubernetes 設計用於多節點, 但 Minikube 允許在本地網路中只用一個 VM 建立工作叢集。如果你的電腦硬體配置有限的話,這就非常有幫助。

容器化

看到這裡,如果想跳過此部分,可以使用我 push 到 dockerhub 的公共測試映象[3],直接跳到下一章節。
考慮到 Kubernetes 是一個容器編排工具,下一步就是建立容器化應用,我使用已經在虛擬機器中安裝的 Docker 來完成,在節點中建立一個簡單的測試應用程式。如果你完全在 Windows 下工作,同樣也有相應版本可以達到相同效果。
幾行程式碼就可以寫好一個簡單 app 的 Dockerfile。
FROM node:8.5.0 
WORKDIR /usr/src/node-service
# Install node packages
COPY package.json ./
RUN npm install
# Copy the source for the app
COPY . .
# Run the app
CMD ["npm", "start"]
# Expose container ports
EXPOSE 3000
接下來在本地編譯 Docker 映象,並啟動容器,測試各個部分都如預期工作正常。
docker build -t fullbit/node-service .
docker run -p 3000:3000 -d fullbit/node-service
確認無誤後,我會把映象 push 到 dockerhub 的 repository 上,沒有賬號的話需要建立一個。
docker login
docker push fullbit/node-service:latest
一旦你掌握,上述所有建立 Dockerfile、push 映象到 repository 的操作都會非常簡單。對我來說,最初的學習曲線是理解映象和容器之間的區別,一旦理解,工作起來就會很輕鬆。

Helm Charts

我的客戶的基礎設施依賴 Helm Chart,所以我也打算自己探索一下。Helm Chart 是一個幫助你定義、安裝及更新 Kubernetes 的工具,安裝 Helm 也很簡單,如下:
  1. 下載[4]安裝檔案

  2. 壓並將 helm.exe 放到與 kubectl 相同的 bin 檔案夾中

  3. 開啟 CMD,執行 helm 確認安裝

  4. 在 CMD 中執行 helm init 命令在 minikube 叢集上安裝 Tiller

執行 helm create node-service 便可以輕鬆建立 chart,會生成一個包含某些檔案的檔案夾。 基本概念是,使用 Chart.yaml 定義 chart,然後在 values.yaml 中定義模板值。然後透過將這些值插入模板目錄中的模板,從而生成 Kubernetes 清單。
要為節點應用程式配置一個非常基礎的工作 chart,我們只需對生成的圖表檔案進行一些更改即可。首先,需要定義 Docker 容器映象的 repository 和 service 的值:
values.yaml
replicaCount: 1
image:
 repository: fullbit/node-service
 tag: latest
 pullPolicy: IfNotPresent
service:
 type: NodePort
 port: 3000
 nodePort: 30001
ingress:
 enabled: false
 annotations: {}
 path: /
 hosts:
   - chart-example.local
 tls: []
resources: {}
nodeSelector: {}
tolerations: []
affinity: {} }}}
接下來需要使用 service 埠值更新部署模板:
{{{templates/deployment.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
 name: {{ template "node-service.fullname" . }}
 labels:
   app: {{ template "node-service.name" . }}
   chart: {{ template "node-service.chart" . }}
   release: {{ .Release.Name }}
   heritage: {{ .Release.Service }}
spec:
 replicas: {{ .Values.replicaCount }}
 selector:
   matchLabels:
     app: {{ template "node-service.name" . }}
     release: {{ .Release.Name }}
 template:
   metadata:
     labels:
       app: {{ template "node-service.name" . }}
       release: {{ .Release.Name }}
   spec:
     containers:
       - name: {{ .Chart.Name }}
         image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
         imagePullPolicy: {{ .Values.image.pullPolicy }}
         ports:
           - name: http
             containerPort: {{ .Values.service.port }}
             protocol: TCP
         livenessProbe:
           httpGet:
             path: /
             port: http
         readinessProbe:
           httpGet:
             path: /
             port: http
         resources:
{{ toYaml .Values.resources | indent 12 }}
   {{- with .Values.nodeSelector }}
     nodeSelector:
{{ toYaml . | indent 8 }}
   {{- end }}
   {{- with .Values.affinity }}
     affinity:
{{ toYaml . | indent 8 }}
   {{- end }}
   {{- with .Values.tolerations }}
     tolerations:
{{ toYaml . | indent 8 }}
   {{- end }}
最後必須使用 service 值更新 service 模板:
templates/service.yaml
apiVersion: v1
kind: Service
metadata:
 name: {{ template "node-service.fullname" . }}
 labels:
   app: {{ template "node-service.name" . }}
   chart: {{ template "node-service.chart" . }}
   release: {{ .Release.Name }}
   heritage: {{ .Release.Service }}
spec:
 type: {{ .Values.service.type }}
 ports:
   - port: {{ .Values.service.port }}
     nodePort: {{ .Values.service.nodePort }}
     protocol: TCP
     name: http
 selector:
   app: {{ template "node-service.name" . }}
   release: {{ .Release.Name }}
應用預設會執行在一個內網 IP 上,外網不可訪問。要將應用暴露給外網,我們定義了一個 nodePort 服務來將應用程式容器公開到託管應用程式節點上的一個埠。
可以點選這裡[5]瞭解 Kubernetes 服務的更多資訊。
下麵使用 helm package node-service 打包 helm chart 用於部署,使用 helm install node-service-0.1.0.tgz 部署。
訪問 :,檢查應用是否正常執行。我們執行的是 Minikube,所以只有一個節點,可以用下麵的命令得到節點的 IP:
kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}"
至此,我們就完工了!使用 Helm 和 Kubernetes 將應用部署到了本地叢集,使用 nodePort 服務將服務暴露給外網,可以使用瀏覽器訪問應用。
儘管 Helm 本身不是太複雜,但我確實發現額外的抽象層會令人困惑。但看起來 Helm 確實可以非常方便地管理 Kubernetes 中的應用程式。如果你正在處理多個大型應用程式,我可以看預見 Helm 特有的價值。

結語

對 Kubernetes 及其工作原理要學習的還有很多,但基本設定相對簡單易行。現在我算是初步入門,我對這項技術感覺不錯,更多的把它看做是一個有用的工具 而不是把它當作是一個黑匣子。
相關連結:
  1. https://github.com/kubernetes/minikube/releases/download/v0.25.0/minikube-installer.exe

  2. https://storage.googleapis.com/kubernetes-release/release/v1.9.0/bin/windows/amd64/kubectl.exe

  3. https://hub.docker.com/r/fullbit/node-service/

  4. https://storage.googleapis.com/kubernetes-helm/helm-v2.8.1-windows-amd64.zip

  5. https://kubernetes.io/docs/concepts/services-networking/service/

原文連結:http://fullbit.ca/kubernetes-setting-up-a-cluster-locally-on-windows-10/
Kubernetes零基礎進階培訓

本次培訓內容包括:容器原理、Docker架構及工作原理、Docker網路與儲存方案、Harbor、Kubernetes架構、元件、核心機制、外掛、核心模組、Kubernetes網路與儲存、監控、日誌、二次開發以及實踐經驗等,點選識別下方二維碼加微信好友瞭解具體培訓內容

4月20日正式上課,點選閱讀原文連結即可報名。
贊(0)

分享創造快樂