
🐇明明跟你说过:个人主页
🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅
🔖行路有良友,便是天堂🔖
目录
[2.3、创建资源限制(Resource Limits)](#2.3、创建资源限制(Resource Limits))
[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、管理Service Accounts](#2.2、管理Service Accounts)
一、引言
1、什么是k8s
K8s(Kubernetes)可以简单理解为一个容器管理系统,它帮助你在多个机器上高效、可靠地运行和管理"应用容器"。
想象一下,容器就像是一个个小盒子,每个盒子里面装着一个独立运行的应用或服务。Kubernetes的作用,就像一个"仓库管理员",它负责管理这些盒子,确保它们按需部署、能够自动修复故障并高效地工作。
- **容器:**就像是一个小型应用工厂,里面有你需要的一切(代码、依赖、配置等),它可以快速创建、删除和移动。
- **K8s:**就像是一个聪明的机器人,能帮你管理这些工厂,确保它们在任何时候都在正常工作,不会发生停工的情况。
举个例子,如果你有一个网站,它需要用到多个"工厂"(比如数据库、前端、后台服务等),K8s会帮你:
- **自动部署:**把这些工厂(容器)放到服务器上运行。
- **负载均衡:**分配流量,确保每个工厂都能高效工作,不会因为流量过大崩溃。
- **自我修复:**如果某个工厂出了问题(比如服务器坏了),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 的定义文件中为容器指定 requests 和 limits来设置资源限制。
在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-deployment 的 Deployment设置资源请求和限制:
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的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺
🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!