Kubernetes系列之四:使用yaml文件创建deployment来部署一个应用程序到k8s集群

释放双眼,带上耳机,听听看~!

系列链接

Kubernetes系列之一:在Ubuntu上快速搭建一个集群Demo

Kubernetes系列之二:将Slave节点加入集群

Kubernetes系列之三:部署你的第一个应用程序到k8s集群

Kubernetes系列之四:使用yaml文件创建deployment来部署一个应用程序到k8s集群

Kubernetes系列之五:使用yaml文件创建service向外暴露服务

Kubernetes系列之六:安装k8s通用的Web UI(Dashboard)

Kubernetes系列之N:使用K8s遇到的问题

目的

从零开始开发一个超小的应用,将它打包成一个image,利用yaml文件部署到kube集群中。

具体的思路是:在开发环境中,打算创建一个node.js应用程序,因为使用它可以让我的程序足够简单,然后使用dockerfile去创建一个docker image,再将它push到docker registry中去;接着使用yaml文件将此image部署到已经搭建好的kube集群中。

创建一个nodejs应用程序

创建一个文件夹kube-demo, 在编辑器(笔者使用vscode)中打开,接着创建一个server.js文件


1
2
3
4
5
6
7
8
9
10
1var http = require('http');
2
3var handleRequest = function(request, response) {
4  console.log('Received request for URL: ' + request.url);
5  response.writeHead(200);
6  response.end('Hello World!');
7};
8var www = http.createServer(handleRequest);
9www.listen(8081);
10

运行应用:


1
2
1node server.js
2

打开浏览器访问http://localhost:8081,得到的结果如下:

 可以看到我们的小应用程序可以正常运行,使用按Ctrl+C停止正在运行的Node.js服务器

将应用程序打包成Docker镜像并Push到Docker hub上去

接下来我们将此应用程序打包成Docker 镜像,这里使用Dockerfile来进行打包,如果看到这里你不太明白,那么你需要先学习一下Docker. Dockerfile的内容如下:


1
2
3
4
5
6
1FROM node:8.11.2
2WORKDIR app
3COPY . .
4EXPOSE 8081
5ENTRYPOINT [ "node","server.js" ]
6

Dockerfile创建好后,执行如下命令


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

运行docker images,可以看到镜像打包成功了


1
2
3
4
1root@Kube-Dev:/home/cong/Desktop/NodeDemo1# docker images
2REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
3wucong60/kube-node-demo1                   v1                  e2522bf8e003        1 hours ago        673 MB
4

执行docker login –username  <你在dockerhub注册的账号> 再输入密码登录到docker hub,再将刚打包好的镜像push上去


1
2
3
4
5
6
7
8
9
10
1root@kube-dev:/home/cong/Desktop/NodeDemo1# docker login --username wucong60
2Password:
3Login Succeeded
4
5root@kube-dev:/home/cong/Desktop/NodeDemo1# docker push wucong60/kube-node-demo1:v1
6The push refers to a repository [docker.io/wucong60/kube-node-demo1]
73f17035e6c72: xxxxx
8.....
9v1: digest: sha256:009219456e793f3b53b777915247c71635b9c5bec6e70de6ab1f08664d056917 size: 2420
10

这时,所有人都可以从docker hub(公有镜像库)中拉取此镜像了。

使用yaml文件创建Deployment

 创建一个名为deployment.yaml的yaml文件,内容如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
1---
2
3apiVersion: extensions/v1beta1
4
5kind: Deployment
6
7metadata:
8
9  name: kube-node
10
11spec:
12
13  replicas: 2
14
15  template:
16
17    metadata:
18
19      labels:
20
21        app: web
22
23    spec:
24
25      containers:
26
27        - name: kube-node-demo-instance
28
29          image: wucong60/kube-node-demo1:v1
30
31          ports:
32
33            - containerPort: 8081
34

 执行kubectl create -f deployment.yaml命令,创建一个deployment


1
2
3
4
5
6
7
8
1root@kube-master:/home/cong/Desktop/NodeDemo1# kubectl create -f deployment.yaml
2deployment.extensions/kube-node created
3root@kube-master:/home/cong/Desktop/NodeDemo1# kubectl get pods
4NAME                            READY     STATUS             RESTARTS   AGE
5kube-node-59bf664cbf-2qzgd      0/1       ImagePullBackOff   0          9s
6kube-node-59bf664cbf-p6wtg      0/1       ImagePullBackOff   0          9s
7
8

 结果发现Pods的状态为ImagePullBackOff, 最终发现是,因为k8s不能够拉取私有仓库的镜像,通过执行下列命令可以查看具体的Pod信息,其中里面的Events下面显示了创建Pod的详细过程。


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

 参考Kubernetes配置secret拉取私有仓库镜像的官方文档后(点击这里查看),执行如下命令


1
2
3
4
5
6
7
8
1root@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
2
3root@kube-master:/home/cong/Desktop/NodeDemo1# kubectl get secrets
4NAME                  TYPE                                  DATA      AGE
5default-token-2lvth   kubernetes.io/service-account-token   3         4d
6myregistrykey         kubernetes.io/dockerconfigjson        1         4h
7
8

这样我们就创建好了secret,然后再将这个secret加到yaml文件中,修改后的deployment.yaml文件如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
1---
2
3apiVersion: extensions/v1beta1
4
5kind: Deployment
6
7metadata:
8
9  name: kube-node
10
11spec:
12
13  replicas: 2
14
15  template:
16
17    metadata:
18
19      labels:
20
21        app: web
22
23    spec:
24
25      containers:
26
27        - name: kube-node-demo-instance
28
29          image: kube-node-demo1
30
31          ports:
32
33            - containerPort: 8081
34      imagePullSecrets:
35       - name: myregistrykey
36

 删除之前的deployment并重新创建新的deployment(另一方法是 :直接编辑此deployment,命令是:kubectl edit deployments/kube-node,编辑完后就立即生效了,所有pods会重新生成),命令如下:


1
2
3
4
1kubectl delete deployments/kube-node
2
3kubectl create -f deployment.yaml
4

最终可以看到我们的应用程序被部署上去了


1
2
3
4
5
6
1root@kube-master:/home/cong/Desktop/NodeDemo1# kubectl get pods -o wide
2NAME                            READY     STATUS    RESTARTS   AGE       IP            NODE
3kube-node-7bd98cf84d-c6q6h      1/1       Running   0          3m        10.244.2.66   kube-slave-1
4kube-node-7bd98cf84d-fbjwz      1/1       Running   0          3m        10.244.1.36   kube-slave-3
5
6

执行下列命令,来验证部署上去的应用程序是否好用,我们尝试访问第一个IP+8081端口,正常显示Hello World!


1
2
3
1root@kube-master:/home/cong/Desktop/NodeDemo1# curl 10.244.2.66:8081
2Hello World!
3

到这里,我们的应用程序部署成功了。接下来我们要创建一个service来供外部来访问我们的应用程序,请见下篇

 

给TA打赏
共{{data.count}}人
人已打赏
安全运维

故障复盘的简洁框架-黄金三问

2021-9-30 19:18:23

安全运维

OpenSSH-8.7p1离线升级修复安全漏洞

2021-10-23 10:13:25

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索