namespace和network-凯发k8国际娱乐官网入口
namespace(命名空间)是一种在多个用户之间划分资源的方法。适用于用户中存在多个团队或项目的情况。当前云容器实例提供“通用计算型”和“gpu型”两种类型的资源,创建命名空间时需要选择资源类型,后续创建的负载中容器就运行在此类型的集群上。
- 通用计算型:支持创建含cpu资源的容器实例及工作负载,适用于通用计算场景。
- gpu型:支持创建含gpu资源的容器实例及工作负载,适用于深度学习、科学计算、视频处理等场景。
network是云容器实例扩展的一种kubernetes资源对象,用于关联vpc及子网,从而使得容器实例能够使用公有云的网络资源。
namespace与网络的关系
从网络角度看,命名空间对应一个虚拟私有云(vpc)中一个子网,如图1所示,在创建命名空间时会关联已有vpc或创建一个新的vpc,并在vpc下创建一个子网。后续在该命名空间下创建pod、service等资源时都会在对应的vpc及子网之内,且占用子网中的ip地址。
通常情况下,如果您在同一个vpc下还会使用其他服务的资源,您需要考虑您的网络规划,如子网网段划分、ip数量规划等,确保有可用的网络资源。
哪些情况下适合使用多个命名空间
因为namespace可以实现部分的环境隔离,当您的项目和人员众多的时候可以考虑根据项目属性,例如生产、测试、开发划分不同的namespace。
创建namespace
namespace下需要有一个network关联vpc及子网,创建完namespace后需要创建一个network。
通常情况下,没有频繁创建namespace的需求,建议通过云容器实例的控制台界面创建namespace,具体方法请参见。
以下示例创建一个名为namespace-test的namespace,指定云容器实例的资源类型为general-computing。
apiversion: v1
kind: namespace
metadata:
name: namespace-test
labels:
sys_enterprise_project_id: "0"
annotations:
namespace.kubernetes.io/flavor: general-computing
spec:
finalizers:
- kubernetes
这里的定义文件采用yaml格式描述(如果您对yaml格式不了解,可以参考),也可使用json格式。
- sys_enterprise_project_id:表示企业项目id,可进入的企业项目详情页面获取。未开通企业管理的用户无需配置此参数。不配置时默认为0,表示default企业项目。
- namespace.kubernetes.io/flavor: general-computing:指定命名空间类型。
命令空间的类型有如下两种:
- general-computing:通用计算型,支持创建含cpu资源的容器实例及工作负载,适用于通用计算场景。
- gpu-accelerated:gpu型,支持创建含gpu资源的容器实例及工作负载,适用于深度学习、科学计算、视频处理等场景。
假如上面namespace定义的文件名称为ns.yaml,则执行kubectl create -f ns.yaml即可创建命名空间,-f 表示从文件创建。
# kubectl create -f ns.yaml namespace/namespace-test created
执行kubectl get ns查询namespace是否创建成功,ns为namespace的缩写。
# kubectl get ns name status age namespace-test active 23s
如上,可以看到namespace-test这个命名空间创建成功,且存在的时长为23秒。
登录云容器实例控制台,单击左侧导航栏“命名空间”,您可以看到命令空间创建成功,但状态为“异常”。这是因为在云容器实例中,您需要为namespace定义网络策略,具体操作方法请参见创建network。
创建network
namespace创建好后,需要为namespace创建网络策略,关联vpc及子网。
apiversion: networking.cci.io/v1beta1 kind: network metadata: annotations: network.alpha.kubernetes.io/default-security-group: security-group-id network.alpha.kubernetes.io/domain-id: domain-id network.alpha.kubernetes.io/project-id: project-id name: test-network spec: cidr: 192.168.0.0/24 attachedvpc: vpc-id networkid: network-id networktype: underlay_neutron subnetid: subnet-id
此处vpc和子网的网段不能为10.247.0.0/16,10.247.0.0/16是云容器实例预留给service的网段。如果您使用此网段,后续可能会造成ip冲突,导致负载无法创建或服务不可用;如果您不需要通过service访问,而是直接访问pod,则可以使用此网段。
上面参数获取方法如下:
- network.alpha.kubernetes.io/domain-id:账号id,可以在获取。
- network.alpha.kubernetes.io/project-id:项目id,可以在获取。
- network.alpha.kubernetes.io/default-security-group:安全组id,可以在获取,如下图。
图3 获取安全组id
- cidr:子网网段。
- attachedvpc:虚拟私有云的id,可在vpc控制台获取。
图4 获取vpc id
- networkid:子网的网络id,可在vpc控制台 > 子网中获取。
图5 获取子网的网络id
- networktype:网络类型,当前仅支持underlay_neutron网络模式。
- subnetid:子网id,可在vpc控制台 > 子网获取。
图6 获取子网id
假如上面network定义的文件名称为network.yaml,则执行kubectl create -f network.yaml即可创建命名空间,-f 表示从文件创建。这里--namespace namespace-test是指定在namespace-test这个命名空间下创建。
# kubectl create -f network.yaml --namespace namespace-test network.networking.cci.io/test-network created
登录云容器实例控制台,单击左侧导航栏“命名空间”,您可以看到命令空间创建成功,且状态为“正常”。
为kubectl上下文指定namespace
上面创建network是在指定的namespace下创建的,本文档后续的资源创建都是在某个命名空间下操作,每次都指定命名空间比较麻烦,您可以为kubectl上下文指定命名空间,这样在某个上下文中,创建的资源就都是在某个命名空间下,方便操作。
指定namespace只需要在设置上下文命令中添加一个“--namespace”选项,如下所示。
kubectl config set-context $context --namespace=$ns
其中,$ns为namespace的名称;$context 为上下文的名称,可以自定义,也可执行如下命令获取:
# kubectl config get-contexts current name cluster authinfo namespace cci-context-cn-east-3-1c8pni0poppcsfgxpm6s cci-cluster-cn-east-3 cci-user-cn-east-3-1c8pni0poppcsfgxpm6s * cci-context-cn-east-3-hwuser_xxx cci-cluster-cn-east-3 cci-user-cn-east-3-hwuser_xxx kubernetes-admin@kubernetes kubernetes kubernetes-admin
假设,上面创建的namespace名称为namespace-test,则示例如下。
# kubectl config set-context cci-context --namespace=namespace-test
指定namespace后,就可以使用 kubectl 命令直接操作云容器实例的相关资源。如下所示,执行kubectl get pod,查看pod资源,一切正常。
# kubectl get pod no resources found.
意见反馈
文档内容是否对您有帮助?
如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨