k8s之工作负载控制器的应用
k8s之工作负载控制器的应用
- 1.k8s工作负载控制器是什么
- 2. Deployment介绍
- 2.1 deployment的资源清单文件
- 2.2 Deployment:滚动升级
- 2.3 Deployment:水平扩容
- 2.4 Deployment:回滚
- 2.5 Deployment:删除
- 2.6 Deployment:ReplicaSet
- 3. DameonSet
- 4. Job 和 CronJob
1.k8s工作负载控制器是什么
工作负载控制器(Workload Controllers)是K8s的一个抽象概念,用于更高级层次对象,部署和管理Pod。
常用工作负载控制器:
- Deployment :无状态应用部署
- StatefulSet :有状态应用部署
- DaemonSet :确保所有Node运行同一个Pod
- Job :一次性任务
- Cronjob :定时任务
控制器的作用:
- 管理Pod对象
- 使用标签与Pod关联
- 控制器实现了Pod的运维,例如滚动更新、伸缩、副本管理、维护Pod状态等。
示例:
2. Deployment介绍
为了更好地解决服务编排的问题,k8s在V1.2版本开始,引入了deployment控制器,值得一提的是,这种控制器并不直接管理pod,
而是通过管理replicaset来间接管理pod,即:deployment管理replicaset,replicaset管理pod。所以deployment比replicaset的功能更强大。
deployment的主要功能有下面几个:
- 支持replicaset的所有功能
- 支持发布的停止、继续
- 支持版本的滚动更新和版本回退
2.1 deployment的资源清单文件
// 示例:
apiVersion: apps/v1 #版本号
kind: Deployment #类型
metadata: #元数据name: #rs名称namespace: #所属命名空间labels: #标签controller: deploy
spec: #详情描述replicas: #副本数量revisionHistoryLimit: #保留历史版本,默认是10paused: #暂停部署,默认是falseprogressDeadlineSeconds: #部署超时时间(s),默认是600strategy: #策略type: RollingUpdates #滚动更新策略rollingUpdate: #滚动更新maxSurge: #最大额外可以存在的副本数,可以为百分比,也可以为整数maxUnavaliable: #最大不可用状态的pod的最大值,可以为百分比,也可以为整数selector: #选择器,通过它指定该控制器管理哪些podmatchLabels: #Labels匹配规则app: nginx-podmatchExpressions: #Expression匹配规则- {key: app, operator: In, values: [nginx-pod]}template: #模板,当副本数量不足时,会根据下面的模板创建pod副本metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.17.1ports:- containerPort: 80
[root@master ~]# cat test.yaml
---
apiVersion: apps/v1 //api的版本信息
kind: Deployment //类型
metadata:name: test //容器名称namespace: default //使用默认的名称空间
spec: replicas: 3 //三个容器副本selector:matchLabels:app: busybox //容器标签template: metadata: labels:app: busyboxspec:containers:- name: b1image: busybox //使用的镜像command: ["/bin/sh","-c","sleep 9000"][root@master ~]# kubectl apply -f test.yaml
deployment.apps/amu created[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
test-864fd4fb54-4hz2h 1/1 Running 0 1ms
test-864fd4fb54-j9ht4 1/1 Running 0 1m
test-864fd4fb54-w485p 1/1 Running 0 1m
2.2 Deployment:滚动升级
- kubectl apply -f xxx.yaml
- kubectl set image deployment/web nginx=nignx:1.16
- kubectl edit deployment/web
滚动升级:K8s对Pod升级的默认策略,通过使用新版本Pod逐步更新旧版本Pod,实现停机发布,用户无感知。
// 滚动更新策略
spec: replicas: 3revisionHistoryLimit: 10selector:matchLabels:app: webstrategy:rollingUpdate: maxSurge: 25%maxUnavaliable: 25%type: RollingUpdate
maxSurge:滚动更新过程中最大Pod副本数,确保在更新时启动的Pod数量比期望(replicsa)Pod数量最大多出25%
maxUnavailable:滚动更新过程中最大不可用Pod副本数,确保在更新时最大25%Pod数量不可用,即确保75%Pod数量是可用状态
实例:
// 创建四个httpd容器
[root@master ~]# cat test1.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata: name: webnamespace: default
spec: replicas: 4selector: matchLabels: app: httpdtemplate: metadata: labels: app: webspec: containers:- name: httpdimage: gaofan1225/httpd:v0.2imagePullPolicy: IfNotPresent[root@master ~]# kubectl apply -f test1.yaml
deployment.apps/web created[root@master ~]# kubectl get pods
web-5c688b9779-7gi6t 1/1 Running 0 50s
web-5c688b9779-9unfy 1/1 Running 0 50s
web-5c688b9779-ft69k 1/1 Running 0 50s
web-5c688b9779-vmlkg 1/1 Running 0 50s[root@master ~]# cat test1.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata: name: webnamespace: default
spec: replicas: 4strategy: rollingUpdate: // 滚动更新maxSurge: 25% // 最大可超出25%maxUnavailable: 25% // 最多不能使用25%type: RollingUpdateselector: matchLabels: app: httpdtemplate: metadata: labels: app: httpdspec: containers:- name: httpdimage: dockerimages123/httpd:v0.2imagePullPolicy: IfNotPresent[root@master ~]# kubectl apply -f test1.yaml
deployment.apps/web configured// 暂未发生变化
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-5c697b9779-7gi6t 1/1 Running 0 8m
web-5c697b9779-9unfy 1/1 Running 0 8m
web-5c697b9779-ft69k 1/1 Running 0 8m
web-5c697b9779-vmlkg 1/1 Running 0 8m// 将镜像修改为httpd,image=httpd
// 再次应用
[root@master ~]# kubectl apply -f test1.yaml
deployment.apps/web configured// 我们发现删除三个,启动了两个新的和一个旧的web
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-5d688b9779-7gi6t 1/1 Terminating 0 18m
web-5d688b9779-9unfy 0/1 Running 0 20m
web-5d688b9779-ft69k 0/1 Terminating 0 20m
web-5d688b9779-vmlkg 0/1 Terminating 0 20m
web-f8bcfc88-vddfk 0/1 Running 0 80s
web-f8bcfc88-yur8y 0/1 Running 0 80s
web-f8bcfc88-t9ryx 1/1 ContainerCreating 0 55s
web-f8bcfc88-k07k 1/1 ContainerCreating 0 56s// 最后变为4个新
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-f8bcfc88vddfk 1/1 Running 0 80s
web-f8bcfc88-yur8y 1/1 Running 0 80s
web-f8bcfc88-t9ryx 1/1 Running 0 55s
web-f8bcfc88-k07k 1/1 Running 0 56s
2.3 Deployment:水平扩容
- 修改yanl里replicas值,再apply
- kubectl scale deployment web --replicas=10
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-f8bcfc88vddfk 1/1 Running 0 80s
web-f8bcfc88-yur8y 1/1 Running 0 80s
web-f8bcfc88-t9ryx 1/1 Running 0 55s
web-f8bcfc88-k07k 1/1 Running 0 56s// 创建10个容器
[root@master ~]# cat test1.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata: name: webnamespace: default
spec: replicas: 10strategy:rollingUpdate:maxSurge: 55%maxUnavailable: 50%type: RollingUpdate
selector: matchLabels: app: httpdtemplate: metadata: labels: app: httpdspec: containers:- name: httpdimage: dockerimages123/httpd:v0.2imagePullPolicy: IfNotPresent[root@master ~]# kubectl apply -f test1.yaml
deployment.apps/web created
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-5c688b9779-pb4x8 1/1 Running 0 50s
web-5c688b9779-kf8vq 1/1 Running 0 50s
web-5c688b9779-ki8s3 1/1 Running 0 50s
web-5c688b9779-o9gx6 1/1 Running 0 50s
web-5c688b9779-i8g4w 1/1 Running 0 50s
web-5c688b9779-olgxt 1/1 Running 0 50s
web-5c688b9779-khctw 1/1 Running 0 50s
web-5c688b9779-ki8d6 1/1 Running 0 50s
web-5c688b9779-i9g5s 1/1 Running 0 50s
web-5c688b9779-jsj8k 1/1 Running 0 50s// 修改replicas值,实现水平扩缩容
[root@master ~]# vim test1.yaml
replicas: 3[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-5c688b9779-pb4x8 1/1 Running 0 50s
web-5c688b9779-kf8vq 1/1 Running 0 50s
web-5c688b9779-ki8s3 1/1 Running 0 50s
web-5c688b9779-o9gx6 1/1 Running 0 50s
web-5c688b9779-i8g4w 1/1 Running 0 50s
web-5c688b9779-olgxt 1/1 Running 0 50s
web-5c688b9779-khctw 1/1 Running 0 50s
web-5c688b9779-ki8d6 1/1 Running 0 50s
web-5c688b9779-i9g5s 1/1 Running 0 50s
web-5c688b9779-jsj8k 1/1 Running 0 50s
web-i9olh676-jdkrg 0/1 ContainerCreating 0 8s
web-i9olh676-opy5b 0/1 ContainerCreating 0 8s
web-i9olh676-k8st4 0/1 ContainerCreating 0 8s[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-i9olh676-jdkrg 1/1 Running 0 2m19s
web-i9olh676-opy5b 1/1 Running 0 2m19s
web-i9olh676-k8st4 1/1 Running 0 2m19s
2.4 Deployment:回滚
kubectl rollout history deployment/web // 查看历史发布版本
kubectl rollout undo deployment/web // 回滚上一个版本
kubectl rollout undo deployment/web --to-revision=2 // 回滚历史指定版本
[root@master ~]# kubectl rollout history deploy/web
deployment.apps/web
REVISION CHANGE-CAUSE
1 <none>
2 <none>// 如果你回滚的是当前版本,就会跳过
[root@master ~]# kubectl rollout undo deploy/web --to-revision 2
deployment.apps/web skipped rollback (current template already matches revision 2)// 回滚第一个版本
[root@master ~]# kubectl rollout undo deploy/web --to-revision 1
deployment.apps/web rolled back// 回滚成功
[root@master ~]# kubectl rollout history deploy/web
deployment.apps/web
REVISION CHANGE-CAUSE
2 <none>
3 <none>
2.5 Deployment:删除
kubectl delete deploy/web
kubectl delete svc/web
kubectl delete pods/web
// 创建
[root@master ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created[root@master ~]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 35s
web 3/3 3 3 20m// 删除一个pod
[root@master ~]# kubectl delete deploy/nginx
deployment.apps "nginx" deleted[root@master ~]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
web 3/3 3 3 20m// 删除所有
[root@master ~]# kubectl delete deployment --all
deployment.apps "web" deleted[root@master ~]# kubectl get deployment
No resources found in default namespace.
2.6 Deployment:ReplicaSet
ReplicaSet控制器用途:
- Pod副本数量管理,不断对比当前Pod数量与期望Pod数量
- Deployment每次发布都会创建一个RS作为记录,用于实现回滚
[root@master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
web-5d7hy50s8a 3 3 3 6m4s
web-f8bki8h5 0 0 0 6m25skubectl rollout history deployment web // 版本对应RS记录[root@master ~]# kubectl rollout history deployment web
deployment.apps/web
REVISION CHANGE-CAUSE
2 <none>
3 <none>
[root@master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
web-5d7hy50s8a 3 3 3 6m4s
web-f8bki8h5 0 0 0 6m25s// 将镜像换为httpd,其他变
[root@master ~]# kubectl apply -f test2.yaml //再次应用
deployment.apps/web configured[root@master ~]# kubectl get pods
web-5d688b9745-dpmsd 1/1 Terminating 0 9m
web-5d688b9745-q6dls 1/1 Terminating 0 9m
web-i80gjk6t-ku6f4 0/1 ContainerCreating 0 5s
web-i80gjk6t-9j5tu 1/1 Running 0 5s
web-i80gjk6t-9ir4h 1/1 Running 0 5s[root@master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
web-5d7hy50s8a 0 0 0 12m
web-f8bki8h5 3 3 3 12m
ReplicaSet:由Deployment里面的relicas的参数控制的
[root@node2 ~]# docker ps | grep web
4c938ouhc8j0 dabutse0c4fy "httpd-foreground" 13 seconds ago Up 12 seconds k8s_httpd_web-f8bcfc88-4rkfx_default_562616cd-1552-4610-bf98-e470225e4c31_1
452713eeccad registry.aliyuncs.com/google_containers/pause:3.6 "/pause" 5 minutes ago Up 5 minutes k8s_POD_web-f8bcfc88-4rkfx_default_562616cd-1552-4610-bf98-e470225e4c31_0// 删除一个
[root@node2 ~]# docker kill 4c938ad0c01d
8htw4ad0cu8s[root@master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
web-5d7hy50s8a 0 0 0 15m
web-f8bki8h5 3 3 3 15m[root@master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
web-5d7hy50s8a 0 0 0 16m
web-f8bki8h5 3 3 3 18m[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-o96gb3sm-9ht4c 1/1 Running 2 (80s ago) 6m32s
web-o96gb3sm-ki85s 1/1 Running 0 6m32s
web-o96gb3sm-ku5sg 1/1 Running 0 6m32s
3. DameonSet
DameonSet功能:
- 在每一个Node上运行一个Pod
- 新加入的Node也同样会自动运行一个Pod
// 删除资源,容器也会被删除
[root@master ~]# kubectl delete -f test1.yml
deployment.apps "web" deleted[root@master ~]# cat daemon.yml
---
apiVersion: apps/v1
kind: DaemonSet // 类型是DaemonSet
metadata:name: filebeatnamespace: kube-system
spec:selector:matchLabels:name: filebeattemplate:metadata:labels:name: filebeatspec:containers: // 记录日志的镜像- name: logimage: elastic/filebeat:7.16.2imagePullPolicy: IfNotPresent[root@master ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-6d8c4cb4d-9m5jg 1/1 Running 14 (4h36m ago) 6d4h
coredns-6d8c4cb4d-mp662 1/1 Running 14 (4h36m ago) 6d4h
etcd-master 1/1 Running 13 (3h30m ago) 6d4h
kube-apiserver-master 1/1 Running 13 (3h30m ago) 6d4h
kube-controller-manager-master 1/1 Running 14 (3h30m ago) 6d4h
kube-flannel-ds-g9jsh 1/1 Running 9 (3h30m ago) 6d1h
kube-flannel-ds-qztxc 1/1 Running 9 (3h30m ago) 6d1h
kube-flannel-ds-t8lts 1/1 Running 13 (3h30m ago) 6d1h
kube-proxy-q2jmh 1/1 Running 12 (3h30mago) 6d4h
kube-proxy-r28dn 1/1 Running 13 (3h30m ago) 6d4h
kube-proxy-x4cns 1/1 Running 13 (3h30m ago) 6d4h
kube-scheduler-master 1/1 Running 15 (3h30m ago) 6d4h[root@master ~]# kubectl apply -f daemon.yaml
deployment.apps/filebeat created[root@master ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-6d8c4cb4d-9m5jg 1/1 Running 14 (4h36m ago) 6d4h
coredns-6d8c4cb4d-mp662 1/1 Running 14 (4h36m ago) 6d4h
etcd-master 1/1 Running 13 (3h30m ago) 6d4h
kube-apiserver-master 1/1 Running 13 (3h30m ago) 6d4h
kube-controller-manager-master 1/1 Running 14 (3h30m ago) 6d4h
kube-flannel-ds-g9jsh 1/1 Running 9 (3h30m ago) 6d1h
kube-flannel-ds-qztxc 1/1 Running 9 (3h30m ago) 6d1h
kube-flannel-ds-t8lts 1/1 Running 13 (3h30m ago) 6d1h
kube-proxy-q2jmh 1/1 Running 12 (3h30mago) 6d4h
kube-proxy-r28dn 1/1 Running 13 (3h30m ago) 6d4h
kube-proxy-x4cns 1/1 Running 13 (3h30m ago) 6d4h
kube-scheduler-master 1/1 Running 15 (3h30m ago) 6d4h
filebeat-oiugt 1/1 Running 0 50s
filebeat-9jhgt 1/1 Running 0 50s[root@master ~]# kubectl get pods -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
filebeat-9ck6z 1/1 Running 0 3m9s 10.242.2.215 node2.example.com <none> <none>
filebeat-d2psf 1/1 Running 0 3m9s 10.242.1.161 node1.example.com <none> <none>
4. Job 和 CronJob
Job分为普通任务(Job)和定时任务(CronJob)
- 一次性执行(Job)
- 定时任务(CronJob)
应用场景:离线数据处理,视频解码等业务(Job)
应用场景:通知、备份(CronJob)
[root@master ~]# cat job.yaml
apiVersion: batch/v1
kind: Job
metadata:name: test
spec:template: spec: containers:- name: testimage: perlcommand: ["perl","-Mbignum=bpi","-wle","print bpi(2000)"]restartPolicy: NeverbackoffLimit: 4[root@master ~]# kubectl apply -f job.yaml
job.batch/test created[root@master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-27xrt 0/1 ContainerCreating 0 10m28s <none> node2.example.com <none> <none>[root@node2 ~]# docker ps | grep test
e55ac8842c89 registry.aliyuncs.com/google_containers/pause:3.6 "/pause" 6 minutes ago Up 6 minutes k8s_POD_test-27xrt_default_698b4c91-ef54-4fe9-b62b-e0abcujhts5o90_9[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
test-27xrt 0/1 Completed 0 15m[root@node2 ~]# docker images | grep perl
perl latest f9596eddf06f 5 days ago 568MB[root@master ~]# kubectl describe job/test
Pods Statuses: 0 Active / 1 Succeeded / 0 Failed
[root@master ~]# kubelet --version
Kubernetes v1.23.1[root@master ~]# cat cronjob.yaml
---
apiVersion: batch/v1
kind: CronJob
metadata:name: hello
spec:schedule: "*/1****"jobTemplate: spec: template: spec: containers:- name: helloimage: busyboxargs:- /bin/sh- -c- date;echo Hello worldrestartPolicy: OnFailure[root@master ~]# kubectl apply -f cronjob.yaml
Warning: batch/v1beta1 CronJob is deprecated in v1.21+, unavailable in v1.25+; use batch/v1 CronJob[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-kihtwoab-kox6w 0/1 Completed 0 5m42s
hello-kihtwoab-o96vw 0/1 Completed 0 90s
hello-kihtwoab-kus6n 0/1 Completed 0 76s[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-kihtwoab-kox6w 0/1 Completed 0 6m26s
hello-kihtwoab-o96vw 0/1 Completed 0 2m11s
hello-kihtwoab-kus6n 0/1 Completed 0 2m10s
hello-kuhdoehs-ki8gr 0/1 ContainerCreating 0 36s[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-kihtwoab-o96vw 0/1 Completed 0 2m11s
hello-kihtwoab-kus6n 0/1 Completed 0 2m10s
hello-kuhdoehs-ki8gr 0/1 Completed 0 45s[root@master ~]# kubectl describe cronjob/hello
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal SuccessfulCreate 5m36s (x133 over 135m) cronjob-controller (combined from similar events): Created job hello-kisgejxbw// batch/v1beta1 CronJob 在 v1.21+ 中被弃用,在 v1.25+ 中不可用; 使用批处理/v1 CronJob。
k8s之工作负载控制器的应用相关推荐
- K8S之Deployment控制器管理应用(十一)
Deployment介绍 Deployment是最常用的K8s工作负载控制器(Workload Controllers), 是K8s的一个抽象概念,用于更高级层次对象,部署和管理Pod. Deploy ...
- 还不会用 K8s 集群控制器?那你会用冰箱吗?(多图详解)
作者 | 阿里云售后技术专家 声东 导读:当我们尝试去理解 K8s 集群工作原理的时候,控制器(Controller)肯定是一个难点.这是因为控制器有很多,具体实现大相径庭:且控制器的实现用到了一些较 ...
- Kubernetes K8S之资源控制器Job和CronJob详解
Kubernetes的资源控制器Job和CronJob详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2 ...
- Kubernetes K8S之资源控制器Daemonset详解
Kubernetes的资源控制器Daemonset详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2C/ ...
- k8s核心技术-Controller控制器_Controller(Job和Cronjob)_一次任务和定时任务---K8S_Google工作笔记0035
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后我们来说一下这个k8s支持的这样一个功能,就是k8s支持,job,也就是任务,也就是说 我们有 ...
- 理论+实操:K8S搭建dns内部服务与控制器controlls五种模式
文章目录 故障排查 一:控制器的类型 一: pod与控制器之间的关系 二:deployment 2.1 deployment概述 2.1 演示 2.1.1 编写yaml文件 2.1.2 创建pod 2 ...
- k8s控制器Deployment使用详解
前言 在上一篇我们聊了k8s中各种控制器的使用,本篇将以控制器中比较常用的一种控制器Deployment 进行详细的说明. 一.Deployment 简介 为了更好解决服务编排的问题,kubernet ...
- 工作负载型控制器的应用
工作负载型控制器的应用 工作负载控制器(Workload Controllers)时kubernetes的一个抽象概念,用于更高层次对象,部署和管理pod. 常用工作负载控制器: Deployment ...
- K8s 集群节点在线率达到 99.9% 以上,扩容效率提升 50%,我们做了这 3 个深度改造
作者 | 张振(守辰)阿里云云原生应用平台高级技术专家 导读:2019 年阿里巴巴核心系统 100% 以云原生方式上云,完美地支撑了 双11 大促.这次上云的姿势很不一般,不仅是拥抱了 Kuberne ...
最新文章
- 从概念到技术,打通「中台」的任督二脉,别再说不知道中台是什么
- 转:MySQL性能优化的最佳20+条经验
- 计网 - 流和缓冲区:缓冲区的 flip 是怎么回事?
- QT学习:网络应用开发练习(文件下载)
- 聊聊高并发(二十四)解析java.util.concurrent各个组件(六) 深入理解AQS(四)
- R语言观察日志(part2)--preProcess函数
- 刷新:重新发现.NET与未来
- C/C++:Winsock网络编程—ping命令的简单实现
- 信息学奥赛一本通 1156:求π的值
- C++ Primer 第4章数组和指针
- Apicloud——关于索引列表
- DMAR(DMA remapping)与 IOMMU
- Simulink中Simscape—Fluids模块(原Simhydraulics)学习记录
- JAVA从文件中取出特定的_从Java中的文本文件读取特定的行
- 70道经典Android面试题加答案--重要知识点几乎都涉及到了
- 15款13英寸低配mbp的外接显示器选择
- 基于3DGIS+BIM的房屋出售管理系统
- QQ空间爬虫分享(2016年11月18日更新)
- Ubuntu下观看B站视频
- 保龄球积分c语言程序,C语言保龄球积分.doc
热门文章
- JVM工具之jstat
- 程序大佬用的电脑配置终于曝光了,难怪
- java matcher find,java - 无尽循环matcher.find()
- pytorch创建模型并训练(初探文本分类问题)
- 数据挖掘--决策树ID3算法(例题)
- 十五天学会Autodesk Inventor,看完这一系列就够了(终章),答疑
- 转:有一个笑话叫做:工作和生活平衡
- 关于如何挣钱的35条建议!万字长文
- 国产手机参与华为鸿蒙系统,华为鸿蒙OS系统再获力挺!又一国产手机巨头官宣:将联动华为?...
- 绝地服务器维护7月5日,绝地求生7月5日更新到几点 更新维护公告