一.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

 

3.owners 和 Dependents

ReplicaSet 是一组 Pod 的属主 owners

replicaset是pod的附属(Dependent)

 
对象规约中的属主引用

metadata.ownerReferences 用于引用其属主对象

ownerReferences.blockOwnerDeletion

用于控制特定的附属对象是否可以阻止垃圾收集删除其属主对象

 

 

字段选择器

字段选择器

“字段选择器(Field selectors)”允许你根据一个或多个资源字段的值 筛选 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 区别



###

 

posted on 2022-09-23 17:06  谢Rain  阅读(183)  评论(0编辑  收藏  举报