Kubernetes系列之四:使用yaml文件创建deployment来部署一个应用程序到k8s集群
目的从零开始开发一个超小的应用,将它打包成一个image,利用yaml文件部署到kube集群中。具体的思路是:在开发环境中,打算创建一个node.js应用程序,因为使用它可以让我的程序足够简单,然后使用dockerfile去创建一个docker image,再将它push到docker registry中去;接着使用yaml文件将此image部署到已经搭建好的kube集群中。创建一个node...
目的
从零开始开发一个超小的应用,将它打包成一个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,可以看到镜像打包成功了
root@Kube-Dev:/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上去
root@kube-dev:/home/cong/Desktop/NodeDemo1# docker login --username wucong60
Password:
Login Succeeded
root@kube-dev:/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
root@kube-master:/home/cong/Desktop/NodeDemo1# kubectl create -f deployment.yaml
deployment.extensions/kube-node created
root@kube-master:/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拉取私有仓库镜像的官方文档后(点击这里查看),执行如下命令
root@kube-master:/home/cong/Desktop/NodeDemo1# kubectl create secret docker-registry myregistrykey --docker-server=https://index.docker.io/v1/ --docker-username=wucong60 --docker-password=xxxx--docker-email=xxxx@qq.com
root@kube-master:/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
最终可以看到我们的应用程序被部署上去了
root@kube-master:/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!
root@kube-master:/home/cong/Desktop/NodeDemo1# curl 10.244.2.66:8081
Hello World!
到这里,我们的应用程序部署成功了。接下来我们要创建一个service来供外部来访问我们的应用程序,请见下篇
作者:wucong60
来源:CSDN
原文:https://blog.csdn.net/wucong60/article/details/81586272
版权声明:本文为博主原创文章,转载请附上博文链接!
更多推荐
所有评论(0)