Kubernetes - Architectural principles
主要功能
基于容器的应用部署、维护和滚动升级
服务发现和负载均衡
跨机器和跨地区的集群调度
自动伸缩
无状态服务和有状态服务
插件机制保证扩展性
命令式 vs 声明式
YAML
命令式关注:如何做
声明式关注:做什么
核心对象
Kubernetes 的所有管理能力是构建在对象抽象的基础上
对象
描述
Node
计算节点的抽象
Namespace
资源隔离的基本单位
Pod
用来描述应用实例,最为核心的对象
Service
如何将应用发布为服务,本质上是负载均衡和域名服务的声明
核心架构
核心组件
Scheduler关注没有与 Node 绑定的 Pod,完成调度后,会将信息写入 etcd,而 kubelet 会监听到
Master
组件
描述
API Server
API 网关
Cluster Data Store
etcd:分布式 kv 存储,K8S 将所有 API 对象持久存储在 etcd
Controller Manager
处理集群日常任务的控制器:节点控制器、副本控制器等
Scheduler
监控新建的 Pods 并将其分配给 No ...
Kubernetes - Cgroups
Namespace
隔离不完备
在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,例如时间
如果在容器中使用 settimeofday(2) 的系统调用,整个宿主机的时间都会被修改
Cgroups
在 Linux 中,Cgroups 暴露给用户的操作接口是文件系统
1234567891011121314151617181920$ mount -t cgroupcgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,name=systemd)cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)cgroup on /sys/fs/cgroup/devices type c ...
Kubernetes - 3rd example
架构
MariaDB
ConfigMap
maria-cm.yaml12345678910apiVersion: v1kind: ConfigMapmetadata: name: maria-cmdata: DATABASE: 'db' USER: 'wp' PASSWORD: '123' ROOT_PASSWORD: '123'
12$ k apply -f maria-cm.yamlconfigmap/maria-cm created
StatefulSet
maria-sts.yaml123456789101112131415161718192021222324252627282930313233343536373839404142434445464748apiVersion: apps/v1kind: StatefulSetmetadata: name: maria-sts labels: app: maria-stsspec: # headless svc serviceName: ...
Kubernetes - CNI
网络模型
Docker bridge
Docker 会创建一个名为 docker0 的虚拟网桥,默认网段为172.17.0.0/16
每个容器上都会创建一个虚拟网卡对(veth pair)
两个虚拟网卡分别连接容器和虚拟网桥,从而实现容器间的网络互通
Docker 的网络方案只局限在单机环境下工作,Kubernetes 的网络模型:IP-per-pod
IP-per-pod
集群内的每个 Pod 都会有唯一的 IP 地址
Pod 内的所有容器共享这个 IP 地址
集群内的所有 Pod 都属于同一个网段
Pod 可以基于 IP 地址直接访问另一个 Pod,不需要做 NAT
CNI
Container Networking Interface
CNI 定义了一系列通用接口,开发者只需要遵循规范接入 Kubernetes
为 Pod 创建虚拟网卡、分配 IP 地址、设置路由规则,进而实现 Kubernetes 的 IP-per-pod 网络模型
依据实现技术分类,CNI 插件可以分为 3 类
Overlay
构建一个工作在底层网络之上的逻辑网络
把原始的 Pod 网络数据包封包,再 ...
Kubernetes - Monitor
Metrics Server
用来收集 Kubernetes 核心资源的指标,定时从所有 Node 的 kubelet 采集信息对集群的整体性能影响极小,性价比很高,每个 Node 大约只会占用 1m vCPU 和 2MB 内存
Metrics Server 调用 kubelet 的 API,获取到 Node 和 Pod 的指标,再将这些信息交给 API Serverkubectl 和 HPA 可以通过 API Server 来读取指标
Metrics Server 早期的数据来源是 cAdvisor,原先是一个独立的应用程序,后来被集成进 kubelet
https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
--kubelet-insecure-tls
1234567891011121314151617apiVersion: apps/v1kind: Deploymentmetadata: labels: k8s-app: metrics-serve ...
Kubernetes - ResourceQuota
Namespace
Namespace 是一个 API 对象,但并不是一个实体对象,只是一个逻辑上的概念
123456$ k create ns test-nsnamespace/test-ns created$ k get ns test-ns -owideNAME STATUS AGEtest-ns Active 8s
nginx-pod-ns.yaml12345678910apiVersion: v1kind: Podmetadata: name: nginx namespace: test-nsspec: containers: - name: nginx image: nginx:alpine
123456789101112$ k apply -f nginx-pod-ns.yamlpod/nginx created$ k get po -ntest-ns -owideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINE ...
Kubernetes - Health
Resources
基于 cgroup 技术
内存使用 Ki、Mi、Gi 来表示 KB、MB、GB;Kubernetes 里 vCPU 的最小使用单位为 0.001,即 m
nginx-pod-resources.yaml12345678910111213141516apiVersion: v1kind: Podmetadata: name: nginx-pod-resourcesspec: containers: - name: nginx image: nginx:alpine resources: requests: cpu: 10m memory: 100Mi limits: cpu: 20m memory: 200Mi
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859$ k apply -f nginx-pod-resource ...
Kubernetes - Rollout
版本
使用 Pod Template Hash 作为版本号
123456789101112$ k get deployments.apps -owideNAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTORnginx-deployment 2/2 2 2 57s nginx nginx:alpine app=nginx-deployment$ k get rs -owideNAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTORnginx-deployment-756d6b7586 2 2 2 114s nginx nginx:alpine app=nginx-deployment,pod ...
Kubernetes - StatefulSet
Stateful
任何应用都是有状态的
无状态应用:应用的状态信息不重要,即便不恢复也能正常运行,如 Nginx
有状态应用:应用的状态信息很重要,如 Redis、MySQL 等,其状态即在内存、磁盘上产生的数据
Kubernetes 认为状态不仅仅是数据持久化,还包括多实例的启动顺序、依赖关系和网络标识等
Stateless - Deployment:多个实例之间无关,启动顺序不固定,Pod 的名称、IP 地址也是完全随机
Stateful - StatefulSet:多个实例之间存在依赖关系
使用1234567$ k api-resources --api-group='apps'NAME SHORTNAMES APIVERSION NAMESPACED KINDcontrollerrevisions apps/v1 true ControllerRevisiondaemonsets ds apps/v1 true ...
Kubernetes - NFS
架构
搭建Server1$ sudo apt install nfs-kernel-server
配置 - /etc/exports
1/tmp/nfs 192.168.191.0/24(rw,sync,no_subtree_check,no_root_squash,insecure)
让配置生效
1234$ sudo exportfs -ra$ sudo exportfs -v/tmp/nfs 192.168.191.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,insecure,no_root_squash,no_all_squash)
启动 NFS Server
12345678910111213141516$ sudo systemctl start nfs-server$ sudo systemctl enable nfs-server$ sudo systemctl status nfs-server● nfs-server.service - NFS server and servi ...