在Kubernetes系统中,Kubernetes对象是持久化的实体。Kubernetes使用这些实体去表示整个集群的状态。特别地,它们描述了如下信息:
哪些容器化应用在运行(以及在哪个 Node 上)
可以被应用使用的资源
关于应用运行时表现的策略,比如重启策略、升级策略,以及容错策略
Kubernetes对象是“目标性记录”。一旦创建对象,Kubernetes系统将持续工作以确保对象存在。通过创建对象,本质上是在告知Kubernetes系统,所需要的集群工作负载看起来是什么样子的,这就是Kubernetes集群的期望状态(Desired State)。
每个Kubernetes对象包含两个嵌套的对象字段,它们负责管理对象的配置:spec
(对象规约)和status
(对象状态) 。 spec
是必需的,它描述了对象的期望状态(Desired State)——希望对象所具有的特征。status
描述了对象的实际状态(Actual State),它是由Kubernetes系统提供和更新的。在任何时刻,Kubernetes控制面一直努力地管理着对象的实际状态以与期望状态相匹配。
- 必需字段:
在想要创建的Kubernetes对象对应的.yaml
文件中,需要配置如下的字段:
apiVersion - 创建该对象所使用的 Kubernetes API 的版本
kind - 想要创建的对象的类型
metadata - 帮助识别对象唯一性的数据,包括一个 name 字符串、UID 和可选的 namespace
大部分对象也需要提供对象的spec
字段。spec
的精确格式对每个Kubernetes对象来说是不同的,包含了特定于该对象的嵌套字段。
命名空间Namespace
命名空间Namespace本质上也是kubernetes的一种资源对象,主要起隔离作用:
资源对象的隔离:Service、Deployment、Pod
资源配额的隔离:CPU、Memory
大多数 kubernetes 资源(例如 Pod、服务、副本控制器等)都位于某些Namespace中。 但是Namespace资源本身并不在Namespace中。
而且底层资源,例如节点和持久化卷不属于任何Namespace。
查看哪些Kubernetes资源在Namespace中,哪些不在Namespace中:
kubectl api-resources --namespaced=true #资源在Namespace中
kubectl api-resources --namespaced=false #资源不在Namespace中
- 查看所有namespace:
# kubectl get namespaces
NAME STATUS AGE
default Active 13d
ingress-nginx Active 7d2h
kube-node-lease Active 13d
kube-public Active 13d
kube-system Active 13d
default是默认的Namespace。当创建Service、Deployment、Pod时不指定Namespace,则会创建在default这个Namespace下。
- 创建一个namespace:
# vim namespace-dev.yaml
apiVersion: v1
kind: Namespace
metadata:
name: dev
# kubectl create -f namespace-dev.yaml
# kubectl get namespaces
NAME STATUS AGE
default Active 13d
dev Active 28s
ingress-nginx Active 7d2h
kube-node-lease Active 13d
kube-public Active 13d
kube-system Active 13d
- 在dev namespace下创建资源对象:
在yaml文件中对应的资源分别指定Namespace,或创建资源时命令行指定Namespace(-n namespace
)。
# vim web-dev.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo
namespace: dev #指定namespace
spec:
selector:
matchLabels:
app: web-demo
replicas: 1
template:
metadata:
labels:
app: web-demo
spec:
containers:
- name: web-demo
image: hub.lzxlinux.cn/kubernetes/web:latest
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: web-demo
namespace: dev #指定namespace
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: web-demo
type: ClusterIP
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: web-demo
namespace: dev #指定namespace
spec:
rules:
- host: web-dev.lzxlinux.cn