ITPub博客

首页 > Linux操作系统 > Linux操作系统 > kubernetes集群常用资源(三)!

kubernetes集群常用资源(三)!

原创 Linux操作系统 作者:老男孩Linux 时间:2025-11-25 13:46:22 0 删除 编辑

   replicationcontrollers

  | RC 控制器概述

  Replication Controller 会持续监控正在运行的pod列表, 并保证相应 ” 类型” 的 pod的数目与期望相符(多了删除,少了新增)

  所谓的类型就是通过标签选择器监控模板中指定标签的pod的数量

   注意:

  •   在新版本的k8s中的副本控制器为Replica Set 完全替代了Replication Controller
  •   在kubectl 命令中 Replication Controller 可简写为rc ,Replica Set 为rs

  | RC 的三部分

  label selector (标签选择器):用于确定ReplicationController作用域中有哪些pod

  replica count (副本个数):指定应运行的pod 数量

  pod template (pod模板):用于创建新的pod 副本

  注意:

  1、ReplicationController 的副本个数、标签选择器,甚至是 pod模板都可以随时修改,但只有副本数目的变更会影响现有的 pod

  2、更改标签选择器和pod模板对现有 pod 没有影响

  •   在创建 pod后,RC也不关心其 pod的实际 “ 内容 ”(容器镜像、 环境变量及其他)
  •   因此更改模板仅影响由此RC 创建的新pod例如在模板中添加标签不会立马给现有Pod 添加,而是新建新的Pod 的时候会添加这个新的标签

  3、修改Pod 的标签,pod 就会脱离了RC控制,然后PC 会新建一个pod,给pod 添加新的标签不影响RC对pod 的管理

  4、修改了 ReplicationController 的标签选择器,那么原有的pod 脱离RC控制,然后RC会新创建几个新的 pod

  | RC 的作用

  1.   人为删除、增加pod后,副本控制器就会根据模板中定义的数量通过创建/删除来维持应有的数量,或者pod 异常丢失停止都会根据模板创建新的pod
  2.   集群节点发生故障时, 它将为故障节 点 上运行的所有 pod (即受ReplicationController 控制的节点上的那些 pod) 创建替代副本
  3.   根据使用需求它能轻松实现 pod的水平伸缩,手动和自动都可以

   RC资源创建

  | 编写rc的测试文件

apiVersion: v1
kind: ReplicationController
metadata:name: oldboyedu-nginx
spec:replicas: 5selector:
  app: oldboyedu-web
template:
  metadata:
    labels:
      app: oldboyedu-web
  spec:
    containers:
    - name: oldboyedu-linux-web
      image: 10.0.0.101:5000/nginx:1.20.1
      ports:
      - containerPort: 80

  | 使用 RC 资源

# 启动kubectl apply -f 01-nginx-rc.yml# 删除Pod测试RC控制器是否会自动拉起新的Pod(删除效果如下图所示)kubectl delete pod oldboyedu-nginx-05z64
kubectl delete pod oldboyedu-nginx-zdhqk

  | 编写rc升级版本的配置文件

# 编写rc升级版本的配置文件cat >02-nginx-rc.yml<<EOF
apiVersion: v1
kind: ReplicationController
metadata:name: oldboyedu-nginx-2022spec:replicas: 5selector:
  app: oldboyedu-web-2022template:
  metadata:
    labels:
      app: oldboyedu-web-2022
  spec:
    containers:
     - name: oldboyedu-linux-web-2022
      image: 10.0.0.101:5000/nginx:1.20.1
      ports:
       - containerPort: 80EOF# 滚动升级kubectl rolling-update oldboyedu-nginx -f 02-nginx-rc.yml --update-period=10s

  滚动升级相关参数说明:

  使用 rc 实现滚动回滚

kubectl rolling-update oldboyedu-nginx-2022 -f 01-nginx-rc.yml --update-period=1s

  温馨提示:

  如下图所示,其实升级和回滚基本上都是一个套路,基本上命令参数都相同,只不过指定不同的资源清单和基于哪个对象进行回滚而已

   ReplicaSet

  | RS 介绍

  Replication Set简称RS,随着Kubernetes的高速发展,官方已经推荐我们使用RS和Deployment来代替RC了,实际上RS和RC的功能基本一致,目前唯一的一个区别就是RC只支持基于等式的selector(env=dev或environment!=qa),但RS还支持基于集合的selector(version in (v1.0, v2.0)),这对复杂的运维管理就非常方便了

  kubectl命令行工具中关于RC的大部分命令同样适用于我们的RS资源对象

  不过我们也很少会去单独使用RS,它主要被Deployment这个更加高层的资源对象使用,除非用户需要自定义升级功能或根本不需要升级Pod,在一般情况下,我们推荐使用Deployment而不直接使用Replica Set

  这里总结下关于RC/RS的一些特性和作用:

  •   大部分情况下,我们可以通过定义一个RC实现的Pod的创建和副本数量的控制
  •   RC中包含一个完整的Pod定义模块(不包含apiversion和kind)
  •   RC是通过label selector机制来实现对Pod副本的控制的
  •   通过改变RC里面的Pod副本数量,可以实现Pod的扩缩容功能
  •   通过改变RC里面的Pod模板中镜像版本,可以实现Pod的滚动升级功能(但是不支持一键回滚,需要用相同的方法去修改镜像地址)

  | rs参考案例

apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:name: oldboyedu-linux-rs
spec:
 # 指定创建Pod的副本数量,默认值为1.replicas: 1
 # 定义标签选择器,rs资源基于标签选择器关联对应的Podselector:
  matchLabels:
    apps: oldboyedu-web # 定义Pod资源创建的模板template:
  metadata:
    name: linux-pod
    labels:
      apps: oldboyedu-web
  spec:
    containers:
     - name: linux-web
      image: nginx:1.20.1

   Deployment

  | deploy介绍

  在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的

  Pod控制器用于Pod的管理,确保Pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建Pod

  | deploy的作用

  •   定义一组pod的期望数量,controller会维持Pod的数量和期望的一致(其实deployment是通过管理rs的状态来间接管理pod)
  •   配置Pod的发布方式,controller会按照给定的策略去更新pod资源,以此来保证更新过程中可用的pod数量和不可用的pod数量都在限定范围内(MaxUnavailable以及MaxSurge字段)
  •   支持回滚操作,可记录多个前置版本(数量可通过配置设置revisionHistoryLimit)

   deploy资源创建

  | deploy参考案例

apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: oldboyedu-linux-deploy
spec:
 # 指定创建Pod的副本数量,默认值为1.replicas: 3
 # 定义标签选择器,rs资源基于标签选择器关联对应的Pod哟~selector:
  matchLabels:
    apps: oldboyedu-web # 定义Pod资源创建的模板template:
  metadata:
    name: linux-pod
    labels:
      apps: oldboyedu-web
  spec:
    containers:
    - name: linux-web
      image: nginx:1.18

  | deploy升级策略

apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: oldboyedu-linux-deploy
spec:
 # 指定创建Pod的副本数量,默认值为1.replicas: 5
 # 定义标签选择器,rs资源基于标签选择器关联对应的Pod哟~selector:
  matchLabels:
    apps: oldboyedu-web # 定义升级策略strategy:
   # 升级的类型,"Recreate" or "RollingUpdate"
   # Recreate:
   #   先停止所有的Pod运行,然后在批量创建更新。
   #   生产环节中不推荐使用这种策略,因为升级过程中用户将无法访问服务!
   # RollingUpdate:
   #   滚动更新,即先实现部分更新,逐步替换原有的pod,是默认策略。
  type: RollingUpdate   # 自定义滚动更新的策略
  rollingUpdate:
     # 在原有Pod的副本基础上,多启动Pod的数量。
    maxSurge: 2
     # 在升级过程中最大不可访问的Pod数量.
    maxUnavailable: 1
 # 定义Pod资源创建的模板template:
  metadata:
    name: linux-pod
    labels:
      apps: oldboyedu-web
  spec:
    containers:
     - name: linux-web
      image: nginx:1.20.1

  | 项目案例:部署wordpress

  将服务放到一个容器里

# 编写资源清单cat > 01-deploy-wordpresss.yaml <'EOF'apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: wordpress
spec:replicas: 2selector:
  matchLabels:
    app: wordpress
template:
  metadata:
    labels:
      app: wordpress
  spec:
    containers:
     - name: mysql
      image: 10.0.0.101:5000/mysql:5.7
      ports:
       - containerPort: 3306
      env:
       - name: MYSQL_ROOT_PASSWORD
        value: somewordpress       - name: MYSQL_DATABASE
        value: wordpress       - name: MYSQL_USER
        value: wordpress       - name: MYSQL_PASSWORD
        value: wordpress     - name: wordpress
      image: 10.0.0.101:5000:5000/wordpress:latest
      ports:
       - containerPort: 80
      env:
       - name: WORDPRESS_DB_HOST
        value: 127.0.0.1
       - name: WORDPRESS_DB_USER
        value: wordpress       - name: WORDPRESS_DB_PASSWORD
        value: wordpress
EOF# 暴露服务kubectl expose -f 01-deploy-wordpresss.yaml --type=NodePort

  将Pod的容器进行拆分

# 拆分mysqlcat > deploy-mysql.yaml <<'EOF'apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: oldboyedu-mysql
spec:replicas: 1selector:
  matchLabels:
    app: oldboyedu-mysql
template:
  metadata:
    labels:
      app: oldboyedu-mysql
  spec:
    containers:
     - name: oldboyedu-mysql
      image: 10.0.0.101:5000/mysql:5.7
      ports:
       - containerPort: 3306
      env:
       - name: MYSQL_ROOT_PASSWORD
        value: somewordpress       - name: MYSQL_DATABASE
        value: wordpress       - name: MYSQL_USER
        value: wordpress       - name: MYSQL_PASSWORD
        value: wordpress
EOF# 拆分wordpresscat > deploy-wordpresss.yaml <<'EOF'apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: oldboyedu-wordpress
spec:replicas: 3selector:
  matchLabels:
    app: oldboyedu-wordpress
template:
  metadata:
    labels:
      app: oldboyedu-wordpress
  spec:
    containers:
     - name: oldboyedu-wordpress
      image: 10.0.0.101:5000/wordpress:latest
      ports:
       - containerPort: 80
      env:
       - name: WORDPRESS_DB_HOST         # 写mysql的Pod的IP地址
        value: 10.244.1.163
       - name: WORDPRESS_DB_USER
        value: wordpress       - name: WORDPRESS_DB_PASSWORD
        value: wordpress
EOF# 暴露workpress服务kubectl expose deployment oldboyedu-wordpress --type=NodePort

  解决svc的IP地址变化及数据持久化问题

# 部署mysql服务cat > 01-deploy-mysql.yaml <<'EOF'apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: oldboyedu-mysql
spec:replicas: 1selector:
  matchLabels:
    app: oldboyedu-mysql
template:
  metadata:
    labels:
      app: oldboyedu-mysql
  spec:
    volumes:
      - name: data
        nfs:
          server: 10.0.0.101
          path: /oldboyedu/data/kubernetes
    containers:
     - name: oldboyedu-mysql
      image: 10.0.0.101:5000/mysql:5.7
      volumeMounts:
       - name: data
        mountPath: /var/lib/mysql
      ports:
       - containerPort: 3306
      env:
       - name: MYSQL_ROOT_PASSWORD
        value: somewordpress       - name: MYSQL_DATABASE
        value: wordpress       - name: MYSQL_USER
        value: wordpress       - name: MYSQL_PASSWORD
        value: wordpress---apiVersion: v1
kind: Service
metadata:name: oldboyedu-mysql
spec:clusterIP: 10.254.131.222selector:
    app: oldboyedu-mysql
ports:
 - port: 3306
  targetPort: 3306EOF# 部署wordpress服务cat > 02-deploy-wordpresss.yaml <<'EOF'apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: oldboyedu-wordpress
spec:replicas: 3selector:
  matchLabels:
    apps: oldboyedu-wordpress
template:
  metadata:
    labels:
      apps: oldboyedu-wordpress
  spec:
    containers:
     - name: oldboyedu-wordpress
      image: k8s201.oldboyedu.com:5000/wordpress:latest
      ports:
       - containerPort: 80
      env:
       - name: WORDPRESS_DB_HOST
        value: 10.254.131.222
       - name: WORDPRESS_DB_USER
        value: wordpress       - name: WORDPRESS_DB_PASSWORD
        value: wordpress---apiVersion: v1
kind: Service
metadata:name: oldboyedu-wordpress
spec:type: NodePort
selector:
    apps: oldboyedu-wordpress
ports:
 - port: 80
  targetPort: 80
  nodePort: 30088EOF# 创建服务kubectl apply -f .# 验证数据是否丢失kubectl delete pod --all# 回收资源kubectl delete -f .

  


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69952968/viewspace-3103352/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
老男孩it教育——致力于帮助有志向的年轻人通过努力学习获得体面的工作和生活。专注于Linux云计算运维、Python全栈开发、网络安全、新媒体运营、容器云架构师、MySQL数据库、go语言的培训。学习可call:18710030740

注册时间:2019-11-06

  • 博文量
    389
  • 访问量
    1010486