在k8s上部署一个简单的应用

部署一个简单的应用

实验目标:
部署一个简单的 web 应用,比如 Nginx 或者一个自定义的 Node.js 应用。

实验步骤:

  • 创建一个 Deployment。
  • 创建一个 Service 来暴露应用。
  • 验证应用是否可以通过 Service 访问。

今天我们来做一下昨天分享的可练习实验中的第一个实验:部署一个Nginx程序

1、创建命名空间

kubectl create namespace nginx

2、在指定命名空间中创建资源

kubectl create deployment nginx -n nginx --image nginx:alpine --replicas=3

# -n 指定namespaces
# --images 指定镜像
# --replicas 指定副本数量

在这里插入图片描述

此处需要注意,一般查询都是从默认的 default 空间中去寻找,但是我们在创建命令中指定了名称空间,在查询的时候要注意带上相对应的名称空间

跑起来的容器会自动分配一个IP地址来供访问

kubectl get pods -n nginx -o wide

在这里插入图片描述
在3个node节点上都有分配,负载很平均

3、 创建Service 来暴露应用

此时在容器内为互通状态,容器外仍为隔离

kubectl create service nodeport nginx --tcp=80:80 -n nginx

# 一定要指定名称空间,这样才会和你的 Deployment 位于同一个命名空间
# NodePort 是一种 Service 类型,允许你通过集群节点上的特定端口从外部访问服务。
# nodeport的名称可以不与创建的pod或者deployment的名称一致

使用命令查看具体的外部地址

kubectl get service nginx -n nginx

在这里插入图片描述

尝试从外部访问 NGINX 服务,使用集群节点的 IP 地址和 NodePort 端口:
验证从外部可以访问:
在这里插入图片描述

在 Kubernetes 中,当你从集群外部访问一个 NodePort 类型的 Service 时,请求会被随机分配到与该 Service 关联的任意一个 Pod。这是因为 Kubernetes Service 使用负载均衡机制来将流量分配到所有匹配的 Pods 上,从而实现高可用性和负载均衡。

负载均衡和流量分配: Kubernetes Service 使用 轮询随机 的负载均衡算法将流量分配到所有匹配的 Pods 上。这个过程对用户是透明的,你无法指定请求访问特定的 Pod。

验证请求分配: 如果你想验证请求被分配到哪个 Pod,可以在每个 Pod 的 NGINX 配置中输出一些标识信息,或者在每个 Pod 中运行一个简单的 HTTP 服务来返回 Pod 的名字。

进入每个 Pod 并创建一个标识文件:

kubectl exec -it <pod-name> -n nginx -- sh -c "echo $(hostname) > /usr/share/nginx/html/index.html"

#替换 <pod-name> 为每个 Pod 的实际名称。
# 请在不同的node节点上分别执行,否则hostname的名称可能会重复,看不到实际效果

每次刷新或再次访问 URL,你应该会看到不同的 Pod 名称,这表明请求正在负载均衡到不同的 Pods。
在这里插入图片描述
在这里插入图片描述


问题总结

虽然看起来部署一个应用比较简单,但也有可能出错的地方。

常见问题: 外部访问时无法连接到 Kubernetes NodePort 服务该怎么办呢

1、检查pod状态

kubectl get pods -n nginx

确保所有 Pods 都显示为 Running 状态。如果有 Pods 处于 Pending 或 Error 状态,进一步查看日志和事件:

kubectl describe pod <pod-name> -n nginx
kubectl logs <pod-name> -n nginx

2、检查service的选择器
确保 Service 的选择器正确匹配到正在运行的 Pods。查看 Service 的详细信息:

kubectl get service nginx -n nginx -o yaml

应该可以看到类似以下的输出:

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2024-06-15T07:15:03Z"
  labels:
    app: nginx
  name: nginx
  namespace: nginx
  resourceVersion: "116170"
  uid: 57f1e070-5a8f-4c77-9a92-e7d8072d987c
spec:
  clusterIP: 10.104.10.231
  clusterIPs:
  - 10.104.10.231
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - name: 80-80
    nodePort: 31151
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx  #这里请注意是否正确匹配到pods的标签
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}

确保 selector 部分正确匹配到 Pods 的标签。查看 Pods 的标签:

kubectl get pods -n nginx --show-labels

在这里插入图片描述
3、检查Endopints
查看 Service 的 Endpoints 确认是否有可用端点:

kubectl get endpoints nginx -n nginx

在这里插入图片描述
4、检查pod监听的端口
确认 Pods 中的 NGINX 容器是否在监听端口 80。进入一个 Pod 并检查:
在这里插入图片描述
5、检查nodeport端口设置
确保节点防火墙允许 NodePort 端口通过(默认范围是 30000-32767)

kubectl get service nginx -n nginx

在这里插入图片描述
如果发现防火墙上有相关的报错信息。比如这种情况:

REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 /* nginx/nginx-service:80-80 has no endpoints */ ADDRTYPE match dst-type LOCAL tcp dpt:31634 reject-with icmp-port-unreachable

这个错误信息表明,Service nginx/nginx-service 的端口 80 没有可用的端点(Pods)。这可能是因为相关 Pods 没有运行或者标签选择器没有正确匹配到这些 Pods。这个时候都要回头去检查第2步是否有误。

删除(可选)

只是作为扩展知识,后续实验可能仍会用到。也可删除试一下能否彻底清除

要停止并删除创建的三个nginx容器。可以使用 kubectl delete pod 命令。首先,你需要知道这两个 Pods 所在的命名空间。当然了我们自己创建的pods我们肯定是清楚的。如果是已经在运行中的且无法判断是否在 default命名空间中,可以参考以下步骤

1、查看pods所在命名空间

kubectl get pods --all-namespaces

在这里插入图片描述
2、删除pods

kubectl delete pod nginx-b4ccb96c6-lhb4l -n nginx

3、验证删除
删除操作完成后,可以再次检查以确认 Pods 已被删除:

kubectl get pods -n nginx

这将完全停止并删除指定的 Pods。如果你使用的是 DeploymentReplicaSet 或其他控制器来管理这些 Pods,它们可能会自动重新创建这些 Pods。在这种情况下,你可能需要删除或更新相应的控制器资源。

在这里插入图片描述
这里我删了两个容器后,Deployment 马上就又创建了两个新的pods容器。因为我们在最初的创建命令中添加了 --replicas=3 参数。保证它永远会存在3个副本。那这种情况该如何删除呢?

删除 Deployment 资源

1、查找Deployment
首先,确认 Pods 是由哪个 Deployment 管理的。你可以查看所有 Deployments:

kubectl get deployments --all-namespaces

在这里插入图片描述

2、删除 Deployment
一旦你确定了管理这些 Pods 的 Deployment 名称,可以删除该 Deployment:

kubectl delete deployment <deployment-name> -n nginx

如果你不想完全删除 Deployment,只是想修改其配置(例如,减少副本数量)
可以更新 Deployment:

1、更新副本数量:
例如,将副本数量缩减为0

kubectl scale deployment <deployment-name> --replicas=0 -n nginx

2、如果你有一个新的Deployment 配置文件,可以应用新的配置:

kubectl apply -f <path-to-new-deployment-file>

删除 ReplicaSet 或其他控制器资源

如果 Pods 是由 ReplicaSet 或其他控制器(如 StatefulSet、DaemonSet)管理的,可以使用类似的方法:

1、查找控制器资源:

kubectl get replicasets -n default

或者:

kubectl get statefulsets -n default
kubectl get daemonsets -n default

2、删除控制器资源:

kubectl delete replicaset <replicaset-name> -n default
kubectl delete statefulset <statefulset-name> -n default
kubectl delete daemonset <daemonset-name> -n default

注意:
当你删除一个 Deployment 时,Kubernetes 会自动删除由该 Deployment 创建和管理的所有 Pods 和 ReplicaSet。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/712038.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【TB作品】STM32F102C8T6单片机,PWM发生器

硬件&#xff1a; STM32F102C8T6核心板&#xff0c;按键&#xff0c;0.96 OLED显示屏。 软件&#xff1a; 1、硬件启动触发单片机输出PWM&#xff0c;未触发之前PWM输出为低电平。 2、按键修改PWM的变化模式、变化时间长度、占空比上下限。 3、输出的PWM是固定的10kHZ的。 4、变…

王思聪日本街头在被偶遇

王思聪日本街头再被偶遇&#xff0c;甜蜜约会日常成网友热议焦点近日&#xff0c;有网友在日本街头再次偶遇了“国民老公”王思聪&#xff0c;这次他不仅携带着一位美丽的女友&#xff0c;还展现出了两人之间亲密无间的互动&#xff0c;让不少网友感叹&#xff1a;这真的是每天…

Kafka 如何保证消息顺序及其实现示例

Kafka 如何保证消息顺序及其实现示例 Kafka 保证消息顺序的机制主要依赖于分区&#xff08;Partition&#xff09;的概念。在 Kafka 中&#xff0c;消息的顺序保证是以分区为单位的。下面是 Kafka 如何保证消息顺序的详细解释&#xff1a; ⭕分区内消息顺序 顺序写入&#…

掌握特劳特定位理论核心,明晰企业战略定位之重

在当今瞬息万变的市场环境中&#xff0c;企业战略定位的重要性日益凸显。它不仅是企业在激烈竞争中保持优势的关键&#xff0c;更是企业实现长期可持续发展的基石。 哈佛大学战略学教授迈克尔波特&#xff08;Michael Porter&#xff09;指出战略就是形成一套独具的运营活动&a…

前端组件样式穿透修改

背景&#xff1a; 在style经常用scoped属性实现组件的私有化时&#xff0c;要改变element-ui某个深层元素&#xff08;例如.el-input__inner&#xff09;或其他深层样式&#xff0c; 但是element-ui 并没有提供修改的接口。 这时&#xff0c;就是需要手动修改样式。 解决方法…

Oracle备份失败处理,看这一篇就够了!

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复&#xff0c; 安装迁移&#xff0c;性能优化、故障…

canvas学习

Canvas API 提供了一个通过 JavaScript 和 HTML 的 元素来绘制图形的方式。它可以用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面。 Canvas 的基本用法 <canvas> 元素 <canvas id"tutorial" width"150" height"150&quo…

基数和基数转换

目录 一、定义&#xff1a; 二、各个进制&#xff1a; 1、二进制&#xff1a; 2、八进制&#xff1a; 3、十进制&#xff1a; 4、十六进制&#xff1a; 三、基数转换&#xff1a; 1、各类基数转十进制&#xff1a; 二转十&#xff1a; 八转十&#xff1a; 十六转八&a…

1. 人工智能中的相关术语的概述

1.1 机器学习的概念&#xff1a;机器学习是指从有限的观测数据中学习出具有一般性的规律&#xff0c;并利用这些规律对未知数据进行预测的方法。机器学习可以分为监督学习&#xff0c;无监督学习和强化学习。 传统的机器学习主要关注于如何学习一个预测模型。一般需要首先将数据…

【教程】学会用PS做海报(教你如何套模板+模板资源),以研电赛展架为例

网上的视频都是好几十个小时&#xff0c;看起来很耗费时间&#xff0c;其实做海报&#xff0c;展架只用到其中的一部分功能&#xff0c;本文会进行讲解 这里写目录标题 去年研电赛做的展架1.首先打开比赛给的展板照片&#xff0c;按照研电赛要求设置大小2.调出ps的几个窗口&am…

苹果发布云AI系统;谷歌警告0day漏洞被利用;微软紧急推迟 AI 召回功能;劫持活动瞄准 K8s 集群 | 网安周报0614

苹果发布私有云计算&#xff0c;开创 AI 处理新时代&#xff0c;隐私保护再升级&#xff01; 苹果宣布推出一个名为“私有云计算”&#xff08;PCC&#xff09;的“开创性云智能系统”&#xff0c;该系统专为在云中以保护隐私的方式处理人工智能&#xff08;AI&#xff09;任务…

【数学竞赛】阿里巴巴全球数学竞赛(附2019-2024年试题+答案)

阿里巴巴全球数学竞赛对所有年龄、背景和职业的个人开放。迄今为止&#xff0c;最年长的参赛者超过80岁&#xff0c;最年轻的仅8岁。 2024年共计801名选手参加比赛&#xff0c;涟水这中专的姜萍获得了全球12名的出众成绩&#xff0c;港中大也抛出了橄榄枝。 初赛注重享受数学之…

【Linux内核】伙伴系统算法和slab分配器(1)

【Linux内核】伙伴系统算法和slab分配器&#xff08;1&#xff09; 目录 【Linux内核】伙伴系统算法和slab分配器&#xff08;1&#xff09;伙伴系统&#xff08;buddy&#xff09;算法伙伴系统算法基本原理内存申请内存回收 接口函数源码分析内存分配接口物理内存释放接口规范…

【TypeScript】类型兼容(协变、逆变和双向协变)

跟着小满zs 学习 ts&#xff0c;原文&#xff1a;学习TypeScript进阶类型兼容_typescript进阶阶段类型兼容 小满-CSDN博客 类型兼容&#xff0c;就是用于确定一个类型是否能赋值给其他的类型。如果A要兼容B 那么A至少具有B相同的属性。 // 主类型 interface A {name: string,a…

【游戏】一款纯web集前后端为一体的沙盒游戏框架介绍

1.biomes-game是什么&#xff1f; 一款基于MIT协议开源沙盒 MMORPG。游戏中可建造、采集、玩迷你游戏等等&#xff0c;所有操作均可通过浏览器完成。它主要使用React框架&#xff0c;前后端用 Typescript 和 WebAssembly 编写。 2.如何本地体验&#xff1f; 配置&#xff1a;…

计算机网络 —— 一文搞懂TCP/UDP

传输层&#xff1a;TCP/UDP 1. TCP1.1 TCP连接管理1.2 TCP首部格式 2. UDPUDP首部格式 3. 其他传输层协议3.1 SCTP3.2 DCCP 传输层实现源端主机和目标端主机上对等实体间会话&#xff0c;TCP/IP中两个代表性的传输层协议分别是TCP和UDP&#xff0c;两者均使用端口来标识传输数据…

数据防泄漏的六个步骤|数据防泄漏软件有哪些

在当前复杂多变的网络安全环境下&#xff0c;数据防泄漏软件成为了企业信息安全架构中不可或缺的一环。下面以安企神软件为例&#xff0c;告诉你怎么防止数据泄露&#xff0c;以及好用的防泄露软件。 1. 安企神软件 安企神软件是当前市场上备受推崇的企业级数据防泄漏解决方案…

为什么微信输入法是比搜狗输入法更好的选择?

微信输入法官网&#xff1a;https://z.weixin.qq.com/ 最近使用搜狗输入法时&#xff0c;频繁弹出广告&#xff0c;实在令人烦恼&#xff0c;于是我干脆卸载了它。然而&#xff0c;电脑上没有输入法是不行的。经过在网上对比了许多输入法软件后&#xff0c;我发现了微信输入法。…

算法:分治(快排)题目练习

目录 题目一&#xff1a;颜色分类 题目二&#xff1a;排序数组 题目三&#xff1a;数组中的第k个最大元素 题目四&#xff1a;库存管理III 题目一&#xff1a;颜色分类 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums &#xff0c;原地对它们进行排序&#xff0c;…

红队攻防渗透技术实战流程:中间件安全:JettyJenkinsWeblogicWPS

红队攻防渗透实战 1. 中间件安全1.1 中间件-Jetty-CVE&信息泄漏1.2 中间件-Jenkins-CVE&RCE执行1.2.1 cve_2017_1000353 JDK-1.8.0_291 其他版本失效1.2.2 CVE-2018-10008611.2.3 cve_2019_100300 需要用户帐号密码1.3 中间件-Weblogic-CVE&反序列化&RCE1.4 应…