K8S初级入门系列之四-Namespace/ConfigMap/Secret

news2024/11/27 18:36:53

一、前言

     本章节我们继续学习Namespace、ConfigMap、Secret基础概念,了解他们基本用法和操作。NameSpace为命名空间,在同一集群中试下资源隔离。ConfigMap通过key-value的方式实现明文配置数据的保存,Secret与ConfigMap类似,不过是采用密文方式保存。

二、Namespace(命名空间)

     K8S集群可以通过Namespace创建多个"虚拟的集群",这些虚拟的集群之间可以完成隔离,包括访问权限,资源,支持了多租户特性,这点在实际工程中非常重要,比如对外的产品系统与内部的IT系统虽然都位于同一集群中,但是我们不希望他们之前可以有任何交互,此时就可以使用不同的Namespace进行隔离。

1、Namespace查看

   我们看下目前K8s中有哪些预置的Namespace,使用kubectl get ns指令

[root@k8s-master yaml]# kubectl get ns
NAME                   STATUS   AGE
default                Active   43d
kube-public            Active   43d
kube-system            Active   43d
kubernetes-dashboard   Active   42d

    一般情况下,环境安装完成后,就会有kube-system,default两个命名空间,与集群管理相关的,为整个集群提供服务的pod都放在kube-system,比如etcd,apiserver等。可以使用kubectl get pod -n <namespace>查看该命名空间下的pod列表。

[root@k8s-master yaml]# kubectl get pod -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-6b8c67b6b5-fsp65   1/1     Running   0          42d
calico-node-bwcfh                          1/1     Running   0          42d
calico-node-f976g                          1/1     Running   0          42d
coredns-6d8c4cb4d-9n8jg                    1/1     Running   0          43d
coredns-6d8c4cb4d-kmh4l                    1/1     Running   0          43d
etcd-k8s-master                            1/1     Running   0          43d
kube-apiserver-k8s-master                  1/1     Running   0          43d
kube-controller-manager-k8s-master         1/1     Running   0          43d
kube-proxy-db9dm                           1/1     Running   0          43d
kube-proxy-jqnnq                           1/1     Running   0          42d
kube-scheduler-k8s-master                  1/1     Running   0          43d

       而普通用户创建的pod,如果不指定Namespace,将统一放到default中,比如前一章节创建的busybox-pod就在default命名空间下。

[root@k8s-master yaml]# kubectl get pod -n default
NAME          READY   STATUS    RESTARTS   AGE
busybox-pod   1/1     Running   0          31m

2、Namespace创建

Namespace可以通过命令直接创建,也可以使用yaml文件创建

(1)使用命令创建

命令创建非常简单,指令为kubectl create ns <namespace>,如下例创建dev的命名空间。

[root@k8s-master yaml]# kubectl create ns dev
namespace/dev created
[root@k8s-master yaml]# kubectl get ns
NAME                   STATUS   AGE
default                Active   43d
dev                    Active   9s
kube-public            Active   43d
kube-system            Active   43d
kubernetes-dashboard   Active   42d

(2)使用yaml文件

编辑namespace-demo.yaml,内容如下:

[root@k8s-master yaml]# cat namespace-demo.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: dev

执行该yaml文件,创建dev命名空间。

[root@k8s-master yaml]# kubectl apply -f namespace-demo.yaml 
namespace/dev created
[root@k8s-master yaml]# kubectl get ns
NAME                   STATUS   AGE
default                Active   43d
dev                    Active   8s
kube-public            Active   43d
kube-system            Active   43d
kubernetes-dashboard   Active   42d

(3)使用namespace,创建pod

接下来我们创建一个pod,指定命名空间为dev,编辑ns-pod.yaml文件,其内如如下:

[root@k8s-master yaml]# cat ns-dev-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: ns-pod
  namespace: dev
  labels: 
     app: nginx-pod 
spec:
  containers:
  - name: nginx
    image: nginx:1.8

在metadata中指定namespace为dev,通过yaml文件创建pod,并查看命名空间下的pod列表。

[root@k8s-master yaml]# kubectl apply -f ns-dev-pod.yaml 
pod/ns-pod created
[root@k8s-master yaml]# kubectl get pod -n dev
NAME     READY   STATUS    RESTARTS   AGE
ns-pod   1/1     Running   0          86s

 可以看到pod正确创建,并在dev的命名空间下。

3、Namespace的删除

下面我们将dev的namespace删除

[root@k8s-master yaml]# kubectl delete ns dev
namespace "dev" deleted

该Namespace下的所有Pod也将一并删除。

关于Namspace的对于网络,计算资源的隔离性,我们将后续章节介绍。

三、ConfigMap

      在实际工程中,我们需要将配置数据与代码进行分离,比如说 Nginx 的 nginx.conf、Redis 的 redis.conf、MySQL 的 my.cnf 等等,这些配置文件会根据不同环境配置不同的数据,且在运行过程中,需要做到动态调整,及时更新。

      K8S提供了ConfigMap对象,用来保存配置数据,实现配置和镜像的解耦,便于应用配置的修改。

1、ConfigMap创建

     ConfigMap保存的是多组key-value键值对数据,其创建方式可以有多种,包括使用yaml文件,以及通过命令行创建。

(1)yaml文件

     编辑 data-config.yaml文件,其内容如下:

[root@k8s-master yaml]# cat data-config.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
 name: data-config
data:
 username: 'root'
 pwd: 'qwert'

    这个yaml文件比较简单,前面几个属性,如apiVersion,kind,metadata都比较熟悉了,这里主要介绍下data部分,定义了多组健值对,实现配置数据的定义,比如本例的username和pwd。

    使用命令创建ConfigMap对象。

[root@k8s-master yaml]# kubectl apply -f data-config.yaml 

   创建完成后,查看configMap列表和详情

[root@k8s-master yaml]# kubectl get cm
NAME               DATA   AGE
data-config        2      79m
kube-root-ca.crt   1      49d
[root@k8s-master yaml]# kubectl describe cm data-config
Name:         data-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
pwd:
----
qwert
username:
----
root

BinaryData
====

Events:  <none>

可以看到已创建名为data-config的ConfigName对象。

(2)命名行

      一般使用命令行,最常用的是通过已存在配置文件,直接生成ConfigMap对象。配置文件可以是具体的文件,也可以是配置文件的目录。接下来,我们演示下通过配置文件目录生成ConfigMap对象。

     首先创建config目录,再在该目录下创建username,pwd两个文件,其内容分别是其对应的value值,结果如下:

[root@k8s-master yaml]# cd config
[root@k8s-master config]# ls
pwd  username
[root@k8s-master config]# cat pwd
123456
[root@k8s-master config]# cat username
root

      使用命令根据config目录创建configMap对象。其命令行kubectl create configmap <configmap name> --from-file=< file path>

[root@k8s-master config]# kubectl create configmap file-configmap --from-file=./
configmap/file-configmap created

--from-file表示通过指定的文件或者目录来创建,本例中指定该目录为当前目录,即config。

同样看下创建结果。

[root@k8s-master config]# kubectl get cm
NAME               DATA   AGE
data-config        2      93m
file-configmap     3      71s
kube-root-ca.crt   1      49d
[root@k8s-master config]# kubectl describe cm file-configmap
Name:         file-configmap
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
pwd:
----
123456

username:
----
root


BinaryData
====
.pwd.swp: 159744 bytes

Events:  <none>

      当使用文件创建configMap时,默认情况下,key是文件名,value是文件里的内容。当然也可以使用kubectl create configmap <configmap name> --from-file=<key>=< file path>自定义key值。

2、ConfigMap的使用

     配置数据生成后,需要在容器中挂载并使用,这里也有两种使用方式,一种是环境变量方式,另一种是使用Volume 的方式。

(1)环境变量方式

   创建Pod的yaml文件configmap-env-pod.yaml ,其内容如下:

[root@k8s-master yaml]# cat configmap-env-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
 name: configmap-env-pod
spec:
 containers:
  - name: test-busybox
    image: busybox
    imagePullPolicy: IfNotPresent
    args:
    - sleep
    - "3600"
    env:
    - name: name
      valueFrom:
       configMapKeyRef:
        name: data-config
        key: username
    - name: password
      valueFrom:
       configMapKeyRef:
        name: data-config
        key: pwd

       该Pod配置一个busybox镜像的容器,容器启动了sleep 3600s,以便我们有时间进入容器进行操作。最核心的是env的配置,这里数据来源于前面的配置的data-config对象。这里我们用下面一张图来描述如何关联的。

      env变量的valueFrom使用configMapKeyRef,表明数据来源于configMap,name是指定该configMap的名称,即ConfigMap对象在metadata定义的name值,本例指定的是data-config;key指定使用该configMap的哪条健值,比如本例中,env定义了两个环境变量name和password,其值分别为data-configmap的配置的username以及pwd。

     下面我们创建该Pod,并进入到容器内部,打印出这两个环境变量的值。

[root@k8s-master yaml]# kubectl exec -it configmap-env-pod  sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # echo $name
root
/ # echo $password
qwert

    可以看到其环境变量的值,就是我们之前在data-config配置的。

(2)Volume 的方式

       除了环境变量的方式,还支持Volume的方式,至于Volume的内容我们K8S初级入门系列之九-共享存储会详细介绍,这里可以理解是容器挂载一个存储目录。

同样,我们编辑pod的yaml文件。内如如下;

[root@k8s-master yaml]# cat configmap-volume-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
 name: configmap-volume-pod
spec:
 containers:
  - name: test-busybox
    image: busybox
    imagePullPolicy: IfNotPresent
    args:
    - sleep
    - "3600"
    volumeMounts:
    - name: config-volume
      mountPath: /tmp/config
 volumes:
 - name: config-volume
   configMap:
     name: data-config

用图示的方式描述下之间的关系:

    containers容器的volumeMounts属性,定义一个volume挂载点,并挂载到指定目录mountPath(本例的/tmp/config)。该挂载点内容在Pod的volumes的定义,本例中volumes关联到指定的configMap,其名称为data-config。所以从分析看,容器里会创建/tmp/config目录,且该目录下能查看到data-config配置的内容。

    创建pod,并进入容器查看。

[root@k8s-master yaml]# kubectl exec -it configmap-volume-pod sh 
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # cd /tmp/config
/tmp/config # ls
pwd       username
/tmp/config # cat pwd
qwert
/tmp/config # cat username
root
/tmp/config # 

     可以看到,在/tmp/config目录下生成了两个文件,分别为key值,即pwd,username,其内容对应的value值,与前面的分析保持一致。

     前面讲过,在实际工程中,配置文件是需要实时更新并生效的,我们看下configMap是否支持。修改data-config.yaml文件,将pwd改为"123456",并更新。

[root@k8s-master yaml]# cat data-config.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
 name: data-config
data:
 username: 'root'
 pwd: '123456'
[root@k8s-master yaml]# kubectl apply -f data-config.yaml 
configmap/data-config configured

再进入 容器内容看下是否有更新

[root@k8s-master yaml]# kubectl exec -it configmap-volume-pod sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # cd /tmp/config
/tmp/config # ls
pwd       username
/tmp/config # cat pwd
123456
/tmp/config # 

      看到已经更新,这个延时在秒级,需要注意的是,同步更新仅针对Volume挂载 的方式,而对于环境变量的方式是不生效的。有兴趣的同学可以测试下。

四、Secret

     configMap配置的数据是明文的,但是很多情况下,对于一些敏感数据,我们不希望暴露明文,需要采用加密的方式保存,比如上面例子中的username和pwd。K8S提供了secret对象实现密文配置数据的保存。

     Secret有多种类型,这里我们了解最常用的,也是最简单的Opaque 类型,其实质就是对字符进行base64格式编码。我们使用Opaque 类型介绍Secret的创建和使用方式,它与configMap非常类似。

1、Secret创建

Secret的创建也分为命令行和yaml文件。

(1)命令行方式

    采用kubectl create secret generic <secret name> --from-file=<file path>命令创建基于文件或目录的secret对象。我们还是以前面的config目录下的文件为例

[root@k8s-master yaml]# kubectl create secret generic file-secret --from-file=./config/
secret/file-secret created

再看下该secret对象的详情

[root@k8s-master yaml]# kubectl describe secret file-secret
Name:         file-secret
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
.pwd.swp:  159744 bytes
pwd:       7 bytes
username:  5 bytes

可以看到,详情中看不到实际的值。

(2)yaml文件方式

   采用yaml文件方式,我们需要将value值进行base64编码。

[root@k8s-master yaml]# echo -n 'root' | base64     
cm9vdA==
[root@k8s-master yaml]# echo -n 'qwert' | base64    
cXdlcnQ=

然后将值写入到yaml中,yaml文件内容如下:

[root@k8s-master yaml]# cat data-secret.yaml 
apiVersion: v1
kind: Secret
metadata:
 name: data-secret
data:
 username: cm9vdA==
 pwd: cXdlcnQ=

执行该文件,并查看详情

[root@k8s-master yaml]# kubectl describe secret data-secret 
Name:         data-secret
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
pwd:       6 bytes
username:  4 bytes

2、Secret使用

Secret使用方式与configMap也很类似,分为环境变量和volume挂载两种。

(1)环境变量方式

创建Pod的yaml文件,内容如下:

[root@k8s-master yaml]# cat secret-env-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
 name: secret-env-pod
spec:
 containers:
  - name: test-busybox
    image: busybox
    imagePullPolicy: IfNotPresent
    args:
    - sleep
    - "3600"
    env:
    - name: name
      valueFrom:
       secretKeyRef:
        name: data-secret
        key: username
    - name: password
      valueFrom:
       secretKeyRef:
        name: data-secret
        key: pwd

    可以看到与configMap的结构一致,仅将configMapKeyRef换成secretKeyRef,并将name修改为指定secret对象的name。

   创建该Pod,进入到容器内部查看环境变量

[root@k8s-master yaml]# kubectl exec -it secret-env-pod  sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # echo $name
root
/ # echo $password
qwert

 容器内可以正确的打印出解密后的字符。

(2)volume挂载方式

创建Pod的yaml文件,内容如下:

[root@k8s-master yaml]# cat secret-volume-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
 name: secret-volume-pod
spec:
 containers:
  - name: test-busybox
    image: busybox
    imagePullPolicy: IfNotPresent
    args:
    - sleep
    - "3600"
    volumeMounts:
    - name: config-volume
      mountPath: /tmp/config
 volumes:
 - name: config-volume
   secret:
     secretName: data-secret

     其与configMap的结构也一致,仅volumes的定义指定来源是secret,要主要使用secretName属性指定secret的对象。

    创建pod,并进入容器内部查看

[root@k8s-master yaml]# kubectl exec -it secret-volume-pod sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # cd /tmp/config
/tmp/config # ls
pwd       username
/tmp/config # cat pwd
qwert
/tmp/config # cat username
root
/tmp/config # 

可以看到正确的读取数据了。与configMap一样,其同步更新仅对volume挂载方式有效

五、总结

      本篇主要介绍了Namespace,ConfigMap以及secret的基本用法。

      Namespace可以在K8S集群中创建多个"虚拟集群",集群间实现隔离,本篇主要介绍了Namespace的创建,查看,删除以及如何创建指定Namespace的Pod。

      ConfigMap通过key-value的方式实现明文配置数据的保存,其创建方式包括yaml文件,以及通过命令行使用指定的配置文件或者目录,Pod使用ConfigMap对象也包括两种方式,环境变量方式和volume挂载方式,其中volume挂载方式可实现同步更新。

       Secret和ConfigMap在创建和使用方式上非常类似,区别在于其以密文的方式保存配置数据,一般用于用户名密码,token等敏感数据配置。

 附:

K8S初级入门系列之一-概述

K8S初级入门系列之二-集群搭建

K8S初级入门系列之三-Pod的基本概念和操作

K8S初级入门系列之四-Namespace/ConfigMap/Secret

K8S初级入门系列之五-Pod的高级特性

K8S初级入门系列之六-控制器(RC/RS/Deployment)

K8S初级入门系列之七-控制器(Job/CronJob/Daemonset)

K8S初级入门系列之八-网络

K8S初级入门系列之九-共享存储

K8S初级入门系列之十-控制器(StatefulSet)

K8S初级入门系列之十一-安全

K8S初级入门系列之十二-计算资源管理

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows下使用rocketMq

1、下载&#xff08;下载zip后解压即可&#xff09; 下载地址&#xff1a;下载 | RocketMQ 2、配置环境变量&#xff08;注意&#xff1a;该目录的下一级是bin&#xff09; 3、启动 在bin目录下使用cmd 分别输入 3.1 启动name server (下图是启动成功的显示&#xff0c;窗口…

CPU密集型和IO密集型任务的权衡:如何找到最佳平衡点

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、CPU密集型与IO密集型3.1、CPU密集型3.2、I/O密…

dp算法 力扣978、力扣139、力扣467

目录 一、力扣978978. 最长湍流子数组 - 力扣&#xff08;LeetCode&#xff09; &#xff08;一&#xff09;题目详情 &#xff08;二&#xff09;算法讲解 &#xff08;三&#xff09;代码 二、力扣139139. 单词拆分 - 力扣&#xff08;LeetCode&#xff09; &#xff0…

计网学习笔记 wireless mobile networks

无线局域网的组成 无线网络在近些年来一直是个非常流行的东西。现在的移动用户数量已经大大超过了有线用户数量&#xff0c;比例大于5:1。 实现无线网络的挑战性 从有线到无线是网络构建上一个伟大的设想&#xff0c;挑战性主要集中在wireless和mobility两个点上。 这两个是…

Express 框架的基本操作

目录 1、应用生成器 2、基本路由 2.1、在跟路由下配置 GET请求&#xff0c;返回对应相应内容。 2.2、在跟路由下配置 POST请求&#xff0c;返回对应相应内容。 2.3、在跟路由下配置 PUT请求&#xff0c;返回对应相应内容。 2.4、在根路由下配置DELETE请求&#xff0c;返回对…

【剑指offer】学习计划day4

目录 一. 前言 二.数组中重复的数字 a.题目 b.题解分析 c.AC代码 三.在排序数组中查找数字 I a.题目 b.题解分析 c.AC代码 四.0&#xff5e;n-1中缺失的数字 a.题目 b.题解分析 c.AC代码 一. 前言 本系列是针对Leetcode中剑指offer学习计划的记录与思路讲解。详情查看以下…

学习系统编程No.32【线程互斥实战】

引言&#xff1a; 北京时间&#xff1a;2023/7/19/15:22&#xff0c;昨天更新完博客&#xff0c;和舍友下了一会棋&#xff0c;快乐就是这么简单&#xff0c;哈哈哈&#xff01;总体来说&#xff0c;摆烂程度得到一定的改善&#xff0c;想要达到以前的水准&#xff0c;需要一定…

分布式 - 消息队列Kafka:Kafka分区常见问题总结

文章目录 01. Kafka 的分区是什么&#xff1f;02. Kafka 为什么需要分区&#xff1f;03. Kafka 分区有什么作用&#xff1f;03. Kafka 为什么使用分区的概念而不是直接使用多个主题呢&#xff1f;04. Kafka 分区的数量有什么限制&#xff1f;05. Kafka 分区的副本有什么作用&am…

[内网渗透]XXE-vulnhub

文章目录 [内网渗透]XXE-vulnhub环境安装信息收集解题步骤总结 [内网渗透]XXE-vulnhub 环境安装 首先在 vulnhub 下载文件&#xff1a; 将其解压为ovf格式&#xff1a; 使用vmware打开&#xff0c;新建一个虚拟机&#xff0c;然后开机&#xff0c;环境就搭好了 信息收集 由于…

【仿写spring】一、通过反射读取带有@RequestMapping与@Controller注解的类并模拟请求路径调用方法

目录 简介思路实践一、自定义注解RequestMapping&#xff0c;Controller二、路径转全限定名方法三、扫描文件夹四、通过反射来寻找有RequestMapping以及Controller的类五、获取对象实例六、通过invoke调用方法 文件结构以及测试结果1、文件结构2、TestController3、测试结果 简…

uniapp 条件编译失败,跑不起来

因为这行代码整个uniapp都跑不起来&#xff0c;谁懂救命。再说uniapp的异常提示也太反人类了<!-- <image :src"require(/ baseListItem.url)" /> -->

Linux进程控制(三)---进程替换+简易shell的实现

目录 execl() execv() execlp() execvp() 如何利用execl执行自己写的C/C可执行程序&#xff1f; 如何利用makefile同时编译两个文件 execle() execvpe() 简单shell的编写 什么是进程替换&#xff1f; 我们之前fork之后&#xff0c;是父子进程各自执行代码的一部分&am…

【人工智能】大模型平台新贵——文心千帆

个人主页&#xff1a;【&#x1f60a;个人主页】 &#x1f31e;热爱编程&#xff0c;热爱生活&#x1f31e; 文章目录 前言大模型平台文心千帆发布会推理能力模型微调 作用 前言 在不久的之前我们曾讨论过在ChatGPT爆火的大环境下&#xff0c;百度推出的“中国版ChatGPT”—文…

深度神经网络基础——深度学习神经网络基础 Tensorflow在深度学习的应用

目录 一、二、Tesnsflow入门 & 环境配置 & 认识Tensorflow三、线程与队列与IO操作神经网络基础知识1.简单神经网络2.卷积神经网络卷积层新的激活函数-Relu池化层(Pooling)计算 案例&#xff1a;Mnist手写数字图片识别卷积网络案例 一、二、Tesnsflow入门 & 环境配置…

IDEA无法链接代理The driver has not received any packets from the server.

问题如下: 1、本地部署Proxifier,且设置全局代理,截图如下 代理工具 2、通过Navicat 工具连接该远程数据库,连接正常,截图如下 3、通过IDEA或者Eclipse连接(通过代理),抛连接失败(数据库地址绝对无误),如果把数据库地址改成本地的mysql地址,可以正常连接(不用通过代理)…

mac使用mvn下载node-sass 会Binary download failed, trying source

m1 上使用nvm 以下node的版本可以直接下载&#xff08;Binary download&#xff0c;而不是 trying source&#xff09;而不用切换mac cpu架构 zhiwenwenzhiwenwendeMBP cockpit % nvm install 14.15.5 Downloading and installing node v14.15.5... Downloading https://node…

二十五章:TransUNet:Transformer为医学图像分割提供强大的编码器

0.摘要 医学图像分割是发展医疗系统的重要先决条件&#xff0c;特别是对于疾病诊断和治疗计划。在各种医学图像分割任务中&#xff0c;U型架构&#xff0c;也称为U-Net&#xff0c;已成为事实上的标准&#xff0c;并取得了巨大的成功。然而&#xff0c;由于卷积操作的固有局部性…

Zabbix监控linux主机(agent端)

目录 一、Linux-clinet操作&#xff08;agent&#xff09; 二、源码安装zabbix 三、Zabbix添加linux主机 为agent.zabbix.com添加模板 等待一会 查看效果如下 一、Linux-clinet操作&#xff08;agent&#xff09; [rootlocalhost ~]# ifconfig ens33[rootlocalhost ~]# vim…

免费的游戏图标素材库分享

游戏图标设计在游戏UI中占有非常重要的地位。例如&#xff0c;当我们看到一个游戏的启动图标时&#xff0c;很容易区分它是哪个游戏。设计游戏图标不仅是一个图形&#xff0c;也是一个标志。 本文将通过各种游戏图标设计素材分享游戏图标的类别和设计游戏图标的思考。 1. 游戏…

程序员基础知识—IP地址

文章目录 一、什么是IP地址二、IP地址的分类三、子网掩码 一、什么是IP地址 IP地址就像我们需要打电话时的电话号码一样&#xff0c;它用来标识网络中的一台主机&#xff0c;每台主机至少有一个IP地址&#xff0c;而且这个IP地址是全网唯一的。IP地址由网路号和主机号两部分组…