K8s学习笔记 (3)
@ wgjak47 | 星期二,七月 23 日,2019 年 | 4 分钟阅读 | 更新于 星期二,七月 23 日,2019 年

k8s学习笔记

集群管理

Node

node是kubernetes的集群工作节点,可以是物理机也可以是虚拟机

Node状态

Node状态包含以下信息

  • Address
  • HostName
  • ExternalIP
  • InternalIP
  • Condition
  • OutOfDisk
  • Read
  • MemoryPressure
  • DiskPressure
  • Capacity
  • CPU
  • Memory
  • MaxPodNum
  • Info
  • OS info
  • kubernetes info
  • docker info
  • etc.

Node管理操作

  • 禁止pod调度到该节点上
kubectl cordon <node>

恢复

kubectl uncordon <node>
  • 驱逐该节点上的所有pod
kubectl drain <node>

Namespace

提供独立的命名空间,实现部分环境隔离。

获取namespace

kubectl get ns

Label

label是附着在k8s object上的键值对。用于将组织架构映射到系统架构上,并通过label selector进行批量操作,便于服务个管理。

注意事项

  • label key 不超过63个字符
  • label key可以使用前缀,使用/分割,前缀必须是dns子域,不超过253字符
  • label key起始必须是字母或数字,中间可以有连字符,下划线和点
  • label value 不超过63个字符
  • label value起始必须是字母或数字,中间可以有连字符,下划线和点
  • object的label不是唯一的

label selector

  • equality-based: 使用=、==、!=操作符,可以使用,分割多个表达式
  • set-based: 使用in,notin, !操作符,也可以直接写key,无操作符,查找包含该key的objects

例子:

$ kubectl get pods -l environment=production,tier=frontend
$ kubectl get pods -l 'environment in (production),tier in (frontend)'
$ kubectl get pods -l 'environment in (production, qa)'
$ kubectl get pods -l 'environment,environment notin (frontend)'
selector:
matchLabels:
component: redis
matchExpressions:
- {key: tier, operator: In, values: [cache]}
- {key: environment, operator: NotIn, values: [dev]}
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/e2e-az-name
operator: In
values:
- e2e-az1
- e2e-az2
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value

Annotation(注解)

Annotation可以将Kubernetes资源对象关联到任意的非标识性元数据。

  • 声明配置层管理的字段。使用annotation关联这类字段可以用于区分以下几种配置来源:客户端或服务器设置的默认值,自动生成的字段或自动生成的 auto-scaling 和 auto-sizing 系统配置的字段。
  • 创建信息、版本信息或镜像信息。例如时间戳、版本号、git分支、PR序号、镜像哈希值以及仓库地址。
  • 记录日志、监控、分析或审计存储仓库的指针
  • 可以用于debug的客户端(库或工具)信息,例如名称、版本和创建信息。
  • 用户信息,以及工具或系统来源信息、例如来自非Kubernetes生态的相关对象的URL信息。
  • 轻量级部署工具元数据,例如配置或检查点。
  • 负责人的电话或联系方式,或能找到相关信息的目录条目信息,例如团队网站。

例子:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: istio-manager
spec:
replicas: 1
template:
metadata:
# 这里对k8s的好像没啥卵用,istio是用模板语言来对这个字段进行判断
# 从而使这个东西生效的
annotations:
alpha.istio.io/sidecar: ignore
labels:
istio: manager
spec:
serviceAccountName: istio-manager-service-account
containers:
- name: discovery
image: harbor-001.jimmysong.io/library/manager:0.1.5
imagePullPolicy: Always
args: ["discovery", "-v", "2"]
ports:
- containerPort: 8080
env:
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: apiserver
image: harbor-001.jimmysong.io/library/manager:0.1.5
imagePullPolicy: Always
args: ["apiserver", "-v", "2"]
ports:
- containerPort: 8081
env:
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace

Taint/Toleration

Taint(污点)和 Toleration(容忍)可以作用于 node 和 pod 上,其目的是优化 pod 在集群间的调度,这跟节点亲和性类似,只不过它们作用的方式相反,具有 taint 的 node 和 pod 是互斥关系,而具有节点亲和性关系的 node 和 pod 是相吸的。另外还有可以给 node 节点设置 label,通过给 pod 设置 nodeSelector 将 pod 调度到具有匹配标签的节点上。

例子:

  • Taint
set taint
kubectl taint nodes node1 key1=value1:NoSchedule
kubectl taint nodes node1 key1=value1:NoExecute
kubectl taint nodes node1 key2=value2:NoSchedule

del taint
kubectl taint nodes node1 key1:NoSchedule-
kubectl taint nodes node1 key1:NoExecute-
kubectl taint nodes node1 key2:NoSchedule-

show taint

kubectl descirbe nodes node1

  • toleration
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
- key: "node.alpha.kubernetes.io/unreachable"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 6000

垃圾收集

Kubernetes 垃圾收集器的角色是删除指定的对象,这些对象曾经有但以后不再拥有 Owner 了。

Owner/Dependent

一些 Kubernetes 对象是其它一些的 Owner。例如,一个 ReplicaSet 是一组 Pod 的 Owner。具有 Owner 的对象被称为是 Owner 的 Dependent。每个 Dependent 对象具有一个指向其所属对象的 metadata.ownerReferences 字段。

例子:

apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: my-repset
spec:
replicas: 3
selector:
matchLabels:
pod-is-for: garbage-collection-example
template:
metadata:
labels:
pod-is-for: garbage-collection-example
spec:
containers:
- name: nginx
image: nginx

kubectl create -f https://k8s.io/docs/concepts/abstractions/controllers/my-repset.yaml
kubectl get pods --output=yaml

apiVersion: v1
kind: Pod
metadata:
...
ownerReferences:
- apiVersion: extensions/v1beta1
controller: true
blockOwnerDeletion: true
kind: ReplicaSet
name: my-repset
uid: d9607e19-f88f-11e6-a518-42010a800195
...

控制垃圾收集器删除 Dependent

当删除对象时,可以指定是否该对象的 Dependent 也自动删除掉。自动删除 Dependent 也称为 级联删除。Kubernetes 中有两种 级联删除 的模式:background 模式和 foreground 模式。

如果删除对象时,不自动删除它的 Dependent,这些 Dependent 被称作是原对象的 孤儿。

Background 级联删除

在 background 级联删除 模式下,Kubernetes 会立即删除 Owner 对象,然后垃圾收集器会在后台删除这些 Dependent。

Foreground 级联删除

在 foreground 级联删除 模式下,根对象首先进入 “删除中” 状态。在 “删除中” 状态会有如下的情况:

  • 对象仍然可以通过 REST API 可见
  • 会设置对象的 deletionTimestamp 字段
  • 对象的 metadata.finalizers 字段包含了值 “foregroundDeletion”

设置级联删除策略

owner的deleteOptions.propagationPolicy

  • orphan default
  • Foreground
  • Background