Kubernetes部署与运维10 命名空间Namespace

136 阅读9分钟

Kubernetes目前大约每年发布三次,由于迭代速度快,目前市场上绝大部分的教程相对陈旧。更重要的是,从Kubernetes 1.20开始,Kubernetes官方宣布逐步弃用Docker作为容器运行时,并计划在Kubernetes 1.24版本中完全移除对Docker作为容器运行时的支持。这意味着,从Kubernetes 1.24版本开始,将不能使用Docker作为容器运行时来运行Kubernetes节点上的Pods。因此,市场上关于直接使用containerd容器运行时的新版Kubernetes教程几乎没有,更重要的是因为的Kubernetes涉及到镜像需要单独配置才能获取,这无疑拉高了初学者门槛。本教程采用互联网的形式进行发布,便于保持与Kubernetes最新版的同步,尽量自包含,便于读者学习、实践。

关键字Kubernetes 1.32; containerd; nerdctl; debain 12

整体规划

为方便后续内容学习,本部分将基于【Kubernetes部署与运维07 Helm部署】中的环境开展KubernetesNamespace学习。整体规划如下:

虚拟机名称IP地址主机名域名CPU核心内存角色
k8s_Master1_2G192.168.152.200master1master.rz22GBmaster
K8s_Worker1_2G192.168.152.201worker1worker1.rz12GBworker
K8s_Worker2_2G192.168.152.202worker2worker2.rz12GBworker
参见【Kubernetes部署与运维02 Nerdctl Rootful部署】,Kubernetes基础环境各组件与版本信息如下:
- nerdctl: v1.7.7
- containerd: v1.7.22
- runc: v1.1.14
- CNI plugins: v1.5.1
- BuildKit: v0.15.2
- Stargz Snapshotter: v0.15.1
- imgcrypt: v1.1.11
- RootlessKit: v2.3.1
- slirp4netns: v1.3.1
- bypass4netns: v0.4.1
- fuse-overlayfs: v1.13
- containerd-fuse-overlayfs: v1.0.8
- Kubo (IPFS): v0.29.0
- Tini: v0.19.0
- buildg: v0.4.1

Kubernetes版本号为1.32

理论知识

【官方参考文档】

  • https://kubernetes.io/zh/docs/concepts/overview/working-with-objects/namespaces/
  • https://kubernetes.io/zh/docs/tasks/administer-cluster/namespaces/

Kubernetes支持多个虚拟集群,它们底层依赖于同一个物理集群。这些虚拟集群被称为命名空间(namespace)。命名空间的使用场景:

  • 命名空间为资源的名称提供了一个使用范围。资源的名称需要在命名空间内是唯一的,但不能跨命名空间。命名空间不能相互嵌套,每个Kubernetes资源只能存在于一个命名空间中;
  • 命名空间是在多个用户之间划分集群资源的一种方法(通过资源配额)。对于只有几到几十个用户的集群,根本不需要创建或考虑名字空间;
  • 不需要使用多个命名空间来分隔轻微不同的资源,例如同一软件的不同版本。可使用标签Label区分同一命名空间中的不同资源。

【常识与技巧】 在实际项目中客户往往是在一个项目中有多个团队,而Namespaces不支持嵌套所以并不满足实际项目的需求。在众多企业级PaaS云平台产品中还会有一个资源叫Project。原生的Kubernetes是没有Porject资源的,因此无法创建Project资源。如果需要创建Project,则需要企业级的云产品(云平台),比如灵雀云、Rancher等。

大多数Kubernetes资源(例如PodService、副本控制器等)都位于某些命名空间中。但是命名空间资源本身并不在名字空间中,而底层资源,例如节点和持久化卷不属于任何名字空间。

案例实践

前期准备

1)同时开启K8s_Master1_2GK8s_Worker1_2GK8s_Worker2_2G三台虚拟机。

2)在主节点master1上创建/root/tutor/namespaces文件夹:

root@master1:~# mkdir -p /root/tutor/namespace

命名空间命令行查看、创建与删除

【实践01- 命名空间查看、创建与删除】

使用Kubernetes命令查看、创建与删除命名空间。

1)命名空间的查看,如同其他资源一样,可以使用kubectl get namespaces命令查看集群中的所有命名空间:

root@master1:~# kubectl get namespaces
NAME              STATUS   AGE
default           Active   25h
kube-node-lease   Active   25h
kube-public       Active   25h
kube-system       Active   25h

可以发现在集群部署之后,默认存在四个命名空间:defaultkube-node-leasekube-publickube-system

Kubernetes存在着四个初始的命名空间:

  • default:没有指明使用其它名字空间的对象所使用的默认名字空间;
  • kube-systemKubernetes系统创建对象时所使用的名字空间,可以理解为Windows系统中的C盘(系统盘);
root@master1:~# kubectl -n kube-system get pods
NAME                                       READY   STATUS    RESTARTS       AGE
calico-kube-controllers-5745477d4d-x4dbj   1/1     Running   5 (119m ago)   23h
calico-node-d9sv5                          1/1     Running   5 (119m ago)   23h
calico-node-ntx28                          1/1     Running   4 (119m ago)   8h
calico-node-zpbc2                          1/1     Running   4 (119m ago)   10h
coredns-6766b7b6bb-hqgsd                   1/1     Running   5 (119m ago)   25h
coredns-6766b7b6bb-w8ztk                   1/1     Running   5 (119m ago)   25h
etcd-master1                               1/1     Running   6 (119m ago)   25h
kube-apiserver-master1                     1/1     Running   6 (119m ago)   25h
kube-controller-manager-master1            1/1     Running   6 (119m ago)   25h
kube-proxy-b8n2k                           1/1     Running   4 (119m ago)   8h
kube-proxy-h2v5l                           1/1     Running   6 (119m ago)   25h
kube-proxy-jf5tm                           1/1     Running   4 (119m ago)   10h
kube-scheduler-master1                     1/1     Running   6 (119m ago)   25h
metrics-server-554dcb6944-kplgb            1/1     Running   2 (119m ago)   5h23m

其中kubectl命令中,可以通过参数-n来指定访问具体命名空间中的资源。

  • kube-public:所有用户(包括未经过身份验证的用户)都可以读取它。该命名空间主要用于集群使用,以防某些资源在整个集群中应该是可见和可读的。其公共性方面只是一种约定,而不是要求。一般不需要运维人员管理与维护该namespace
  • kube-node-lease:此命名空间用于与各个节点相关的租期(Lease)对象;此对象的设计使得集群规模很大时节点心跳检测性能得到提升。一般不需要运维人员管理与维护该namespace

四个初始的命名空间是不允许被删除的。

2)可使用kubectl create namespace <name>命令创建自定义的命名空间:

root@master1:~# kubectl create namespace rz-cloud
namespace/rz-cloud created

root@master1:~# kubectl create namespace rz-k8s
namespace/rz-k8s created

root@master1:~# kubectl get namespaces
NAME              STATUS   AGE
default           Active   25h
kube-node-lease   Active   25h
kube-public       Active   25h
kube-system       Active   25h
rz-cloud          Active   17s
rz-k8s            Active   6s

不同的团队可以在不同的命名空间中发布应用,互不影响。默认不同命名空间中的应用可以互相访问与通信。

3)可使用kubectl delete namespace <name>命令删除命名空间:

root@master1:~# kubectl delete namespaces rz-cloud
namespace "rz-cloud" deleted

root@master1:~# kubectl delete namespaces rz-k8s
namespace "rz-k8s" deleted

root@master1:~# kubectl delete namespaces kube-public
Error from server (Forbidden): namespaces "kube-public" is forbidden: this namespace may not be deleted

root@master1:~# kubectl get namespaces
NAME              STATUS   AGE
default           Active   25h
kube-node-lease   Active   25h
kube-public       Active   25h
kube-system       Active   25h

可以删除之前创建的rz-cloudrz-k8s两个命名空间,但是无法删除四个初始命名空间。

命名空间配置文件创建与删除

【实践02- 使用配置文件创建与删除命名空间】

除了可以使用kubectl命令创建、删除命名空间之外,还可以使用yaml配置文件(脚本)创建、删除命名空间。

1)进入主节点master1上的/root/tutor/namespaces 目录:

root@master1:~# cd /root/tutor/namespace

2)创建/root/tutor/namespace/namespace1.yaml文件,内容如下:

apiVersion: v1
kind: Namespace
metadata:
  name: rz-cloud

其中:

  • apiVersionAPI的版本号。其值v1表示Namespace的版本信息,核心组件。该值可以参见kubectl api-resource命令输出中的APIVERSION列值;
  • Namespace表示其为命名空间资源,该值可以参见kubectl api-resource命令输出中的KIND列值,注意大小写;
  • name字段则表示当前配置文件所描述的命名空间的名称,这里为rz-cloud

3)yaml文件各字段的定义与解释,可以使用kube explain namespace命令查看:

root@master1:~# kubectl explain namespace
KIND:       Namespace
VERSION:    v1

DESCRIPTION:
    Namespace provides a scope for Names. Use of multiple namespaces is
    optional.

FIELDS:
  apiVersion    <string>
    APIVersion defines the versioned schema of this representation of an object.
    Servers should convert recognized schemas to the latest internal value, and
    may reject unrecognized values. More info:
    https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
...

4)可使用kubectl create -f <fileName>命令通过指定文件来创建所描述的资源。

root@master1:~# cd /root/tutor/namespace/

root@master1:~/tutor/namespace# kubectl create -f namespace1.yaml
namespace/rz-cloud created

root@master1:~/tutor/namespace# kubectl get namespaces
NAME              STATUS   AGE
default           Active   26h
kube-node-lease   Active   26h
kube-public       Active   26h
kube-system       Active   26h
rz-cloud          Active   6s

需要说明的,使用kubectl create命令不可以创建两个相同的资源。如果再次应用kubectl create -f namespace1.yaml命令(假设namespace1.yaml文件内容未发生变化),则会报错,提示已经存在rz-cloud命名空间:

root@master1:~/tutor/namespace# kubectl create -f namespace1.yaml
Error from server (AlreadyExists): error when creating "namespace1.yaml": namespaces "rz-cloud" already exists

5)可使用kubectl delete -f <fileName>命令通过指定文件来删除所描述的资源:

root@master1:~/tutor/namespace# kubectl delete -f namespace1.yaml
namespace "rz-cloud" deleted

root@master1:~/tutor/namespace# kubectl get namespaces
NAME              STATUS   AGE
default           Active   26h
kube-node-lease   Active   26h
kube-public       Active   26h
kube-system       Active   26h

【常识与技巧】 使用命令行进行诸如命名空间、PodKubernetes资源的创建,可以用于小场景或测试场景。在实际生产运维过程中,往往需要正式部署之前进行充分的测试与验证,通过测试与验证之后,再在生产环境下进行部署,这便需要确保在生产环境下的部署包括输入的命令在内均是正确无误的,使用脚本(例如yaml格式的配置文件)可以大大降低命令误输入的可能。

收尾工作

1)使用poweroff命令,关闭三台虚拟机。

2)AI时代背景之下,运维将从传统CPU服务器切入到GPU服务器与端边设备,对于运维开发人员,技术玩家而言,也同步需要跟上新的技术栈。本学习内容涉及到的软件包、配置文件等资源,可以直接从百度网盘下载获取:

  • 百度网盘分享文件:Kubernetes1.32
  • 链接:https://pan.baidu.com/s/18XeGQ28BDPjHh8JKj0uZFQ?pwd=6x17 提取码:6x17