1. 程式人生 > >Kubernetes系列之四:使用yaml檔案建立deployment來部署一個應用程式到k8s叢集

Kubernetes系列之四:使用yaml檔案建立deployment來部署一個應用程式到k8s叢集

目的

從零開始開發一個超小的應用,將它打包成一個image,利用yaml檔案部署到kube叢集中。

具體的思路是:在開發環境中,打算建立一個node.js應用程式,因為使用它可以讓我的程式足夠簡單,然後使用dockerfile去建立一個docker image,再將它push到docker registry中去;接著使用yaml檔案將此image部署到已經搭建好的kube叢集中。

建立一個nodejs應用程式

建立一個資料夾kube-demo, 在編輯器(筆者使用vscode)中開啟,接著建立一個server.js檔案

var http = require('http');
 
var handleRequest = function(request, response) {
  console.log('Received request for URL: ' + request.url);
  response.writeHead(200);
  response.end('Hello World!');
};
var www = http.createServer(handleRequest);
www.listen(8081);

執行應用:

node server.js

開啟瀏覽器訪問http://localhost:8081,得到的結果如下:
在這裡插入圖片描述

可以看到我們的小應用程式可以正常執行,使用按Ctrl+C停止正在執行的Node.js伺服器

將應用程式打包成Docker映象並Push到Docker hub上去

接下來我們將此應用程式打包成Docker 映象,這裡使用Dockerfile來進行打包,如果看到這裡你不太明白,那麼你需要先學習一下Docker. Dockerfile的內容如下:

FROM node:8.11.2
WORKDIR app
COPY . .
EXPOSE 8081
ENTRYPOINT [ "node","server.js" ]

Dockerfile建立好後,執行如下命令

docker build -t wucong60/kube-node-demo1:v1 .

執行docker images,可以看到映象打包成功了

[email protected]:/home/cong/Desktop/NodeDemo1# docker images
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
wucong60/kube-node-demo1                   v1                  e2522bf8e003        1 hours ago        673 MB

執行docker login --username <你在dockerhub註冊的賬號> 再輸入密碼登入到docker hub,再將剛打包好的映象push上去

[email protected]:/home/cong/Desktop/NodeDemo1# docker login --username wucong60
Password: 
Login Succeeded
 
[email protected]:/home/cong/Desktop/NodeDemo1# docker push wucong60/kube-node-demo1:v1
The push refers to a repository [docker.io/wucong60/kube-node-demo1]
3f17035e6c72: xxxxx 
.....
v1: digest: sha256:009219456e793f3b53b777915247c71635b9c5bec6e70de6ab1f08664d056917 size: 2420

這時,所有人都可以從docker hub(公有映象庫)中拉取此映象了。

使用yaml檔案建立Deployment

建立一個名為deployment.yaml的yaml檔案,內容如下:


---
apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
  name: kube-node 
spec: 
  replicas: 2 
  template: 
    metadata: 
      labels: 
        app: web 
    spec: 
      containers: 
        - name: kube-node-demo-instance 
          image: wucong60/kube-node-demo1:v1 
          ports: 
            - containerPort: 8081 

執行kubectl create -f deployment.yaml命令,建立一個deployment

[email protected]:/home/cong/Desktop/NodeDemo1# kubectl create -f deployment.yaml
deployment.extensions/kube-node created
[email protected]:/home/cong/Desktop/NodeDemo1# kubectl get pods
NAME                            READY     STATUS             RESTARTS   AGE
kube-node-59bf664cbf-2qzgd      0/1       ImagePullBackOff   0          9s
kube-node-59bf664cbf-p6wtg      0/1       ImagePullBackOff   0          9s

結果發現Pods的狀態為ImagePullBackOff, 最終發現是,因為k8s不能夠拉取私有倉庫的映象,通過執行下列命令可以檢視具體的Pod資訊,其中裡面的Events下面顯示了建立Pod的詳細過程。

kubectl describe pods/kube-node-59bf664cbf-2qzgd

參考Kubernetes配置secret拉取私有倉庫映象的官方文件後(點選這裡檢視),執行如下命令

[email protected]:/home/cong/Desktop/NodeDemo1# kubectl create secret docker-registry myregistrykey --docker-server=https://index.docker.io/v1/ --docker-username=wucong60 [email protected]
 
[email protected]:/home/cong/Desktop/NodeDemo1# kubectl get secrets
NAME                  TYPE                                  DATA      AGE
default-token-2lvth   kubernetes.io/service-account-token   3         4d
myregistrykey         kubernetes.io/dockerconfigjson        1         4h

這樣我們就建立好了secret,然後再將這個secret加到yaml檔案中,修改後的deployment.yaml檔案如下:


---
apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
  name: kube-node 
spec: 
  replicas: 2 
  template: 
    metadata: 
      labels: 
        app: web 
    spec: 
      containers: 
        - name: kube-node-demo-instance 
          image: kube-node-demo1 
          ports: 
            - containerPort: 8081
      imagePullSecrets:
       - name: myregistrykey

刪除之前的deployment並重新建立新的deployment(另一方法是 :直接編輯此deployment,命令是:kubectl edit deployments/kube-node,編輯完後就立即生效了,所有pods會重新生成),命令如下:

kubectl delete deployments/kube-node
 
kubectl create -f deployment.yaml

最終可以看到我們的應用程式被部署上去了

[email protected]:/home/cong/Desktop/NodeDemo1# kubectl get pods -o wide
NAME                            READY     STATUS    RESTARTS   AGE       IP            NODE
kube-node-7bd98cf84d-c6q6h      1/1       Running   0          3m        10.244.2.66   kube-slave-1
kube-node-7bd98cf84d-fbjwz      1/1       Running   0          3m        10.244.1.36   kube-slave-3

執行下列命令,來驗證部署上去的應用程式是否好用,我們嘗試訪問第一個IP+8081埠,正常顯示Hello World!

[email protected]:/home/cong/Desktop/NodeDemo1# curl 10.244.2.66:8081
Hello World!

到這裡,我們的應用程式部署成功了。接下來我們要建立一個service來供外部來訪問我們的應用程式,請見下篇

作者:wucong60
來源:CSDN
原文:https://blog.csdn.net/wucong60/article/details/81586272
版權宣告:本文為博主原創文章,轉載請附上博文連結!