作者: wucong60

原文: https://blog.csdn.net/wucong60/article/details/81586272

系列链接

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文件

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 Succeededroot@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/v1beta1kind: Deploymentmetadata:name: kube-nodespec:replicas: 2template:metadata:labels:app: webspec:containers:- name: kube-node-demo-instanceimage: wucong60/kube-node-demo1:v1ports:- 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.comroot@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/v1beta1kind: Deploymentmetadata:name: kube-nodespec:replicas: 2template:metadata:labels:app: webspec:containers:- name: kube-node-demo-instanceimage: kube-node-demo1ports:- containerPort: 8081imagePullSecrets:- name: myregistrykey

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

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

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

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

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

使用yaml文件创建deployment来部署一个应用程序到k8s集群相关推荐

  1. 手把手教你部署一个最小化的 Kubernetes 集群

    虽然网上有大量从零搭建 K8S 的文章,但大都针对老版本,若直接照搬去安装最新的 1.20 版本会遇到一堆问题.故此将我的安装步骤记录下来,希望能为读者提供 copy and paste 式的集群搭建 ...

  2. Centos7.2部署HOR2.2(基于K8S集群的容器应用整合)

    一. 部署本地yum源 二. 前置环境准备 1.配置主机名和hosts文件(每个节点) (1)hostnamectl set-hostname xxx (2)编辑各节点/etc/hosts文件,修改对 ...

  3. 使用kubeadm快速部署一套稳定的K8S集群

    文章目录 一. 操作系统初始化配置 1.1 设置主机名 1.2 设置hosts解析主机名 1.3 关闭SELinux和防火墙 1.4 关闭swap 1.5 设置系统参数 1.6 设置节点间的SSH免密 ...

  4. 使用 K3s 和 WireGuard 网络快速部署一个多云环境的 Kubernetes 集群

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 每日言论 SQLite 的应用太广泛,测试量也很惊人.每个版本发布之前,都要进行各种单元测试.参数测试.模糊测试, ...

  5. 京东云开发者|IoT运维 - 如何部署一套高可用K8S集群

    环境 准备工作 配置ansible(deploy 主机执行) # ssh-keygen # for i in 192.168.3.{21..28}; do ssh-copy-id -i ~/.ssh/ ...

  6. K8S_Google工作笔记0004---平台规划和部署方式介绍_搭建k8s集群准备

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152. 按照上面3个部分来说明 先说这个但master集群,也就是说master这个节点,用来管理其他的 ...

  7. [错误解决]centos中使用kubeadm方式搭建一个单master的K8S集群

    安装步骤 参考该大佬博客 --------- [ningan@k8s-master pv]$ kubectl get pod The connection to the server localhos ...

  8. 项目四 CentOS使用kubeadm部署工具部署测试环境的K8s集群---Kubectl命令使用以及安装dashboard界面

    大家好,我是SuieKa.在之前呢有幸学习了马哥教育提供的K8s入门指南以及视频.初来乍到,写一篇关于K8s的介绍以及部署测试环境使用的K8s集群. 树 @·K8s入门简单介绍 一.K8s(Kuber ...

  9. 使用containerd和cilium部署kubeproxy-free的k8s集群

    1.准备工作 1.1 集群信息 机器均为8C8G的虚拟机,硬盘为100G. IP Hostname 10.31.18.1 tiny-kubeproxy-free-master-18-1.k8s.tci ...

最新文章

  1. 每天超50亿推广流量、3亿商品展现,阿里妈妈的推荐技术有多牛?
  2. knime如何连接mysql_knime怎么连接MySQL?
  3. 好久不更新这个博客了。
  4. 0202年了,怎么还这么多人不会搜索
  5. 飞龙的程序员书单 – 数据结构、算法
  6. 飞思卡尔16位单片机(四)——GPIO输入功能测试
  7. Win10系统离线安装可选功能XPS查看器(XPS Viewer)的详细说明(修订版)
  8. SATI统计分析文献--以关键词为例
  9. 常用的几个设计心理学
  10. 从总线式以太网到SDN交换机OpenVSwitch
  11. Python3.8场景式编程学习与训练- 第1章 入门基础 沙箱技术与虚拟环境创建
  12. test.java_test JavaWeb开发的试题库管理系统。包括用户 、 、试卷生成及增删改查等。 Develop 256万源代码下载- www.pudn.com...
  13. linux中脚本都是.sh吗,Linux跑脚本用sh和./有什么区别?
  14. snaker流程预览
  15. MySQL Workbench 类似Navicat侧边栏查表名
  16. JS判断输入的字符串是否是数字(正则表达式)
  17. 【FME】矢量间进行空间传值、属性关联
  18. 《圈外课程学习记录》1.1结构化的特征 1.2表达时主题先行
  19. 武汉纺织大学计算机科学校区在哪,武汉纺织大学是一本吗 重点专业是什么 有几个校区及校区地址...
  20. 全球与中国植物培养箱市场现状及未来发展趋势(2022)

热门文章

  1. iphone个人热点无法开启_iPhone无法开启个人热点怎么回事【解决方法】
  2. 浅谈js与jq给新增元素动态绑定事件(事件委托)
  3. 洛谷——[USACO07OCT]Bessie‘s Secret Pasture S
  4. 模型相关:SolidWorks按实际比例创建模型,在Unity中保持尺寸不变
  5. springboot热部署与发布
  6. python正则_python中正则匹配
  7. Windows 下的坐标系
  8. 开源大数据周刊-第22期
  9. 网络安全管理的“模拟人生”
  10. Oracle 写存储过程的一个模板还有一些基本的知识点