Kubernetes最佳实践S01E02:如何使用命名空间管理Kubernetes资源?

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 今天是Google Developer Advocate Sandeep Dinesh的七部分视频和博客系列的第二部分,介绍如何充分利用您的Kubernetes环境。当您开始在Kubernetes之上构建越来越多的服务时,简单的任务开始变得更加复杂。
今天是Google Developer Advocate Sandeep Dinesh 的七部分视频和博客系列的第二部分,介绍如何充分利用您的Kubernetes环境。

当您开始在Kubernetes之上构建越来越多的服务时,简单的任务开始变得更加复杂。 例如,团队无法创建具有相同名称的Kubernetes Service Deployment 。 如果你有成千上万的 Pod ,只是列出它们都需要一些时间,更不用说实际管理它们了!当然,这些还只是冰山一角。

在本期Kubernetes最佳实践中,让我们来看看如何使用Kubernetes命名空间来更轻松地管理您的Kubernetes资源。


什么是命名空间(Namespace)?

您可以将命名空间视为Kubernetes集群中的虚拟集群。 您可以在单个Kubernetes集群中拥有多个命名空间,并且它们在逻辑上彼此隔离。 他们可以为您和您的团队提供组织,安全甚至性能方面的帮助!

默认命名空间(Default Namespace)

在大多数Kubernetes发行版中,集群开箱即用,命名空间默认为 default 。事实上,Kubernetes上有三个命名空间: default kube-system (用于Kubernetes组件)和 kube-public ( 用于公共资源)。 kube-public 现在并没有真正使用过,而且通常单独隔离一个 kube-system 是个好主意,尤其是在 Google Kubernetes Engine 这样的托管系统中。 默认命名空间是你创建服务和应用程序的默认位置,如果你不指定 namespace 参数的话。

这个命名空间绝对没有什么特别之处,只是Kubernetes工具是开箱即用的设置使用这个命名空间,而且你无法删除它。 它很适合入门和小型生产系统,我建议不要在大型生产系统中使用它。 这是因为团队很容易在没有意识到的情况下,意外地覆盖或破坏其他服务。 相反,我们应该创建多个命名空间并使用它们来将服务划分为可管理的块。

创建命名空间

不要害怕创建命名空间。 它们不会增加性能损失,而且实际上,在许多情况下它们可以提高性能,因为这样的话 Kubernetes API 使用的是较小的对象集合。

可以使用单个命令来创建命名空间。 如果你想创建一个名为 test 的命名空间,你可以运行如下命令:
kubectl create namespace test

或者您可以像创建其他任何Kubernetes资源一样,创建一个 YAML 文件并应用它。

test.yaml:
kind: Namespace
apiVersion: v1
metadata:
name: test
labels:
name: test
kubectl apply -f test.yaml

查看命名空间

您可以使用以下命令查看所有命名空间:
kubectl get namespace

1.png

如上图,您可以看到三个内置命名空间,以及名为 test 的新命名空间。

在命名空间中创建资源

让我们看一个简单的YAML,它用来创建一个Pod:
apiVersion: v1
kind: Pod
metadata:
name: mypod
labels:
name: mypod
spec:
containers:
- name: mypod
image: nginx

您可能会注意到在任何地方都没有提到名称空间。 如果在此文件上运行 kubectl apply ,它将在当前活动的命名空间中创建Pod。 除非您更改它,否则这将是“默认”命名空间。

有两种方法可以明确告诉Kubernetes您要在哪个 Namespace 中创建资源。

一种方法是在创建资源时设置 namespace 标识:
kubectl apply -f pod.yaml --namespace=test

您还可以在YAML声明中指定命名空间:
apiVersion: v1
kind: Pod
metadata:
name: mypod
namespace: test
labels:
name: mypod
spec:
containers:
- name: mypod
image: nginx

如果在YAML声明中指定命名空间,则将始终在该命名空间中创建资源。如果您尝试使用 namespace 标志来设置另一个命名空间,则该命令将会失败。

在命名空间中查看资源

如果你试图找到你的Pod,你可能会注意到你不能!
$ kubectl get pods
No resources found.

这是因为所有命令都是针对当前active的命名空间运行的。 要查找Pod,您需要指定 namespace
$ kubectl get pods --namespace=test
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 10s

这可能会很快让人觉得很烦,特别是如果您是一个开发团队的开发人员,该团队使用自己的命名空间来处理所有事情,并且不希望对每个命令都指定 namespace 。 让我们看看我们如何解决这个问题。

管理active命名空间

初始状态下,您的活动命名空间是 default 。 除非在YAML中指定命名空间,否则所有Kubernetes命令都将使用当前active命名空间。

不幸的是,尝试使用kubectl管理您的active命名空间可能会很痛苦。 幸运的是,有一个非常好的工具叫做 kubens (由优秀的Ahmet Alp Balkan创建)可以让它变得轻而易举!

运行 kubens 命令时,您应该看到所有命名空间,并突出显示active命名空间:
2.png

要将active命名空间切换到 test 命名空间,请运行:
kubens test

现在您可以看到 test 命名空间处于active状态:
3.png

现在,如果你运行kubectl命令,命名空间将是 test 而不是 default

这意味着您不需要指定命名空间来查看测试命名空间中的Pod。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 10m

跨命名空间通信

命名空间彼此“隐藏”,但默认情况下它们不是完全隔离的。一个命名空间中的服务可以与另一个命名空间中的服务进行通信。 这通常非常有用,例如让您的团队的服务(在您的命名空间中)与另一个团队的服务(在另一个命名空间中)进行通信。

当您的应用想要访问Kubernetes Service 时,您可以使用内置的DNS服务发现,只需将您的应用指向该 Service 的名称即可。 但是,您可以在多个命名空间中创建具有相同名称的 Service !值得庆幸的是,通过使用扩展形式的DNS地址很容易解决这个问题。

Kubernetes中的服务使用通用DNS模式公开其 endpoint 。 它看起来像这样:
<Service Name>.<Namespace Name>.svc.cluster.local

通常,您只需要服务名称,DNS将自动解析为完整地址。 但是,如果需要访问另一个命名空间中的服务,则需使用服务名称加上命名空间名称。

例如,如果要连接到 test 命名空间中的 database 服务,可以使用以下地址:
database.test

如果要连接到 production 命名空间中的 database 服务,可以使用以下地址:
database.production

警告:如果您创建一个映射到“com”或“org”等TLD的命名空间,然后创建一个与网站名称相同的服务,例如“google”或“reddit”,Kubernetes将拦截“google.com“或”reddit.com“的请求并将其发送到您的服务。 这通常对于测试和代理非常有用,但也可以轻松破坏集群中的内容!

注意:如果确实要隔离命名空间,则应使用网络策略( Network Policies )来完成此操作。 更多信息请继续关注未来剧集!

命令空间粒度

一个常见问题是要创建多少个命名空间以及用于何种目的。 什么是可管理的块? 创建太多的命名空间,它们会让你变得没有效率,但是创建太少,你会错过它们的好处。

我认为答案在于您的项目或公司处于什么阶段 ——从小团队到成熟企业,每个阶段都有自己的组织架构。 根据您的具体情况,您可以采用对应的命名空间策略。

小团队

在这种情况下,您是一个小团队的一员,该团队正在开发5-10个微服务,可以轻松地进行团队沟通。 在这种情况下,将所有生产服务放到“默认”命名空间是个不错的选择。 根据你的个人喜好,你可能希望有一个 production development 的命名空间,但你很有可能是在本地机器上使用类似Minikube搭建的开发环境。

快速成长的团队

在这种情况下,您有一个快速发展的团队,正在开发10多个微服务。 您开始将团队分成多个子团队,每个团队都拥有自己的微服务。 虽然每个人都可能知道整个系统是如何工作的,但是与其他人协调每一个变化变得越来越困难。 尝试在本地计算机上启动整个堆栈每天都变得越来越复杂。

此时有必要使用多个集群或命名空间进行生产和开发。 每个团队可以选择拥有自己的命名空间,以便于管理。

大公司

在一家大公司,并不是每个人都了解其他人。 某个团队正致力于其他团队可能不了解的功能。 团队可能正在使用服契约(service contract)与其他微服务通信(例如,gRPC),也有可能使用服务网格(Service Mesh)进行通信(例如,istio)。 试图在本地运行整个堆栈是不可能的。 强烈建议使用 Kubernetes-aware Continuous Delivery 系统(例如,Spinnaker)。

此时,每个团队肯定需要自己的命名空间。 每个团队甚至可以选择多个名称空间来运行其开发和生产环境。 设置 RBAC ResourceQuotas 也是一个好主意。 多个集群开始显得很有意义,但可能不一定是必要的。

注意:我将在后面的文章中深入研究gRPC、Istio、Spinnaker、RBAC和Resources!

企业

在这种规模下,有些群体甚至不知道其他群体的存在。 某个组也可能是外部公司,服务之间通过标准文档定义的API来通信。 每个小组都有多个拥有一定数量微服务的团队。 这时使用我上面提到的所有工具是必要的。 人们不应该手工部署服务,同时应该被锁定在他们不拥有的命名空间之外。

此时,拥有多个集群以减少配置不当的应用程序导致的爆炸半径,以及简化计费和资源管理可能是有意义的。


结论

命名空间可以帮助您组织Kubernetes资源,同时可以提高团队的开发速度。 请继续关注未来的Kubernetes最佳实践剧集,我将向您展示如何锁定命名空间中的资源并为您的群集引入更多安全性和隔离性!

本文转自DockOne-Kubernetes最佳实践S01E02:如何使用命名空间管理Kubernetes资源?

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
5天前
|
存储 Kubernetes 对象存储
部署DeepSeek但GPU不足,ACK One注册集群助力解决IDC GPU资源不足
借助阿里云ACK One注册集群,充分利用阿里云强大ACS GPU算力,实现DeepSeek推理模型高效部署。
|
1月前
|
弹性计算 运维 Kubernetes
使用ACK Edge统一管理多地域的ECS资源
本文介绍如何使用ACK Edge来管理分布在多个地域的ECS资源。
|
1月前
|
人工智能 运维 监控
容器服务Kubernetes场景下可观测体系生产级最佳实践
阿里云容器服务团队在2024年继续蝉联Gartner亚洲唯一全球领导者象限,其可观测体系是运维的核心能力之一。该体系涵盖重保运维、大规模集群稳定性、业务异常诊断等场景,特别是在AI和GPU场景下提供了全面的观测解决方案。通过Tracing、Metric和Log等技术,阿里云增强了对容器网络、存储及多集群架构的监控能力,帮助客户实现高效运维和成本优化。未来,结合AI助手,将进一步提升问题定位和解决效率,缩短MTTR,助力构建智能运维体系。
|
2月前
|
Kubernetes 算法 调度
阿里云 ACK FinOps成本优化最佳实践
本文源自2024云栖大会梁成昊演讲,讨论了成本优化策略的选择与实施。文章首先介绍了成本优化的基本思路,包括优化购买方式、调整资源配置等基础策略,以及使用弹性、资源混部等高级策略。接着,文章详细探讨了集群优化和应用优化的具体方法,如使用抢占式实例降低成本、通过资源画像识别并优化资源配置,以及利用智能应用弹性策略提高资源利用效率。
|
2月前
|
Kubernetes 容灾 调度
阿里云 ACK 高可用稳定性最佳实践
本文整理自2024云栖大会刘佳旭的演讲,主题为《ACK高可用稳定性最佳实践》。文章探讨了云原生高可用架构的重要性,通过Kubernetes的高可用案例分析,介绍了ACK在单集群高可用架构设计、产品能力和最佳实践方面的方法,包括控制面和数据面的高可用策略、工作负载高可用配置、企业版容器镜像服务高可用配置等内容,旨在帮助企业构建更加可靠和高效的应用运行环境。
|
3月前
|
Kubernetes 监控 API
深入解析Kubernetes及其在生产环境中的最佳实践
深入解析Kubernetes及其在生产环境中的最佳实践
121 1
|
3月前
|
存储 运维 Kubernetes
K8s业务迁移最佳实践: 灵活管理资源备份与调整策略,实现高效简便的应用恢复
在当今快速变化的云原生领域,Kubernetes(K8s)集群的运维面临着诸多挑战,其中灾备与业务迁移尤为关键。ACK备份中心支持丰富的资源调整策略,在数据恢复阶段即可自动适配目标集群环境,确保业务无缝重启。
|
3月前
|
Kubernetes 监控 开发者
掌握容器化:Docker与Kubernetes的最佳实践
【10月更文挑战第26天】本文深入探讨了Docker和Kubernetes的最佳实践,涵盖Dockerfile优化、数据卷管理、网络配置、Pod设计、服务发现与负载均衡、声明式更新等内容。同时介绍了容器化现有应用、自动化部署、监控与日志等开发技巧,以及Docker Compose和Helm等实用工具。旨在帮助开发者提高开发效率和系统稳定性,构建现代、高效、可扩展的应用。
|
4月前
|
JSON 运维 Kubernetes
|
4月前
|
NoSQL 关系型数据库 Redis
高可用和性能:基于ACK部署Dify的最佳实践
本文介绍了基于阿里云容器服务ACK,部署高可用、可伸缩且具备高SLA的生产可用的Dify服务的详细解决方案。

热门文章

最新文章