本篇文章,集群接着为大家介绍kubernetes集群常用资源,常用如果没有看过之前的资源文章,建议大家在阅读这篇文章之前,集群先阅读一下以下两篇文章:
kubernetes集群常用资源(一)!LinuxSRE工程师培训
kubernetes集群常用资源(二)!Linux运维培训班
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 的作用
人为删除、增加pod后,副本控制器就会根据模板中定义的数量通过创建/删除来维持应有的数量,或者pod 异常丢失停止都会根据模板创建新的pod 集群节点发生故障时, 它将为故障节 点 上运行的所有 pod (即受ReplicationController 控制的节点上的那些 pod) 创建替代副本 根据使用需求它能轻松实现 pod的水平伸缩,手动和自动都可以RC资源创建
| 编写rc的测试文件
apiVersion: v1 kind: ReplicationController metadata: name: oldboyedu-nginx spec: replicas: 5 selector: 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-2022 spec: replicas: 5 selector: app: oldboyedu-web-2022 template: 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: 80 EOF # 滚动升级 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资源基于标签选择器关联对应的Pod selector: matchLabels: apps: oldboyedu-web # 定义Pod资源创建的模板 template: metadata: name: linux-pod labels: apps: oldboyedu-web spec: containers: - name: linux-web image: nginx:1.20.1Deployment
| 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: 2 selector: 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的容器进行拆分
# 拆分mysql cat > deploy-mysql.yaml <<EOF apiVersion: extensions/v1beta1 kind: Deployment metadata: name: oldboyedu-mysql spec: replicas: 1 selector: 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 # 拆分wordpress cat > deploy-wordpresss.yaml <<EOF apiVersion: extensions/v1beta1 kind: Deployment metadata: name: oldboyedu-wordpress spec: replicas: 3 selector: 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: 1 selector: 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.222 selector: app: oldboyedu-mysql ports: - port: 3306 targetPort: 3306 EOF # 部署wordpress服务 cat > 02-deploy-wordpresss.yaml <<EOF apiVersion: extensions/v1beta1 kind: Deployment metadata: name: oldboyedu-wordpress spec: replicas: 3 selector: 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: 30088 EOF # 创建服务 kubectl apply -f . # 验证数据是否丢失 kubectl delete pod --all # 回收资源 kubectl delete -f .







