k8s 配置资源管理

一、Secret的资源配置

1.1 Secret配置的相关说明

        Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源,这类数据虽然也可以存放在 Pod 或者镜像中,但是放在 Secret 中是为了更方便的控制如何使用数据,并减少暴露的风险。

有四种类型:

kubernetes.io/service-account-token:由 Kubernetes 自动创建,用来访问 APIServer 的 Secret,Pod 会默认使用这个 Secret 与 APIServer 通信, 并且会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中;
Opaque :base64 编码格式的 Secret,用来存储用户自定义的密码、密钥等,默认的 Secret 类型;
kubernetes.io/dockerconfigjson :用来存储私有 docker registry 的认证信息。
kubernetes.io/tls:用于存储TLS证书和私钥,通常用于Ingress控制器或其他需要TLS加密通信的服务。

Pod 需要先引用才能使用某个 secret,Pod 有 3 种方式来使用 secret
●作为挂载到一个或多个容器上的卷 中的文件。
●作为容器的环境变量。
●由 kubelet 在为 Pod 拉取镜像时使用。

应用场景:凭据  Secret | Kubernetes

1.2 陈述式创建 Secret配置

        Secret 的创建是根据文件中保存到相应信息 进行。例如我们要通过一个用户名文件和密码文件来创建具体的Secret资源配置。

#首先准备好相对应的用户和密码文件
#echo 中 “-n” 选项为不换行
echo -n 'limahua' > username.txt
echo -n 'qq666' > passwd.txt

用kubectl create secret命令创建Secret

kubectl create secret generic mysecret --from-file=username.txt --from-file=passwd.txt

kubectl describe secrets mysecret

1.3 声明式 + base64编码 创建Secret

echo limahua | base64

echo qq666 | base64
通过管道符base64 将明文进行转码

编写yaml文件
vim secret01.yamlapiVersion: v1
kind: Secret                #表明资源的类型为Secret,用于存储敏感信息
metadata:name: my-secret1
type: Opaque                 # base64 进行转码信息保护
data:                        #定义secret的配置信息username: bGltYWh1YQo=     #Base64编码后的用户名password: cXE2NjYK         #Base64编码后的密码kubectl apply -f secret01.yaml

1.4 将secret 以volume形式挂载到pod中

创建一个pod模板,对其进行修改编辑
kubectl run nginx-secret --image=nginx:1.18 --port=80 --dry-run=client -o yaml > ng-secret.yamlvim ng-secret.yamlapiVersion: v1
kind: Pod
metadata:labels:run: nginx-secretname: nginx-secret
spec:containers:- image: nginx:1.18name: nginx-secretports:- containerPort: 80volumeMounts:- name: secrets                 #引用一个卷(volume)的名称,该卷在此容器内挂载mountPath: "/etc/secret"      #指定容器内挂载的路径readOnly: true                #只读volumes:- name: secrets                   #卷的名称,与上述容器中引用的卷名对应secret:secretName: mysecret          #指定了此卷的数据来源是一个名为mysecret的Secret对象Kubernetes会自动将mysecret Secret中的数据挂载到指定的/etc/secret路径下,
所有数据都是以文件形式存在且根据Secret的原始内容Base64解码。kubectl apply -f ng-secret.yaml

1.5 将Secret导入到pod中,充当环境变量

复制上一个模板,进行修改编辑
cp ng-secret.yaml env-secret.yaml进行编辑修改
vim env-secret.yamlapiVersion: v1
kind: Pod
metadata:labels:run: nginx-secret2name: nginx-secret2
spec:containers:- image: nginx:1.18name: nginx-secret2ports:- containerPort: 80env:                    #定义了环境变量- name: THIS_USER       #环境变量从名为my-secret1的Secret中通过键username获取值volumeFrom:secretKeyRef:name: my-secret1key: username- name: THIS_PASSWORD   #环境变量同样从my-secret1 Secret中通过键password获取值volumeFrom:secretKeyRef:name: my-secret1key: passwordkubectl apply -f env-secret.yaml

1.6 实战运用:使用secret配置免密交互拉取habor私有仓库镜像

harbor仓库的搭建详见:kubeadm 部署k8s集群-CSDN博客

在pod详解里有

        我们在搭建好docker的私有仓库后,在使用私有仓库时需要通过docker login指令来登录到私有仓库中。

        但同时在使用的过程中也会把habor仓库的用户名和密码暴露在命令行中,存在一定的安全隐患。k8s中的secret配置的运用能够实现并且规避这一问题的存在

 进行私有仓库的secret资源创建

#私有仓库的secret配置
kubectl create secret docker-registry myharbor --docker-server=hub.benet.com --docker-username=admin --docker-password=Harbor12345 --docker-email=admin@qq.com

引用secret资源拉取私有仓库镜像创建pod
vim harbor-nginx.yamlapiVersion: apps/v1
kind: Deployment
metadata:name: myapp-nginx
spec:replicas: 3selector:matchLabels:app: myapp-nginxtemplate:metadata:labels:app: myapp-nginxspec:containers:- name: myapp-containerimage: hub.benet.com/library/nginx:v1
#从私有 Docker registry hub.benet.com 中拉取 library/nginx 镜像的 v1 版本imagePullSecrets:        #定义了用于拉取私有 Docker registry 镜像所需的 Secret- name: myharbor
#指定了一个 Secret 的名称,这里为 myharbor,这意味着 Kubernetes 在拉取私有 Docker registry 的
镜像时,将使用 myharbor Secret 中的认证信息kubectl apply -f harbor-nginx.yaml

以下是实验没有结果可能存在的问题:

注意以上配置完成后要重启docker 加载该配置。

另一种方法:

---------- 部署 harbor 创建私有项目 ----------
//在 Docker harbor 节点(192.168.80.13)上操作
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0yum install -y yum-utils device-mapper-persistent-data lvm2 
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
yum install -y docker-ce
systemctl start docker.service
systemctl enable docker.service
docker version//上传 docker-compose 和 harbor-offline-installer-v1.2.2.tgz 到 /opt 目录中
cd /opt
chmod +x docker-compose
mv docker-compose /usr/local/bin///部署 Harbor 服务
tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/
vim /usr/local/harbor/harbor.cfg
--5行--修改,设置为Harbor服务器的IP地址或者域名
hostname = 192.168.80.13cd /usr/local/harbor/
./install.sh//在 Harbor 中创建一个新项目
(1)浏览器访问:http://192.168.80.13 登录 Harbor WEB UI 界面,默认的管理员用户名和密码是 admin/Harbor12345
(2)输入用户名和密码登录界面后可以创建一个新项目。点击“+项目”按钮
(3)填写项目名称为“kgc-project”,点击“确定”按钮,创建新项目//在每个 node 节点配置连接私有仓库(注意每行后面的逗号要添加)
cat > /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],"insecure-registries":["192.168.80.13"]
}
EOFsystemctl daemon-reload
systemctl restart docker//在每个 node 节点登录 harbor 私有仓库
docker login -u admin -p harbor12345 http://192.168.80.13//在一个 node 节点下载 Tomcat 镜像进行推送
docker pull tomcat:8.0.52
docker imagesdocker tag tomcat:8.0.52 192.168.80.13/kgc-project/tomcat:v1
docker imagesdocker push 192.168.80.13/kgc-project/tomcat:v1//查看登陆凭据
cat /root/.docker/config.json | base64 -w 0			#base64 -w 0:进行 base64 加密并禁止自动换行
ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjE5NS44MCI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZTR0Z5WW05eU1USXpORFU9IgoJCX0KCX0sCgkiSHR0cEhlYWRlcnMiOiB7CgkJIlVzZXItQWdlbnQiOiAiRG9ja2VyLUNsaWVudC8xOS4wMy41IChsaW51eCkiCgl9Cn0=//创建 harbor 登录凭据资源清单,用于 K8S 访问 Harbor 私服拉取镜像所需要的密钥权限凭证 secret 资源
vim harbor-pull-secret.yaml
apiVersion: v1
kind: Secret
metadata:name: harbor-pull-secret
data:.dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjE5NS44MCI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZTR0Z5WW05eU1USXpORFU9IgoJCX0KCX0sCgkiSHR0cEhlYWRlcnMiOiB7CgkJIlVzZXItQWdlbnQiOiAiRG9ja2VyLUNsaWVudC8xOS4wMy41IChsaW51eCkiCgl9Cn0=			#复制粘贴上述查看的登陆凭据
type: kubernetes.io/dockerconfigjson//创建 secret 资源
kubectl create -f harbor-pull-secret.yaml//查看 secret 资源
kubectl get secret//创建资源从 harbor 中下载镜像
cd /opt/demo
vim tomcat-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: my-tomcat
spec:replicas: 2selector:matchLabels:app: my-tomcattemplate:metadata:labels:app: my-tomcatspec:imagePullSecrets:						#添加 K8S 访问 Harbor 私服拉取镜像所需要的 secret 资源选项- name: harbor-pull-secret			#指定 secret 资源名称containers:- name: my-tomcatimage: 192.168.80.13/kgc-project/tomcat:v1		#指定 harbor 中的镜像名ports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: my-tomcat
spec:type: NodePortports:- port: 8080targetPort: 8080nodePort: 31111selector:app: my-tomcat//删除之前在 node 节点下载的 Tomcat 镜像
docker rmi tomcat:8.0.52
docker rmi 192.168.80.13/kgc-project/tomcat:v1
docker images//创建资源
kubectl create -f tomcat-deployment.yamlkubectl get pods
NAME                              READY   STATUS    RESTARTS   AGE
my-tomcat-d55b94fd-29qk2   1/1     Running   0         
my-tomcat-d55b94fd-9j42r   1/1     Running   0         //查看 Pod 的描述信息,可以发现镜像时从 harbor 下载的
kubectl describe pod my-tomcat-d55b94fd-29qk2//刷新 harbor 页面,可以看到镜像的下载次数增加了

二、ConfigMap资源配置

与Secret类似,区别在于ConfigMap保存的是不需要加密配置的信息。
        ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制大对象。
应用场景:应用配置

2.1 使用目录来创建configMap资源

 创建一个目录并且在一个目录中填写两个文件:

mkdir /opt/configmap/vim /opt/configmap/game.properties
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30vim /opt/configmap/ui.properties
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice

kubectl create configmap game-config --from-file=/opt/configmap/
//--from-file 指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件名,值就是文件的内容

2.2 使用文件创建configMap资源

只要指定为一个文件就可以从单个文件中创建 ConfigMap
--from-file 这个参数可以使用多次,即可以使用两次分别指定上个实例中的那两个配置文件,效果就跟指定整个目录是一样的

kubectl create configmap game-config-2 --from-file=/opt/configmap/game.properties --from-file=/opt/configmap/ui.properties

2.3 直接使用参数创建confidenceMap资源

使用字面值创建

使用文字值创建,利用 --from-literal 参数传递配置信息,该参数可以使用多次,格式如下

kubectl create configmap special-config --from-literal=name=huhu --from-literal=hobby=play

这里的--from-literal 后跟 key=value

2.4 pod利用configMap资源

(1) 使用 ConfigMap 来替代环境变量
vim env.yamlapiVersion: v1
kind: ConfigMap
metadata:name: special-config1namespace: default
data:special.how: very         #这里定义了一些configMap的配置资源special.type: good        #这里定义了一些configMap的配置资源
---
apiVersion: v1
kind: ConfigMap
metadata:name: env-config1namespace: default
data:log_level: INFO            #这里定义了一些configMap的配置资源kubectl apply -f env.yaml

(2) 创建pod,并且引用configMap资源
vim test-pod.yamlapiVersion: v1
kind: Pod
metadata:name: test-pod
spec:containers:- name: busyboximage: busybox:1.28.4command: [ "/bin/sh", "-c", "env" ]#容器启动时执行的命令,这里运行env命令来打印环境变量。env:- name: SPECIAL_HOW_KEYvalueFrom:configMapKeyRef:name: special-config1key: special.how#从名为special-config1的ConfigMap中通过键special.how获取值,并设置为环境变量。- name: SPECIAL_TYPE_KEYvalueFrom:configMapKeyRef:name: special-config1key: special.type#同样从special-config1 ConfigMap中通过键special.type获取值设置为环境变量。envFrom:- configMapRef:name: env-config1#从名为env-config1的ConfigMap中批量导入所有键值对作为环境变量。restartPolicy: Neverkubectl create -f test-pod.yaml

2.5 使用 ConfigMap 设置命令行参数

vim test-pod2.yamlapiVersion: v1
kind: Pod
metadata:name: test-pod2
spec:containers:- name: busyboximage: busybox:1.28.4command: - /bin/sh- -c- echo "$(SPECIAL_HOW_KEY) $(SPECIAL_TYPE_KEY)"
#与上一个配置文件相同这里把configMap中配置设置为pod中环境变量  再用echo将其输出env:- name: SPECIAL_HOW_KEYvalueFrom:configMapKeyRef:name: special-config1key: special.how- name: SPECIAL_TYPE_KEYvalueFrom:configMapKeyRef:name: special-config1key: special.typeenvFrom:- configMapRef:name: env-config1restartPolicy: Neverkubectl create -f test-pod2.yaml

2.6 通过数据卷插件使用ConfigMap

        在数据卷里面使用 ConfigMap,就是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容

vim test-pod3.yamlapiVersion: v1
kind: Pod
metadata:name: test-pod3
spec:containers:- name: busyboximage: busybox:1.28.4command: [ "/bin/sh", "-c", "sleep 36000" ]volumeMounts:- name: config-volumemountPath: /etc/configvolumes:- name: config-volumeconfigMap:name: special-config1restartPolicy: Neverkubectl create -f test-pod3.yaml

我想通过configMap实现单独挂载pod中的nginx.conf配置

#首先获取nginx.conf 下载或则之前保存都可以
# nginx.conf 配置文件在/opt/benet/目录 下
kubectl create cm my-nginx --from-file=/opt/benet

vim pod-nginx1.yaml 
apiVersion: v1
kind: Pod
metadata:name: mypod1
spec:volumes:- name: nginxconfigMap:            #指定卷数据来源于 ConfigMapname: my-nginx      #具体指定了 ConfigMap 的名称containers:- image: nginx:1.18name: nginxvolumeMounts:- name: nginxmountPath: /etc/nginx/nginx.confsubPath: nginx.conf     #subPath  可以实现只覆盖修改该文件,而不影响目录如果不加subPath,你挂载到容器内的目录中其它文件将被覆盖。且如果configMap有其它键值也会被一起挂载。kubectl apply -f pod-nginx1.yaml

2.7 configMap 的热更新

#创建一个cm资源
kubectl create configmap name-hobby --from-literal=hobby=fly#创建一个pod,并且通过volume的方式挂载configMap中的name-config
vim  pod-demo5.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: namepod1name: namepod1
spec:replicas: 1selector:matchLabels:app: namepod1template:metadata:labels:app: namepod1spec:volumes:- name: pod-testconfigMap:name: name-hobbycontainers:- image: nginx:1.18name: mypodvolumeMounts:- name: pod-testmountPath: /opt/

开启另一个终端进行实时修改:

kubectl edit cm name-hobby

等大概一分钟左右,使用该 ConfigMap 挂载的 Volume 中的数据同步更新

ConfigMap 更新后滚动更新 Pod

        更新 ConfigMap 目前并不会触发相关 Pod 的滚动更新,可以通过在 .spec.template.metadata.annotations 中添加 version/config ,每次通过修改 version/config 来触发滚动更新

kubectl patch deployment namepod1 --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20240603" }}}}}'

PS:更新 ConfigMap 后:
●使用该 ConfigMap 挂载的 Env 不会同步更新。
●使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新。

总结

使用 Secret 资源
挂载的方式
在 pod.spec.volumes 字段中定义卷类型为 secret 
在 pod.spec.containers.volumeMounts 字段中把存储卷挂载到指定的容器目录,secret资源数据的key将
以文件名的形式存在,value为文件内容容器环境变量引用的方式
在 pod.spec.containers.env.name 字段中自定义容器的环境变量名
在.containers.env.valueFrom.secretKeyRef.name字段中指定secret资源的名
称,.containers.env.valueFrom.secretKeyRef.key字段中指定这个secret资源数据的key, 
从而确定引用那个secret资源的key的value作为这个环境变量的值在 .containers.envFrom.secretRef.name 字段中指定secret资源的名称,可实现使用secret资源数据的
key作为容器环境变量名,value作为这个环境变量的值K8S从私有仓库拉取镜像时使用
在 pod.spec.imagePullSecrets 字段中指定 kubernetes.io/dockerconfigjson 类型的 secret 资源来
作为连接私有仓库的认证信息ConfigMap  简称  cm ,保存配置文件  环境变量 命令行参数 之类的不需要加密的信息
创建 cm 资源
kubectl create  cm  XXX --from-file=文件/目录    --from-literal=变量的键值对(key=value)查看cm资源的数据,数据以明文格式显示key的value
kubectl describe cm  XXX   或    kubectl get cm XXX -o yaml使用 cm 资源
容器环境变量引用的方式
env 指定自定义的环境变量名,通过指定的cm资源名称和key来给这个变量赋值
envFrom  直接使用cm资源的key作为容器的环境变量名,key的value作为这个变量的值挂载的方式
volumes 定义卷类型为 configMap ,使用 items 字段可以自定义挂载的文件的子目录和文件名
volumeMounts  把卷挂载到容器目录。cm资源数据中的key以文件名的形式存在,value为文件内容   使用 subPath 指定文件名,实现只把卷挂载到指定的文件名上cm资源热更新
更新cm资源的数据可以同步更新通过挂载的方式使用cm资源数据的Pod中的配置(注:使用subPath挂载的文件
不会更新)
如果使用env或envFrom引用环境变量的方式,是不会同步更新Pod中的配置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/343314.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生活使用英语口语柯桥外语学校成人英语学习

● “自来水”英语怎么说&#xff1f; ● “自来水”的英语表达是&#xff1a;Running water或者Tap water. 例句&#xff1a; There are hot and cold running water in all the bedrooms. 所有的卧室里都有冷热自来水。 ● “热水”英文怎么水&#xff1f; ● 我们不管…

Java面试题:Redis持久化问题

Redis持久化问题 RDB (Redis Database Backup File) Redis数据快照 将内存中的所有数据都记录到磁盘中做快照 当Redis实例故障重启时,从磁盘读取快照文件恢复数据 使用 save/bgsave命令进行手动快照 save使用主进程执行RDB,对所有命令都进行阻塞 bgsave使用子进程执行R…

21 - 即时食物配送 II(高频 SQL 50 题基础版)

21 - 即时食物配送 II -- sum(if(order_datecustomer_pref_delivery_date,1,0))/count(*)sum(order_datecustomer_pref_delivery_date)/count(*) -- count(*),表示数据的行数&#xff0c;如果有分组&#xff0c;为分组后数据的行数select round(100*sum(if(order_datecustomer_…

Gradio.NET:一个快速制作演示demo网页的利器

Gradio介绍 Gradio是一个用于创建机器学习模型交互界面的Python库。它允许开发者快速为他们的模型创建一个简单的web界面&#xff0c;以便于非技术用户和其他开发者进行交互和测试。 Gradio的主要优点是易用性和灵活性。你只需要几行代码就可以为你的模型创建一个交互界面。你…

go的反射和断言

在go中对于一个变量&#xff0c;主要包含两个信息变量类型&#xff08;type&#xff09;和变量值&#xff08;value&#xff09; 可以通过reflect包在运行的时候动态获取变量信息&#xff0c;并能够进行操作 对于Type可以通过reflect.TypeOf()获取到变量的类型信息 reflect.Ty…

python基础实例

下一个更大的数 定义一个Solution类&#xff0c;用于实现next_great方法 class Solution: def next_great(self, nums1, nums2): # 初始化一个空字典answer&#xff0c;用于存储答案 answer {} # 初始化一个空列表stack&#xff0c;用于存储待比较的数字 stack [] # 遍历nu…

Java——面向对象进阶(一)

前言 面向对象进阶(一)&#xff1a;static&#xff0c;继承&#xff0c;this和super关键字 文章目录 一、static1.1 静态变量1.2 静态方法1.3 静态变量和静态方法在内存中 二、继承2.1 概念2.2 继承的特点和能继承什么2.3 继承中的重写2.4 this和super关键字 一、static 在 Jav…

C++ AVL树 详细讲解

目录 一、AVL树的概念 二、AVL树的实现 1.AVL树节点的定义 2.AVL树的插入 3.AVL树的旋转 4.AVL树的验证 三、AVL树的性能 四、完结撒❀ 一、AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但 如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查 …

容器化实践:DevOps环境下的容器交付流程

DevOps的兴起是为了应对市场和消费者对技术应用的不断增长的需求。它的目标是构建一个更快的开发环境&#xff0c;同时保持软件的高质量标准。DevOps还致力于在敏捷开发周期中提升软件的整体品质。这一目标的实现依赖于多种技术、平台和工具的综合运用。 结合容器化技术与DevO…

Xamarin.Android实现通知推送功能(1)

目录 1、背景说明1.1 开发环境1.2 实现效果1.2.1 推送的界面1.2.2 推送的设置1.2.3 推送的功能实现1.2.3.1、Activity的设置【重要】1.2.3.2、代码的实现 2、源码下载3、总结4、参考资料 1、背景说明 在App开发中&#xff0c;通知&#xff08;或消息&#xff09;的推送&#x…

jadx-gui-1.5 反编译工具使用教程 反混淆 Java android 查看签名

JADX&#xff1a;JADX是一个强大的反编译工具&#xff0c;它支持命令行和图形界面操作。除了基本的反编译功能外&#xff0c;JADX还提供了反混淆功能&#xff0c;有助于提高反编译后代码的可读性。 在Android开发和安全分析领域&#xff0c;反编译工具扮演着至关重要的角色。这…

HTML静态网页成品作业(HTML+CSS)—— 金宝贝儿童教育机构介绍网页(2个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有2个页面。 二、作品演示 三、代…

【数据分享】中国高技术产业统计年鉴(2023年)

大家好&#xff01;今天我要向大家介绍一份重要的高技术产业发展情况统计数据资源——《中国高技术产业统计年鉴》。这份年鉴涵盖了从2023年中国高技术产业发展情况的全面数据&#xff0c;并以多格式提供免费下载。&#xff08;无需分享朋友圈即可获取&#xff09; 数据介绍 …

离散数学答疑 3

&#xff5e;A&#xff1a;A的补集 有时候空集是元素&#xff0c;有时候就是纯粹的空集 A-B的定义&#xff1a; 笛卡尔积&#xff1a; 求等价关系&#xff1a;先求划分再一一列举 不同划分&#xff1a;分几块。一块&#xff1a;两块&#xff1a;三块&#xff1a;分别计算 Ix是…

LeetCode62不同路径

题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。问总共有多少条不同的路径&#xff1f; …

【Spring Cloud Alibaba】开源组件Sentinel

目录 什么是Sentinel发展历史与Hystrix的异同 Sentinel可以做什么&#xff1f;Sentinel的功能Sentinel的开源生态Sentinel的用户安装Sentinel控制台预备环境准备Sentinel 分为两个部分:下载地址 项目集成Sentinel创建项目修改依赖信息添加启动注解添加配置信息在控制器类中新增…

Django 里的表格内容做修改

当Django里表格内容需要做修改&#xff0c;可以这么操作。 先看效果图 修改后的表格 1. 先得在 asset_list.html 里修改。你们的html有可能跟我不一样 <table border"1px"><thead><tr><th>ID</th><th>标题</th><th…

九种mfc140u.dll丢失的解决方法,全面解决mfc140u.dll文件丢失

mfc140u.dll是 Microsoft Visual C 2015 Redistributable 的一部分&#xff0c;它与 Microsoft 基础类库&#xff08;MFC&#xff09;的 Unicode 版本有关。当您在运行使用 Visual C 2015 开发的应用程序时&#xff0c;可能会碰到关于mfc140u.dll丢失的错误。下面列出了一些解决…

探索k8s集群的配置资源(secret和configmap)

目录 ConfigMap ConfigMap&#xff08;主要是将配置目录或者文件挂载到k8s里面使用&#xff09; 与Secret类似&#xff0c;区别在于ConfigMap保存的是不需要加密配置的信息。&#xff08;例如&#xff1a;配置文件&#xff09; ConfigMap 功能在 Kubernetes1.2 版本中引入&…

Python深度学习基于Tensorflow(13)目标检测实战

文章目录 RPN 整体代码RPN 具体实现过程数据标注读取标注数据固定图片大小调整目标框使用预训练模型获取 feature_shape定义 RPN 网络生成RPN 的 CLS 和 REG 数据集获取所有的锚点计算锚点与目标框的IOU 定义 RPN loss 和 训练过程 参考资料 这里实现的是二阶段目标检测&#x…