一.K8S的组件
1.Control Plane Components
做出全局决策 比如资源调度
1.kube-apiserver
负责处理接受请求的工作(可以多个)
2.etcd
高可用数据库
3.kube-scheduler
负责监视新创建的、未指定运行节点(node)的 Pods
4.kube-controller-manager
节点控制器 任务控制器 端点控制器
5.cloud-controller-manager
允许你将你的集群连接到云提供商的 API 之上, 并将与该云平台交互的组件同与你的集群交互的组件分离开来
node
kubelet
它保证容器(containers)都运行在 Pod 中。
kube-proxy
集群中每个节点(node)所上运行的网络代理
Container Runtime
容器运行环境是负责运行容器的软件
Addons
DNS
Web 界面
容器资源监控
集群层面日志
二. Kubernetes 对象
Kubernetes 对象 是持久化的实体
Kubernetes 对象是目标性记录 一旦创建该对象,Kubernetes 系统将不断工作以确保该对象存在
对象规约(Spec)与状态(Status)
它们负责管理对象的配置
对于具有 spec 的对象,你必须在创建对象时设置其内容,描述你希望对象所具有的特征: 期望状态(Desired State)
1.Kubernetes 对象管理
kubectl diff -R -f configs/
kubectl apply -R -f configs/
2.对象名称和 IDs
集群中的每一个对象都有一个[名称] (#names)来标识在同类资源中的唯一性。 在一个名称空间中 pod和Deployment 都可以叫myapp-1234 ,但是不能有两个name=myapp-1234的pod
每个 Kubernetes 对象也有一个 [UID](#uids)来标识在整个集群中的唯一性。
3.名称空间
kubectl get namespace
kubectl create namespace xzqtest #不能用下划线 不符合规定
kubectl run nginx --image=nginx --namespace=<名字空间名称>
kubectl get pods --namespace=<名字空间名称>
#设置默认的名称空间
kubectl config set-context --current --namespace=<名字空间名称> #
# 验证
kubectl config view --minify | grep namespace:
4.名字空间和 DNS
创建一个 service 会自动创建dns
pod与Service 的 DNS
Kubernetes 为 Service 和 Pod 创建 DNS 记录 你可以使用一致的 DNS 名称访问 Service
Service 的名字空间
DNS 查询可能因为执行查询的 Pod 所在的名字空间而返回不同的结果 你在哪个pod查询dns 结果都不同
2.要查询dns必须指定名称空间 否则限制pod的名称空间内
3.要访问其他名称空间的 service 需要dns查询指定的名称空间
test : pod >
pod : service data
test的pod 查 data这个service 时 查不到 指定了 data.pod时 查到了
DNS 记录
Services
Pods
PODS aaa记录
POD 的hostname
1.hostname字段
2.建 Pod 时其主机名取自 Pod 的 metadata.name 值
POD 的subdomain
域名为 hostname.subdomain.namespace.svc.cluster-domain.example
# 位于名字空间中的资源
kubectl api-resources --namespaced=true
# 不在名字空间中的资源
kubectl api-resources --namespaced=false
标签
1.标签前缀是可选的 如果要必须是 子域
2.标签选择算符
api
, 标识 and
基于等式的 = ==,!=
基于集合的需求
environment in (production, qa)
tier notin (frontend, backend)
partition 包含了有 partition 标签的资源
!partition 没有 partition 标签的资源
3.api
kubectl get pods -l 'environment in (production, qa)'
4.
在 API 对象中设置引用
Finalizers
在某些动作完成 再清理你标记为finalizers的对象 你可以做垃圾清理之类的动作
如果你删除了一个资源对象(指定了 Finalizer)
那么 他会对 资源对象 填充 metadata.deletionTimestamp 说明删除的时间
此时控制平面或其他组件会采取 Finalizer 所定义的行动 而目标对象仍然处于终止中
这些行动完成后,控制器会删除目标对象相关的 Finalizer
kubernetes.io/pv-protection 例子
它是防止 PersistentVolume 被意外删除
当PersistentVolume 被pod 引用时会自动加入Finalizers
所以当pod没有被引用会立马删除
当有Finalizers 进入Terminating
直到你删除了pod引用的PersistentVolume
那么PersistentVolume会释放Finalizers 然后系统删除了
属主引用 Owner references, labels, and finalizers
ReplicaSet 是一组 Pod 的属主 owners
replicaset是pod的附属(Dependent)
ownerReferences.blockOwnerDeletion
用于控制特定的附属对象是否可以阻止垃圾收集删除其属主对象
“字段选择器(Field selectors)”允许你根据一个或多个资源字段的值 筛选 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
链式选择器
同标签和其他选择器一样, 字段选择器可以通过使用逗号分隔的列表组成一个选择链。 下面这个
kubectl
命令将筛选status.phase
字段不等于Running
同时spec.restartPolicy
字段等于Always
的所有 Pod:kubectl get pods --field-selector=status.phase!=Running,spec.restartPolicy=Always
apiVersion
对于节点,有两种形式的心跳:
心跳
自注册和手动添加节点
节点
Kubernetes 架构/节点
推荐使用的标签
你可在字段选择器中使用
=
、==
和!=
(=
和==
的意义是相同的)操作符
二.总结知识点
:kubelet 会告诉容器 使用 dns serveice 的ip 来解析 dns名称 所以 /etc/resolv.conf 这个是kubelet 为他生成的
名字空间 test 中的 Pod 可以成功地解析 data.prod 或者 data.prod.svc.cluster.local
pod的域名是 hostname.subdomain.namespace.svc.cluster-domain.example 规定的
标签的前缀是可选的 前缀必须是dns子域名
三.命令记录
#查看pod内的容器
kubectl get pod POD_NAME_HERE -o jsonpath="{.spec['containers','initContainers'][*].name}" -n namespace
四.YAML记录
# 使用内存 编写 yaml 并执行
cat <<EOF | kubectl create -f - apiVersion: v1 kind: ConfigMap metadata: name: mymap finalizers: - kubernetes EOF ##在线修改资源对象 kubectl patch configmap/mymap \ --type json \ --patch='[ { "op": "remove", "path": "/metadata/finalizers" } ]'
五.课后疑问点
1.EndpointSlice 是什么
2.节点自注册和join 区别
###