Kubectl 部署无状态应用

基本概念

无状态服务

无状态服务不会在本地存储持久化数据。多个服务实例对于同一个用户请求的响应结果是完全一致的。这种多服务实例之间是没有依赖关系,比如web应用,在k8s控制器中动态启停无状态服务的pod并不会对其它的pod产生影响。

有状态服务

有状态服务需要在本地存储持久化数据,典型的是分布式数据库的应用,分布式节点实例之间有依赖的拓扑关系。比如,主从关系。如果K8S停止分布式集群中任一实例pod,就可能会导致数据丢失或者集群的crash。

Deployment控制器被设计用来管理无状态服务的pod,每个pod完全一致。即:

  • 无状态服务内的多个Pod创建的顺序是没有顺序的。
  • 无状态服务内的多个Pod的名称是随机的,pod被重新启动调度后,它的名称与IP都会发生变化。
  • 无状态服务内的多个Pod背后是共享存储的。

开始部署无状态应用

目标

  • 运行 Hello World 应用程序的五个实例。
  • 创建公开外部 IP 地址的服务对象。
  • 使用 Service 对象访问正在运行的应用程序。

1.编写yaml文件

vim load-balancer-example.yaml

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: load-balancer-example
  name: hello-world
spec:
  replicas: 5
  selector:
    matchLabels:
      app.kubernetes.io/name: load-balancer-example
  template:
    metadata:
      labels:
        app.kubernetes.io/name: load-balancer-example
    spec:
      containers:
      - image: gcr.io/google-samples/node-hello:1.0
        name: hello-world
        ports:
        - containerPort: 8080

可以看到yaml文件中,kind的类型为Deployment,replicas个数为5。

lua 复制代码
kubectl apply -f load-balancer-example.yaml

此yaml文件由k8s官方提供,因此也可以通过执行以下命令来进行部署。

bash 复制代码
kubectl apply -f https://k8s.io/examples/service/load-balancer-example.yaml

2.显示有关部署的信息

sql 复制代码
kubectl get deployments hello-world
kubectl describe deployments hello-world

当然也可以执行 kubectl get pods 查看已经部署的5个hello-world pods。

此时,可以看到STATUS显示ContainerCreating。

可以执行kubectl get pod hello-world-7476585d6-4f9w8

在Events中可以看到,失败的原因是拉取镜像失败。我们这边采用的镜像是gcr.io/google-samples/node-hello:1.0。k8s再拉取镜像时是通过调用Docker进行拉取。所以这时候,我们可以通过docker search node-hello:1.0

先执行kubectl delete -f load-balancer-example.yaml 将之前的pod删除掉。

替换yaml文件中的image

arduino 复制代码
image: tomtsang/dockerlibraryk8s-node-hello 

或者使用其他镜像;或者采用科学🪜手段,先docker pull 下来。

READY 是当前已经创建成功的pod数量和需要创建的总数。

3.显示有关 ReplicaSet 对象的信息

sql 复制代码
kubectl get replicasets
kubectl describe replicasets

4.创建一个公开部署的 Service 对象

css 复制代码
kubectl expose deployment hello-world --type=LoadBalancer --name=my-service

5.显示有关服务的信息

arduino 复制代码
kubectl get services my-service

由于我此处使用的是minikube,因此EXTERNAL-IP 显示pending。 如果用的多节点形式。大概会输出类似:

scss 复制代码
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)    AGE
my-service   LoadBalancer   10.3.245.137   104.198.205.71   8080/TCP   54s

6.显示有关服务的详细信息

yaml 复制代码
kubectl describe services my-service
----
Name:                     my-service
Namespace:                default
Labels:                   app.kubernetes.io/name=load-balancer-example
Annotations:              <none>
Selector:                 app.kubernetes.io/name=load-balancer-example
Type:                     LoadBalancer
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.97.24.45
IPs:                      10.97.24.45
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  30386/TCP
Endpoints:                10.244.0.10:8080,10.244.1.18:8080,10.244.1.19:8080 + 2 more...
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

7. 使用外部 IP 地址 ( LoadBalancer Ingress) 访问 Hello World 应用程序

NodePort: 30386/TCP

xml 复制代码
curl http://<external-ip>:<port>

由于本文使用的是minikube ,因此可以执行minikube service my-service

成功请求的响应是一条 hello 消息:

Hello Kubernetes!

清理服务

要删除服务,输入以下命令:

perl 复制代码
kubectl delete services my-service

要删除 Deployment、ReplicaSet 和运行 Hello World 应用程序的 Pod, 输入以下命令:

arduino 复制代码
kubectl delete deployment hello-world

走完所有的流程,就完成了无状态应用的部署与删除。是不是so easy~

下一篇将会介绍有状态应用的部署。

本文由mdnice多平台发布

相关推荐
全云在线allcloudonline17 小时前
江苏阿里云代理商怎么选?现有服务点、南京节点与项目交付
阿里云·云计算·企业上云
全云在线allcloudonline20 小时前
湖北阿里云代理商怎么选?现有服务点、武汉节点与项目交付
阿里云·云计算·企业上云
全云在线allcloudonline20 小时前
陕西阿里云代理商怎么选?现有服务点、西安节点与项目交付
阿里云·云计算·企业上云
搞科研的小刘选手1 天前
【哈尔滨信息工程学院主办】第五届信息经济、数据建模与云计算国际学术会议(ICIDC 2026)
云计算·数据建模·学术会议·会议推荐·信息经济
xywww1681 天前
Claude Opus 5 API 接入实战:国内项目上线前的网络、Key、限流和排错清单
大数据·linux·网络·数据库·云计算·aws
AOwhisky2 天前
Linux(CentOS)系统管理入门笔记(第十四期)——计划任务与进程调度管理:atcron 与 nicechrt
linux·运维·笔记·centos·云计算·进程调度·计划任务
冰封之寂2 天前
Docker 资源管理终极指南:CPU、内存与 IO 的精细化控制
linux·运维·服务器·docker·云计算
yiyeguzhou1003 天前
Load/Store 和 Register–memory 架构
性能优化·云计算
AOwhisky3 天前
Linux(CentOS)系统管理入门笔记(第十二期)——系统管理工具与软件包管理(上篇):Cockpit 与 RPM 包管理
linux·运维·笔记·centos·云计算
TMT星球4 天前
IDC报告:阿里云稳居中国混合云软件及服务市场第一
阿里云·云计算