原文公众号链接:https://mp.weixin.qq.com/s/gZx-IIW1g9-Kl7yXw7tsEA

原文公众号链接:https://mp.weixin.qq.com/s/gZx-IIW1g9-Kl7yXw7tsEA

一、ConfigMap

应用部署的最佳实践都趋向于将应用所需要的配置信息和应用程序本身离开,以便实现通过不同的配置实现更灵活的功能。

我们都知道,K8S中运行的是容器,若不将配置文件抽离,每一次配置文件的变动,都需要重新制作镜像,这其实挺麻烦挺没必要的。

在K8S中提供了ConfigMap资源对象作为配置管理的统一管理方案,可以通过环境变量或者文件的方式,在创建容器的时候将配置信息动态注入到容器中~

下文开始对ConfigMap的实战

官网文档:https://kubernetes.io/zh/docs/concepts/configuration/configmap/

1.1、创建

1.1.1、from-file

准备目录和文件

# 创建目录及配置文件
[root@master01 yamls]# ls conf/
nginx.conf redis.conf [root@master01 yamls]# cat conf/nginx.conf
app.name=nginx
location.prefix=/app [root@master01 yamls]# cat conf/redis.conf
ip=10.10.10.101
port=2379

创建cm

[root@master01 yamls]# kubectl create cm -h
# --from-file参数既可以指定文件又可以指定目录
[root@master01 yamls]# kubectl create cm cm-from-file --from-file=conf/
configmap/cm-from-file created

查看

[root@master01 yamls]# kubectl get cm
NAME DATA AGE
cm-from-file 2 38s
kube-root-ca.crt 1 17d [root@master01 yamls]# kubectl get cm cm-from-file -oyaml
apiVersion: v1
data:
# 默认的data的key值就是文件名
# 可以在创建时通过参数 --from-file=abc=nginx.conf的方式将data.key改成abc
nginx.conf: |
app.name=nginx
location.prefix=/app
redis.conf: |
ip=10.10.10.101
port=2379
kind: ConfigMap
metadata:
creationTimestamp: "2022-03-31T00:52:21Z"
name: cm-from-file
namespace: default
resourceVersion: "759788"
uid: 5a41bdbe-66d0-45fa-8a5e-b6f6b005d671
1.1.2、from-env-file

env环境变量的格式为:key=value

指定参数:--from-env-file而不是--from-file

[root@master01 yamls]# kubectl create cm cm-env-file --from-env-file=conf/nginx.conf
configmap/cm-env-file created [root@master01 yamls]# kubectl get cm cm-env-file -oyaml
apiVersion: v1
data:
app.name: nginx
location.prefix: /app
kind: ConfigMap
metadata:
creationTimestamp: "2022-03-31T01:04:12Z"
name: cm-env-file
namespace: default
resourceVersion: "761496"
uid: 8e885d31-0a83-423c-a59f-6ea8b0473103
1.1.3、from-literal

literal(翻译为:字面意义的)直接在命令行上指定好key和value

参数:--from-literal

[root@master01 ~]# kubectl create cm env-from-literal --from-literal=Level=INFO --from-literal=Name=Mac
configmap/env-from-literal created [root@master01 ~]# kubectl get cm env-from-literal -oyaml
apiVersion: v1
data:
Level: INFO
Name: Mac
kind: ConfigMap
metadata:
creationTimestamp: "2022-04-01T00:31:13Z"
name: env-from-literal
namespace: default
resourceVersion: "762641"
uid: da2f8922-8385-46ba-82e9-b0dc197a1eb2
[root@master01 ~]#
1.1.4、基于yaml文件创建
apiVersion: v1
kind: ConfigMap
metadata:
name: game-demo
data:
# 类属性键;每一个键都映射到一个简单的值
player_initial_lives: "3"
ui_properties_file_name: "user-interface.properties" # 类文件键
game.properties: |
enemy.types=aliens,monsters
player.maximum-lives=5
user-interface.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true

1.2、Pod使用ConfigMap

1.2.1、valueFrom

推荐将下面这种kv格式的configMap注入为容器的配置文件

[root@master01 yamls]# kubectl get cm cm-env-file -oyaml
apiVersion: v1
data:
app.name: nginx
location.prefix: /app
kind: ConfigMap
metadata:
creationTimestamp: "2022-03-31T01:04:12Z"
name: cm-env-file
namespace: default
resourceVersion: "761496"
uid: 8e885d31-0a83-423c-a59f-6ea8b0473103

创建dp,并将cm挂在进去

[root@master01 yamls]#  kubectl create deployment dp-test-cm --image=nginx --dry-run=client -oyaml > dp-test-cm.yaml

修改

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: dp-test-cm
name: dp-test-cm
spec:
replicas: 1
selector:
matchLabels:
app: dp-test-cm
template:
metadata:
labels:
app: dp-test-cm
spec:
containers:
- image: nginx
name: nginx
env:
# 直接定义ENV的kv
- name: Level
value: Pro
# 将cm中的指定key的值作为AppName这个环境变量的值
- name: AppName
valueFrom:
configMapKeyRef:
name: cm-env-file
key: app.name

验证:

[root@master01 yamls]# kubectl get po
NAME READY STATUS RESTARTS AGE
dp-test-cm-7c5666c5c4-wnhtk 1/1 Running 0 111s
[root@master01 yamls]# kubectl exec -ti dp-test-cm-7c5666c5c4-wnhtk -- sh
# echo $AppName
nginx
# echo $Level
Pro
1.2.2、envFrom

一次性配置多个环境变量

注意点:如果key不存在,不会影响pod的运用,但是也不会创建这个环境变量

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: dp-test-cm
name: dp-test-cm
spec:
replicas: 1
selector:
matchLabels:
app: dp-test-cm
template:
metadata:
labels:
app: dp-test-cm
spec:
containers:
- image: nginx
name: nginx
# 和env同级,将redis-cm中的所有kv均作为环境变量注入到容器中
envFrom:
- configMapRef:
name: redis-cm
env:
- name: Level
value: Pro
- name: AppName
valueFrom:
configMapKeyRef:
name: cm-env-file
key: app.name

验证:

[root@master01 yamls]# kubectl exec -ti dp-test-cm-6b7d8dc675-wf2vm -- sh
# echo $ip
10.10.10.101
1.2.3、volumeMounts

将基于文件创建的configMap以文件的形式挂在Pod的指定目录中

关键字:volume、volumeMounts

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: dp-test-cm
name: dp-test-cm
spec:
replicas: 1
selector:
matchLabels:
app: dp-test-cm
template:
metadata:
labels:
app: dp-test-cm
spec:
volumes:
- name: brm-config
configMap:
name: cm-from-file
containers:
- image: nginx
name: nginx
volumeMounts:
- name: brm-config
mountPath: "/etc/foo"

验证:可以看到它会将ConfigMap.data中的每一项,都作为一个单独的文件挂载进Pod中。

[root@master01 yamls]# kubectl get cm cm-from-file -oyaml
apiVersion: v1
data:
nginx.conf: |
app.name=nginx
location.prefix=/app
redis.conf: |
ip=10.10.10.101
port=2379
kind: ConfigMap
metadata:
creationTimestamp: "2022-03-31T00:52:21Z"
name: cm-from-file
namespace: default
resourceVersion: "759788"
uid: 5a41bdbe-66d0-45fa-8a5e-b6f6b005d671 [root@master01 yamls]# kubectl exec -ti dp-test-cm-68d77c6c6-4jtqr -- sh
# cd /etc/foo
# ls
nginx.conf redis.conf
# cat nginx.conf
app.name=nginx
location.prefix=/app
1.2.4、自定义文件名称

自定义挂载进Pod容器的文件名关键字:spec.spec.volumes.configMap.items

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: dp-test-cm
name: dp-test-cm
spec:
replicas: 1
selector:
matchLabels:
app: dp-test-cm
template:
metadata:
labels:
app: dp-test-cm
spec:
volumes:
- name: brm-config
configMap:
name: cm-from-file
items:
- key: redis.conf
path: redis.conf.cus
containers:
- image: nginx
name: nginx
volumeMounts:
- name: brm-config
mountPath: "/etc/foo"
1.2.5、控制文件权限

关键字:spec.template.spec.vulumes.configMap.defaultModespec.template.spec.vulumes.configMap.items.mode

用在控制挂载进Pod的文件的权限,---分别对应421(八进制)

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: dp-test-cm
name: dp-test-cm
spec:
replicas: 1
selector:
matchLabels:
app: dp-test-cm
template:
metadata:
labels:
app: dp-test-cm
spec:
volumes:
- name: brm-config
configMap:
name: cm-from-file
items:
- key: redis.conf
path: redis.conf.cus
mode: 0111
defaultMode: 0666
containers:
- image: nginx
name: nginx
volumeMounts:
- name: brm-config
mountPath: "/etc/foo"
1.2.6、子目录-subPath

关键字:subPath

subpath的作用是解决spec.template.spec.containers.volumeMounts.mountPath的挂载覆盖问题

意思就是说,如果mountPath指定的是一个目录,那么k8s会用我们期望挂载进该目录的文件覆盖掉该目录中已存在的文件,从而导致意外的结果。

解决方式如下的subPath,就是将cm 挂载成指定目录+指定文件,覆盖也是对指定目录中的指定文件进行覆盖,也就是下例中:将brm-config这个cm挂载进容器的/etc/foo/nginx.conf文件(覆盖也不会影响其他文件)。

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: dp-test-cm
name: dp-test-cm
spec:
replicas: 1
selector:
matchLabels:
app: dp-test-cm
template:
metadata:
labels:
app: dp-test-cm
spec:
volumes:
- name: brm-config
configMap:
name: cm-from-file
items:
- key: redis.conf
path: redis.conf.cus
mode: 0111
defaultMode: 0666
containers:
- image: nginx
name: nginx
volumeMounts:
- name: brm-config
mountPath: "/etc/foo/nginx.conf"
subPath: "nginx.conf"

这里可以做一个实验,比如在挂在之前先搞一个/etc/foo/1.txt,然后分别用subpath和不用subpath两种方式做挂载,对比/etc/foo/1.txt的是否被覆盖的差异~

1.2.7、热更新

cm中的值被编辑修改后,Pod中对应的挂载文件的值也会保持同步。

特殊情况:

env-fromvalue-from这种以环境变量的形式挂载进pod的cm,无法做到热更新

subPath也无法热更新

1.2.8、不可变的cm

与Kind同级,设置参数immutable=true即可

1.3、限制条件

  • cm收NameSpace限制,只有在同一个NameSpace中的Pod才能引用她
  • cm必须先于使用它的pod前创建
  • 只有被apiserver管理的Pod的才能使用cm,静态pod无法使用cm

二、Secret

Secret主要用户保管私密数据,比如密码、token、ssh keys等信息。这些信息直接放在镜像中一是不方便动态变动,而是数据比较敏感,不安全。

可以通过三种方式使用Secret

  • 通过挂在方式挂在Secret到Pod中使用它
  • 通过

2.1、创建

2.1.1、from-file
# 创建文件
[root@master01 echo -n 'admin' > ./username.txt
[root@master01 echo -n 'qwerqwer123123' > ./password.txt # 查看帮助文档
[root@master01 secret-file]# kubectl create secret --help # 基于file创建secret,使用generic创建出的Secret类型为Opaque
[root@master01 secret-file]# kubectl create secret generic db-user-info --from-file=./username.txt --from-file=./password.txt
secret/db-user-info created

查看

[root@master01 secret-file]# kubectl get secrets db-user-info -oyaml
apiVersion: v1
data:
password.txt: cXdlcnF3ZXIxMjMxMjM=
username.txt: YWRtaW4=
kind: Secret
metadata:
creationTimestamp: "2022-04-05T23:08:11Z"
name: db-user-info
namespace: default
resourceVersion: "837054"
uid: eabe607c-27fc-4611-92c6-fce4cc24f030
type: Opaque

data中的数据经base64加密存储,可直接解密

[root@master01 secret-file]# echo "cXdlcnF3ZXIxMjMxMjM=" | base64  -d
qwerqwer123123
2.1.2、from-literal

基于字面意思上的命令行中指定好key和value创建Secret

[root@master01 secret-file]# kubectl create secret generic secret-from-literal --from-literal=username=admin --from-literal=passsword=123456
secret/secret-from-literal created

查看

[root@master01 secret-file]# kubectl get secrets secret-from-literal -oyaml
apiVersion: v1
data:
passsword: MTIzNDU2
username: YWRtaW4=
kind: Secret
metadata:
creationTimestamp: "2022-04-05T23:19:02Z"
name: secret-from-literal
namespace: default
resourceVersion: "838616"
uid: ebb95a99-8cbf-48fd-a651-60e12cd30110
type: Opaque
2.1.3、基于yaml文件创建
  • 需要将data使用base64提前加密好,必须基于秘文创建
  • 也可以使用stringData基于明文创建secret
apiVersion: v1
kind: Secret
metadata:
name: my-secret-from-yaml
namespace: default
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm

创建

[root@master01 secret-file]# kubectl apply -f secret-user-info.yaml
secret/my-secret-from-yaml created

查看

[root@master01 secret-file]# kubectl get secrets my-secret-from-yaml -o yaml
apiVersion: v1
data:
password: MWYyZDFlMmU2N2Rm
username: YWRtaW4=
kind: Secret
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"password":"MWYyZDFlMmU2NRm","username":"YWRW4="},"kind":"Secret","metadata":{"annotations":{},"name":"my-secret-from-yaml","namespace":"default"},"type":"Opaque"}
creationTimestamp: "2022-04-05T23:28:27Z"
name: my-secret-from-yaml
namespace: default
resourceVersion: "839971"
uid: eb3acb4d-edf2-4ac0-9373-e7a931a1a559
type: Opaque

基于明文创建

使用stringData关键字可以基于明文创建,因为不安全所以不推荐。

apiVersion: v1
kind: Secret
metadata:
name: secret-basic-auth
type: kubernetes.io/basic-auth
stringData:
username: admin # kubernetes.io/basic-auth 类型的必需字段
password: t0p-Secret # kubernetes.io/basic-auth 类型的必需字段
2.1.4、from-env-file

用法和cm的from-env-file类似

[root@master01 secret-file]# cat ./secret-env-file.txt
username=admin
password=123456 [root@master01 secret-file]# kubectl get secrets secret-from-env -oyaml
apiVersion: v1
data:
password: MTIzNDU2
username: YWRtaW4=
kind: Secret
metadata:
creationTimestamp: "2022-04-05T23:39:47Z"
name: secret-from-env
namespace: default
resourceVersion: "841608"
uid: efaf7ad6-2ded-4544-93f8-5efabd2ca449
type: Opaque

2.2、实战

2.2.1、配置阿里云私有仓库密钥

给kubelet配置私有云下载Docker镜像的账号密码

# 查看帮助文档
[root@master01 secret-file]# kubectl create secret docker-registry -h # 将username、password、email修改成自己的
[root@master01 secret-file]# kubectl create secret docker-registry brm-alicloud-docker-secret --docker-username=xxxx --docker-password=xxx --docker-email=xxx@qq.com --docker-server=registry.cn-hangzhou.aliyuncs.com

查看(data中的dockerconfigjson) 同样可以使用base64解码看到一个json串

[root@master01 secret-file]# kubectl get secrets brm-alicloud-docker-secret -oyaml
apiVersion: v1
data:
.dockerconfigjson: eyJhdXRocyI6eyJyZWdpc3RyeS5jbi1oYW5nemhvdS5hbGl5dW5jcy5jb20iOnsidXNlcm5hbWUiOiLmnLHmmIzmraYyMjMzIiwicGFzc3dvcmQiOiJxd2VyMTAxMC4uIiwiZW1haWwiOiI2NDY0NTAzMDhAcXEuY29tIiwiYXV0aCI6IjVweXg1cGlNNXEybU1qSXpNenB4ZDJWeU1UQXhNQzR1In19fQ==
kind: Secret
metadata:
creationTimestamp: "2022-04-06T00:04:17Z"
name: brm-alicloud-docker-secret
namespace: default
resourceVersion: "845134"
uid: 6e7bd04e-621c-4da8-8649-99c0ebffcee9
type: kubernetes.io/dockerconfigjson

挂载,先搞一个模版dp

[root@master01 secret-file]# kubectl create deployment alicloud-private-nginx --image=registry.cn-hangzhou.aliyuncs.com/changwu/nginx:1.7.9-nettools --dry-run=client -oyaml

修改添加imagePullSecrets配置

apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: alicloud-private-nginx
name: alicloud-private-nginx
spec:
replicas: 1
selector:
matchLabels:
app: alicloud-private-nginx
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: alicloud-private-nginx
spec:
imagePullSecrets:
- name: brm-alicloud-docker-secret
containers:
- image: registry.cn-hangzhou.aliyuncs.com/changwu/nginx:1.7.9-nettools
name: nginx
resources: {}
status: {}

验证的话就去 kubectl get pod -owide即可

2.2.2、管理https证书

生成私钥和crt

[root@master01 https]# openssl req -x509 -nodes -days 3650 \
> -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=test.com"
Generating a 2048 bit RSA private key
....................................................................+++
...........+++
writing new private key to 'tls.key'
-----
[root@master01 https]# ls
tls.crt tls.key

将key和cry托管进secret

[root@master01 https]# kubectl create secret tls https-nginx-tls-test-secret -n default --key=tls.key --cert=tls.crt
secret/https-nginx-tls-test-secret created

查看

[root@master01 https]# kubectl get secrets https-nginx-tls-test-secret -oyaml
apiVersion: v1
data:
tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1R1lrWTJRCjN4VUpQV1hVR0lqM2VVYnhTc0hFZ2lyZDlJalBZL1pwZEsxWittbmNHTWMyNW41aVhoUEs1UG1ZcjYrcAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1V3AzbUtRNHJkZG1CZGplMjJpMjR1bU5IUGd2STJBRGlEalAKNXBTb2hRYWRkZVZYRDJFZWdlWFRTTHY3Ci0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K
kind: Secret
metadata:
creationTimestamp: "2022-04-06T00:25:33Z"
name: https-nginx-tls-test-secret
namespace: default
resourceVersion: "848213"
uid: afa127bb-4a3a-4eb9-9d55-8cd50af5b3f4
type: kubernetes.io/tls

配置到ingress中(不是很推荐直接在ingress中配置https,通常会将https配置在ingress的上一层的SLB代理中)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: simple-tls-ingress
spec:
ingressClassName: nginx
rules:
- host: https-test.com # 配置域名,可以不写,匹配*,或者写 *.bar.com
http:
paths: # 相当于nginx的location,同一个host可以配置多个path
- path: /
pathType: Prefix
backend:
service:
name: nginx-svc
port:
number: 80
tls:
- secretName: https-nginx-tls-test-secret

验证

2.2.3、不可变的secret

与Kind同级,设置参数immutable=true即可

系统整理K8S的配置管理实战-建议收藏系列的更多相关文章

  1. Linux 文件搜索神器 find 实战详解,建议收藏!

    大家好,我是肖邦,这是我的第 10 篇原创文章. 在 Linux 系统使用中,作为一个管理员,我希望能查找系统中所有的大小超过 200M 文件,查看近 7 天系统中哪些文件被修改过,找出所有子目录中的 ...

  2. Python 100个样例代码【爆肝整理 建议收藏】

    本教程包括 62 个基础样例,12 个核心样例,26 个习惯用法.如果觉得还不错,欢迎转发.留言. 一. Python 基础 62 例 1 十转二 将十进制转换为二进制: >>> b ...

  3. 解密国内BAT等大厂前端技术体系-携程篇(长文建议收藏)

    1 引言 为了了解当前前端的发展趋势,让我们从国内各大互联网大厂开始,了解他们的最新动态和未来规划.这是解密大厂前端技术体系的第四篇,前三篇已经讲述了阿里.腾讯.百度在前端技术这几年的技术发展. 这一 ...

  4. 解密国内BAT等大厂前端技术体系-腾讯篇(长文建议收藏)

    1 引言 为了了解当前前端的发展趋势,让我们从国内各大互联网大厂开始,了解他们的最新动态和未来规划.这是解密大厂前端技术体系的第三篇,前两篇已经讲述了阿里和百度在前端技术这几年的技术发展.这一篇从腾讯 ...

  5. 解密国内BAT等大厂前端技术体系-美团点评之下篇(长文建议收藏)

    引言 在上篇中,我已经介绍了美团点评的业务情况.大前端的技术体系,其中大前端的技术全景图如下: 上篇重点介绍了工程化和代码质量的部分,工程化涵盖了客户端持续集成平台-MCI.全端监控平台-CAT.移动 ...

  6. 解密国内BAT等大厂前端技术体系-美团点评之上篇(长文建议收藏)

    引言 进入2019年,大前端技术生态似乎进入到了一个相对稳定的环境,React在2013年发布至今已经6年时间了,Vue 1.0在2015年发布,至今也有4年时间了. 整个业界在前端框架不断迭代中,也 ...

  7. 万字超强图文讲解AQS以及ReentrantLock应用(建议收藏)

    | 好看请赞,养成习惯 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it ...

  8. CTF取证方法大汇总,建议收藏!

    站在巨人的肩头才会看见更远的世界,这是一篇来自技术牛人的神总结,运用多年实战经验总结的CTF取证方法,全面细致,通俗易懂,掌握了这个技能定会让你在CTF路上少走很多弯路,不看真的会后悔! 本篇文章大约 ...

  9. (转)python资料汇总(建议收藏)零基础必看

    摘要:没料到在悟空问答的回答大受欢迎,为方便朋友,重新整理汇总,内容包括长期必备.入门教程.练手项目.学习视频. 一.长期必备. 1. StackOverflow,是疑难解答.bug排除必备网站,任何 ...

随机推荐

  1. 从零开始Blazor Server(12)--编辑菜单

    上个星期有点事,导致没法及时更新.现在我们继续更我们的从零开始系列. 这个系列也快要结束了,目前规划再有2-3篇,就结束了. 今天我们来说编辑菜单的问题,说实话菜单这种东西,你不更新代码加个页面,单独 ...

  2. MySQL查询性能优化七种武器之索引下推

    前面已经讲了MySQL的其他查询性能优化方式,没看过可以去了解一下: MySQL查询性能优化七种武器之索引潜水 MySQL查询性能优化七种武器之链路追踪 今天要讲的是MySQL的另一种查询性能优化方式 ...

  3. 新年趣事之红包--"四边形"不等式优化DP

    目录 题目描述 输入 输出 思路 新年趣事之红包 时间限制: 1 Sec  内存限制: 64 MB 题目描述 xiaomengxian一进门,发现外公.外婆.叔叔.阿姨--都坐在客厅里等着他呢.经过仔 ...

  4. Python自学教程8-数据类型有哪些注意事项

    不知不觉,python自学教程已经更新到第八篇了,再有几篇,基本的语法就介绍完了. 今天来总结一下数据类型有哪些需要注意的地方. 元组注意事项 元组是另一种经常使用到的数据类型,看上去和列表差不多.它 ...

  5. 五 工厂方法模式【Factory Method Pattern】 来自CBF4LIFE 的设计模式

    女娲补天的故事大家都听说过吧,今天不说这个,说女娲创造人的故事,可不是"造人"的工作,这个词被现代人滥用了.这个故事是说,女娲在补了天后,下到凡间一看,哇塞,风景太优美了,天空是湛 ...

  6. ubuntu安装BricsCAD

    目录 目录 下载软件包 安装deb软件包 sudo dpkg -i *.deb 将Crack/bricsys.lic中hostid= <YOURHOSTID>替代本机MAC地址(中间不要冒 ...

  7. [AI]-模型测试和评价指标

    模型测试 import cv2 from torchvision import transforms, datasets, models from torch.utils.data import Da ...

  8. Java SE 3、封装

    封装 封装的好处 隐藏实现细节 可以对数据进行验证,保证安全合理 实现步骤 将属性进行私有化private 提供一个公共的(public)set方法,用于对属性判断并赋值 public void se ...

  9. 迁移阿里云上的ECS操作说明

    背景: 1.公司测试服务器快要到期了,但是续费太贵,就想用另一个阿里云账号下的服务器作为测试服务器. 2.测试服务器原在阿里云账号A下,要迁移到阿里云账号B下 3.该测试服务器有一个系统盘和俩数据盘 ...

  10. 延申三大问题中的第一个问题处理---原先shell脚本中启动jar文件命令的配置,附加参数等

    经过一系列的试错,最终采用的解决办法如下: 采用的配置文件 附加的启动参数 或者把这些都给统一添加到ConfigMap中