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
版權宣告:本文為博主原創文章,轉載請附上博文連結!