resource
Deployment
kubectl apply -f https://k8s.io/examples/application/deployment.yaml kubectl describe deployment nginx-deployment
Nodes
tools
- kubeadm
components
- kubelet
- kube-proxy
- container runtime
Node Capacity
- 如果是自动注册入cluster,同时提交memory,cpu等node的能力
- 如果是手动加入,那么需要手动设置
- 调度器scheduler保证所有容器的资源需求不大于节点的资源能力
- 总量只是被kubelet管理的容器,不包括直接启动的容器,也不包括其他非kubelet控制的进程(也占资源)
Pods
NAME | SHORTNAMES | purpose |
---|---|---|
pods | po | |
services | svc |
k8s的最小管理和调度单元,一个pod中可以有1个或多个容器。这些容器共享网络、存储
Volumes 存储
Persistent Volumes(PV)
Persistent Volumes Claim(PVC)
Service
一组pods提供的服务。在你的集群中,如果有一组pods提供一种服务(比如检索服务),但是pods会不断的更新、销毁后重启拉起,使用这组 服务的其他服务,如何马上切换到最新的pods机器ip上去呢? service解决这样的问题。
- service –> Pods
- service –> your own service(like database,不是部署在k8s中的)
- service –> service(其他的Namespace)
- 非指向pods的service,需要指定Endpoints(也就是具体的ip和端口),这里需要注意哪些ip是不能指定到Endpoints中的,比如另一个service的虚拟ip
kube-proxy
iptables mode
- by Linux netfilter (不需要用户态、内核态切换)
- 可靠性高
IPVS proxy mode
- call netlink interface to create IPVS rules
- is based on netfilter hook function. 和iptables相似,工作于内核态,使用了hash表
- 更低的时延(lower latency),更高的性能(better performance)
- 支持更高的吞吐量(throughput)
- rr: round-robin 轮询
- lc: least connection (smallest number of open connections) 最少链接
- dh: destination hashing 目的地址hash
- sh: source hashing 源地址hash
- sed: shortest expected delay 最小延迟
- nq: never queue 不进等待队列??
Note: IPVS是一个内核模块,启动kube-proxy之前,确保IPVS可用。
服务发现 Discovering services
- 环境变量
- DNS
更好的方式,DNS Server(CoreDNS/kube-dns),原理也是watch k8s的API
* $service_name$.$namespace$
Headless Services
NetworkPolicy
pods之间是否都运行访问呢?
- ingress
- egress
网络相关
- Pod 网络组件,给pod提供网络(CNI),pod之间的网络交互。 Calico
- DNS ,必须有Pod网络,DNS才能工作
- NetworkPolicy 网络的ACL
- Calico,a networking and network policy provider.
k8s组件
- worker node(nodes/worker machines)
- Pods
控制面的组件
- Master Nodes
- kube-apiserver, 水平扩展,可部署多个
- etcd, 保存持久化数据
- kube-scheduler,监听没有指定具体node的Pod新建需求,调度选择一个node给这个新pod。
- 资源需求
- 硬件/软件/策略限制/亲和性/反亲和性/数据位置/工作负载/
- kube-controller-manager。 本质上是多个controller,为了降低复杂度,编译成了一个二进制执行文件,并单进程运行。
- Node controller:node节点宕机(下线)通知
- Replication controller : 维持pods的数量
- Endpoints controller: 加入的services和pods
- 服务Account & Token 控制器:给新的命名空间创建默认的账号和访问tokens
- worker Nodes
- kubelet
- kube-proxy
- Container runtime
- Docker
- containerd
- CRI-O
- 其他的一个对CRI的实现(只要实现Container Runtime Interface标准的都可以)
插件 Addons
利用k8s的资源(DaemonSetEnsures, Deployment等等)来实现计算特性,这些都是集群的特性,所以放在kube-system的命名空间里。
- DNS
- Web UI(Dashboard)
- 容器资源监控
- 集群级别的日志
k8s APIserver
暴露http的接口。终端用户、集群中的不同部分、其他一些组件
kubectl
API如何兼容老版本
spec 和 status
申明式
Controllers
在k8s中,控制器不断循环观察集群的状态。每个控制器都不断将当前的集群状态逼近期望的状态
NAME | SHORTNAMES | purpose |
---|---|---|
ReplicaSet | rs | maintain a stable set of replica Pods running at any given time |
ReplicationController | rc | a specified number of pod replicas are running at any one time |
Deployments | deploy | provides declarative updates for Pods and ReplicaSets. 部署升级 |
HorizontalPodAutoscaler | hpa |
CRD(Custom Resource Definition)
- 定义一个yaml文件
- kind: CustomResourceDefinition
- 其他信息
- $kubectl api-resources 可以看到自定义的资源类型 doc
创建CRD的过程
- 创建CRD, 让k8s‘认识’我们自定义的API对象
- 编写基础代码,使用代码工具生成controller之外的代码
- 编写controller代码
- 编译代码
NAME | SHORTNAMES | APIGROUP | NAMESPACED | KIND |
---|---|---|---|---|
nodes | no | false | Node | |
pods | po | true | Pod | |
crontabs | ct | stable.example.com | true | CronTab |
docker
- cpu
- cpushare
- cpuset