2025-2-18 面试2025-0218

pod的request和limit的关系 以及他们在node节点上的pod被驱逐时的优先级 #

在 Kubernetes 中,requestlimit 是资源调度的关键参数,分别表示容器资源的最小需求和最大使用限制。它们的关系和在节点上的 Pod 被驱逐时的优先级可以分为以下几个方面:

1. requestlimit 的关系 #

  • request
    • request 是容器启动时所需的资源量。Kubernetes 调度器根据 request 来选择合适的节点调度 Pod。当你设置了 request,Kubernetes 确保该容器至少能使用这么多资源。若没有足够的资源,Pod 将无法被调度到该节点。
    • 它反映了容器的“需求量”,用于确定调度时是否能找到一个合适的节点。
  • limit
    • limit 是容器可以使用的最大资源量。容器在运行时使用的资源如果超过 limit,Kubernetes 会根据策略(如 OOM Killer)限制容器的资源使用。
    • 它是对容器资源使用的“上限”,防止容器占用过多的资源,影响同一节点上的其他容器。
  • requestlimit 的差异
    • request 用于调度,而 limit 用于资源使用控制。理想情况下,request 应该小于或等于 limit,否则会造成资源浪费或调度错误。
    • 例如:如果 request 设置为 512Mi,而 limit 设置为 1Gi,Pod 将被调度到有足够 512Mi 内存的节点,但在节点上运行时,该容器最多可使用 1Gi 内存。

2. Node 节点上 Pod 被驱逐时的优先级 #

当 Kubernetes 节点资源不足时(如内存或 CPU),Pod 可能会被驱逐。Pod 驱逐的决策基于以下几个因素:

  • 内存压力(OutOfMemory)

    • 当节点的内存资源不足时,Kubernetes 会优先驱逐使用了大量内存的容器。特别是那些内存使用超过了 limit 或发生了 OOM(Out of Memory)情况的容器。
  • 优先级和 QoS 类别

    • Kubernetes 使用 QoS(Quality of Service)来确定 Pod 的资源优先级,分为三类:

      1. Guaranteed(保证)

        • 如果容器的 requestlimit 相同(例如 cpu: 500mmem: 1Gi),则 Pod 被视为 Guaranteed 类型。这类 Pod 在资源争抢时优先不被驱逐。
      2. Burstable(可突发)

        • 如果容器的 request 小于 limit,则 Pod 被视为 Burstable 类型。这类 Pod 可以在节点资源空闲时使用更多资源,但在资源紧张时,优先级低于 Guaranteed 类型 Pod。
      3. BestEffort(最佳努力)

        • 如果容器既没有设置 request 也没有设置 limit(或者 requestlimit 都设置为 0),则 Pod 被视为 BestEffort 类型。这类 Pod 在资源紧张时最容易被驱逐。
  • 驱逐优先级

    • BestEffort Pod 会被最优先驱逐,因为它没有任何资源保障。
    • 其次是 Burstable Pod,这类 Pod 的 request 小于 limit,有弹性,但是在资源紧张时,可能会被驱逐。
    • 最不容易被驱逐的是 Guaranteed Pod,因为它们在内存和 CPU 资源上都有严格的保障。

3. 驱逐顺序的总结#

  • Guaranteed > Burstable > BestEffort
  • 在节点资源紧张时,Kubernetes 会根据 QoS 类别、Pod 的资源请求和限制,来决定哪个 Pod 应该被驱逐。

4. 驱逐决策的影响因素 #

  • 节点资源压力:当节点的资源(如 CPU、内存)出现压力时,Kubernetes 会根据 requestlimit 的设置,评估哪些 Pod 占用了过多的资源,哪些应该优先驱逐。
  • Pod 的资源使用情况:如果容器的实际使用超过了 limit,可能会触发驱逐。
  • NodeEviction 和 PodDisruptionBudgets:这些设置也会影响驱逐决策,允许设置一些控制规则来防止关键 Pod 被驱逐。

通过合理配置 Pod 的 requestlimit,以及根据实际业务需求和 QoS 类别选择合适的策略,可以帮助提高系统的资源利用率,避免不必要的资源浪费和容器被驱逐的情况。

禁止某个用户登陆 修改哪个配置参数 #

在 Linux 系统中,如果你想禁止某个用户登录,可以通过修改以下配置来实现:

1. 修改 /etc/passwd 文件 #

  • 你可以通过将该用户的 shell 设置为 nologin,来禁止用户登录。

  • 打开 /etc/passwd 文件:

    sudo vi /etc/passwd
    
  • 找到该用户的条目,并将其登录 shell 修改为 /sbin/nologin/bin/false。例如,如果你要禁用 username 用户,修改如下:

    username:x:1001:1001:,,,:/home/username:/sbin/nologin
    
  • 这样,username 用户就不能登录系统了。

2. 使用 usermod 命令 #

  • 你可以使用 usermod 命令直接设置该用户的 shell 为 nologin,也可以使用 false 作为 shell。

  • 禁止用户登录:

    sudo usermod -s /sbin/nologin username
    

3. 使用 passwd 命令锁定用户账户 #

  • 另一种常见的方法是使用 passwd 命令锁定用户账户,这会禁用该用户的密码,从而阻止其通过密码登录。

  • 锁定用户账户:

    sudo passwd -l username
    
  • 该命令会在 /etc/shadow 文件中添加一个 “!",禁止该用户登录系统。

4. 禁用 SSH 登录 #

如果你特别想禁止用户通过 SSH 登录,可以修改 SSH 配置文件 /etc/ssh/sshd_config

  • 打开 SSH 配置文件:

    sudo vi /etc/ssh/sshd_config
    
  • 在文件中添加或修改以下行,禁止该用户通过 SSH 登录:

    DenyUsers username
    
  • 保存并退出后,重启 SSH 服务:

    sudo systemctl restart sshd
    

5. 暂时禁用用户 #

如果你只是想暂时禁用该用户,而不修改任何配置文件,可以使用以下命令禁用该用户的账户:

sudo usermod -L username

以上方法都可以有效地禁止某个用户登录,具体使用哪种方法可以根据你的需求来选择。

统计某个日志文件的error的次数 #

你可以使用 grep 命令来统计日志文件中 “error” 出现的次数。具体方法如下:

1. 简单统计出现次数 #

使用 grep 命令并结合 -c 选项,可以直接统计包含 “error” 的行数:

grep -ic "error" /path/to/logfile
  • -i:忽略大小写(不区分大小写,“error” 和 “Error” 都会被匹配)。
  • -c:只输出匹配到的行数。

这条命令会输出文件中包含 “error”(忽略大小写)的行数。

2. 统计精确的 “error” 词出现次数 #

如果你想统计日志中精确出现 “error” 这个词的次数,而不仅仅是行数,可以使用 grep-o 选项:

grep -io "error" /path/to/logfile | wc -l
  • -o:每次匹配都会输出匹配到的内容(每次出现 “error” 都会被输出)。
  • wc -l:计算输出的行数,即 “error” 出现的次数。

3. 匹配 “error” 或类似的单词 #

如果你想匹配更广泛的错误信息(例如 “Error”、“ERROR” 或 “error”),并且考虑到日志中的一些大小写不同,可以使用正则表达式来进行匹配:

grep -iE "error|fail|exception" /path/to/logfile | wc -l

这会统计包含 “error”、“fail” 或 “exception” 这些单词的行数。

这些方法都可以帮助你快速统计日志文件中 “error” 出现的次数,或者根据不同的需求调整匹配模式。

怎么知道 / 目录下 哪个目录占用的最多的空间? #

你可以使用 du(disk usage)命令来查看 / 目录下各个子目录占用的磁盘空间,并找出占用最多空间的目录。具体的步骤如下:

1. 查看每个子目录的空间使用情况 #

使用 du 命令配合 -h(以人类可读的格式显示,自动选择合适的单位如 KB、MB、GB 等)和 -d(指定递归的深度)选项来查看 / 目录下各个子目录的磁盘使用情况:

sudo du -h --max-depth=1 /
  • -h:以易读的方式显示磁盘使用量(如 KB、MB、GB)。
  • --max-depth=1:只列出 / 目录下一级子目录的空间使用情况,不会递归显示子目录内部的目录。

这会列出 / 目录下每个直接子目录(如 /bin/home/var 等)占用的空间大小。

2. 排序并查看最大占用空间的目录 #

如果你希望查看哪个子目录占用空间最多,可以结合 sort 命令按空间大小排序:

sudo du -h --max-depth=1 / | sort -rh | head -n 10
  • sort -rh:根据磁盘使用量排序,-r 表示逆序(从大到小),-hsort 能够根据文件大小的单位(如 KB、MB、GB)正确排序。
  • head -n 10:只显示排名前10的目录。

3. 查看更深层次的目录使用情况 #

如果你希望查看某个子目录内部的具体磁盘使用情况(例如,深入 /var 目录查看哪些子目录占用空间最多),可以递归更深一级:

sudo du -h /var --max-depth=2 | sort -rh | head -n 10

4. 查看某个目录的详细空间使用情况 #

如果你想查看某个特定目录下所有文件和子目录的空间占用情况,可以直接运行 du

sudo du -ah /path/to/directory | sort -rh | head -n 20

这些方法可以帮助你快速找出哪个目录或子目录占用了最多的磁盘空间。

查找大文件 find #

要使用 find 命令查找大文件,可以通过设置文件大小的条件来过滤出符合要求的文件。以下是一些常用的查找大文件的 find 命令示例:

1. 查找大于 1GB 的文件 #

使用 -size 参数可以指定文件大小,单位可以是 b(字节)、k(千字节)、M(兆字节)、G(吉字节)等。

查找大于 1GB 的文件:

find /path/to/directory -type f -size +1G

解释:

  • /path/to/directory:指定你要搜索的目录,根目录 / 表示整个系统。
  • -type f:仅查找文件。
  • -size +1G:查找大于 1GB 的文件(+ 表示大于,G 表示以 GB 为单位)。

2. 查找大于 100MB 的文件 #

查找大于 100MB 的文件:

find /path/to/directory -type f -size +100M

3. 查找大于 500KB 的文件 #

查找大于 500KB 的文件:

find /path/to/directory -type f -size +500k

4. 查找大于 1GB 并按大小排序输出 #

查找大于 1GB 的文件,并按大小排序输出:

find /path/to/directory -type f -size +1G -exec ls -lh {} \; | sort -k 5 -rh

解释:

  • -exec ls -lh {} \;:对找到的每个文件执行 ls -lh,以便显示文件的详细信息。
  • sort -k 5 -rh:根据 ls 输出的第五列(即文件大小)进行逆序排序。

5. 查找大文件并显示文件路径及大小 #

如果你只想查看文件路径和大小,可以用 -exec 执行 du -sh 来显示:

find /path/to/directory -type f -size +1G -exec du -sh {} \;

这将显示每个文件的大小(以人类可读的格式)及其路径。

6. 查找大文件并显示路径 #

如果你只关心文件的路径,可以直接输出文件路径:

find /path/to/directory -type f -size +1G -print

通过这些命令,你可以方便地在指定目录下查找大文件,帮助你分析磁盘空间的使用情况。

-exec 啥意思 #

-execfind 命令的一个选项,用来对找到的每个文件执行一个指定的命令。-exec 后面跟着的命令会对 find 查找到的每个文件或目录执行一次。

基本语法: #

find <路径> <查找条件> -exec <命令> {} \;

解释: #

  • <路径>:你希望搜索的目录路径(例如 /path/to/directory/ 等)。
  • <查找条件>:你用来限制查找条件的参数(例如 -type f 查找文件,-name "*.log" 查找所有 .log 文件等)。
  • -exec <命令>:对于每个找到的文件,执行指定的命令。
  • {}:是一个占位符,代表 find 查找到的每个文件或目录的路径。每个找到的文件路径会替换 {}
  • \;:表示命令的结束,-exec 后的命令必须以 \; 结束。

示例: #

  1. 列出每个找到文件的详细信息: 查找 /path/to/directory 中的所有 .log 文件,并使用 ls -l 列出文件的详细信息:

    find /path/to/directory -type f -name "*.log" -exec ls -l {} \;
    
    • ls -l {} 会对每个 .log 文件执行,{} 会被替换为文件的路径。
  2. 显示每个文件的大小: 查找 /path/to/directory 中的大于 1GB 的文件,并使用 du -sh 显示文件的大小:

    find /path/to/directory -type f -size +1G -exec du -sh {} \;
    
    • du -sh {} 对每个找到的文件执行,显示文件的大小。
  3. 删除找到的文件: 查找并删除 /path/to/directory 下所有 .bak 文件:

    find /path/to/directory -type f -name "*.bak" -exec rm -f {} \;
    
    • rm -f {} 会删除每个 .bak 文件。

注意: #

  • \; 需要转义,因为 ; 是一个特殊字符,转义后它就被传递给 find 命令,表示命令的结束。如果不转义,会被 shell 误解。

  • 如果希望在

    -exec
    

    执行时一次性处理多个文件,可以使用

    +
    

    来替代

    \;
    

    ,这样会将多个文件作为参数传递给命令(比

    \;
    

    效率更高):

    find /path/to/directory -type f -size +1G -exec du -sh {} +
    

这样,-exec 提供了灵活的方式来对查找到的文件进行处理。

k8s的探针有哪些 有啥作用 怎么用 #

Kubernetes 的探针(Probes)是用于检测容器健康状态的机制,帮助集群管理器(Kubernetes)判断容器是否正常工作,并采取相应的动作(如重启容器或不调度容器)。Kubernetes 提供了三种类型的探针:

1. Liveness Probe(存活探针) #

  • 作用:检查容器是否仍在正常运行。如果存活探针失败,Kubernetes 会认为容器已经进入了不健康状态,然后重启容器。适用于容器在启动后可能出现的问题,比如应用死锁、无限循环等。
  • 使用场景:应用启动完成后长时间无响应,可能需要重启容器以恢复正常。

示例

livenessProbe:
  httpGet:
    path: /healthz
    port: 8080
  initialDelaySeconds: 3
  periodSeconds: 5

解释:

  • httpGet:通过 HTTP GET 请求检查容器状态。
  • pathport:指定检查路径和端口。
  • initialDelaySeconds:在容器启动后,延迟多少秒再开始探测。
  • periodSeconds:每隔多少秒执行一次探测。

2. Readiness Probe(就绪探针) #

  • 作用:检查容器是否已经准备好接受流量。如果就绪探针失败,Kubernetes 会停止将流量路由到这个容器。就绪探针失败时不会重启容器,仅仅是停止流量的转发。
  • 使用场景:应用启动时需要加载大量数据,或者依赖外部服务(如数据库)。容器可以在准备好之前处于“未就绪”状态,避免收到请求导致错误。

示例

readinessProbe:
  httpGet:
    path: /readiness
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 5

解释:

  • httpGet:通过 HTTP GET 请求检查容器是否准备好。
  • initialDelaySeconds:延迟多少秒后开始检查容器是否准备好。
  • periodSeconds:每隔多少秒检查一次容器的就绪状态。

3. Startup Probe(启动探针) #

  • 作用:启动探针用于标识应用程序何时完全启动。它和就绪探针的区别在于,它只在容器启动期间使用,如果启动探针失败,容器将会被重启。启动探针比就绪探针更适合用于检测长时间启动的应用。
  • 使用场景:一些应用在启动时需要较长时间,例如初始化大量数据或者连接外部资源。可以通过启动探针来告诉 Kubernetes 延迟执行健康检查,避免不必要的重启。

示例

startupProbe:
  httpGet:
    path: /startup
    port: 8080
  failureThreshold: 30
  periodSeconds: 10

解释:

  • httpGet:通过 HTTP GET 请求检查容器启动状态。
  • failureThreshold:在启动探针失败多少次后,容器才会被重启。
  • periodSeconds:每隔多少秒进行一次检查。

各探针之间的关系: #

  • Liveness Probe:主要用于检测容器是否健康。如果失败,容器会被杀死并重启。
  • Readiness Probe:主要用于检测容器是否准备好接收流量。如果失败,Kubernetes 会停止将流量发送到该容器。
  • Startup Probe:专门用于应用启动期间的健康检查。如果容器启动较慢,启动探针可以防止过早的健康检查失败。

使用探针的最佳实践: #

  1. 合理配置延迟和周期:在容器刚启动时,避免探针立即进行检查,使用 initialDelaySecondsperiodSeconds 来配置合理的延迟和周期。
  2. 设置适当的失败阈值failureThreshold 控制容器失败后重启的次数,可以根据实际情况调整,避免频繁重启。
  3. 分开使用不同类型的探针:例如,启动探针用于处理长时间启动的应用,而就绪探针用于检测应用是否准备好接收流量。
  4. 使用外部资源检查:对于依赖外部服务(如数据库、缓存等)的应用,可以通过探针检查这些依赖是否可用。

例子:一个完整的 pod 配置 #

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: my-app-container
    image: my-app-image
    ports:
    - containerPort: 8080
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
    readinessProbe:
      httpGet:
        path: /readiness
        port: 8080
      initialDelaySeconds: 3
      periodSeconds: 5
    startupProbe:
      httpGet:
        path: /startup
        port: 8080
      failureThreshold: 30
      periodSeconds: 10

这个示例中:

  • Liveness Probe:容器每 10 秒检查一次 /healthz 路径,初始延迟 5 秒。
  • Readiness Probe:容器每 5 秒检查一次 /readiness 路径,初始延迟 3 秒。
  • Startup Probe:容器每 10 秒检查一次 /startup 路径,失败 30 次后才会重启。

通过合理配置探针,可以显著提升系统的可靠性和稳定性。

pod deploy ingress servie的概念 #

在 Kubernetes 中,PodDeploymentIngressService 都是核心的资源对象,它们各自有不同的功能和目的。我们来逐个解释这些概念。

1. Pod #

  • 定义:Pod 是 Kubernetes 中的最小部署单位,它可以包含一个或多个容器。容器共享同一个网络命名空间、存储卷以及其他资源,因此它们可以轻松地互相通信。
  • 作用:Pod 是运行应用程序容器的地方,确保容器在同一个物理或虚拟机上运行,并且能够共享资源和网络。
  • 示例:当你创建一个 Pod 时,它可以包含一个 Web 服务容器和一个 Redis 容器,两个容器在同一个 Pod 内,可以通过 localhost 相互访问。
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: nginx
    image: nginx:latest
  - name: redis
    image: redis:latest

2. Deployment #

  • 定义:Deployment 是 Kubernetes 中用于管理和部署 Pod 的资源对象。它定义了如何部署 Pod 的副本,并确保一定数量的 Pod 实例在集群中始终处于运行状态。Deployment 可以自动管理 Pod 的滚动更新和回滚。
  • 作用:Deployment 用于自动化 Pod 的部署、扩展和更新。当你需要在 Kubernetes 中管理一个应用的多个副本,并确保它们始终健康运行时,使用 Deployment 是很合适的。
  • 示例:一个简单的 Deployment,管理 3 个 Nginx 容器副本。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest

3. Service #

  • 定义:Service 是 Kubernetes 中一种抽象,它为一组运行中的 Pod 提供一个稳定的网络访问入口。Pod 在生命周期内的 IP 地址是动态的,因此需要通过 Service 来提供一个统一的访问点。
  • 作用:Service 解决了 Pod 间通信问题,并为外部访问提供稳定的 IP 或 DNS 名称。Kubernetes 支持不同类型的 Service,常见的有 ClusterIP(默认,集群内部访问)、NodePort(外部访问通过节点的端口)、LoadBalancer(外部访问通过云提供商的负载均衡器)、ExternalName(将 Service 映射为外部服务)。
  • 示例:创建一个 Service 来暴露 Deployment 中的 Nginx Pod。
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP

这个 Service 会把 80 端口的流量路由到所有具有标签 app: nginx 的 Pod 上。这里的 ClusterIP 类型表示该 Service 仅在集群内部可访问。

4. Ingress #

  • 定义:Ingress 是 Kubernetes 中用于管理外部 HTTP 和 HTTPS 访问的资源对象。它定义了如何将外部请求路由到集群内的 Service。Ingress 控制器是实现 Ingress 资源的实际组件,它通常是基于反向代理或负载均衡器(如 Nginx、Traefik)来工作的。
  • 作用:Ingress 使得你可以通过一个单一的公共 IP 地址或 DNS 名称暴露多个服务,进行 URL 路由,支持 SSL/TLS 加密等功能。
  • 示例:创建一个 Ingress,指定 HTTP 请求如何路由到不同的 Service。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /nginx
        pathType: Prefix
        backend:
          service:
            name: nginx-service
            port:
              number: 80

这个 Ingress 会将访问 http://example.com/nginx 的请求路由到名为 nginx-service 的 Service 上。

总结: #

  • Pod:Kubernetes 中的最小单位,包含一个或多个容器,负责实际运行应用。
  • Deployment:管理 Pod 的创建、更新、滚动升级等。
  • Service:为一组 Pod 提供稳定的访问入口,确保 Pod 的通信。
  • Ingress:管理 HTTP(S) 请求,允许外部流量通过指定的规则路由到不同的 Service。

这些资源协同工作,帮助 Kubernetes 提供高效、可靠、可扩展的应用部署和管理。在开发和部署多层应用时,这些组件组合使用,可以确保应用在 Kubernetes 集群中的稳定运行,并使得外部流量可以通过指定的方式访问内部应用。

#

虚拟化技术有哪些 #

虚拟化技术是一种通过软件来模拟硬件资源,使得多个操作系统或应用程序能够共享同一台物理机器的技术。虚拟化可以在硬件、操作系统、存储和网络等多个层面进行,它极大地提高了资源的利用率,提升了管理和扩展的灵活性。以下是几种常见的虚拟化技术:

1. 硬件虚拟化(Server Virtualization) #

  • 定义:硬件虚拟化使得在一台物理服务器上运行多个虚拟机(VM)。每个虚拟机有自己的操作系统、应用程序和虚拟硬件。

  • 技术:基于虚拟机监控器(Hypervisor)实现,通常分为两类:

    • 类型 1(裸机虚拟化)

      :直接运行在物理硬件上,无需操作系统支持。常见的有:

      • VMware ESXi
      • Microsoft Hyper-V
      • Xen
      • KVM (基于 Linux 的虚拟化技术)
    • 类型 2(托管虚拟化)

      :运行在宿主操作系统之上,通过宿主操作系统提供的接口来管理虚拟机。常见的有:

      • VMware Workstation
      • Oracle VirtualBox
      • Parallels Desktop
  • 优点:实现了物理资源的隔离和管理,能够在同一台物理服务器上运行多个操作系统,充分利用硬件资源。

2. 操作系统级虚拟化(OS-level Virtualization) #

  • 定义:操作系统级虚拟化与硬件虚拟化的不同之处在于,它不模拟硬件,而是通过操作系统的内核将系统划分为多个容器,每个容器都运行独立的应用程序和服务。
  • 技术
    • Docker:基于 Linux 内核的容器化技术,通过 cgroups 和 namespaces 提供进程隔离,实现应用层的虚拟化。
    • LXC(Linux Containers):提供一种轻量级的容器化技术,允许在同一个主机上运行多个隔离的 Linux 环境。
    • OpenVZ:类似于 LXC,但 OpenVZ 提供更为严格的资源管理和隔离。
  • 优点:相较于硬件虚拟化,容器启动更快、资源消耗更少,适合微服务架构和云原生应用。

3. 网络虚拟化(Network Virtualization) #

  • 定义:通过虚拟化技术来抽象和管理物理网络资源,使网络流量在虚拟网络中进行转发和隔离,能够实现灵活的网络管理和资源分配。
  • 技术
    • SDN(软件定义网络):通过集中式控制器管理网络流量,实现网络虚拟化。
    • NFV(网络功能虚拟化):将传统的网络功能(如防火墙、路由器等)通过虚拟化技术转化为软件形式,以便运行在通用硬件上。
    • VXLAN(Virtual Extensible LAN):一种网络虚拟化技术,通常用于在不同数据中心之间创建虚拟局域网。
  • 优点:提高了网络的灵活性和可扩展性,能够根据需求动态调整网络配置。

4. 存储虚拟化(Storage Virtualization) #

  • 定义:存储虚拟化将多个物理存储设备抽象为一个统一的虚拟存储池,简化存储管理并提高资源利用率。
  • 技术
    • SAN(Storage Area Network):通过高速网络将存储设备连接起来,形成一个独立的存储网络。
    • NAS(Network-Attached Storage):通过网络协议(如 NFS 或 SMB)将存储设备连接到网络,提供文件级存储服务。
    • 虚拟化存储设备:如 VMware vSAN,可以将物理存储设备整合成一个统一的虚拟存储池,简化存储管理。
  • 优点:简化存储管理,提高存储资源的利用率,支持更灵活的数据访问和灾难恢复。

5. 桌面虚拟化(Desktop Virtualization) #

  • 定义:通过虚拟化技术将桌面操作系统(如 Windows)运行在数据中心或云环境中,用户通过终端访问虚拟桌面。
  • 技术
    • VDI(Virtual Desktop Infrastructure):将桌面操作系统虚拟化,并集中管理,用户可以通过终端访问虚拟桌面。
    • RDS(Remote Desktop Services):通过 Windows 服务器为多个用户提供远程桌面会话。
    • Citrix XenDesktopVMware Horizon:企业级桌面虚拟化解决方案。
  • 优点:集中管理桌面,提高安全性和可维护性,支持远程访问,减少物理硬件需求。

6. 应用虚拟化(Application Virtualization) #

  • 定义:通过虚拟化技术,将应用程序的运行环境与操作系统解耦,使得应用可以在没有安装的情况下运行。
  • 技术
    • Microsoft App-V:允许应用程序在虚拟环境中运行,不依赖于本地操作系统的安装。
    • VMware ThinApp:将应用程序打包成独立的可执行文件,用户无需安装即可运行。
  • 优点:减少应用程序冲突,简化部署,提升管理效率。

7. GPU 虚拟化 #

  • 定义:通过虚拟化技术将物理 GPU 资源分配给多个虚拟机,使得每个虚拟机都能像物理机一样使用 GPU 加速。
  • 技术
    • NVIDIA vGPU:允许多个虚拟机共享一块物理 GPU,实现高效的图形和计算加速。
    • AMD MxGPU:AMD 的 GPU 虚拟化技术,支持多用户共享 GPU 资源。
  • 优点:可以为图形密集型应用提供虚拟化支持,例如虚拟桌面、科学计算、深度学习等领域。

总结: #

虚拟化技术涵盖了从硬件、操作系统、存储到网络和应用程序的多个层面,不同的虚拟化技术根据应用场景和需求具有各自的优势。通过虚拟化技术,企业可以实现资源的高效利用,提升灵活性,降低成本,同时简化管理和维护。

容器化技术有哪些 #

容器化技术是将应用及其所有依赖打包到一个容器中,使得应用可以在任何环境中一致地运行,而不依赖于宿主操作系统的配置。这种技术广泛应用于微服务架构、云计算及持续集成/持续交付(CI/CD)等场景。以下是一些常见的容器化技术:

1. Docker #

  • 概述:Docker 是最广泛使用的容器化技术之一,它通过将应用和其所有依赖项打包成镜像,提供了一种轻量级的虚拟化方式。Docker 容器可以在任何支持 Docker 的平台上运行。

  • 功能

    • 轻量级:容器共享宿主操作系统的内核,因此比虚拟机占用更少的资源。
    • 可移植性:容器内的应用可以在不同的环境中保持一致的行为。
    • Docker Hub:官方的公共镜像仓库,包含大量的开源镜像。
  • 相关工具

    • Docker Compose:用于定义和管理多容器应用,帮助开发者在本地快速搭建服务。
    • Docker Swarm:Docker 的原生集群管理工具,用于容器的自动调度和负载均衡。

2. Kubernetes (K8s) #

  • 概述:Kubernetes 是一个开源的容器编排平台,用于自动化容器的部署、扩展和管理。它最初由 Google 开发,现在由 CNCF(Cloud Native Computing Foundation)维护。

  • 功能

    • 自动化部署:通过配置文件自动化容器的部署、升级和回滚。
    • 容器编排:管理容器的调度、负载均衡、滚动更新和集群健康检查。
    • 高可用性和扩展性:支持多节点、跨主机的容器管理,自动扩容。
    • 支持多种容器运行时,如 Docker、containerd 和 CRI-O。
  • 相关工具

    • Helm:Kubernetes 的包管理工具,简化应用的安装和升级。
    • Kubectl:Kubernetes 的命令行工具,用于管理集群中的资源。

3. Podman #

  • 概述:Podman 是一个与 Docker 类似的容器引擎,但与 Docker 不同的是,它不依赖于守护进程。Podman 是无守护进程的容器管理工具,可以在无 root 权限的情况下运行容器。

  • 功能

    • 与 Docker 命令兼容:Podman 使用与 Docker 相似的命令行界面。
    • 安全性:由于 Podman 是无守护进程的,它没有持久的守护进程运行,因此它的安全性较高。
    • 容器集群管理:支持多容器组(pod),类似于 Kubernetes 中的 Pod。

4. Docker Swarm #

  • 概述:Docker Swarm 是 Docker 提供的容器集群管理工具,可以将多个 Docker 主机组成一个集群,并提供容器的负载均衡、服务发现和自动扩容等功能。

  • 功能

    • 集群管理:Docker Swarm 允许多个 Docker 主机以集群的形式工作,通过 Swarm 集群的管理,可以确保容器的高可用性。
    • 服务发现:Swarm 中的服务会自动发现并连接。
    • 自动负载均衡:Swarm 会将流量均衡地分发到各个容器实例。
  • 优点:对于已有 Docker 环境的用户来说,Swarm 提供了简单易用的容器编排功能。

5. OpenShift #

  • 概述:OpenShift 是 Red Hat 提供的企业级 Kubernetes 平台,是 Kubernetes 的一个增强版,提供了许多额外的功能,如更强的安全性和集成开发工具等。

  • 功能

    • 集成开发工具:OpenShift 提供了一个 Web 控制台,可以进行源代码管理、构建自动化、持续交付等。
    • 安全性:OpenShift 默认启用了许多安全机制,如强制使用 SELinux。
    • 企业支持:作为商业产品,OpenShift 提供了专业的技术支持。
  • 相关工具

    • OpenShift CLI(oc):用于与 OpenShift 集群进行交互的命令行工具。

6. Apache Mesos #

  • 概述:Apache Mesos 是一个分布式系统内核,旨在处理大规模的计算集群,它不仅支持容器化应用,还能运行各种非容器化的应用程序。

  • 功能

    • 容器调度:Mesos 支持 Docker 和其他容器技术的调度。
    • 弹性:支持动态伸缩,能够自动扩展或缩减资源。
    • 多种任务支持:除了容器,Mesos 还可以管理虚拟机和传统应用程序。

7. Containerd #

  • 概述:Containerd 是一个高效的容器运行时(runtime),提供容器的生命周期管理,包括容器的启动、停止、镜像管理等。它是 Kubernetes 默认使用的容器运行时之一。

  • 功能

    • 容器生命周期管理:从镜像拉取、容器启动到停止。
    • 运行时接口:作为容器引擎的核心,提供了与 Kubernetes 等平台的接口。
  • 优点:提供高效、低开销的容器管理,适用于生产环境。

8. Rancher #

  • 概述:Rancher 是一个开源的容器管理平台,用于简化 Kubernetes 集群的部署和管理。它支持多种容器编排平台,但最常见的是 Kubernetes。

  • 功能

    • 多集群管理:支持跨多个 Kubernetes 集群的统一管理。
    • 集成工具:提供日志、监控、服务网格、CI/CD 等集成。
    • 简化操作:通过 Web 控制台提供简单的 UI 和 API,降低了 Kubernetes 管理的复杂度。

9. LXC (Linux Containers) #

  • 概述:LXC 是一种轻量级的操作系统虚拟化技术,可以在同一个 Linux 内核上运行多个隔离的 Linux 系统,它比传统的虚拟机更轻便,但提供了更高的隔离性。

  • 功能

    • 类似虚拟机:每个容器拥有独立的文件系统、网络和进程空间。
    • 高效:比传统的虚拟化技术占用更少的资源。
    • 网络隔离:提供容器间网络隔离,支持桥接、虚拟局域网等多种网络模式。

10. Kata Containers #

  • 概述:Kata Containers 是一个开源项目,旨在将容器的速度与虚拟机的安全性相结合。它通过将每个容器包装为一个轻量级虚拟机来提供隔离。

  • 功能

    • 高安全性:每个容器在虚拟机中运行,提供比普通容器更强的安全隔离。
    • 兼容性:与现有的容器编排工具(如 Kubernetes)兼容。

总结: #

容器化技术通过虚拟化应用及其依赖,提升了部署的效率和一致性。从最常见的 DockerKubernetes,到更专业的容器编排平台(如 OpenShiftRancher),不同的容器化技术提供了从开发到生产环境全方位的支持。选择合适的容器化技术取决于应用的规模、需要的安全性、管理复杂度等因素。

free -mh的buffer和cache的区别 #

free -mh 命令用于显示系统的内存使用情况,其中 -m 表示以 MB 为单位显示,-h 表示以人类可读的格式显示(如 KB, MB, GB)。在输出中,你会看到 buffercache 两个字段,它们分别表示不同类型的内存使用。下面是它们的区别:

1. Buffer #

  • 定义:Buffer 是用于临时存储输入/输出操作的数据缓冲区,主要是磁盘 I/O 操作的缓存。
  • 作用:在 Linux 系统中,当有文件被写入磁盘时,数据不会直接写入磁盘,而是先写入内存的 buffer 中,直到合适的时机再将数据写入磁盘。这样可以提高磁盘操作的性能。
  • 使用:Buffer 主要用于存储磁盘块的管理数据,像文件系统元数据、文件的内容等等。

2. Cache #

  • 定义:Cache 是文件系统缓存,用于存储经常访问的文件内容。当你频繁访问某些文件时,这些文件会被存储在内存中的 cache 区域,这样可以加速文件的读取速度。
  • 作用:通过缓存文件内容(如文件内容、目录项等),系统可以更快地响应对这些文件的访问。缓存会根据内存的使用情况动态调整,缓存区也会被用作文件内容读取的高速缓存。
  • 使用:Cache 保存了文件的实际内容,是对文件数据本身的缓存,而不是文件系统的元数据。

Buffer 和 Cache 的区别 #

  • 功能:Buffer 主要是用于管理磁盘 I/O 操作的缓冲区,而 Cache 主要是用于存储文件的内容。
  • 内容:Buffer 存储的是磁盘的元数据(例如:目录、文件的块),而 Cache 存储的是文件的实际数据(例如:文件的内容)。
  • 使用目的:Buffer 目的是加速磁盘写入操作,Cache 目的是加速文件读取操作。

举例 #

假设你打开一个大文件并进行读取,系统会先将文件的内容加载到内存的 cache 中,以便快速访问。之后,你对该文件进行写入,数据会先写入内存的 buffer 中,再逐步写回磁盘。

总结 #

  • Buffer 是与磁盘操作相关的内存区域,涉及到磁盘 I/O 的缓冲。
  • Cache 是与文件数据存取相关的内存区域,用于加速对文件内容的读取。

free 命令的输出中,buffercache 都是属于被 缓存的内存,这些内存如果系统需要被释放,内核会自动将其回收,释放给其他应用程序使用。因此,free 命令中的 buffercache 并不代表“已占用”的内存,因为它们在空闲时可以被回收。

查看操作系统的命令 #

要查看操作系统的相关信息,你可以使用不同的命令来获取操作系统的版本、内核版本、系统架构等详细信息。以下是一些常用的命令:

1. 查看操作系统的版本 #

  • Linux:

    cat /etc/os-release
    

    或者:

    uname -a
    

    这条命令将输出操作系统的内核信息、主机名、操作系统版本等。

  • Ubuntu:

    lsb_release -a
    

    或者:

    cat /etc/lsb-release
    
  • CentOS:

    cat /etc/centos-release
    
  • Debian:

    cat /etc/debian_version
    

2. 查看操作系统内核版本 #

uname -r

该命令将显示内核的版本号。

3. 查看系统架构 #

uname -m

这条命令会返回系统的架构,例如 x86_64(表示 64 位系统)。

4. 查看主机名 #

hostname

这条命令将显示当前操作系统的主机名。

5. 查看操作系统的硬件架构 #

lscpu

这个命令显示关于CPU架构、核心数、线程数等的详细信息。

6. 查看操作系统的内存信息 #

free -h

此命令将以人类可读的格式显示系统的内存使用情况。

7. 查看操作系统的硬盘信息 #

lsblk

该命令列出系统上的所有块设备,显示磁盘及其分区信息。

8. 查看操作系统的文件系统信息 #

df -h

该命令显示文件系统的磁盘使用情况,包括每个挂载点的使用情况。

9. 查看操作系统的进程信息 #

top

该命令会显示当前系统运行中的进程以及系统资源的使用情况。

10. 查看操作系统的日志 #

journalctl -xe

查看系统的日志输出,特别是与系统事件相关的信息。

这些命令是最常见的查看操作系统信息的方式,根据你需要查看的具体信息,选择适合的命令。

查看用户数的命令 #

要查看系统中当前的用户数,可以使用以下命令:

1. 查看当前登录的用户数 #

who | wc -l

who 命令显示当前登录系统的用户信息,wc -l 则统计登录的用户数。

2. 查看系统中所有用户的数目 #

cat /etc/passwd | wc -l

/etc/passwd 文件包含了所有的用户信息,每一行代表一个用户。wc -l 会统计文件中的行数,从而得到用户的总数。

3. 查看当前活跃的用户数 #

w -h | wc -l

w 命令显示当前登录的用户及其活跃状态,-h 选项去掉头部信息,wc -l 统计活跃用户数。

4. 查看系统中的用户数量(仅普通用户) #

awk -F: '{ if ($3 >= 1000) print $1 }' /etc/passwd | wc -l

这个命令通过 awk 过滤 /etc/passwd 中 UID 大于等于 1000 的用户(通常是普通用户),然后使用 wc -l 统计用户数量。一般情况下,UID 小于 1000 的是系统用户。

这些命令能够帮助你查看当前系统中不同类别用户的数量。

禁止root直接登录 修改哪个文件的什么参数 #

为了禁止 root 用户直接登录,你可以通过修改 SSH 配置文件来限制。具体步骤如下:

1. 编辑 SSH 配置文件 #

使用文本编辑器打开 SSH 配置文件(通常是 /etc/ssh/sshd_config):

sudo vim /etc/ssh/sshd_config

2. 修改配置参数 #

找到并修改以下配置项:

  • PermitRootLogin:这是控制 root 用户是否可以通过 SSH 登录的参数。设置为 no 即可禁止 root 用户直接登录。

PermitRootLogin 设置为 no

PermitRootLogin no

3. 保存并退出 #

保存并关闭文件(在 vim 中,按 Esc 键,然后输入 :wq 保存并退出)。

4. 重启 SSH 服务 #

配置修改后,重启 SSH 服务使修改生效:

sudo systemctl restart sshd

或者在一些系统中可能需要使用以下命令:

sudo service ssh restart

5. 验证 #

尝试用 root 用户通过 SSH 登录,应该会被禁止。可以用普通用户登录并验证:

ssh root@<your-server-ip>

你应该会看到类似以下的信息:

Permission denied, please try again.

总结 #

  • 修改 /etc/ssh/sshd_config 文件中的 PermitRootLogin 参数,将其设置为 no 来禁止 root 用户通过 SSH 登录。
  • 重启 SSH 服务使配置生效。
#
#
#
#
#
#
#
#
#