当前位置: 首页 > article >正文

1.4 给应用添加service,执行扩容和滚动更新

本节重点总结:

  • k8s Service三种类型

    • ClusterIP(默认)
    • NodePort
    • LoadBalancer
  • 为 nginx Deployment 创建一个 Service,并通过service访问pod

  • Scaling(伸缩)应用程序,将 nginx Deployment 扩容到 4 个副本

  • 执行滚动更新

    • Rolling Update滚动更新 通过使用新版本的 Pod 逐步替代旧版本的 Pod 来实现 Deployment 的更新,从而实现零停机

k8s Service(服务)简介

  • Kubernetes 中的 Service(服务) 提供了这一个抽象层,它选择具备某些特征的 Pod(容器组)并为它们定义一个访问方式
  • Service(服务)使 Pod(容器组)之间的相互依赖解耦(原本从一个 Pod 中访问另外一个 Pod,需要知道对方的 IP 地址)
  • 一个 Service(服务)选定哪些 Pod(容器组) 通常由 LabelSelector(标签选择器) 来决定。
  • 在创建Service的时候,通过设置配置文件中的 spec.type 字段的值,可以以不同方式向外部暴露应用程序:

ClusterIP(默认)

  • 在群集中的内部IP上公布服务,这种方式的 Service(服务)只在集群内部可以访问到

NodePort

  • 使用 NAT 在集群中每个的同一端口上公布服务
  • 这种方式下,可以通过访问集群中任意节点+端口号的方式访问服务 :
  • 此时 ClusterIP 的访问方式仍然可用。

LoadBalancer

  • 在云环境中(需要云供应商可以支持)创建一个集群外部的负载均衡器,并为使用该负载均衡器的 IP 地址作为服务的访问地址
  • 此时 ClusterIP 和 NodePort 的访问方式仍然可用

为 nginx Deployment 创建一个 Service

创建文件 nginx-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-service	#Service 的名称
  labels:     	#Service 自己的标签
    app: nginx	#为该 Service 设置 key 为 app,value 为 nginx 的标签
spec:	    #这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问
  selector:	    #标签选择器
    app: nginx	#选择包含标签 app:nginx 的 Pod
  ports:
  - name: nginx-port	#端口的名字
    protocol: TCP	    #协议类型 TCP/UDP
    port: 80	        #集群内的其他容器组可通过 80 端口访问 Service
    nodePort: 32600   #通过任意节点的 32600 端口访问 Service
    targetPort: 80	#将请求转发到匹配 Pod 的 80 端口
  type: NodePort	#Serive的类型,ClusterIP/NodePort/LoaderBalancer

部署

apply

 kubectl apply -f nginx-service.yaml

检查执行结果

[root@k8s-master01 k8s_yamldate]# kubectl get svc -o wide 
NAME                  TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE    SELECTOR
nginx-service         NodePort    10.96.10.90    <none>        80:32600/TCP   77s    app=nginx
  • NAME 是service的name
  • TYPE 是NodePort
  • CLUSTER-IP 是这个svc的 内部访问ip
  • EXTERNAL-IP 是这个svc 的外部访问ip,和公有云对接
  • port 代表端口映射
  • SELECTOR 代表pod 标签选择器

访问服务

curl <任意节点的 IP>:32600
[root@k8s-master01 k8s_yamldate]# curl localhost:32600               
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Scaling(伸缩)应用程序

  • 在之前的文章中,我们创建了一个 Deployment
  • 然后通过服务提供访问 Pod 的方式。我们发布的 Deployment 只创建了一个 Pod 来运行我们的应用程序
  • 当流量增加时,我们需要对应用程序进行伸缩操作以满足系统性能需求。

将 nginx Deployment 扩容到 4 个副本

修改 nginx-deployment.yaml 文件

  • 将 replicas 修改为 4
spec:           #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
  replicas: 4   #使用该Deployment创建一个应用程序实例

部署

 kubectl apply -f nginx-deployment.yaml
[root@k8s-master01 k8s_yamldate]# kubectl get deployment nginx-deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   4/4     4            4           47m
  • apply之后可以看到 nginx-deployment中READY 的个数由1变为了4
  • 同时观察我们的pod ,可以看到nginx-deployment的pod变成4个
[root@k8s-master01 k8s_yamldate]# kubectl get pod |grep nginx-deployment
nginx-deployment-746fbb99df-tdmb7              1/1     Running            0          48m
nginx-deployment-746fbb99df-v6l9c              1/1     Running            0          102s
nginx-deployment-746fbb99df-v8cm5              1/1     Running            0          102s
nginx-deployment-746fbb99df-w4qqx              1/1     Running            0          102s
[root@k8s-master01 k8s_yamldate]# 

执行滚动更新

  • 用户期望应用程序始终可用,为此开发者/运维者在更新应用程序时要分多次完成
  • 在 Kubernetes 中,这是通过 Rolling Update 滚动更新完成的
  • Rolling Update滚动更新 通过使用新版本的 Pod 逐步替代旧版本的 Pod 来实现 Deployment 的更新,从而实现零停机
  • 新的 Pod 将在具有可用资源的 Node(节点)上进行调度。
  • 这个过程中,Service 能够监视 Pod 的状态,将流量始终转发到可用的 Pod 上。

修改 nginx-deployment.yaml 文件

  • 修改文件中 image 镜像的标签,如下所示
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.8   #使用镜像nginx:1.8替换原来的nginx:1.7.9
        ports:
        - containerPort: 80
  • 执行命令
kubectl apply -f nginx-deployment.yaml

  • 查看过程及结果,可以看到 逐步替换的过程
watch kubectl get pods -l app=nginx

Every 2.0s: kubectl get pods -l app=nginx                                                                                                                                                                        Fri Oct  8 17:14:39 2021

nginx-deployment-746fbb99df-tdmb7   1/1     Terminating   0          52m      
nginx-deployment-746fbb99df-v6l9c   0/1     Terminating   0          6m2s
nginx-deployment-746fbb99df-v8cm5   0/1     Terminating   0          6m2s
nginx-deployment-746fbb99df-w4qqx   0/1     Terminating   0          6m2s
nginx-deployment-7cd7fc4dbf-ckdtk   1/1     Running       0          5s
nginx-deployment-7cd7fc4dbf-m4ppb   1/1     Running       0          4s
nginx-deployment-7cd7fc4dbf-pq27j   1/1     Running       0          3s
nginx-deployment-7cd7fc4dbf-xjndw   1/1     Running       0          3s



NAME                                READY   STATUS        RESTARTS   AGE      
nginx-deployment-7cd7fc4dbf-ckdtk   1/1     Running       0          22s
nginx-deployment-7cd7fc4dbf-m4ppb   1/1     Running       0          21s
nginx-deployment-7cd7fc4dbf-pq27j   1/1     Running       0          20s
nginx-deployment-7cd7fc4dbf-xjndw   1/1     Running       0          20s



本节重点总结:

  • k8s Service三种类型

    • ClusterIP(默认)
    • NodePort
    • LoadBalancer
  • 为 nginx Deployment 创建一个 Service,并通过service访问pod

  • Scaling(伸缩)应用程序,将 nginx Deployment 扩容到 4 个副本

  • 执行滚动更新

    • Rolling Update滚动更新 通过使用新版本的 Pod 逐步替代旧版本的 Pod 来实现 Deployment 的更新,从而实现零停机

http://www.kler.cn/a/504098.html

相关文章:

  • <代码随想录> 算法训练营-2025.01.09
  • 【Qt】01-了解QT
  • Vue.js前端框架教程16:Element UI的el-dialog组件
  • 基于当前最前沿的前端(Vue3 + Vite + Antdv)和后台(Spring boot)实现的低代码开发平台
  • 如何独立SDK模块到源码目录?
  • 蓝牙BT04-A的使用与相关AT指令
  • TDSQL 内存占用解析一例
  • Golang|单机并发缓存
  • 24. 【.NET 8 实战--孢子记账--从单体到微服务】--记账模块--预算扣除、退回、补充
  • 华为2024嵌入式研发面试题
  • Adobe与MIT推出自回归实时视频生成技术CausVid。AI可以边生成视频边实时播放!
  • Oracle 终止正在执行的SQL
  • 下载导出Tomcat上的excle文档,浏览器上显示下载
  • Web前端------HTML块级和行内标签之块级标签
  • kube-prometheus监控Linux主机
  • 关于H5复制ios没有效果
  • JavaScript系列(25)--性能优化技术详解
  • 如何通过NMudbus读取寄存器数据
  • Vue环境变量配置指南:如何在开发、生产和测试中设置环境变量
  • mysql 与Redis 数据强一致方案
  • Jenkins简单的安装运行
  • 线程间通信
  • 当生活低迷时,如何醒过走出迷境?
  • SQL从入门到实战-2
  • Scala语言的字符串处理
  • 【某大型互联网企业】软件测试面试经验分享(1 ~ 3年)