0
点赞
收藏
分享

微信扫一扫

k8s学习-基础操作2

使用名称空间共享集群

查看名称空间

查看集群中的名称空间列表:

kubectl get namespaces

输出结果

NAME          STATUS    AGE
default Active 11d
kube-system Active 11d
kube-public Active 11d

Kubernetes 安装成功后,默认有初始化了三个名称空间:

  • default默认名称空间,如果 Kubernetes 对象中不定义metadata.namespace 字段,该对象将放在此名称空间下
  • kube-systemKubernetes系统创建的对象放在此名称空间下
  • kube-public此名称空间自动在安装集群是自动创建,并且所有用户都是可以读取的(即使是那些未登录的用户)。主要是为集群预留的,例如,某些情况下,某些Kubernetes对象应该被所有集群用户看到。

查看名称空间的概要信息

kubectl describe namespaces <name>

输出结果如下

Name:           default
Labels: <none>
Annotations: <none>
Status: Active

No resource quota.

Resource Limits
Type Resource Min Max Default
---- -------- --- --- ---
Container cpu - - 100m
  • Resource quota 汇总了名称空间中使用的资源总量,并指定了集群管理员定义该名称空间最多可以使用的资源量
  • Limit range 定义了名称空间中某种具体的资源类型的最大、最小值

名称空间可能有两种状态(phase):

  • Active名称空间正在使用中
  • Termining名称空间正在被删除,不能再向其中创建新的对象

创建名称空间

使用 kubectl 有两种方式可以创建名称空间

  • 通过 yaml 文件,创建文件my-namespace.yaml 内容如下:
apiVersion: v1
kind: Namespace
metadata:
name: <名称空间的名字>

执行命令

kubectl create -f ./my-namespace.yaml
  • 直接使用命令创建名称空间
kubectl create namespace <名称空间的名字>

删除名称空间

kubectl delete namespaces <名称空间的名字>

使用名称空间切分集群

default

默认情况下,安装Kubernetes集群时,会初始化一个 default 名称空间,用来将承载那些未指定名称空间的 Pod、Service、Deployment等对象

创建新的名称空间

创建两个 Kubernetes 名称空间。

假设企业使用同一个集群作为开发环境和生产环境(注意:通常开发环境和生产环境是物理隔绝的):

  • 开发团队期望有一个集群中的空间,以便他们可以查看查看和使用他们创建的 Pod、Service、Deployment等。在此空间中,Kubernetes对象被创建又被删除,为了适应敏捷开发的过程,团队中的许多人都可以在此空间内做他们想做的事情。
  • 运维团队也期望有一个集群中的空间,在这里,将有严格的流程控制谁可以操作 Pod、Service、Deployment等对象,因为这些对象都直接服务于生产环境。

此时,该企业可以将一个Kubernetes集群切分成两个名称空间:development 和 production。创建名称空间的 yaml 文件如下所示:

apiVersion: v1
kind: Namespace
metadata:
name: development
labels:
name: development

执行命令以创建 development 名称空间:

kubectl create -f https://kuboard.cn/statics/learning/namespace/dev.yaml #创建命名空间
kubectl get namespaces --show-labels #查看已创建的名称空间

输出结果

NAME          STATUS    AGE       LABELS
default Active 32m <none>
development Active 29s name=development
production Active 23s name=production

在每个名称空间中创建POD

Kubernetes名称空间为集群中的 Pod、Service、Deployment 提供了一个作用域。可以限定使用某个名称空间的用户不能看到另外一个名称空间中的内容。

检查当前的kubectl上下文

kubectl config view

输出结果

apiVersion: v1
clusters:
- cluster:
certificate-authority-data: REDACTED
server: https://130.211.122.180
name: lithe-cocoa-92103_kubernetes
contexts:
- context:
cluster: lithe-cocoa-92103_kubernetes
user: lithe-cocoa-92103_kubernetes
name: lithe-cocoa-92103_kubernetes
current-context: lithe-cocoa-92103_kubernetes
kind: Config
preferences: {}
users:
- name: lithe-cocoa-92103_kubernetes
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
token: 65rZW78y8HbwXXtSXuUw9DbP4FLjHi4b
- name: lithe-cocoa-92103_kubernetes-basic-auth
user:
password: h5M0FtUUIflBSdI7
username: admin

执行

kubectl config current-context
################################
#输出结果
lithe-cocoa-92103_kubernetes

接下来,为 kubectl 定义一个上下文,以便在不同的名称空间中工作。cluster​ 和 user 字段的取值从前面的 current context 复制过来:

kubectl config set-context dev --namespace=development --cluster=lithe-cocoa-92103_kubernetes --user=lithe-cocoa-92103_kubernetes
kubectl config set-context prod --namespace=production --cluster=lithe-cocoa-92103_kubernetes --user=lithe-cocoa-92103_kubernetes
#切换命名空间
kubectl config use-context dev
#验证
kubectl config current-context
dev

此时,通过 kubectl 向 Kubernetes 集群发出的所有指令都限定在名称空间 development 里

示例

kubectl run snowflake --image=nginx:1.7.9 --replicas=2  #创建副本为2的nginx
kubectl get deployment #查看
###########################
#输出结果
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
snowflake 2 2 2 2 2m

kubectl get pods -l run=snowflake
##########################
#输出结果
NAME READY STATUS RESTARTS AGE
snowflake-3968820950-9dgr8 1/1 Running 0 2m
snowflake-3968820950-vgc4n 1/1 Running 0 2m

用户在一个名称空间创建的内容对于另外一个名称空间来说是不可见的。

标签和选择器

标签(Label)是附加在Kubernetes对象上的一组名值对,其意图是按照对用户有意义的方式来标识Kubernetes对象,同时,又不对Kubernetes的核心逻辑产生影响。标签可以用来组织和选择一组Kubernetes对象。您可以在创建Kubernetes对象时为其添加标签,也可以在创建以后再为其添加标签。每个Kubernetes对象可以有多个标签,同一个对象的标签的 Key 必须唯一,例如:

metadata:
labels:
key1: value1
key2: value2

​使用标签(Label)可以高效地查询和监听Kubernetes对象,在Kubernetes界面工具(如 Kubenetes Dashboard 或 Kuboard)和 kubectl 中,标签的使用非常普遍。那些非标识性的信息应该记录在注解(annotation)

使用标签的原因

使用标签,用户可以按照自己期望的形式组织 Kubernetes 对象之间的结构,而无需对 Kubernetes 有任何修改。

应用程序的部署或者批处理程序的部署通常都是多维度的(例如,多个高可用分区、多个程序版本、多个微服务分层)。管理这些对象时,很多时候要针对某一个维度的条件做整体操作,例如,将某个版本的程序整体删除,这种情况下,如果用户能够事先规划好标签的使用,再通过标签进行选择,就会非常地便捷。

标签的例子有:

  • release: stable、release: canary
  • environment: dev、environment: qa、environment: production
  • tier: frontend、tier: backend、tier: cache
  • partition: customerA、partition: customerB
  • track: daily、track: weekly

语法和字符集

标签是一组名值对(key/value pair)。标签的 key 可以有两个部分:可选的前缀和标签名,通过 / 分隔。

  • 标签名:
  • 标签名部分是必须的
  • 不能多于 63 个字符
  • 必须由字母、数字开始和结尾
  • 可以包含字母、数字、减号-、下划线_、小数点.
  • 标签前缀:
  • 标签前缀部分是可选的
  • 如果指定,必须是一个DNS的子域名,例如:k8s.eip.work
  • 不能多于 253 个字符
  • 使用/ 和标签名分隔

如果省略标签前缀,则标签的 key 将被认为是专属于用户的。Kubernetes的系统组件(例如,kube-scheduler、kube-controller-manager、kube-apiserver、kubectl 或其他第三方组件)向用户的Kubernetes对象添加标签时,必须指定一个前缀。

kubernetes.io/ 和 k8s.io/ 这两个前缀是 Kubernetes 核心组件预留的。Kuboard 使用 k8s.eip.work 这个前缀。

以下的pod包含两个标签

apiVersion: v1
kind: Pod
metadata:
name: label-demo
labels:
environment: production
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80

标签选择器

与 name 和 UID 不同,标签不一定是唯一的。通常来讲,会有多个Kubernetes对象包含相同的标签。通过使用标签选择器(label selector),用户/客户端可以选择一组对象。标签选择器(label selector)是 Kubernetes 中最主要的分类和筛选手段。

Kubernetes api server支持两种形式的标签选择器,equality-based 基于等式的 和 set-based 基于集合的。标签选择器可以包含多个条件,并使用逗号分隔,此时只有满足所有条件的 Kubernetes 对象才会被选中。

如果使用空的标签选择器或者不指定选择器,其含义由具体的 API 接口决定。

基于等式

Equality- 或者 inequality-based 选择器可以使用标签的名和值来执行过滤选择。只有匹配所有条件的对象才被选中(被选中的对象可以包含未指定的标签)。可以使用三种操作符 =、==、!=。前两个操作符含义是一样的,都代表相等,后一个操作符代表不相等。例如:

# 选择了标签名为 `environment` 且 标签值为 `production` 的Kubernetes对象
environment = production
# 选择了标签名为 `tier` 且标签值不等于 `frontend` 的对象,以及不包含标签 `tier` 的对象
tier != frontend

下面的yaml示例,表示pod将会调度到包含标签 accelerator=nvidia-tesla-p100 的节点上:

apiVersion: v1
kind: Pod
metadata:
name: cuda-test
spec:
containers:
- name: cuda-test
image: "k8s.gcr.io/cuda-vector-add:v0.1"
resources:
limits:
nvidia.com/gpu: 1
nodeSelector:
accelerator: nvidia-tesla-p100

基于集合

Set-based 标签选择器可以根据标签名的一组值进行筛选。支持的操作符有三种:in、notin、exists。例如:

# 选择所有的包含 `environment` 标签且值为 `production` 或 `qa` 的对象
environment in (production, qa)
# 选择所有的 `tier` 标签不为 `frontend` 和 `backend`的对象,或不含 `tier` 标签的对象
tier notin (frontend, backend)
# 选择所有包含 `partition` 标签的对象
partition
# 选择所有不包含 `partition` 标签的对象
!partition


API

查询条件

LIST 和 WATCH 操作时,可指定标签选择器作为查询条件,以筛选指定的对象集合。两种选择方式都可以使用,但是要符合 URL 编码,例如:

  • 基于等式的选择方式:?labelSelector=environment%3Dproduction,tier%3Dfrontend
  • 基于集合的选择方式:?labelSelector=environment+in+%28production%2Cqa%29%2Ctier+in+%28frontend%29
#基于等式
kubectl get pods -l environment=production,tier=frontend
#基于集合
kubectl get pods -l 'environment in (production),tier in (frontend)'

k8s对象引用

某些 Kubernetes 对象中(例如,Service和Deployment),使用标签选择器指定一组其他类型的 Kubernetes 对象(例如,Pod)

Service

Service 中通过 spec.selector 字段来选择一组 Pod,并将服务请求转发到选中的 Pod 上。

在 yaml 或 json 文件中,标签选择器用一个 map 来定义,且支持基于等式的选择方式,例如:

selector:
component: redis

注解

注解(annotation)可以用来向 Kubernetes 对象的 metadata.annotations 字段添加任意的信息。Kubernetes 的客户端或者自动化工具可以存取这些信息以实现其自定义的逻辑。

添加注解

Kubernetes 对象的 metadata​ 字段可以添加自定义的标签(label)或者注解(annotation)。标签用来选择对象或者用来查找符合指定条件的一组对象。与此相对,注解不是用来标记对象或者选择对象的。metadata 中的注解可以很大,也可以很小;可以是结构化的,也可以是非结构化的;还可以包括标签中不允许出现的字符。

与标签相似,注解也是 key/value map

metadata:
annotations:
key1: value1
key2: value2

类似于下面的信息可以记录在注解中:

  • 声明式配置层用到的状态信息。
  • Build、release、image信息,例如 timestamp、release ID、git branch、PR number、image hash、registry address
  • 日志、监控、分析、审计系统的参数
  • 第三方工具所需要的信息,例如 name、version、build information、URL
  • 轻量级的发布工具用到的信息,例如,config、checkpoint
  • 负责人的联系方式,例如,电话号码、网址、电子信箱
  • 用户用来记录备忘信息的说明,例如,对标准镜像做了什么样的修改、维护过程中有什么特殊信息需要记住

注解示例

metadata:
annotations:
deployment.kubernetes.io/revision: 7 # 由Deployment控制器添加,用于记录当前发布的修改次数
k8s.eip.work/displayName: busybox # Kuboard添加,Deployment显示在Kuboard界面上的名字
k8s.eip.work/ingress: false # Kuboard添加,根据此参数显示Deployment是否配置了Ingress
k8s.eip.work/service: none # Kuboard添加,根据此参数显示Deployment是否配置了Service

字段选择器

字段选择器(Field Selector)可以用来基于的一个或多个字段的取值来选取一组Kubernetes对象。下面有一些示例性的字段选择器:

  • metadata.name=my-service
  • metadata.namespace!=default
  • status.phase=Pending

下面的 kubectl 命令选择了所有字段 status.phase 的取值为 Running 的 Pod:

kubectl get pods --field-selector status.phase=Running

以下是字段选择器示例

#可以指定多个字段选择器,用逗号 , 分隔。
kubectl get pods --field-selector=status.phase!=Running,spec.restartPolicy=Always
#字段选择器可以跨资源类型使用。下面的 kubectl 命令查询所有的不在 default 名称空间的 StatefulSet 和 Service:
kubectl get statefulsets,services --all-namespaces --field-selector metadata.namespace!=default


举报

相关推荐

k8s学习 - 存储2

k8s学习笔记-2

k8s(2)

k8s学习

K8S学习

k8s 学习

0 条评论