在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: nginxname: nginxnamespace: nginxresourceVersion: "116170"uid: 57f1e070-5a8f-4c77-9a92-e7d8072d987c
spec:clusterIP: 10.104.10.231clusterIPs:- 10.104.10.231externalTrafficPolicy: ClusterinternalTrafficPolicy: ClusteripFamilies:- IPv4ipFamilyPolicy: SingleStackports:- name: 80-80nodePort: 31151port: 80protocol: TCPtargetPort: 80selector:app: nginx  #这里请注意是否正确匹配到pods的标签sessionAffinity: Nonetype: 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。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Debian12的#!bash #!/bin/bash #!/bin/env bash #!/usr/bin/bash #!/usr/bin/env bash

bash脚本开头可写成 #!/bin/bash , #!/bin/env bash , #!/usr/bin/bash , #!/usr/bin/env bash #!/bin/bash , #!/usr/bin/bash#!/bin/env bash , #!/usr/bin/env bash Debian12的 /bin 是 /usr/bin 的软链接, /sbin 是 /usr/sbin 的软链接, (Debian12默认没有ll命令,用的ls …

Python的pandas读取excel文件中的数据

一、前言 hello呀&#xff01;各位铁子们大家好呀&#xff0c;我是一个在软件测试行业摸爬滚打十几年的老江湖了&#xff0c;今天呢来和大家聊一聊用Python的pandas读取excel文件中的数据。 二、读取Excel文件 使用pandas的read_excel()方法&#xff0c;可通过文件路径直接读…

Techviz:XR协作工作流程,重塑远程电话会议新形式

在当今快速发展的数字环境中&#xff0c;无缝远程协作的需求正在成为企业多部门协同工作的重中之重&#xff0c;尤其是对于制造业、建筑和设计等行业的专业人士而言&#xff0c;这一需求更加迫切。传统的远程电话会议协作形式存在着延滞性&#xff0c;已经渐渐跟不上当今快节奏…

项目三OpenStack基础环境配置与API使用

任务一 了解OpenStack基础环境配置 1.1 •数据库服务器 1.2 •消息队列服务 •AMQP系统的组成 任务二 了解并使用OpenStack API 2.1 •什么是RESTful API • RESTful API 是目前比较成熟的 一套Internet应用程序的API软件架构 。 • 表现 层&#xff08; Representation …

汽车IVI中控开发入门及进阶(三十一):视频知识扫盲

有效的视频资源管理需要集成许多不同的底层技术,共同为用户提供给定应用程序的最佳体验。其中许多技术是从早期电视广播中使用的技术演变而来的。其他方法,如用于通过网络流式传输视频的压缩方法,相对较新且不断发展。 以下详细概述了与图形和视频处理和传输相关的一些基本…

云上宝库:三大厂商对象存储安全性及差异性比较

前言 看了几家云厂商的对象存储&#xff0c;使用上有相似也有差异&#xff0c;聊聊阿里云、腾讯云、京东云三家对象存储在使用中存在的风险以及防护措施。 0x01 云存储命名 阿里云对象存储OSS(Object Storage Service)&#xff0c;新用户免费试用三个月&#xff0c;存储包容…

安装idea后配置的全局配置

1、打开IDEA应用&#xff1a;Customize→All settings...&#xff0c;如果启动IDEA后&#xff0c;默认打开的是之前的项目&#xff0c;可以关闭当前项目&#xff1a;File→Close Project&#xff0c;就退到全局配置界面了。 2、打开全局配置界面&#xff1a;Editor→File Encod…

斯巴达(Spartanhost)VPS的性能评测

原创原文链接&#xff1a;详细斯巴达&#xff08;Spartanhost&#xff09;VPS的性能和购买价值评测 | BOBO Blog (soulcloser.com)https://www.soulcloser.com/3398/ 引言 最近看了全球的VPS商家&#xff0c;想搞台网站高性能的服务器&#xff0c;发现一个特别有意思的商家竟…

Mathtype7永久无限免费安装包下载地址2024最新方法步骤

亲爱的数学爱好者们&#xff0c;今天我要分享一个让数学表达变得超级简单的神器——Mathtype7最新破解版&#xff01;&#x1f389; 这不仅仅是个软件&#xff0c;而是打开高效学习和工作的钥匙。准备好了吗&#xff1f;让我们一起探索这个神奇的工具&#xff01; MathType最新…

通过ModelScope开源Embedding模型将图片转换为向量

本文介绍如何通过ModelScope魔搭社区中的视觉表征模型将图片转换为向量&#xff0c;并入库至向量检索服务DashVector中进行向量检索。 ModelScope魔搭社区旨在打造下一代开源的模型即服务共享平台&#xff0c;为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品&#xf…

空间复杂度的相关概念

1. 空间复杂度 空间复杂度&#xff08;space complexity&#xff09;用于衡量算法占用内存空间随着数据量变大时的增长趋势。 统计哪些空间&#xff1a; ● 暂存数据&#xff1a;用于保存算法运行过程中的各种常量、变量、对象等。 ● 栈帧空间&#xff1a;用于保存调用函数…

keil MDK自动生成带版本bin文件

作为嵌入式单片机开发&#xff0c;在Keil MDK&#xff08;Microcontroller Development Kit&#xff09;中开发完编译完后&#xff0c;经常需要手动进行版本号添加用于发版&#xff0c;非常麻烦&#xff0c;如果是对外发行的话&#xff0c;更容易搞错&#xff0c;特此码哥提供一…

SpringCloud Alibaba Sentinel 流量控制之流控模式实践总结

官网文档&#xff1a;https://sentinelguard.io/zh-cn/docs/flow-control.html wiki地址&#xff1a;https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6 本文版本&#xff1a;spring-cloud-starter-alibaba&#xff1a;2.2.0.RELEASE 如下图所…

企业如何选择合适的CRM工具?除Salesforce之外的10大主流选择

对比salesforce&#xff0c;其他10款优秀CRM&#xff1a;纷享销客CRM、Zoho CRM、腾讯企点、销售易、企业微信 (WeCom)、Odoo CR、OroCRM、金蝶、用友CRM、EspoCRM 虽然Salesforce以其全面的功能和强大的市场占有率在海外收获了许多客户&#xff0c;但Salesforce在国内市场的接…

多环境镜像晋级/复用最佳实践

作者&#xff1a;木烟 本文主要介绍镜像构建部署场景&#xff0c;多环境镜像晋级/复用最佳实践&#xff0c;保证“所发即所测”。 场景介绍 应用研发场景有效地管理镜像产物是确保软件快速、安全、可靠部署的关键环节。通常一个应用研发需要经过测试、预发、生产各个阶段&am…

Windows下MySQL数据库定期备份SQL文件与删除历史备份文件.bat脚本

目录 一、功能需求 二、解决方案 (1)新建文件夹及批处理文件 (2)编写备份脚本 ①完整脚本 ②参数修改 (3)编写定期删除备份脚本 ①根据文件名识别日期进行删除 ② 根据文件的修改日期删除 (4)设置定时器 (5)常见报错与处理 一、功能需求 在Windows系统下…

minSdkVersion、targetSdkVersion、compileSdkVersion三者的作用解析

minSDK和targetSDK&#xff0c;这两者相当于一个区间。你能够用到targetSDK中最新的API和最酷的新功能&#xff0c;但又需要向后(向下)兼容到minSDK&#xff0c;保证这个区间内的设备都能够正常的执行你的APP。换句话说&#xff0c;想使用Android刚刚推出的新特性&#xff0c;但…

JAVA 注解搜索工具类与注解原理讲解(获取方法和类上所有的某个注解,父类继承的注解也支持获取)

文章目录 JAVA 注解搜索工具类与注解原理讲解&#xff08;获取方法和类上所有的某个注解&#xff0c;父类继承的注解也支持获取&#xff09;代码测试方法上加注解&#xff0c;类上不加类上加注解、方法上加注解 注解原理性能测试 JAVA 注解搜索工具类与注解原理讲解&#xff08…

汉化版PSAI全面测评,探索国产AI绘画软件的创新力量

引言 随着AI技术的飞速发展&#xff0c;图像处理和绘画领域迎来了新的变革。作为一名AIGC测评博主&#xff0c;今天我们测评的是一款国产AI绘画软件——StartAI&#xff0c;一句话总结&#xff1a;它不仅在技术上毫不逊色于国际大牌&#xff0c;更在用户体验和本地化服务上做到…

AI 克隆声音,只需 3 分钟(附最全教程)

作者&#xff1a;寒斜 继生成式文本大模型 Chatgpt&#xff0c;生成式图片 Stablediffusion 之后生成式语音 Text To Speech 在开源社区也出现了一匹黑马&#xff0c;就是 GPT-Sovits [ 1] 。 之所以说他是黑马&#xff0c;让人觉得惊艳&#xff0c;是因为在语音效果克隆上做…