【Kubernetes】常用命令全解析:从入门到实战(中)

🐇明明跟你说过:个人主页

🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅

🔖行路有良友,便是天堂🔖

目录

一、引言

1、什么是k8s

2、K8s的核心功能

二、资源调度与伸缩命令

1、资源调度与伸缩命令

1.1、Label(标签)

1.2、Selector(选择器)

2、资源配额与限制

2.1、创建资源配额(ResourceQuota)

2.2、查看资源配额

[2.3、创建资源限制(Resource Limits)](#2.3、创建资源限制(Resource Limits))

2.4、查看Pod的资源限制

2.5、删除资源配额与资源限制

三、网络与安全命令

[1、创建与管理Network Policies](#1、创建与管理Network Policies)

[1.1、创建 Network Policy](#1.1、创建 Network Policy)

[2.2、基本 Network Policy 规则](#2.2、基本 Network Policy 规则)

[2.3、管理 Network Policies](#2.3、管理 Network Policies)

2、安全认证与授权

2.1、配置RBAC

[2.2、管理Service Accounts](#2.2、管理Service Accounts)


一、引言

1、什么是k8s

K8s(Kubernetes)可以简单理解为一个容器管理系统,它帮助你在多个机器上高效、可靠地运行和管理"应用容器"。

想象一下,容器就像是一个个小盒子,每个盒子里面装着一个独立运行的应用或服务。Kubernetes的作用,就像一个"仓库管理员",它负责管理这些盒子,确保它们按需部署、能够自动修复故障并高效地工作。

  • **容器:**就像是一个小型应用工厂,里面有你需要的一切(代码、依赖、配置等),它可以快速创建、删除和移动。
  • **K8s:**就像是一个聪明的机器人,能帮你管理这些工厂,确保它们在任何时候都在正常工作,不会发生停工的情况。

举个例子,如果你有一个网站,它需要用到多个"工厂"(比如数据库、前端、后台服务等),K8s会帮你:

  1. **自动部署:**把这些工厂(容器)放到服务器上运行。
  2. **负载均衡:**分配流量,确保每个工厂都能高效工作,不会因为流量过大崩溃。
  3. **自我修复:**如果某个工厂出了问题(比如服务器坏了),K8s会自动替换或重启它,确保不会影响整体服务。

总的来说,K8s就像是一个智能调度员,帮助你自动化地管理应用程序,避免人工干预,提高效率和稳定性。

2、K8s的核心功能

  • **自动化部署和回滚:**K8s能够自动部署和更新应用,同时可以在出现问题时进行回滚,恢复到之前的状态。
  • **负载均衡:**它能够自动分配流量到各个容器实例,确保应用的高可用性。
  • **自我修复:**K8s能够自动检测故障的容器并重新启动、替换或终止它们,保持应用健康运行。
  • **服务发现和负载均衡:**它能够自动为容器分配IP地址并将它们链接到服务中,简化微服务架构的部署。
  • **存储编排:**支持将本地存储、云存储或分布式存储挂载到容器中。
  • **自动扩展:**可以根据负载自动增加或减少容器的实例数量。
  • **密钥和配置管理:**允许存储敏感信息(如密码、API密钥等),并将其传递到容器中。

二、资源调度与伸缩命令

1、资源调度与伸缩命令

1.1、Label(标签)

标签是附加到Kubernetes资源(如Pod、Service、Deployment等)上的键值对。它们用于标识和分类这些资源。标签本身并没有任何业务逻辑,但它们为选择和管理资源提供了重要的信息。

举个例子:

  • Pod可以被赋予标签 app=frontend,表示它是"前端"应用的一部分。
  • 另一个Pod可能有标签 app=backend,表示它是"后端"应用的一部分。

标签是动态的,可以随时添加、修改或删除,灵活性非常高。

给 Pod 添加标签

假设你有一个名为 my-pod 的 Pod,想要给它添加标签 app=frontend:

kubectl label pod my-pod app=frontend

如果要修改现有的标签,可以使用相同的命令,kubectl 会更新标签:

kubectl label pod my-pod app=backend

给 Deployment 添加标签

你也可以在创建 Deployment 时或之后添加标签。例如,给名为 my-deployment 的 Deployment 添加 env=production 标签:

kubectl label deployment my-deployment env=production

给 Node 添加标签

例如,为名为 node-1 的节点添加标签 zone=us-east1:

kubectl label node node-1 zone=us-east1

1.2、Selector(选择器)

选择器是用来选择一组具有特定标签的资源的方式。它允许Kubernetes根据标签来筛选出你关心的资源。

选择器主要有两种类型:

  • **等于选择器(Equality-Based Selector):**选择符合某个标签键值对的资源。
  • **集合选择器(Set-Based Selector):**选择符合标签集合条件的资源。

使用 Label Selector 选择 Pods

我们可以通过 kubectl get 命令使用标签选择器来选择特定标签的资源。例如,选择所有标签为 app=frontend 的 Pod:

kubectl get pods -l app=frontend

这将列出所有具有标签 app=frontend 的 Pod。

使用多个标签进行选择

如果你想选择多个标签条件,可以使用逗号分隔多个条件。例如,选择 app=frontend 且 env=production 的 Pod:

kubectl get pods -l app=frontend,env=production

使用集合选择器

Kubernetes支持集合选择器,允许你使用 In、NotIn、Exists 和 DoesNotExist 等操作符。例如,选择 env 标签值为 production 或 staging 的 Pod:

kubectl get pods -l 'env in (production,staging)'

或者,选择 env 标签存在但不等于 development 的 Pod:

kubectl get pods -l 'env notin (development)'

2、资源配额与限制

2.1、创建资源配额(ResourceQuota)

资源配额(ResourceQuota)用于限制特定命名空间内可使用的资源总量。可以通过以下步骤在命令行中创建资源配额:

创建资源配额

例如,创建一个资源配额 my-quota ,限制命名空间 my-namespace中的资源使用:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: my-quota
  namespace: my-namespace
spec:
  hard:
    requests.cpu: "4"          # 最大请求CPU为4个核心
    requests.memory: "8Gi"     # 最大请求内存为8Gi
    limits.cpu: "8"            # 最大限制CPU为8个核心
    limits.memory: "16Gi"      # 最大限制内存为16Gi
    pods: "10"                 # 最多创建10个Pod

将上面的内容保存为 resource-quota.yaml,然后使用以下命令应用:

kubectl apply -f resource-quota.yaml

通过命令行直接创建资源配额

我们也可以通过命令行直接创建资源配额。以下是一个限制 CPU 和内存请求、限制以及 Pod 数量的资源配额示例:

kubectl create quota my-quota \
  --namespace=my-namespace \
  --hard=requests.cpu=4 \
  --hard=requests.memory=8Gi \
  --hard=limits.cpu=8 \
  --hard=limits.memory=16Gi \
  --hard=pods=10

这个命令会创建一个名为 my-quota 的资源配额,并为命名空间my-namespace限制资源使用。

2.2、查看资源配额

查看指定命名空间的资源配额使用情况:

kubectl get resourcequota -n my-namespace

该命令将显示 my-namespace 中的所有资源配额及其当前使用情况。输出会显示每种资源(如 CPU、内存、Pod 数量)的请求和限制的使用量。

查看特定资源配额的详细信息:

kubectl describe resourcequota my-quota -n my-namespace

2.3、创建资源限制(Resource Limits)

资源限制(如 CPU 和内存)通常是为单个 Pod 或容器设置的。你可以在 Pod 的定义文件中为容器指定 requestslimits来设置资源限制。

在Pod的YAML中配置资源限制

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
    - name: my-app-container
      image: my-app-image
      resources:
        requests:
          memory: "64Mi"     # 请求64MB内存
          cpu: "250m"        # 请求250m CPU(0.25个CPU核心)
        limits:
          memory: "128Mi"    # 限制最多使用128MB内存
          cpu: "500m"        # 限制最多使用500m CPU(0.5个CPU核心)

将此内容保存为 pod.yaml,并使用以下命令应用:

kubectl apply -f pod.yaml

通过命令行直接设置资源限制

你可以通过kubectl set resources 命令为现有的 Pod 或 Deployment 设置资源限制。例如,给名为 my-deploymentDeployment设置资源请求和限制:

kubectl set resources deployment my-deployment \
  --limits=cpu=500m,memory=128Mi \
  --requests=cpu=250m,memory=64Mi

这个命令会为 my-deployment 中的所有容器设置资源限制。

2.4、查看Pod的资源限制

要查看 Pod 或容器的资源请求和限制,可以使用以下命令:

kubectl describe pod my-app

输出中会包含每个容器的资源请求和限制。

2.5、删除资源配额与资源限制

删除资源配额

如果你不再需要资源配额,可以通过以下命令删除:

kubectl delete resourcequota my-quota -n my-namespace

删除Pod的资源限制

如果你要删除已设置的资源限制,可以使用以下命令:

kubectl set resources pod my-app --limits=cpu=0,memory=0 --requests=cpu=0,memory=0

这个命令将 my-app Pod 中的所有容器的资源限制和请求设置为 0,相当于删除资源限制。

三、网络与安全命令

1、 创建与管理Network Policies

1.1、创建 Network Policy

Network Policy 是一个基于 YAML 文件的资源,通常通过定义一组 ingress(入站) 和**egress(出站)**规则来描述。每个规则会指定允许或拒绝的通信流。

创建 Network Policy 示例

以下是一个基本的示例,表示只允许来自特定Pod的流量进入目标Pod:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: backend   # 仅作用于标签为 app=backend 的Pod
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend   # 允许来自标签为 app=frontend 的Pod的流量
  policyTypes:
  - Ingress

这个示例中:

  • podSelector用来选择目标Pod(在此例中,选择标签为 app=backend 的Pod)。
  • ingress规则限制只有标签为 app=frontend 的Pod才能访问 app=backend 的Pod。
  • policyTypes 声明了该Policy只作用于入站流量(Ingress)。

将此文件保存为 network-policy.yaml后,可以通过命令行应用:

kubectl apply -f network-policy.yaml

2.2、基本 Network Policy 规则

Network Policies 支持以下几种规则:

  • **Ingress(入站流量):**指定哪些Pod可以向目标Pod发送流量。
  • **Egress(出站流量):**指定目标Pod可以向哪些外部地址或Pod发送流量。

**完整的示例:**允许来自特定IP的流量,并允许Pod向外部特定IP地址发送流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-from-ip
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: backend   # 仅作用于标签为 app=backend 的Pod
  ingress:
  - from:
    - ipBlock:
        cidr: 192.168.1.0/24  # 允许来自此IP范围的流量
  egress:
  - to:
    - ipBlock:
        cidr: 203.0.113.0/24  # 允许向此IP范围发送流量
  policyTypes:
  - Ingress
  - Egress

此规则允许:

  • backend 应用接受来自 192.168.1.0/24 网络的流量。
  • backend 应用能够向 203.0.113.0/24 网络发出流量。

2.3、管理 Network Policies

查看所有 Network Policy

要查看当前命名空间中的所有 Network Policy,可以使用:

kubectl get networkpolicy -n <namespace>

例如,查看 default 命名空间中的所有 Network Policies:

kubectl get networkpolicy -n default

查看特定 Network Policy 的详细信息

要查看某个特定 Network Policy 的详细信息,可以使用:

kubectl describe networkpolicy <network-policy-name> -n <namespace>

例如,查看 allow-frontend 的详细信息:

kubectl describe networkpolicy allow-frontend -n default

删除 Network Policy

如果你不再需要某个 Network Policy,可以通过以下命令删除:

kubectl delete networkpolicy <network-policy-name> -n <namespace>

例如,删除 allow-frontend Network Policy:

kubectl delete networkpolicy allow-frontend -n default

2、安全认证与授权

2.1、配置RBAC

创建 Role 和 RoleBinding(命名空间级别)

假设你需要授予用户 jane 在 default 命名空间内查看 Pod 列表的权限。

创建 Role

Role 定义了用户在某个命名空间中对资源的权限。例如,授予查看 Pod 的权限。

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"]

保存为role-pod-reader.yaml 后,使用以下命令创建角色:

kubectl apply -f role-pod-reader.yaml

创建 RoleBinding

将 Role 绑定到用户 jane 上,允许其访问 default 命名空间中的 Pods。

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: User
  name: "jane"  # 绑定到用户 jane
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

保存为 rolebinding-pod-reader.yaml后,使用以下命令创建角色绑定:

kubectl apply -f rolebinding-pod-reader.yaml

此时,用户 jane 就能查看 default 命名空间中的 Pods。

创建 ClusterRole 和 ClusterRoleBinding(集群级别)

如果你需要在集群范围内授予某些权限,可以使用 ClusterRole 和 ClusterRoleBinding。

创建 ClusterRole

例如,你可以创建一个 ClusterRole,授予用户在整个集群中列出所有命名空间的 Pods 的权限:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"]

保存为clusterrole-pod-reader.yaml 后,使用以下命令创建 ClusterRole:

kubectl apply -f clusterrole-pod-reader.yaml

创建 ClusterRoleBinding

将 ClusterRole 绑定到用户 jane,使其可以在整个集群范围内列出 Pods:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: bind-cluster-pod-reader
subjects:
- kind: User
  name: "jane"  # 绑定到用户 jane
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: cluster-pod-reader
  apiGroup: rbac.authorization.k8s.io

保存为clusterrolebinding-pod-reader.yaml后,使用以下命令创建 ClusterRoleBinding:

kubectl apply -f clusterrolebinding-pod-reader.yaml

此时,用户 jane 将能够在集群内查看所有命名空间的 Pods。

2.2、管理Service Accounts

创建 Service Account

通过 kubectl 命令可以创建一个 Service Account。在 Kubernetes 中,Service Account 通常是与命名空间相关的。以下是如何在某个命名空间中创建一个 Service Account。

kubectl create serviceaccount <service-account-name> -n <namespace>

例如,在 default 命名空间中创建一个名为 my-service-account 的 Service Account:

kubectl create serviceaccount my-service-account -n default

查看 Service Account

要查看某个命名空间中的所有 Service Accounts,可以使用以下命令:

kubectl get serviceaccounts -n <namespace>

例如,查看 default 命名空间中的所有 Service Accounts:

kubectl get serviceaccounts -n default

要查看某个特定 Service Account 的详细信息:

kubectl describe serviceaccount <service-account-name> -n <namespace>

例如,查看 my-service-account 的详细信息:

kubectl describe serviceaccount my-service-account -n default

删除 Service Account

要删除某个 Service Account,可以使用以下命令:

kubectl delete serviceaccount <service-account-name> -n <namespace>

例如,删除 my-service-account:

kubectl delete serviceaccount my-service-account -n default

💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Kubernetes的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!

相关推荐
鸡鸭扣1 小时前
Docker:3、在VSCode上安装并运行python程序或JavaScript程序
运维·vscode·python·docker·容器·js
A ?Charis2 小时前
k8s-对接NFS存储
linux·服务器·kubernetes
神秘_博士2 小时前
自制AirTag,支持安卓/鸿蒙/PC/Home Assistant,无需拥有iPhone
arm开发·python·物联网·flutter·docker·gitee
KTKong3 小时前
kubeadm拉起的k8s集群证书过期的做法集群已奔溃也可以解决
云原生·容器·kubernetes
人工干智能4 小时前
科普:“Docker Desktop”和“Docker”以及“WSL”
运维·docker·容器
落笔画忧愁e4 小时前
FastGPT及大模型API(Docker)私有化部署指南
运维·docker·容器
一天八小时4 小时前
Docker学习进阶
学习·docker·容器
前端没钱4 小时前
前端需要学习 Docker 吗?
前端·学习·docker
Logout:4 小时前
[AI]docker封装包含cuda cudnn的paddlepaddle PaddleOCR
人工智能·docker·paddlepaddle
前端郭德纲4 小时前
前端自动化部署的极简方案
运维·前端·自动化