在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。

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 非常感谢您的问题。Kubernetes是一种可扩展的开源容器编排和管理平台,它可以帮助我们轻松地管理和部署应用程序。Spring Boot是一种轻量级的Java框架,可以帮助我们快速构建可靠的应用程序。在Kubernetes部署Spring Boot应用程序需要执行以下步骤: 1. 创建一个Docker镜像,并将Spring Boot应用程序打包到Docker镜像中。 2. 创建一个Kubernetes Deployment对象,定义应用程序的容器镜像和其他配置。 3. 创建一个Kubernetes Service对象,以公开应用程序并在群集中暴露其端点。 4. 如果需要,可以创建其他Kubernetes对象,例如ConfigMaps和Secrets,以管理应用程序的配置和敏感信息。 在完成这些步骤后,您的Spring Boot应用程序将在Kubernetes集群中成功部署和运行。希望这个回答能够帮助到您! ### 回答2: Kubernetes(简称为K8s)是一个用于容器编排和管理的开源平台,它可以帮助我们轻松地部署和扩展应用程序。Spring Boot是一个用于构建独立的、生产级的Java应用程序的框架。在K8s部署Spring Boot应用程序需要以下几个步骤: 1. 编写Dockerfile:首先,我们需要在项目根目录下创建一个Dockerfile文件。在Dockerfile中,我们可以指定基础镜像、添加应用程序文件和依赖项,并设置应用程序的启动命令。 2. 构建Docker镜像:使用Dockerfile,我们可以构建一个镜像,该镜像包含了我们的Spring Boot应用程序和所有的依赖项。我们可以使用Docker命令行工具或Docker客户端来构建镜像。 3. 将镜像推送到镜像仓库:构建完成后,可以将镜像推送到镜像仓库,以便在K8s集群中进行访问和部署。常见的镜像仓库包括Docker Hub、私有镜像仓库等。 4. 创建K8s部署文件:接下来,我们需要创建K8s部署文件,该文件定义了应用程序的部署配置,例如容器数量、资源限制等。部署文件可以使用YAML或JSON格式编写。 5. 部署应用程序:使用kubectl命令行工具或K8s API,我们可以将部署文件应用K8s集群中,从而部署我们的Spring Boot应用程序。K8s将自动为我们创建和管理应用程序的Pods、Services和其他相关资源。 6. 监控和扩展:一旦应用程序成功部署,我们可以使用K8s提供的监控和扩展功能来监视和调整应用程序的运行。K8s提供了各种工具和指标,可以帮助我们实现应用程序的自动扩展和高可用。 通过以上步骤,我们可以在K8s集群中轻松部署和管理Spring Boot应用程序。K8s提供了强大的容器编排和管理功能,可以帮助我们构建可靠、高可用的应用程序环境。 ### 回答3: K8sKubernetes)是一种开源的容器编排平台,它可以帮助我们更方便地部署、管理和扩展容器应用。Spring Boot是一种快速开发、便捷部署的Java框架,它提供了一种简化Spring应用开发的方式。 在将Spring Boot应用部署K8s上时,我们可以按照以下步骤进行操作: 1. 创建Docker镜像:首先,我们需要将Spring Boot应用打包成一个Docker镜像。我们可以使用Maven或Gradle构建工具来执行此操作。在创建镜像时,我们需要指定容器运行所需的基础镜像、将Spring Boot应用的JAR文件添加到镜像中,并配置容器的启动命令。 2. 配置K8s资源:接下来,我们需要定义一组K8s资源,用于描述如何部署和运行Spring Boot应用。这些资源包括Deployment、Service和Ingress。Deployment用于定义应用部署规则,Service用于暴露应用的网络访问入口,Ingress则用于将外部请求路由到应用的Service。 3. 应用部署:在配置完成后,我们可以使用Kubectl命令将应用部署K8s集群中。Kubectl是Kubernetes的命令行工具,它可以与K8s API进行交互,管理集群中的资源。通过执行`kubectl create`或`kubectl apply`命令,可以创建或更新我们定义的K8s资源。 4. 监控和扩展:一旦应用部署成功,我们可以使用K8s提供的监控工具来监控应用的性能和运行状态。K8s还提供了自动伸缩的功能,可以根据应用的负载情况自动调整副本数量,以提供更好的性能和可用性。 总结来说,将Spring Boot应用部署K8s上可以帮助我们更好地管理和扩展应用。通过将应用打包成Docker镜像,并使用K8s的资源配置和管理工具,我们可以轻松地将应用部署K8s集群中,并享受K8s提供的自动扩展和监控功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值