2023年CKA考试真题及注意事项
2023年CKA考试真题及注意事项
- 注意事项
- 考试题目
- 原题解析
- 1.RBAC
- 2.节点维护
- 3.K8S组件升级 1.28.0升级到1.28.1
- 4.Etcd备份与恢复
- 5.NetworkPolicy
- 6.Service
- 7.Ingress
- 8.指定节点部署
- 9.检查Node节点健康状态
- 10.一个Pod多个容器
- 11.监控Pod度量指标
- 12.监控Pod日志
- 13.PersistentVolumeClaim
- 14.Sidecar
- 15.集群故障排查——kubelet故障
注意事项
1.黑色星期五(或Cyber Monday)时购买考试是全年价格最低的时候,推荐预算充足的同学购买CKA+CKS,性价比最高,相关课程不推荐买,video和课件都是纯英语,对英语一般的人不够友好,买后用处不大。
2.规定的是考试购买后1个月内需要兑换考试券(我超过1个月后兑换的虽然也成功了,但不建议卡时间)。
3.考试时间的选择,最好选择凌晨和清晨,比如早上6点左右,亲测网络不会卡顿。本人亲测在凌晨5-7点网络不卡。
4.浏览器和PSI插件按照指南说明准备,考前最好多测试多运行几次,确保系统环境一定没问题,比如我考时windows系统不能用win10企业版,所以需要重装系统或换个电脑。
5.关于网络,不建议在办公室等有公司防火墙的WiFi环境考试,很可能会看不到题目,可以选择在家或酒店,或者自己手机开热点这些方式。
考试题目
原题解析
1.RBAC

中文解释:
创建一个名为deployment-clusterrole的clusterrole,该clusterrole只允许创建Deployment、Daemonset、Statefulset的create操作
在名字为app-team1的namespace下创建一个名为cicd-token的serviceAccount,并且将上一步创建clusterrole的权限绑定到该serviceAccount
参考:
https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/
https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-service-account/
解题:
# 创建clusterrole
kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployments,statefulsets,daemonsets# 或者
[root@k8s-master01 ~]# cat dp-clusterrole.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: deployment-clusterrole
rules:
- apiGroups: ["extensions", "apps"]resources: ["deployments","statefulsets","daemonsets"]verbs: ["create"]
[root@k8s-master01 ~]# kubectl create -f dp-clusterrole.yaml
clusterrole.rbac.authorization.k8s.io/deployment-clusterrole created# 创建serviceAccount
kubectl create sa cicd-token -n app-team1
serviceaccount/cicd-token created# 绑定权限(推荐,节省时间)
kubectl create rolebinding deployment-rolebinding --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token -n app-team1或者
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: deployment-rolebindingnamespace: app-team1
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: deployment-clusterrole
subjects:
- kind: ServiceAccountname: cicd-tokennamespace: app-team1# 验证:
[root@k8smaster /opt/cka]# kubectl auth can-i create deployment --as system:serviceaccount:app-team1:cicd-token -n app-team1
yes
[root@k8smaster /opt/cka]# kubectl auth can-i create daemonset --as system:serviceaccount:app-team1:cicd-token -n app-team1
yes
[root@k8smaster /opt/cka]# kubectl auth can-i create statefulset --as system:serviceaccount:app-team1:cicd-token -n app-team1
yes
[root@k8smaster /opt/cka]# kubectl auth can-i create pod --as system:serviceaccount:app-team1:cicd-token -n app-team1
no
2.节点维护

中文解释:
将ek8s-node-1节点设置为不可用,然后重新调度该节点上的所有Pod
参考:
https://kubernetes.io/zh/docs/tasks/configure-pod-container/
https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#drain
解题:
kubectl config use-context ek8s
kubectl cordon ek8s-node-1
# 测试执行
kubectl drain ek8s-node-1 --delete-emptydir-data --ignore-daemonsets --force --dry-run=server
# 腾空节点
kubectl drain ek8s-node-1 --delete-emptydir-data --ignore-daemonsets --force
3.K8S组件升级 1.28.0升级到1.28.1
参考:
https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
解题:
首先腾空节点:
# 设置为维护状态
kubectl cordon k8s-master
# 驱逐Pod
kubectl drain k8s-master --delete-emptydir-data --ignore-daemonsets --force
# 之后需要按照题目提示ssh到一个master节点
apt update
apt-cache policy kubeadm | grep 1.28.1
# 注意版本的差异,有可能并非1.20.1升级到1.28.1
apt-get install kubeadm=1.28.1-00
# 验证升级计划
kubeadm upgrade plan
# 看到如下信息,可升级到指定版本# 开始升级Master节点,注意看题需不需要升级etcd
kubeadm upgrade apply v1.28.1 --etcd-upgrade=false -f# 升级kubectl和kubelet
apt-get install -y kubelet=1.28.1-00 kubectl=1.28.1-00
systemctl daemon-reload
systemctl restart kubelet
# 恢复master可调度
kubectl uncordon k8s-master
node/k8s-master uncordonedkubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready control-plane,master 11d v1.28.1
k8s-node01 Ready <none> 8d v1.28.0
k8s-node02 Ready <none> 11d v1.28.0
4.Etcd备份与恢复

中文解释:
针对etcd实例https://127.0.0.1:2379创建一个快照,保存到 /srv/data/etcd-snapshot.db。在创建快照的过程中,如果卡住了,就键入ctrl+c终止,然后重试。
然后恢复一个已经存在的快照:/var/lib/backup/etcd-snapshot-previous.db
执行etcdctl命令的证书存放在:
ca证书:/opt/KUIN00601/ca.crt
客户端证书:/opt/KUIN00601/etcd-client.crt
客户端密钥:/opt/KUIN00601/etcd-client.key
参考:
https://kubernetes.io/zh/docs/tasks/administer-cluster/configure-upgrade-etcd/
解题:
kubernetes的所有数据记录在etcd中,对etcd进行备份就是对集群进行备份。连接etcd需要证书,证书可以从apiserver获取,因为apiserver可以去连etcd。新版本的apiserver都是以static pod方式运行,证书通过volume挂载到pod中。
具体的证书路径和备份到的路径按题目要求设置。ssh到master节点很快,长时间没连上,可以中断重连。
恢复部分据说很容易卡住,不要花太多时间。# 路径不存在的话要提前建出来
export ETCDCTL_API=3
etcdctl --endpoints="https://127.0.0.1:2379" --cacert=/opt/KUIN000601/ca.crt --cert=/opt/KUIN000601/etcd-client.crt --key=/opt/KUIN000601/etcd-client.key snapshot save /srv/data/etcd-snapshot.db# 还原
还原前最好关掉etcd服务,还原后重新开启etcd服务,
还原后etcd的状态可能有问题,最好不要去赌,失分可能性很大。
systemctl stop etcdmkdir /opt/backup/ -p
cd /etc/kubernetes/manifests
mv kube-* /opt/backupexport ETCDCTL_API=3
etcdctl --endpoints="https://127.0.0.1:2379" --cacert=/opt/KUIN000601/ca.crt --cert=/opt/KUIN000601/etcd-client.crt --key=/opt/KUIN000601/etcd-client.key snapshot restore /var/lib/backup/etcd-snapshot-previous.db --data-dir=/var/lib/etcd-restorevim /etc/kubernetes/manifests/etcd.yaml
# 将volume配置的path: /var/lib/etcd改成/var/lib/etcd-restorevolumes:- hostPath:path: /etc/kubernetes/pki/etcdtype: DirectoryOrCreatename: etcd-certs- hostPath:path: /var/lib/etcd-restore# 修改数据目录权限
chown -R etcd.etcd /var/lib/etcd-restore# 还原k8s组件
mv /opt/backup/* /etc/kubernetes/manifests
systemctl restart kubeletsystemctl start etcd# 其他答案:
# 不需要进行集群的切换,etcdctl 工具主机上已存在,无需进行安装
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/opt/KUIN00601/ca.crt --cert=/opt/KUIN00601/etcd-client.crt --key=/opt/KUIN00601/etcd-client.key snapshot save /var/lib/backup/etcd-snapshot.db
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/opt/KUIN00601/ca.crt --cert=/opt/KUIN00601/etcd-client.crt --key=/opt/KUIN00601/etcd-client.key snapshot restore /var/lib/backup/etcd-snapshot-previous.db
注意:
如果是二进制安装的etcd,考试环境的etcd可能并非root用户启动的,所以可以先切换到root用户(sudo su -)
然后使用ps aux | grep etcd查看启动用户是谁和启动的配置文件是谁config-file字段指定,假设用户是etcd。所以如果是二进制安装的etcd,执行恢复时需要root权限,所以在恢复数据时,可以使用root用户恢复,之后更改恢复目录的权限:sudo chown -R etcd.etcd /var/lib/etcd-restore,
然后通过systemctl status etcd(或者ps aux | grep etcd)找到它的配置文件
(如果没有配置文件,就可以直接在etcd的service 通过systemctl status etcd即可看到文件中找到data-dir的配置),然后更改data-dir配置后,执行systemctl daemon-reload,最后使用etcd用户systemctl restart etcd即可。
5.NetworkPolicy

中文解释:
创建一个名字为allow-port-from-namespace的NetworkPolicy,这个NetworkPolicy允许internal命名空间下的Pod访问该命名空间下的9000端口。
并且不允许不是internal命令空间的下的Pod访问
不允许访问没有监听9000端口的Pod。
参考:
https://kubernetes.io/zh/docs/concepts/services-networking/network-policies/
解题:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: allow-port-from-namespacenamespace: internal
spec:ingress:- from:- podSelector: {}ports:- port: 9000protocol: TCPpodSelector: {}policyTypes:- Ingress
6.Service

中文解释:
重新配置一个已经存在的deployment front-end,在名字为nginx的容器里面添加一个端口配置,名字为http,暴露端口号为80/TCP,然后创建一个service,名字为front-end-svc,暴露该deployment的http端口,并且service的类型为NodePort。
解题:
kubectl edit deploy front-endspec:containers:- name: nginximage: nginx# 需要加这四行ports:- name: httpcontainerPort: 80protocol: TCP# 或者命令行添加service:
kubectl expose deploy front-end --name=front-end-svc --port=80 --target-port=http --type=NodePort# 或者通过文件方式创建service:
apiVersion: v1
kind: Service
metadata:name: front-end-svclabels:app: front-end
spec:type: NodePortselector:app: front-end # label需要匹配,否则访问不到。ports:- name: httpprotocol: TCPport: 80targetPort: 80
7.Ingress

中文解释:
在ing-internal 命名空间下创建一个ingress,名字为pong,代理的service hi,端口为5678,配置路径/hi。
验证:访问curl -kL <INTERNAL_IP>/hi会返回hi。
解题:
# ingressClassName需指定为nginx
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: pongnamespace: ing-internal
spec:ingressClassName: nginxrules:- http:paths:- path: /hipathType: Prefixbackend:service:name: hiport:number: 5678kubectl get ingress -n ing-internal 获取ip后curl验证# 如果考试环境没出ip需要在annotations下加一行
cat ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: pongnamespace: ing-internalannotations:nginx.ingress.kubernetes.ionginx.ingress.kubernetes.io/rewrite-target: /
spec:rules:- http:paths:- path: /hipathType: Prefixbackend:service:name: hiport:number: 5678
ingressclassname如果不指定,则会使用集群默认的指定的ingress。
Deployment扩缩容(4分)

解题:
kubectl config use-context k8s
kubectl scale --replicas=6 deployment loadbalancer
kubectl edit deploy loadbalancer
8.指定节点部署

解题:
vim pod-ns.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx-kusc00401labels:role: nginx-kusc00401
spec:nodeSelector:disk: spinningcontainers:- name: nginximage: nginxkubectl create -f pod-ns.yaml# 省时
kubectl run nginx-kusc00401 --image=nginx --dry-run=client -o yaml > 9.yaml
9.检查Node节点健康状态

解题;
kubectl config use-context k8s
# 记录总数为A
kubectl get node|grep -i ready|wc -l
# 记录总数为B
kubectl describe node|grep Taints|grep NoSchedule|wc -l
# 将A减B的值x导入到/opt/KUSC00402/kusc00402.txt
echo x >> /opt/KUSC00402/kusc00402.txt# 切换到指定集群
kubectl config use-context [NAME]
# Ready 状态的节点数减去 NoSchedule 状态的节点数
kubectl get node |grep -i ready
kubectl describe node |grep -i 'taints'
echo '2' >> /opt/KUSC00402/kusc00402.txt
10.一个Pod多个容器

中文解释:
创建一个Pod,名字为kucc1,这个Pod可能包含1-4容器,该题为四个:nginx+redis+memcached+consul
解题:
apiVersion: v1
kind: Pod
metadata:name: kucc1
spec:containers:- image: nginxname: nginx- image: redisname: redis- image: memchachedname: memcached- image: consulname: consul# 或者用dry-run=client的命令快速生成yaml模板,修改yaml,加入新容器进去
kubectl run kucc1 --image=nginx --dry-run=client -o yaml > 11.yaml
apiVersion: v1
kind: Pod
metadata:labels:run: kucc1name: kucc1
spec:containers:- image: nginxname: nginx- image: redisname: redis- image: memcachedname: memcached- image: consulname: consuldnsPolicy: ClusterFirstrestartPolicy: Always
PersistentVolume(4分)

中文解释:
创建一个pv,名字为app-config,大小为2Gi,访问权限为ReadWriteMany。Volume的类型为hostPath,路径为/srv/app-config
apiVersion: v1
kind: PersistentVolume
metadata:name: app-configlabels:type: local
spec:storageClassName: manual # 需要有这一项吗?题目没有要求,(可以不写)volumeMode: Filesystemcapacity:storage: 2GiaccessModes:- ReadWriteManyhostPath:path: "/srv/app-config"kubectl get pv app-config
11.监控Pod度量指标

中文解释:
找出具有name=cpu-user的Pod,并过滤出使用CPU最高的Pod,然后把它的名字写在已经存在的 /opt/KUTR00401/KUTR00401.txt文件里(注意他没有说指定namespace。所以需要使用-A指定所以namespace)
解题:
kubectl config use-context k8s
kubectl top pod -A -l name=cpu-user
NAMESPACE NAME CPU(cores) MEMORY(bytes)
kube-system coredns-54d67798b7-hl8xc 7m 8Mi
kube-system coredns-54d67798b7-m4m2q 6m 8Mi# 注意这里的pod名字以实际名字为准,按照CPU那一列进行选择一个最大的Pod,另外如果CPU的数值是1 2 3这样的。是大于带m这样的,因为1颗CPU等于1000m
注意要用">>"而不是">"
echo "coredns-54d67798b7-hl8xc" >> /opt/KUTR00401/KUTR00401.txt# 其他解法:
kubectl get pods -A --show-labels
kubectl top pods -A -l name=cpu-user --sort-by="cpu"
echo "[podname]" >> /opt/KUTR00401/KUTR00401.txt
12.监控Pod日志

中文解释:
监控名为foobar的Pod的日志,并过滤出具有unable-access-website信息的行,然后将写入到 /opt/KUTR00101/foobar
解题:
kubectl config use-context k8s
kubectl logs foobar|grep 'unable-access-website' >> /opt/KUTR00101/foobar
13.PersistentVolumeClaim

中文翻译:
创建一个名字为pv-volume的pvc,指定storageClass为csi-hostpath-sc,大小为10Mi
然后创建一个Pod,名字为web-server,镜像为nginx,并且挂载该PVC至/usr/share/nginx/html,挂载的权限为ReadWriteOnce。之后通过 kubectl edit或者 kubectl path将pvc改成70Mi,并且记录修改记录。
解题:
# 创建PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pv-volume
spec:accessModes:- ReadWriteOncevolumeMode: Filesystemresources:requests:storage: 10MistorageClassName: csi-hostpath-sc# 创建Pod
apiVersion: v1
kind: Pod
metadata:name: web-server
spec:containers:- name: nginximage: nginxvolumeMounts:- mountPath: "/usr/share/nginx/html"name: pv-volume # 名字不是必须和pvc一直,也可以为my-volumevolumes:- name: pv-volume # 名字不是必须和pvc一直,也可以为my-volumepersistentVolumeClaim:claimName: pv-volume# 扩容
# 方式一patch命令:
kubectl patch pvc pv-volume -p '{"spec":{"resources":{"requests":{"storage": "70Mi"}}}}' --record# 方式二edit:
kubectl edit pvc pv-volume
# 记录修改记录,需要加--record参数或--save-config
kubectl edit pvc pv-volume --record
kubectl edit pvc pv-volume --save-config
将两处10Mi都改为70Mi,如果是nfs,会因为不支持动态扩容而失败。
edit完需要稍等一会儿,容量才会变为70Mi
14.Sidecar

添加一个名为busybox且镜像为busybox的sidecar到一个已经存在的名为legacy-app的Pod上,这个sidecar的启动命令为 /bin/sh, -c, ‘tail -n+1 -f /var/log/legacy-app.log’。
并且这个sidecar和原有的镜像挂载一个名为logs的volume,挂载的目录为/var/log/。
解题:
kubectl get pod legacy-app -o yaml > c-sidecar.yaml
apiVersion: v1
kind: Pod
metadata:name: legacy-app
spec:containers:- name: countimage: busyboxargs:- /bin/sh- -c- >i=0;while true;doecho "$(date) INFO $i" >> /var/log/legacy-ap.log;i=$((i+1));sleep 1;done # 在此yaml中添加sidecar和volume
vim c-sidecar.yaml
apiVersion: v1
kind: Pod
metadata:name: legacy-app
spec:containers:- name: countimage: busyboxargs:- /bin/sh- -c- >i=0;while true;doecho "$(date) INFO $i" >> /var/log/legacy-ap.log;i=$((i+1));sleep 1;done # 加上下面部分volumeMounts:- name: logsmountPath: /var/log- name: busyboximage: busyboxargs: [/bin/sh, -c, 'tail -n+1 -f /var/log/legacy-ap.log']volumeMounts:- name: logsmountPath: /var/logvolumes:- name: logsemptyDir: {}kubectl delete -f c-sidecar.yaml
kubectl create -f c-sidecar.yaml# 检查
[root@k8smaster /opt/cka]# kubectl logs legacy-app -c busybox
15.集群故障排查——kubelet故障

中文解释:
一个名为wk8s-node-0的节点状态为NotReady,让其他恢复至正常状态,并确认所有的更改开机自动完成
解题:
# 检查wk8s-node-0 kubelet服务状态
ssh wk8s-node-0
sudo su -
systemctl status kubelet
systemctl start kubelet
systemctl enable kubelet其实这题没这么简单,一般启动kubelet后大概率是启动失败的
可能的原因:
1.kubelet二进制文件路径不对,which kubelet后和服务启动文件kubelet systemd service做个对比,看是否是这个原因
2.service文件路径和它启动的路径不一致,在启动目录下找不到service文件,可以全局搜下并做个软链接。
3.其他原因。# 再次检查wk8s-node-0是否在ready
ssh master01
kubectl get nodes
相关文章:
2023年CKA考试真题及注意事项
2023年CKA考试真题及注意事项 注意事项考试题目原题解析1.RBAC2.节点维护3.K8S组件升级 1.28.0升级到1.28.14.Etcd备份与恢复5.NetworkPolicy6.Service7.Ingress8.指定节点部署9.检查Node节点健康状态10.一个Pod多个容器11.监控Pod度量指标12.监控Pod日志13.PersistentVolumeCl…...
云计算运维面试
一、Linux的启动过程 1.加电 2.加载bios设置 3.加载grub 4. 加载内核系统到内存中 5.加载配置文件 6.加载内核模块 7.完成相应初始化工作和启动相应服务 8.启动系统进程 9.出现登录界面 10.开机自启动完成 二、查看系统的版本和内核 1、 查看版本 cat /etc/redha…...
Qt实现TCP调试助手 - 简述如何在Qt中实现TCP多并发
简介 软件开发中,可能经常会用到TCP调试工具。本人使用QT开发了一款TCP调试工具,方便大家使用。本文章主要介绍下,该工具的功能,以及如何在Qt中实现TCP服务器的并发。 界面展示 安装界面 桌面图标。安装后会生成桌面图标&#…...
【Python OpenCV】OpenCV介绍
文章目录 前言一、OpenCV简介二、基本功能三、实际应用场景四、Python安装OpenCV总结 前言 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和图像处理库,它提供了丰富的工具和函数,用于处理图像和视频。由于…...
11-09 周四 CNN 卷积神经网络基础知识
11-09 周四 CNN 卷积神经网络 时间版本修改人描述2023年11月9日09:38:12V0.1宋全恒新建文档 简介 学习一下CNN,卷积神经网络。使用的视频课程。视觉相关的任务: 人脸识别 卷积网络与传统网络的区别: <img altimage-20231109094400591 s…...
Vue.js中的路由(router)和Vue Router的作用?
聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...
从开源项目聊鱼眼相机的“360全景拼接”
目录 概述 从360全景的背景讲起 跨过参数标定聊透视变化 拼接图片后处理 参考文献 概述 写这篇文章的原因完全源于开源项目(GitHub参阅参考文献1)。该项目涵盖了环视系统的较为全貌的制作过程,包含完整的标定、投影、拼接和实时运行流程。该篇文章主要是梳理全…...
网络安全——
文章目录 网络安全TCP/IP与网络安全网络安全构成要素加密技术基础 网络安全 TCP/IP与网络安全 起初,TCP/IP只用于一个相对封闭的环境,之后才发展为并无太多限制、可以从远程访问更多资源的形式。因此,“安全”这个概念并没有引起人们太多的…...
用excel 整理工作流程,以周为时间节点,自动统计进度
无论是处理自己还是团队的工作,我们都经常会遇到复杂的,凌乱的,需要多个环节才能完成的工作。 梳理工作流程 因为环节内容,每个环节处理不当都可能会导致我们整个工作目标实现受到影响,所以通过工作流程图,…...
Wireshark学习 与 TCP/IP协议分析
Wireshark简介和工具应用 如何开始抓包? 打开wireshark,显示如下网络连接。选择你正在使用的,(比如我正在使用无线网上网),双击 可以先看下自己的ip地址和网关ip地址(看抓包数据时候会用到&…...
Sequence(矩阵连乘+数论)
求Fn mod 1e97 Input 第一行是一个t代表有t组数据 接下来有t行每行有6个整数A,B,C,D,P,n 1<t<10 0<A,B,C,D<1e9 1<p,n<1e9 Output 输出一个答案Fn对1e97取余 Sample Input 2 1 1 1 1 1 5 1 1 1 1 10 4 Sample Output 9 10 思路: p/n上…...
集合工具类的常用方法--小总和
前言 集合工具类是Java中的一个重要工具类,在Java常用的集合框架中起到了重要的作用。集合工具类提供了一系列的方法,可以方便地处理Java中的集合对象,提高了开发的效率。 Collections类 Collections.sort(List<T> list) 对List集合进…...
一文了解游戏行业(数据分析)
一.概况 1.基本术语 游戏行业基础术语——持续更新ing... 2.产业链 包括游戏开发,发行和销售等环节 ①游戏开发 上游环节是游戏产业链的核心环节,包括游戏策划,美术设计,程序开发等,是决定游戏质量与内容的关键因…...
Flutter之Json序列化
前言 使用 json_annotation 框架实现json字符串序列化和反序列化 框架官方地址:json_serializable 一、引入依赖:在pubspec.yaml中添加 dependencies:json_annotation: ^4.8.1dev_dependencies:build_runner: ^2.3.3json_serializable: ^6.6.0 二、…...
Java基础——局部变量和常量
变量:内存中的一个存储区域(该区域的数据可以在同一类型范围内不断变化)。 常量:一旦声明就不可变,通常用 final 修饰的变量称为常量。 声明格式: [final] 变量类型 变量名;说明: final修饰…...
番外 1 : Java 环境下的 selenium 搭建
Java 环境下的 selenium 搭建 一 . 下载谷歌浏览器二 . 下载谷歌浏览器驱动2.1 查看谷歌浏览器版本2.2 下载对应版本的谷歌驱动2.3 解压下载好的驱动压缩包 , 将下载好的 chromedriver.exe 放到java 系统环境变量下 三 . 下载 Edge 浏览器的驱动3.1 查看 Edge 浏览器的版本3.2 …...
游戏缺失d3dx9_39.dll的5个修复方法,深度解析d3dx9_39.dll文件的作用
在当今的数字化时代,电子游戏已经成为了人们休闲娱乐的重要方式之一。然而,对于许多玩家来说,他们在享受游戏带来的乐趣的同时,也可能会遇到各种各样的问题,其中最常见的就是游戏无法正常运行。而这些问题中࿰…...
RHCSA --- Linux用户/组权限
用户管理 useradd 创建用户 -u(UID) 指定UID -g(GID) 指定基本组 -G(GID1,GID2,...) 指定附加组 -c “注释信息” 指定用户注释信息(昵称) -d /path…...
怎么做到高性能网络IO?
为什么要做高性能网络IO。主要是解决c10,c10M问题 最开始的时候我们走的内核协议栈,走内核协议栈其实性能比较低,因为我们之前介绍的时候需要拷贝两次 但是我们采用用户态协议栈可以少拷贝一次,可以大大提高效率, 步骤…...
设计模式-创建型
文章目录 设计模式-创建型工厂模式简单工厂工厂方法抽象工厂 建造者模式单例模式原型模式 设计模式-创建型 本章主要介绍有关对象创建的几种设计模式。 工厂模式 工厂模式:封装了对象的创建,使得获得对象更加符合实际逻辑 简单工厂 将所有对象的生产…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...
