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

容器编排大王Kubernetes——控制器的使用(3)

一 什么是控制器

官方文档:

https://v1-30.docs.kubernetes.io/zh-cn/docs/concepts/workloads/controllers/

控制器也是管理pod的一种手段

  • 自主式pod:pod退出或意外关闭后不会被重新创建
  • 控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目

Pod控制器是管理pod的中间层,使用Pod控制器之后,只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资源在运行中出现故障,它会基于指定策略重新编排Pod

当建立控制器后,会把期望值写入etcd,k8s中的apiserver检索etcd中我们保存的期望状态,并对比pod的当前状态,如果出现差异代码自驱动立即恢复

二 控制器常用类型

控制器名称控制器用途
Replication Controller比较原始的pod控制器,已经被废弃,由ReplicaSet替代
ReplicaSetReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行
Deployment一个 Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力,通过 Deployment 部署无状态应用,如 Web 服务
DaemonSetDaemonSet 确保全指定节点上运行一个 Pod 的副本,适用于日志收集(如 Fluentd)、监控代理(如 Prometheus Node Exporter)等场景。
StatefulSetStatefulSet 是用来管理有状态应用的工作负载 API 对象,用于管理有状态应用,如数据库(MySQL、MongoDB)。
Job执行批处理任务,仅执行一次任务,保证任务的一个或多个Pod成功结束
CronJobCron Job 创建基于时间调度的 Jobs,用于周期性任务,如备份、报表生成。
HPA全称Horizontal Pod Autoscaler根据资源利用率自动调整service中Pod数量,实现Pod水平自动缩放,自动调整 Pod 副本数量,基于 CPU 使用率、内存或自定义指标,结合监控使用。

三 replicaset控制器

image-20251012190833427

3.1 replicaset功能

  • ReplicaSet 是下一代的 Replication Controller,官方推荐使用ReplicaSet
  • ReplicaSet和Replication Controller的唯一区别是选择器的支持,ReplicaSet支持新的基于集合的选择器需求
  • ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行
  • 虽然 ReplicaSets 可以独立使用,但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的机制

3.2 replicaset参数说明

参数名称字段类型参数说明
specObject详细定义对象,固定值就写Spec
spec.replicasinteger指定维护pod数量
spec.selectorObjectSelector是对pod的标签查询,与pod数量匹配
spec.selector.matchLabelsstring指定Selector查询标签的名称和值,以key:value方式指定
spec.templateObject指定对pod的描述信息,比如lab标签,运行容器的信息等
spec.template.metadataObject指定pod属性
spec.template.metadata.labelsstring指定pod标签
spec.template.specObject详细定义对象
spec.template.spec.containerslistSpec对象的容器列表定义
spec.template.spec.containers.namestring指定容器名称
spec.template.spec.containers.imagestring指定容器镜像

3.3 replicaset 示例

#生成yml文件
[root@k8s-master ~]# kubectl create deployment replicaset --image myapp:v1 --dry-run=client -o yaml > replicaset.yml[root@k8s-master ~]# vim replicaset.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:name: replicaset		#指定pod名称,一定小写,如果出现大写报错
spec:replicas: 2			#指定维护pod数量为2selector:				#指定检测匹配方式matchLabels:		#指定匹配方式为匹配标签app: myapp		#指定匹配的标签为app=myapptemplate:				#模板,当副本数量不足时,会根据下面的模板创建pod副本metadata:labels:app: myappspec:containers:- image: myapp:v1name: myapp[root@k8s-master ~]# kubectl apply -f replicaset.yml
replicaset.apps/replicaset created[root@k8s-master ~]# kubectl get pods  --show-labels
NAME               READY   STATUS    RESTARTS   AGE   LABELS
replicaset-l4xnr   1/1     Running   0          96s   app=myapp
replicaset-t2s5p   1/1     Running   0          96s   app=myapp#replicaset是通过标签匹配pod
[root@k8s-master ~]# kubectl label pod replicaset-l4xnr app=timinglee --overwrite
pod/replicaset-l4xnr labeled
[root@k8s-master ~]# kubectl get pods  --show-labels
NAME               READY   STATUS    RESTARTS   AGE     LABELS
replicaset-gd5fh   1/1     Running   0          2s      app=myapp		#新开启的pod
replicaset-l4xnr   1/1     Running   0          3m19s   app=timinglee
replicaset-t2s5p   1/1     Running   0          3m19s   app=myapp#恢复标签后
[root@k8s2 pod]# kubectl label pod replicaset-example-q2sq9 app- 
[root@k8s2 pod]# kubectl get pod --show-labels
NAME                       READY   STATUS    RESTARTS   AGE     LABELS
replicaset-example-q2sq9   1/1     Running   0          3m14s   app=nginx
replicaset-example-th24v   1/1     Running   0          3m14s   app=nginx
replicaset-example-w7zpw   1/1     Running   0          3m14s   app=nginx#replicaset自动控制副本数量,pod可以自愈
[root@k8s-master ~]# kubectl delete pods replicaset-t2s5p
pod "replicaset-t2s5p" deleted[root@k8s-master ~]# kubectl get pods --show-labels
NAME               READY   STATUS    RESTARTS   AGE     LABELS
replicaset-l4xnr   1/1     Running   0          5m43s   app=myapp
replicaset-nxmr9   1/1     Running   0          15s     app=myapp回收资源
[root@k8s2 pod]# kubectl delete -f rs-example.yml

四 deployment控制器

4.1 deployment功能

image-20251012191301684

  • 为了更好的解决服务编排的问题,kubernetes在V1.2版本开始,引入了Deployment控制器。
  • Deployment控制器并不直接管理pod,而是通过管理ReplicaSet来间接管理Pod
  • Deployment管理ReplicaSet,ReplicaSet管理Pod
  • Deployment 为 Pod 和 ReplicaSet 提供了一个申明式的定义方法
  • 在Deployment中ReplicaSet相当于一个版本

典型的应用场景:

  • 用来创建Pod和ReplicaSet
  • 滚动更新和回滚
  • 扩容和缩容
  • 暂停与恢复

4.2 deployment控制器示例

#生成yaml文件
[root@k8s-master ~]# kubectl create deployment deployment --image myapp:v1  --dry-run=client -o yaml > deployment.yml[root@k8s-master ~]# vim deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:name: deployment
spec:replicas: 4selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- image: myapp:v1name: myapp
#建立pod
root@k8s-master ~]# kubectl apply -f deployment.yml
deployment.apps/deployment created#查看pod信息
[root@k8s-master ~]# kubectl get pods --show-labels
NAME                          READY   STATUS    RESTARTS   AGE   LABELS
deployment-5d886954d4-2ckqw   1/1     Running   0          23s   app=myapp,pod-template-hash=5d886954d4
deployment-5d886954d4-m8gpd   1/1     Running   0          23s   app=myapp,pod-template-hash=5d886954d4
deployment-5d886954d4-s7pws   1/1     Running   0          23s   app=myapp,pod-template-hash=5d886954d4
deployment-5d886954d4-wqnvv   1/1     Running   0          23s   app=myapp,pod-template-hash=5d886954d4

4.2.1 版本迭代

[root@k8s-master ~]# kubectl get pods -o wide
NAME                          READY   STATUS    RESTARTS   AGE     IP            NODE        NOMINATED NODE   READINESS GATES
deployment-5d886954d4-2ckqw   1/1     Running   0          2m40s   10.244.2.14   k8s-node2   <none>           <none>
deployment-5d886954d4-m8gpd   1/1     Running   0          2m40s   10.244.1.17   k8s-node1   <none>           <none>
deployment-5d886954d4-s7pws   1/1     Running   0          2m40s   10.244.1.16   k8s-node1   <none>           <none>
deployment-5d886954d4-wqnvv   1/1     Running   0          2m40s   10.244.2.15   k8s-node2   <none>           <none>#pod运行容器版本为v1
[root@k8s-master ~]# curl  10.244.2.14
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>[root@k8s-master ~]# kubectl describe deployments.apps deployment
Name:                   deployment
Namespace:              default
CreationTimestamp:      Sun, 01 Sep 2024 23:19:10 +0800
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=myapp
Replicas:               4 desired | 4 updated | 4 total | 4 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge			#默认每次更新25%#更新容器运行版本
[root@k8s-master ~]# vim deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:name: deployment
spec:minReadySeconds: 5				#最小就绪时间5秒replicas: 4selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- image: myapp:v2				#更新为版本2name: myapp[root@k8s2 pod]# kubectl apply -f deployment-example.yaml#更新过程
[root@k8s-master ~]# watch - n1 kubectl get pods  -o wide 
NAME                          READY   STATUS    RESTARTS   AGE
deployment-5d886954d4-8kb28   1/1     Running   0          48s
deployment-5d886954d4-8s4h8   1/1     Running   0          49s
deployment-5d886954d4-rclkp   1/1     Running   0          50s
deployment-5d886954d4-tt2hz   1/1     Running   0          50s
deployment-7f4786db9c-g796x   0/1     Pending   0          0s#测试更新效果
[root@k8s-master ~]# kubectl get pods -o wide
NAME                          READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
deployment-7f4786db9c-967fk   1/1     Running   0          10s   10.244.1.26   k8s-node1   <none>           <none>
deployment-7f4786db9c-cvb9k   1/1     Running   0          10s   10.244.2.24   k8s-node2   <none>           <none>
deployment-7f4786db9c-kgss4   1/1     Running   0          9s    10.244.1.27   k8s-node1   <none>           <none>
deployment-7f4786db9c-qts8c   1/1     Running   0          9s    10.244.2.25   k8s-node2   <none>           <none>[root@k8s-master ~]# curl  10.244.1.26
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

[!NOTE]

更新的过程是重新建立一个版本的RS,新版本的RS会把pod 重建,然后把老版本的RS回收

4.2.2 版本回滚

[root@k8s-master ~]# vim deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:name: deployment
spec:replicas: 4selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- image: myapp:v1				#回滚到之前版本name: myapp[root@k8s-master ~]# kubectl apply -f deployment.yml
deployment.apps/deployment configured#测试回滚效果
[root@k8s-master ~]# kubectl get pods -o wide
NAME                          READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
deployment-5d886954d4-dr74h   1/1     Running   0          8s    10.244.2.26   k8s-node2   <none>           <none>
deployment-5d886954d4-thpf9   1/1     Running   0          7s    10.244.1.29   k8s-node1   <none>           <none>
deployment-5d886954d4-vmwl9   1/1     Running   0          8s    10.244.1.28   k8s-node1   <none>           <none>
deployment-5d886954d4-wprpd   1/1     Running   0          6s    10.244.2.27   k8s-node2   <none>           <none>[root@k8s-master ~]# curl  10.244.2.26
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

4.2.3 滚动更新策略

[root@k8s-master ~]# vim deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:name: deployment
spec:minReadySeconds: 5		#最小就绪时间,指定pod每隔多久更新一次replicas: 4strategy:					#指定更新策略rollingUpdate:maxSurge: 1			#比定义pod数量多几个maxUnavailable: 0		#比定义pod个数少几个selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- image: myapp:v1name: myapp
[root@k8s2 pod]# kubectl apply -f deployment-example.yaml

4.2.4 暂停及恢复

在实际生产环境中我们做的变更可能不止一处,当修改了一处后,如果执行变更就直接触发了

我们期望的触发时当我们把所有修改都搞定后一次触发

暂停,避免触发不必要的线上更新

[root@k8s2 pod]# kubectl rollout pause deployment deployment-example[root@k8s2 pod]# vim deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: deployment-example
spec:minReadySeconds: 5strategy:rollingUpdate:maxSurge: 1maxUnavailable: 0replicas: 6				selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- name: myappimage: nginxresources:limits:cpu: 0.5memory: 200Mirequests:cpu: 0.5memory: 200Mi[root@k8s2 pod]# kubectl apply -f deployment-example.yaml#调整副本数,不受影响
[root@k8s-master ~]# kubectl describe pods deployment-7f4786db9c-8jw22
Name:             deployment-7f4786db9c-8jw22
Namespace:        default
Priority:         0
Service Account:  default
Node:             k8s-node1/172.25.254.10
Start Time:       Mon, 02 Sep 2024 00:27:20 +0800
Labels:           app=myapppod-template-hash=7f4786db9c
Annotations:      <none>
Status:           Running
IP:               10.244.1.31
IPs:IP:           10.244.1.31
Controlled By:  ReplicaSet/deployment-7f4786db9c
Containers:myapp:Container ID:   docker://01ad7216e0a8c2674bf17adcc9b071e9bfb951eb294cafa2b8482bb8b4940c1dImage:          myapp:v2Image ID:       docker-pullable://myapp@sha256:5f4afc8302ade316fc47c99ee1d41f8ba94dbe7e3e7747dd87215a15429b9102Port:           <none>Host Port:      <none>State:          RunningStarted:      Mon, 02 Sep 2024 00:27:21 +0800Ready:          TrueRestart Count:  0Environment:    <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-mfjjp (ro)
Conditions:Type                        StatusPodReadyToStartContainers   TrueInitialized                 TrueReady                       TrueContainersReady             TruePodScheduled                True
Volumes:kube-api-access-mfjjp:Type:                    Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds:  3607ConfigMapName:           kube-root-ca.crtConfigMapOptional:       <nil>DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type    Reason     Age    From               Message----    ------     ----   ----               -------Normal  Scheduled  6m22s  default-scheduler  Successfully assigned default/deployment-7f4786db9c-8jw22 to k8s-node1Normal  Pulled     6m22s  kubelet            Container image "myapp:v2" already present on machineNormal  Created    6m21s  kubelet            Created container myappNormal  Started    6m21s  kubelet            Started container myapp#但是更新镜像和修改资源并没有触发更新
[root@k8s2 pod]# kubectl rollout history deployment deployment-example
deployment.apps/deployment-example
REVISION  CHANGE-CAUSE
3         <none>
4         <none>#恢复后开始触发更新
[root@k8s2 pod]# kubectl rollout resume deployment deployment-example[root@k8s2 pod]# kubectl rollout history  deployment deployment-example
deployment.apps/deployment-example
REVISION  CHANGE-CAUSE
3         <none>
4         <none>
5         <none>#回收
[root@k8s2 pod]# kubectl delete -f deployment-example.yaml

五 daemonset控制器

5.1 daemonset功能

image-20251012193410354

DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时, 也会为他们新增一个 Pod ,当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod

DaemonSet 的典型用法:

  • 在每个节点上运行集群存储 DaemonSet,例如 glusterd、ceph。
  • 在每个节点上运行日志收集 DaemonSet,例如 fluentd、logstash。
  • 在每个节点上运行监控 DaemonSet,例如 Prometheus Node Exporter、zabbix agent等
  • 一个简单的用法是在所有的节点上都启动一个 DaemonSet,将被作为每种类型的 daemon 使用
  • 一个稍微复杂的用法是单独对每种 daemon 类型使用多个 DaemonSet,但具有不同的标志, 并且对不同硬件类型具有不同的内存、CPU 要求

5.2 daemonset 示例

image-20251012194234156

[root@k8s2 pod]# cat daemonset-example.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:name: daemonset-example
spec:selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:tolerations:		#对于污点节点的容忍,master节点默认存在NoSchedule污点- effect: NoScheduleoperator: Existscontainers:- name: nginximage: nginx[root@k8s-master ~]# kubectl get pods  -o wide
NAME              READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
daemonset-87h6s   1/1     Running   0          47s   10.244.0.8    k8s-master   <none>           <none>
daemonset-n4vs4   1/1     Running   0          47s   10.244.2.38   k8s-node2    <none>           <none>
daemonset-vhxmq   1/1     Running   0          47s   10.244.1.40   k8s-node1    <none>           <none>#回收
[root@k8s2 pod]# kubectl delete -f daemonset-example.yml

六 job 控制器

6.1 job控制器功能

image-20251012195316613

Job,主要用于负责批量处理(一次要处理指定数量任务)短暂的一次性(每个任务仅运行一次就结束)任务

Job特点如下:

  • 当Job创建的pod执行成功结束时,Job将记录成功结束的pod数量
  • 当成功结束的pod达到指定的数量时,Job将完成执行

6.2 job 控制器示例

[root@master contorll]# kubectl create job job-example --image perl:5.34.0 --dry-run=client -o yaml > job.yaml
[root@master contorll]# vim job.yam
apiVersion: batch/v1
kind: Job
metadata:name: job-example
spec:completions: 6parallelism: 2backoffLimit: 4template:spec:containers:- image: perl:5.34.0name: picommand: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]restartPolicy: Never[root@master contorll]# kubectl apply -f job.yaml
#每次只能运行两个

image-20251012224850912

image-20251012225045136

image-20251012225127186

[!NOTE]

关于重启策略设置的说明:

  • ​ 如果指定为OnFailure,则job会在pod出现故障时重启容器

    ​ 而不是创建pod,failed次数不变

  • ​ 如果指定为Never,则job会在pod出现故障时创建新的pod

    ​ 并且故障pod不会消失,也不会重启,failed次数加1

  • ​ 如果指定为Always的话,就意味着一直重启,意味着job任务会重复去执行了

七 cronjob 控制器

7.1 cronjob 控制器功能

image-20251012201019373

  • Cron Job 创建基于时间调度的 Jobs。

  • CronJob控制器以Job控制器资源为其管控对象,并借助它管理pod资源对象,

  • CronJob可以以类似于Linux操作系统的周期性任务作业计划的方式控制其运行时间点及重复运行的方式。

  • CronJob可以在特定的时间点(反复的)去运行job任务。

7.2 cronjob 控制器示例

[root@master contorll]# kubectl create cronjob cronjob-example --image busybox --schedule "* * * * *" --dry-run=client -o yaml > cronjob.yml
[root@master contorll]# vim cronjob.yml
apiVersion: batch/v1
kind: CronJob
metadata:name: cronjob-example
spec:schedule: '* * * * *'jobTemplate:metadata:name: cronjob-examplespec:template:metadata:spec:containers:- image: busyboxname: cronjob-exampleimagePullPolicy: IfNotPresentcommand:- /bin/sh- -c- date; echo Hello from the Kubernetes clusterrestartPolicy: OnFailure[root@master contorll]# kubectl apply -f cronjob.yml

image-20251012231035288

[root@master contorll]# kubectl logs jobs/cronjob-example-29338028 cronjob-example
Sun Oct 12 15:08:00 UTC 2025
Hello from the Kubernetes cluster

八 statefulset控制器

8.1 statefulset功能

  • Statefulset是为了管理有状态服务的问提设计的

  • StatefulSet将应用状态抽象成了两种情况:

  • 拓扑状态:应用实例必须按照某种顺序启动。新创建的Pod必须和原来Pod的网络标识一样

  • 存储状态:应用的多个实例分别绑定了不同存储数据。

  • StatefulSet给所有的Pod进行了编号,编号规则是:(statefulset名称)−(statefulset名称)-(statefulset名称)(序号),从0开始。

  • Pod被删除后重建,重建Pod的网络标识也不会改变,Pod的拓扑状态按照Pod的“名字+编号”的方式固定下来,并且为每个Pod提供了一个固定且唯一的访问入口,Pod对应的DNS记录。

8.2 statefulset示例

[root@master ~]# kubectl create deployment web --image myapp:v1 --replicas=2 --dry-run=client -o yaml > test.yml[root@master ~]# vim test.yml
apiVersion: apps/v1
kind: StatefulSet
metadata:labels:app: webname: web
spec:serviceName: webreplicas: 2selector:matchLabels:app: webtemplate:metadata:labels:app: webspec:containers:- image: myapp:v1name: myapp#配置无头服务svc
[root@master ~]# kubectl create service clusterip web --clusterip='None' --dry-run=client -o yaml >> test.yml[root@master ~]# cat test.yml
---
apiVersion: v1
kind: Service
metadata:labels:app: webname: web
spec:clusterIP: Noneselector:app: webtype: ClusterIP[root@master ~]# watch -n1 " kubectl get pods  -o wide "

测试

image-20250816131502827

image-20250816131650390

[root@master ~]# kubectl -n kube-system get svc
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   5d15h[root@master ~]# dig web.default.svc.cluster.local. @10.96.0.10
[root@master ~]# dig web-0.web.default.svc.cluster.local. @10.96.0.10

image-20250816101844982

image-20250816101900298

pp: web
name: web
spec:
clusterIP: None
selector:
app: web
type: ClusterIP

[root@master ~]# watch -n1 " kubectl get pods -o wide "


测试[外链图片转存中...(img-cAxYJ9Zg-1760282213698)][外链图片转存中...(img-UKgdgdlo-1760282213698)]```bash
[root@master ~]# kubectl -n kube-system get svc
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   5d15h[root@master ~]# dig web.default.svc.cluster.local. @10.96.0.10
[root@master ~]# dig web-0.web.default.svc.cluster.local. @10.96.0.10

[外链图片转存中…(img-zNCShbkv-1760282213699)]

[外链图片转存中…(img-LFRF1PlV-1760282213699)]

http://www.dtcms.com/a/475069.html

相关文章:

  • 建筑设计图保定seo网络推广
  • 上海网站设计费用温州鹿城区企业网站搭建
  • 网站建设方案功能哪个网站可以做微商
  • 牛客:大加法数
  • 连云港网站开发公司江苏省建设厅网站
  • 景区宣传网站制作模板wordpress安装无法连接数据库
  • 四川省建设工程质量监督总站网站seo优化思路
  • 手机官方网站广告软文
  • 站长工具查询域名网络营销方式有哪些
  • 萧山区住房和城乡建设局网站进入公众号核酸检测
  • 记录oracle19c安装完成后,使用navcat连接数据库一直报错ORA-00922: 选项缺失或无效
  • 网站不被收录自建网站推广的最新发展
  • 泰安微信网站建设asp.net 当前网站
  • LINUX复习资料(二)
  • 基于视觉与IMU融合的地下停车场自动导航系统原理与实现
  • 国外域名购买网站品牌策划方案设计
  • 外设模块学习(5)——DS18B20温度传感器(STM32)
  • 网站增加点击率 怎样做app制作哪里正规
  • 自己做的网站慢是什么原因哪些网站微信支付平台
  • 编程语言比较从Java到C++,探索主流开发工具的特性与应用场景
  • 自定义网站模板科技公司网页设计欣赏
  • 【完整源码+数据集+部署教程】管道与支架检测系统源码和数据集:改进yolo11-RepNCSPELAN
  • 长沙便宜网站建设手机设计软件下载大全
  • Unity网络开发--自定义协议生成工具
  • 做宣传类网站需要什么资质浙江省建设执业注册中心网站
  • 怎么做视频解析的网站网站数据分析
  • 营销网站建站长沙营销型网站设计
  • 多输入,多输出来学英语
  • 矩阵的除法
  • 网站建设与优化推广方案内容WordPress安装插件要FTP