🐇明明跟你说过:个人主页
🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅
🔖行路有良友,便是天堂🔖
目录
一、引言
1、什么是k8s
2、K8s的核心功能
二、资源调度与伸缩命令
1、资源调度与伸缩命令
1.1、Label(标签)
1.2、Selector(选择器)
2、资源配额与限制
2.1、创建资源配额(ResourceQuota)
2.2、查看资源配额
2.3、创建资源限制(Resource Limits)
2.4、查看Pod的资源限制
2.5、删除资源配额与资源限制
三、网络与安全命令
1、创建与管理Network Policies
1.1、创建 Network Policy
2.2、基本 Network Policy 规则
2.3、管理 Network Policies
2、安全认证与授权
2.1、配置RBAC
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-quotanamespace: my-namespace
spec:hard:requests.cpu: "4" # 最大请求CPU为4个核心requests.memory: "8Gi" # 最大请求内存为8Gilimits.cpu: "8" # 最大限制CPU为8个核心limits.memory: "16Gi" # 最大限制内存为16Gipods: "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-containerimage: my-app-imageresources: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-frontendnamespace: default
spec:podSelector:matchLabels:app: backend # 仅作用于标签为 app=backend 的Podingress:- 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-ipnamespace: default
spec:podSelector:matchLabels:app: backend # 仅作用于标签为 app=backend 的Podingress:- 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: defaultname: 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-podsnamespace: default
subjects:
- kind: Username: "jane" # 绑定到用户 janeapiGroup: rbac.authorization.k8s.io
roleRef:kind: Rolename: pod-readerapiGroup: 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: Username: "jane" # 绑定到用户 janeapiGroup: rbac.authorization.k8s.io
roleRef:kind: ClusterRolename: cluster-pod-readerapiGroup: 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的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺
🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!