Kubernetes
https://github.com/kubernetes/kubernetes
https://github.com/kubernetes/kubeadm
https://github.com/kubernetes/kops
https://github.com/kubernetes-sigs/kubespray
kubernetes简称k8s, 是开源的容器编排工具。
安装单机版k8s:
- minikube
安装k8s集群:
- kubeadm (k8s内置的,类似于docker swarm mode, 没有HA)
- kops (目前主要支持aws等云平台, 国内不友好)
- kubespray (通过ansible部署, 国内不友好)
k8s发行版:
- openshift-okd(redhat)
- rancher
k8s集群组成
master
- aip-server, 提供资源操作唯一入口
- scheduler, 负责资源调度
- controller-manager, 负责维护集群状态
- etcd(可以部署单独集群), 保存整个集群的状态
node
- kubelet, 负责维护容器生命周期, 还包括CNI CVI
- kube-proxy, 为service提供cluster内部的服务发现和负载均衡
- CRI(containerd), 创建pod
addons
- coredns
- flannel/cilium/calico
- dashboard, web-gui
- metrics-server, 取代heapster,用于cpu/memory监控
- ingress-nginx, 为服务提供外网入口
- federation, 提供跨可用区的集群
概念
k8s包含的重要概念:
-: nodes, 运行pod的物理机或虚拟机. -: namespace, 对资源和对象的抽象集合.pods/deployments/services都属于某个ns. -: pods,一组紧密关联的容器集合,共享pid,ipc,network,uts,namespace.
k8s业务类型:
-: long-running 长期伺服型 -> RC, RS, Deployment -: batch 批处理型-> Job -: node-daemon 节点后台支撑型-> DaemonSet -: stateful application 有状态应用型-> StatefulSet
api对象三大类属性:
- metadata 元数据(至少包含namespace, name, uid).
- spec 规范
- status 状态
kubernetes对外暴露服务的三种方式:
- NodePort: dev/qa. (30000-32767)
- Ingress: production.
- LoadBalance: cloud provider.
clusterIP 是k8s内部默认服务,外部无法访问,可以通过proxy来访问。
pod
一个pod包含一个或多个容器,这些容器通过infra container共享同一个network namespace。
infra container: k8s.gcr.io/pause, 汇编写的,永远处于暂停状态。
pod共享网络:
同一个pod里面看到的网络跟infra容器看到的是一样的,一个pod只有一个ip,也就是这个Pod的network namespace对应的IP; 整个pod的生命周期跟infra容易是一样的。
pod共享存储:
通过pod volumes, 使pod中的container共享存储。
应用:
- 一个pod中的某个容器异常退出,被kubelet拉起来之前保证之前的数据部丢失.
- 同一个pod的多个容器共享数据.
pod volume类型:
-
本地存储: emptydir/hostpath…
-
网络存储:
in-tree(ks8内置支持): awsElasticBlockStore/gcePresistentDisk/nfs…
out-of-tree(插件): flexvolume/csi…
-
projected volume: secret/configmap/downwardAPI/serviceAccountToken
pod服务质量配置:
依据容器对cpu,memory资源的request/limit需求,pod服务质量分类:
- Guaranteed
- Burstable
- BestEffort
initContainer:
initContainer用于普通Container启动前的初始化(如配置文件准备) 和 前置条件校验 (如网络)。
- initContainer会先于普通container启动执行,直到所有initcontainer执行成功后,普通container 才会执行。
- pod中多个initcontainer之间是按次序依次启动执行,而pod中多个普通container是并行启动。
- initcontainer 执行成功后就结束退出,而普通container会一直执行或重启。
resources
查看所有对象:
$ kubectl api-resources
Workloads
replicasets/rs
控制无状态的pod数量,增删Pods.
deployments/deploy
定义pod的数目和版本,通过Controller自动恢复失败的pod,滚动升级,重新生成,回滚等。
DeploymentStatus: complete, processing, failed
Deployment只负责管理不同版本的ReplicaSet, 由ReplicaSet管理Pod副本个数; 每个版本的ReplicaSet对应了Deployment template的一个版本; 一个ReplicaSet下的Pod都是相同的版本.
daemonsets/ds
ds作用:
- 保证集群内每个节点运行一组相同的pod
- 跟踪集群节点状态,保证新加入的节点自动创建对应的pod
- 跟踪集群节点状态,保证移除的节点删除对应的pod
- 跟踪pod状态,保证每个节点pod处于运行状态
jobs
job的作用:
- 创建一个或多个pod确保指定数量的Pod可以成功运行和终止.
- 跟踪pod状态,根据配置及时重试失败的pod.
- 确定依赖关系,保证上一个任务运行完毕后再运行下一个任务.
- 控制任务并行度,并根据配置确保pod队列大小。
cronJobs/cj
statefulsets/sts
控制有状态的pod数量.
service discovery & load balancing
services/svc
提供访问一个或多个pod的稳定的访问地址.支持ClusterIP, NodePort, LoadBalancer等访问方式.
ingresses
endpointslices
Config & Storage
secrets
secret用于在集群中存储密码,token等敏感信息用的资源对象.
其中敏感数据采用base-64编码保存.
四种类型:
- Opaque
- kubernetes.io/service-account-token
- kubernetes.io/dockerconfigjson
- bootstrap.kubernetes.io/token
secret主要被pod使用,一般通过volume挂载到指定容器目录,供容器中业务使用.
访问私有镜像仓库也可以通过secret实现.
secret大小限制1M; secret不适合机密信息,推荐用vault.
configmaps/cm
主要管理容器运行所需的配置文件,环境变量,命令行参数等可变配置。
可用于解耦容器镜像和可变配置,从而保障工作负载的可移植性.
主要被pod使用,一般用于挂载pod用的配置文件,环境变量,命令行参数.
ConigMap 大小不超过1M; pod只能引用相同namespace中的configmap, pod引用的configmap不存在时,pod无法创建;使用envFrom从ConfigMap配置环境变量时,如果ConfigMap中的某些key被认为无效,该环境变量不会注入容器,但是pod可以创建; 只有通过k8s api创建的pod才能使用ConfigMap, 其它方式创建的pod不能使用ConfigMap.
persistentvolume/pv
static volume provisioning:
dynamic volume provisioning:
persistentvolumeclaims/pvc
pvc中只需要申明需要的存储size, access mode等业务需求.
pvc简化了用户对存储的需求,pv才是存储的实际信息载体,通过kube-controller-manager中的PersistentVolumeController将PVC与合适的PV 绑定.
csidrivers
csinodes
storageclasses/sc
volumeattachments
metadata
events
horizontalpodautoscaler
podtemplate
cluster
componentstatuses/cs
namespaces/ns
一个集群内部的逻辑隔离机制,每个资源都属于一个namespace,同一个namespace中的资源命名唯一,不同namespace中的资源可重名.
nodes/no
serviceaccount/sa
解决pod在集群中的身份认证问题.
Tools
sonobuoy
https://github.com/vmware-tanzu/sonobuoy
kuard