BHOL402 - k8s应用开发部署 - 使用pod进行部署

在这几节实验中,我们将完成我们的 Hello Boathouse 应用的k8s部署过程,其中会涉及到一下k8s中的对象

    • Pod
  • Deployment
  • Service
  • Secret
  • Namespace

这些内容基本上覆盖了我们k8s集群进行应用开发部署的主要对象。

01 - 创建 Hello Boathouse 应用并打包成 docker 镜像

使用以下命令创建代码目录并用vscode打开

  1. mkdir hello-boathouse
  2. cd hello-boathouse
  3. code .

使用vscode分别创建以下文件

  • index.js
  • Dockerfile
  • package.json

BHOL402 - k8s应用开发部署 - 使用pod进行部署 - 图1

将以下内容分别复制到对应的文件中

index.js - 这是我们的应用入口,其功能就是在网页中直接输出 Hello Boathouse!的字样

  1. var express = require('express');
  2. var os = require('os');
  3. var app = express();
  4. app.get('/', function (req, res) {
  5. console.log('Hello Boathouse v1 from ... %s', os.hostname );
  6. res.send('Hello Boathouse v1 from ... '+ os.hostname);
  7. });
  8. var server = app.listen(3000, function () {
  9. var host = server.address().address;
  10. var port = server.address().port;
  11. console.log('Example app listening at http://%s:%s', host, port);
  12. });

package.json - 这是 node.js 项目的配置文件,描述了本项目的依赖以及入口

  1. {
  2. "name": "myapp",
  3. "version": "0.0.1",
  4. "private": true,
  5. "scripts": {
  6. "start": "node index.js"
  7. },
  8. "engines": {
  9. "node": "^4.6.1"
  10. },
  11. "dependencies": {
  12. "express": "^4.14.0",
  13. "http-errors": "^1.7.0",
  14. "mysql": "^2.10.2"
  15. },
  16. "devDependencies": {
  17. "inherits": "^2.0.3",
  18. "mocha": "^5.2.0",
  19. "ms": "^2.1.1"
  20. }
  21. }

Dockerfile - 用于 docker build 的打包脚本文件,我们基于node:12基础镜像,将应用代码复制到 /app 目录后执行 npm install,然后执行 package.json 中定义的应用入口 npm start 启动应用。

  1. FROM node:12
  2. WORKDIR /app
  3. ADD . /app
  4. RUN npm install
  5. EXPOSE 3000
  6. CMD npm start

使用一下命令将 hello-boathouse 应用打包成docker镜像并上传到个人镜像仓库

  1. cd hello-boathouse
  2. ## docker 打包
  3. docker build -t hello-boathouse .
  4. ## 推送到个人镜像仓库
  5. docker tag hello-boathouse registry.cn-hangzhou.aliyuncs.com/{命名空间}/hello-boathouse
  6. docker push registry.cn-hangzhou.aliyuncs.com/{命名空间}/hello-boathouse
  7. ## 同样的镜像,tag成v1
  8. docker tag hello-boathouse registry.cn-hangzhou.aliyuncs.com/{命名空间}/hello-boathouse:v1
  9. docker push registry.cn-hangzhou.aliyuncs.com/{命名空间}/hello-boathouse:v1

将boat-house仓库设置为公开仓库,需要同时对命名空间和仓库本身进行“公开”设置

注意:这个设置是为了简化我们后续的操作,可以在无需授权的情况下直接拉取镜像。实际应用中一般我们不会将镜像设置为公开。

BHOL402 - k8s应用开发部署 - 使用pod进行部署 - 图2

BHOL402 - k8s应用开发部署 - 使用pod进行部署 - 图3

02 - 为 Hello Boathouse 应用添加 k8s 部署文件并创建 Pod

在 hello-boathouse 目录中创建 kube-deploy 目录,并添加 hello-boathouse-pod.yaml 文件,文件内容如下:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: hello-boathouse-pod
  5. labels:
  6. app: hello-boathouse
  7. spec:
  8. containers:
  9. - name: hello-boathouse
  10. image: registry.cn-hangzhou.aliyuncs.com/boathouse216/hello-boathouse
  11. ports:
  12. - name: nodejs-port
  13. containerPort: 3000

运行一下命令,完成 Pod 部署

  1. ## 创建 Pod
  2. kubectl create -f kube-deploy/hello-boathouse-pod.yaml
  3. ## 获取 pod 状态
  4. ### 这里需要等待一会儿,因为k8s需要先拉取镜像
  5. ### 可以通过 BHOL401 中所介绍的工具实时监控 Pod 创建状态
  6. kubectl get pods
  7. NAME READY STATUS RESTARTS AGE
  8. hello-boathouse-pod 1/1 Running 0 2m29s
  9. ## 获取 pod 状态详情
  10. ### 同样的信息也可以通过 BHOL401 中所介绍的工具获取
  11. kubectl describe pod hello-boathouse-pod
  12. Name: hello-boathouse-pod
  13. Namespace: default
  14. Priority: 0
  15. Node: minikube/192.168.99.106
  16. Start Time: Thu, 10 Jun 2021 12:23:44 +0800
  17. Labels: app=hello-boathouse
  18. Annotations: <none>
  19. Status: Running
  20. IP: 172.17.0.3
  21. IPs:
  22. IP: 172.17.0.3
  23. Containers:
  24. hello-boathouse:
  25. Container ID: docker://17ca9f4d81ec8c9c6deff4c06e1b510c26654ed06c86bd6ffb4b7d32480aff31
  26. Image: registry.cn-hangzhou.aliyuncs.com/boathouse216/hello-boathouse
  27. Image ID: docker-pullable://registry.cn-hangzhou.aliyuncs.com/boathouse216/hello-boathouse@sha256:8932c0b090a1bb4ee61b9d55b9f85a9a93660322d391b33ecfcec700b2b2afcf
  28. Port: 3000/TCP
  29. Host Port: 0/TCP
  30. State: Running
  31. Started: Thu, 10 Jun 2021 12:25:53 +0800
  32. Ready: True
  33. Restart Count: 0
  34. Environment: <none>
  35. Mounts:
  36. /var/run/secrets/kubernetes.io/serviceaccount from default-token-57vz9 (ro)
  37. Conditions:
  38. Type Status
  39. Initialized True
  40. Ready True
  41. ContainersReady True
  42. PodScheduled True
  43. Volumes:
  44. default-token-57vz9:
  45. Type: Secret (a volume populated by a Secret)
  46. SecretName: default-token-57vz9
  47. Optional: false
  48. QoS Class: BestEffort
  49. Node-Selectors: <none>
  50. Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
  51. node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
  52. Events:
  53. Type Reason Age From Message
  54. ---- ------ ---- ---- -------
  55. Normal Scheduled 4m16s default-scheduler Successfully assigned default/hhello-boathouse-pod to minikube
  56. Normal Pulling 4m15s kubelet Pulling image "registry.cn-hangzhou.aliyuncs.com/boathouse216/hello-boathouse"
  57. Normal Pulled 2m8s kubelet Successfully pulled image "registry.cn-hangzhou.aliyuncs.com/boathouse216/hello-boathouse" in 2m7.440614757s
  58. Normal Created 2m8s kubelet Created container hello-boathouse
  59. Normal Started 2m7s kubelet Started container hello-boathouse

通过k9s获取pod详情

BHOL402 - k8s应用开发部署 - 使用pod进行部署 - 图4

03 - 获取 hello-boathouse 应用的外部访问

使用端口转发方式

kubectl 可以将k8s集群中的应用端口转发到我们本机上,方便我们对应用进行快速调试,运行一下命令即可启动端口转发

  1. kubectl port-forward hello-boathouse-pod 8081:3000
  2. Forwarding from 127.0.0.1:8081 -> 3000
  3. Forwarding from [::1]:8081 -> 3000

这时打开浏览器,通过 http://localhost:8081 即可访问我们的应用,效果如下:

BHOL402 - k8s应用开发部署 - 使用pod进行部署 - 图5

按 Ctrl+C 结束端口转发

使用节点端口(NodePort)方式直接在节点上开放端口

  1. ## 为 Pod 创建 Service 并使用 NodePort 模式
  2. kubectl expose pod hello-boathouse-pod --type=NodePort --name hello-boathouse-service
  3. service/hello-boathouse-service exposed
  4. ## 从 minikube 获取对外暴露的端口号
  5. minikube service hello-boathouse-service --url
  6. http://192.168.99.106:31359
  7. ## 获取 Service 列表
  8. kubectl get services
  9. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  10. hello-boathouse-service NodePort 10.96.202.41 <none> 3000:31359/TCP 5m8s
  11. kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 30h

这时打开浏览器,通过 http://192.168.99.106:31359 (具体要参考你自己的输出) 即可访问我们的应用,效果如下:

BHOL402 - k8s应用开发部署 - 使用pod进行部署 - 图6

04 - 常用kubectl命令

kubectl attach

连接 pod 日志输出

  1. kubectl attach hello-boathouse-pod

BHOL402 - k8s应用开发部署 - 使用pod进行部署 - 图7

kubectl exec

在 pod 中执行指令

  1. ## 列出 /app 目录内容
  2. kubectl exec hello-boathouse-pod -- ls /app
  3. ## 在 Pod 中运行 bash
  4. kubectl exec hello-boathouse-pod -i -t -- /bin/bash

BHOL402 - k8s应用开发部署 - 使用pod进行部署 - 图8

kubectl run

使用 busybox 在 k8s 集群中调试应用

  1. ## 使用 describe 获取 Service 详情,记录Endpoint信息
  2. kubectl describe service hello-boathouse-service
  3. ## 使用 busybox 启动临时 pod,对服务进行测试
  4. kubectl run -i --tty busybox --image=busybox --restart=Never -- sh
  5. ping {EndPoint IP 地址}
  6. telnet {EndPoint IP 地址} {EndPoint 端口}

BHOL402 - k8s应用开发部署 - 使用pod进行部署 - 图9

使用这种方式我们可以进入k8s进群内部定位问题,确定我们启动的pod是否工作正常。