云原生Kubernetes:K8S集群实现容器运行时迁移(docker → containerd) 与 版本升级(v1.23.14 → v1.24.1)
目录
一、理论
1.K8S集群升级
2.环境
3.升级策略
4.master1节点迁移容器运行时(docker → containerd)
5.master2节点迁移容器运行时(docker → containerd)
6.node1节点容器运行时迁移(docker → containerd)
7.升级集群计划(v1.23.14 → v1.24.1)
8.升级master1节点版本(v1.24.1)
9.升级master2节点版本(v1.24.1)
10.升级node1节点版本(v1.24.1)
11.验证集群(v1.24.1)
二、实验
1. 环境
2.master1节点迁移容器运行时(docker → containerd)
3.master2节点迁移容器运行时(docker → containerd)
4.node1节点迁移容器运行时(docker → containerd)
5.升级集群计划(v1.23.14 → v1.24.1)
6.升级master1节点版本(v1.24.1)
7.升级 master2节点版本(v1.24.1)
8.升级 node1节点版本(v1.24.1)
9.验证集群(v1.24.1)
一、理论
1.K8S集群升级
(1)概念
搭建K8S集群的方式有很多种,比如二进制,kubeadm,RKE(Rancher)等,K8S集群升级方式也各有千秋,目前准备使用kubeadm方式搭建的k8s集群升级方法。
需要注意的是,升级集群版本建议逐步升级,比如v1.21.1–>v1.22.1–>v1.23.1–>v1.24.1,不能跨度过大,否则会报错。
2.环境
(1)主机(容器运行时)
表1 主机(容器运行时)
| 主机 | 架构 | 当前容器运行时 | 目标容器运行时 | IP |
|---|---|---|---|---|
| master1 | K8S master节点 | docker 20.10.6 | containerd 1.6.24 | 192.168.204.180 |
| master2 | K8S master节点 | docker 20.10.6 | containerd 1.6.24 | 192.168.204.181 |
| node1 | K8S node节点 | docker 20.10.6 | containerd 1.6.24 | 192.168.204.182 |
(2)主机 (集群版本)
表2 主机(集群版本)
| 主机 | 架构 | 当前版本 | 目标版本 | IP |
|---|---|---|---|---|
| master1 | K8S master节点 | v1.23.14 | v1.24.1 | 192.168.204.180 |
| master2 | K8S master节点 | v1.23.14 | v1.24.1 | 192.168.204.181 |
| node1 | K8S node节点 | v1.23.14 | v1.24.1 | 192.168.204.182 |
3.升级策略
(1)升级策略1
先迁移容器运行时为containerd:
docker → containerd
(2)升级策略2
然后升级集群版本到v1.24.1:
v1.23.14 → v1.24.1
4.master1节点迁移容器运行时(docker → containerd)
(1)确定迁移容器运行时
可以看到目前的容器运行时是docker 20.10.6。
kubectl get nodes -owide #查看容器运行时
(2)迁移master1
kubectl drain master1 --delete-emptydir-data --force --ignore-daemonsets #对k8s控制节点xianchaomaster1进行drain
(3)关闭并卸载Docker
systemctl disable docker --now #先启动dockeryum remove docker-ce docker-ce-cli -y #卸载
(4)安装并配置containerd
yum install containerd.io cri-tools -y # 安装crictl config runtime-endpoint unix:///var/run/containerd/containerd.sockcontainerd config default > /etc/containerd/config.toml #生成配置文件vim /etc/containerd/config.toml #使用vim编辑器打开,分别搜素mirrors、sandbox、SystemdCgroup并修改
(5)重启containerd服务
systemctl enable containerd ; systemctl restart containerd # 重启systemctl status containerd # 查看服务状态
(6)配置并启动kubelet
vim /etc/sysconfig/kubelet #设置kubelet启动参数systemctl restart kubelet #重启kubelet服务
(7)对master节点进行uncordon
kubectl uncordon master1 #解除维护
(8)验证
kubectl get nodes -owide #验证是否把容器运行时由docker迁移到containerd
5.master2节点迁移容器运行时(docker → containerd)
(1)确定迁移容器运行时
可以看到目前的容器运行时是docker 20.10.6。
kubectl get nodes -owide #查看容器运行时
(2)迁移master2
kubectl drain master2 --delete-emptydir-data --force --ignore-daemonsets #对k8s控制节点xianchaomaster1进行drain
(3)关闭并卸载Docker
systemctl disable docker --now #先启动dockeryum remove docker-ce docker-ce-cli -y #卸载
(4)安装并配置containerd
yum install containerd.io cri-tools -y # 安装crictl config runtime-endpoint unix:///var/run/containerd/containerd.sockcontainerd config default > /etc/containerd/config.toml #生成配置文件vim /etc/containerd/config.toml #使用vim编辑器打开,分别搜素mirrors、sandbox、SystemdCgroup并修改
(5)重启containerd服务
systemctl enable containerd ; systemctl restart containerd # 重启systemctl status containerd # 查看服务状态
(6)配置并启动kubelet
vim /etc/sysconfig/kubelet #设置kubelet启动参数systemctl restart kubelet #重启kubelet服务
(7)对master2节点进行uncordon
kubectl uncordon master2 #解除维护
(8)验证
kubectl get nodes -owide #验证是否把容器运行时由docker迁移到containerd
6.node1节点容器运行时迁移(docker → containerd)
(1) 迁移node1节点
kubectl drain node1 --delete-emptydir-data --force --ignore-daemonsets #对k8s工作节点xianchaonode1进行drain
(2)关闭并卸载Docker
systemctl disable docker --now # 关闭yum remove docker-ce docker-ce-cli -y # 卸载
(3)安装并配置containerd
yum install containerd.io cri-tools -y #安装crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock # 配置containerd config default > /etc/containerd/config.toml #生成配置文件vim /etc/containerd/config.toml #使用vim编辑器打开,分别搜素mirrors、sandbox、SystemdCgroup并修改
(4)重启containerd服务
systemctl enable containerd ; systemctl restart containerd # 重启
(5)配置并启动kubelet
vim /etc/sysconfig/kubelet #设置kubelet启动参数systemctl restart kubelet #重启kubelet服务kubectl get nodes -owide #查看pod
(6)对node1节点进行uncordon
kubectl uncordon node1 #解除维护
(7)验证
kubectl get nodes -owide #验证是否把容器运行时由docker迁移到containerd
(8)查看
kubectl get pods -n kube-system #查看集群
7.升级集群计划(v1.23.14 → v1.24.1)
(1)查看集群
kubectl get nodes -owide # 查看集群版本
(2)修改master1节点kubelet参数
kubectl edit nodes master1 #修改systemctl restart kubelet #重启
(3)修改master2节点kubelet参数
kubectl edit nodes master2 #修改systemctl restart kubelet #重启
(4)修改node1节点kubelet参数
kubectl edit nodes node1 #修改systemctl restart kubelet #重启
(5)确定升级版本
# 执行如下命令确定升级版本
yum list --showduplicates kubeadm --disableexcludes=kubernetes
我的目标版本是1.24.1-0。
8.升级master1节点版本(v1.24.1)
(1)在k8s控制节点master1安装kubeadm1.24.1
yum install -y kubeadm-1.24.1-0 --disableexcludes=kubernetes
(2)腾空控制节点master1
kubectl drain master1 --delete-emptydir-data --force --ignore-daemonsets
(3)升级控制节点master1各个组件
kubeadm upgrade apply v1.24.1
(4)升级kubectl和kubelet到1.24.1
yum install -y kubelet-1.24.1-0 kubectl-1.24.1-0 --disableexcludes=kubernetes
(5)修改kubelet参数
vim /var/lib/kubelet/kubeadm-flags.env
(6)重启kubelet
systemctl daemon-reload; systemctl restart kubelet
(7)解除master1的节点维护
kubectl uncordon master1
(8)查看节点状态
kubectl get nodes
9.升级master2节点版本(v1.24.1)
(1)在k8s控制节点master1安装kubeadm1.24.1
yum install -y kubeadm-1.24.1-0 --disableexcludes=kubernetes
(2)腾空控制节点master1
kubectl drain master2 --delete-emptydir-data --force --ignore-daemonsets
(3)升级控制节点master1各个组件
kubeadm upgrade apply v1.24.1
(4)升级kubectl和kubelet到1.24.1
yum install -y kubelet-1.24.1-0 kubectl-1.24.1-0 --disableexcludes=kubernetes
(5)修改kubelet参数
vim /var/lib/kubelet/kubeadm-flags.env
(6)重启kubelet
systemctl daemon-reload; systemctl restart kubelet
(7)解除master1的节点维护
kubectl uncordon master2
(8)查看节点状态
kubectl get nodes
10.升级node1节点版本(v1.24.1)
(1)在k8s工作节点node1安装kubeadm1.24.1
yum install -y kubeadm-1.24.1-0 --disableexcludes=kubernetes
(2)腾空控制节点master1
kubectl drain node1 --delete-emptydir-data --force --ignore-daemonsets
(3)升级node1上的kubelet
kubeadm upgrade node
(4)修改kubelet参数
vim /var/lib/kubelet/kubeadm-flags.env
(5)升级kubelet和kubectl
yum install -y kubelet-1.24.1-0 kubectl-1.24.1-0 --disableexcludes=kubernetes
(6)重启kubelet
systemctl daemon-reload; systemctl restart kubelet
(7)解除node11的节点维护
kubectl uncordon node1
11.验证集群(v1.24.1)
(1)验证集群状态是否正常
kubectl get nodes# 结果如下:
[root@master1 ~]# kubectl get nodes
版本均已升级到 v1.24.1。
(2) 查看集群服务状态
kubectl get pods -n kube-system
二、实验
1. 环境
(1)主机(容器运行时)
表1 主机(容器运行时)
| 主机 | 架构 | 当前容器运行时 | 目标容器运行时 | IP |
|---|---|---|---|---|
| master1 | K8S master节点 | docker 20.10.6 | containerd 1.6.24 | 192.168.204.180 |
| master2 | K8S master节点 | docker 20.10.6 | containerd 1.6.24 | 192.168.204.181 |
| node1 | K8S node节点 | docker 20.10.6 | containerd 1.6.24 | 192.168.204.182 |
(2)主机 (集群版本)
表2 主机(集群版本)
| 主机 | 架构 | 当前版本 | 目标版本 | IP |
|---|---|---|---|---|
| master1 | K8S master节点 | v1.23.14 | v1.24.14 | 192.168.204.180 |
| master2 | K8S master节点 | v1.24.14 | v1.24.14 | 192.168.204.181 |
| node1 | K8S node节点 | v1.24.14 | v1.24.14 | 192.168.204.182 |
2.master1节点迁移容器运行时(docker → containerd)
(1)确定迁移容器运行时
可以看到目前的容器运行时是docker 20.10.6。
(2)迁移master1
(3)关闭并卸载Docker
先启动docker,再卸载

(4)安装并配置containerd
① 安装

② 生成配置文件

③ 使用vim编辑器打开

④第一步:搜素mirrors,并修改(原来一行变三行)
修改前:

修改后:

⑤ 第二步:搜索sandbox,并修改。
修改前:
![]()
修改后:
⑥ 第三步:搜索SystemdCgroup,并修改。
修改前:

修改后:
![]()
(5)重启containerd服务
① 重启

②查看服务

(6)配置并启动kubelet
① 设置

②修改
③ 重启kubelet服务

④这时查看pod,master1为SchedulingDisabled,容器运行时还未更新

(7)对master1节点进行uncordon
(8)验证(此时master1可以调度)
3.master2节点迁移容器运行时(docker → containerd)
(1)迁移master2
(2)关闭并卸载Docker
先启动

卸载

(4)安装并配置containerd
① 安装

② ⑩配置

③ 生成配置文件

④ 使用vim编辑器打开
![]()
⑤第一步:搜素mirrors,并修改(原来一行变三行)

⑥第二步:搜索sandbox,并修改。

⑦ 第三步:搜索SystemdCgroup,并修改。

(5)重启containerd服务
① 重启

② 查看服务

(6)配置并启动kubelet
①设置

② 修改

③ 重启

④ 这时查看pod,master2为SchedulingDisabled,容器运行时已更新

(7)对master2节点进行uncordon
(8)验证(此时master2可以调度)
4.node1节点迁移容器运行时(docker → containerd)
(1) 迁移node1节点
(2)关闭并卸载Docker
关闭并卸载

(3)安装并配置containerd
① 安装

② 配置

③生成配置文件

④ 使用vim编辑器打开

⑤ 第一步:搜素mirrors,并修改(原来一行变三行)。

⑥第二步:搜索sandbox,并修改。

⑦ 第三步:搜索SystemdCgroup,并修改。

(4)重启containerd服务
① 重启
② 查看服务

(5)配置并启动kubelet
① 设置

② 这时查看pod,node1为SchedulingDisabled,容器运行时已更新

(6)对node节点进行uncordon
(7)验证 (此时node1可以调度)
(8)查看
5.升级集群计划(v1.23.14 → v1.24.1)
(1)确定升级版本
可以看到目前的版本是v1.23.14。
(2)修改节点kubelet参数(在runtime由docker迁移到containerd之后做)
①修改master1节点

修改前:

修改后:

②重启

③修改master2节点

修改前:

修改后:

④重启

⑤修改node1节点

修改前:

修改后:

④重启

(3)确定升级计划
执行如下命令确定升级版本

我的目标版本是1.24.1-0。
6.升级master1节点版本(v1.24.1)
(1)在k8s控制节点master1安装kubeadm1.24.1

(2)腾空控制节点master1

(3)升级控制节点master1各个组件

成功

(4)升级kubectl和kubelet到1.24.1
![]()
(5)修改kubelet参数

修改前:

修改后:

(6)重启kubelet
![]()
(7)解除master1的节点维护

(8)查看节点状态(master1已升级为v1.24.1)


7.升级 master2节点版本(v1.24.1)
(1)在k8s控制节点master2安装kubeadm1.24.1

(2)腾空控制节点master2

(3)升级master2节点

成功:

(4)升级kubectl和kubelet到1.24.1

(5)修改kubelet参数
![]()
修改前:

修改后:

(6)重启kubelet
(7)查看节点状态(master1和master2都已升级为v1.24.1)

8.升级 node1节点版本(v1.24.1)
(1)在node1节点上安装kubeadm 1.24.1

(2)腾空节点node1(驱逐node1的pod)

(3)升级node1上的kubelet

(4)修改kubelet变量
![]()
修改前:

修改后:

(5)升级kubelet和kubectl

(6)解除对node1的保护

9.验证集群(v1.24.1)
(1)验证集群状态是否正常

版本均已升级到 v1.24.1。
(2) 查看集群服务状态

相关文章:
云原生Kubernetes:K8S集群实现容器运行时迁移(docker → containerd) 与 版本升级(v1.23.14 → v1.24.1)
目录 一、理论 1.K8S集群升级 2.环境 3.升级策略 4.master1节点迁移容器运行时(docker → containerd) 5.master2节点迁移容器运行时(docker → containerd) 6.node1节点容器运行时迁移(docker → containerd) 7.升级集群计划(v1.23.14 → v1.24.1&#…...
Redis 数据结构和常用命令
* 代表多个,?代表一个 (不用全部敲出来,按住tab可以自动补全) -2是无效,-1是永久有效 ;贴心小提示:内存非常宝贵,对于一些数据,我们应当给他一些过期时间&a…...
Docker 容器命令总汇
目录 1、创建Docker容器(不启动) 2、创建Docker容器(启动) 3、列出正在运行的容器 4、停止和启动容器 5、重启容器 6、进入容器 7、查看容器信息 8、查看容器日志 9、删除容器和镜像 10、重命名容器 11、从旧容器复制数…...
react + redux 之 美团案例
1.案例展示 2.环境搭建 克隆项目到本地(内置了基础静态组件和模版) git clone http://git.itcast.cn/heimaqianduan/redux-meituan.git 安装所有依赖 npm i 启动mock服务(内置了json-server) npm run serve 启动前端服务 npm…...
【形式语言与自动机/编译原理】CFG-->Greibach-->NPDA(2)
本文将详细讲解《形式语言与自动机》(研究生课程)或《编译原理》(本科生课程)中的上下文无关文法(CFG)转换成Greibach范式,再转成下推自动机(NPDA)识别语言是否可以被接受…...
14.用户管理
目录 1、权限表 1、user表 1.用户列 2.权限列 3.安全列 4.资源控制列 2、db表和host 表 1.用户列 2.权限列 3. tables_priv 表和 columns _priv 表 4.procs_priv 表 2、账户管理 1. 登录和退出MySQL服务器 2、创建普通用户: 1.使用CREATE USER语创建…...
【交叉编译环境】安装arm-linux交叉编译环境到虚拟机教程(简洁版本)
就是看到了好些教程有些繁琐,我就写了一个 我这个解压安装的交叉编译环境是Linaro GCC的一个版本,可以用于在x86_64的主机上编译arm-linux-gnueabihf的目标代码 步骤来了 在你的Ubuntu系统中创建一个目录,例如/usr/local/arm,然后…...
感染了后缀为.[sqlback@memeware.net].2700勒索病毒如何应对?数据能够恢复吗?
导言: 近期,[sqlbackmemeware.net].2700 勒索病毒成为网络安全的一大威胁。该勒索病毒采用高度复杂的加密算法,将用户文件加密并勒索赎金。了解该病毒的特征对于有效恢复被加密数据以及预防进一步感染至关重要。如果受感染的数据确实有恢复的…...
[Linux开发工具]——vim使用
Linux编辑器——vim的使用 一、什么是集成开发环境?二、什么是vim?三、vim的概念四、vim的基本操作五、vim命令模式命令集5.1 移动光标5.2 删除文字5.3 复制粘贴5.4 其他操作 六、vim底行模式命令集6.1 首先在命令模式下shift;进入末行模式。…...
【教学类-43-11】 20231231 3*3宫格数独提取单元格坐标数字的通用模板(做成2*2=4套、3*2=6套)
背景需求: 1、以前做单元格填充,都是制作N个分开的单元格 (表格8) 2、这次做五宫格数独的Word模板,我图方便,就只用了一个大表格,第六行第六列隐藏框线,看上去就是分开的ÿ…...
Spring Boot日志:从Logger到@Slf4j的探秘
写在前面 Hello大家好,今日是2024年的第一天,祝大家元旦快乐🎉 2024第一篇文章从SpringBoot日志开始 文章目录 一、前言二、日志有什么用?三、日志怎么用?四、自定义日志打印💬 常见日志框架说明4.1 在程序…...
英飞凌TC3xx之一起认识GTM系列(六)如何实现GTM与VADC关联的配置
英飞凌TC3xx之一起认识GTM系列(六)如何实现GTM与VADC关联的配置 1 GTM与ADC的接口2 GTM与VADC的连接2.1 VADC 到 GTM 的连接2.1.1 简要介绍2.1.2 应用举例2.2 EVADC到 GTM的连接2.2.1 应用举例3 总结本文介绍实现GTM与VADC的连接性的相关寄存器配置。 1 GTM与ADC的接口 由英…...
【基础】【Python网络爬虫】【6.数据持久化】Excel、Json、Csv 数据保存(附大量案例代码)(建议收藏)
Python网络爬虫基础 数据持久化(数据保存)1. Excel创建数据表批量数据写入读取表格数据案例 - 豆瓣保存 Excel案例 - 网易新闻Excel保存 2. Json数据序列化和反序列化中文指定案例 - 豆瓣保存Json案例 - Json保存 3. Csv写入csv列表数据案例 - 豆瓣列表保…...
王道考研计算机网络——应用层
如何为用户提供服务? CS/P2P 提高域名解析的速度:local name server高速缓存:直接地址映射/低级的域名服务器的地址 本机也有告诉缓存:本机开机的时候从本地域名服务器当中下载域名和地址的对应数据库,放到本地的高…...
Android MVVM 写法
前言 Model:负责数据逻辑 View:负责视图逻辑 ViewModel:负责业务逻辑 持有关系: 1、ViewModel 持有 View 2、ViewModel 持有 Model 3、Model 持有 ViewModel 辅助工具:DataBinding 执行流程:View &g…...
LeetCode 热题 100——283. 移动零
283. 移动零 提示 简单 2.3K 相关企业 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,…...
neovim调试xv6-riscv过程中索引不到对应头文件问题
大家好,我叫徐锦桐,个人博客地址为www.xujintong.com,github地址为https://github.com/jintongxu。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家访问。 和这篇文章neovim调试linux内核过程中索…...
轻量应用服务器与云服务器CVM对比——腾讯云
腾讯云轻量服务器和云服务器CVM该怎么选?不差钱选云服务器CVM,追求性价比选择轻量应用服务器,轻量真优惠呀,活动 https://curl.qcloud.com/oRMoSucP 轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年,540元三…...
骑砍战团MOD开发(31)-游戏AI控制
一.骑砍单机模式下AI控制 骑砍战团中野外战斗,训练场中小兵和地方小兵的行为统称为场景AI. 骑砍大地图中敌军追踪和遭遇追击统称为大地图AI. 二.骑砍场景AI 骑砍引擎通过header_mission_templates,py定制AI常量控制小兵位置,动作和朝向.可实现自定义阵型和攻击动作。 # Agen…...
flutter学习-day21-使用permission_handler进行系统权限的申请和操作
文章目录 1. 介绍2. 环境准备2-1. Android2-2. iOS 3. 使用 1. 介绍 在大多数操作系统上,权限不是在安装时才授予应用程序的。相反,开发人员必须在应用程序运行时请求用户的许可。在 flutter 开发中,则需要一个跨平台(iOS, Android)的 API 来…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
