1. 死磕 k8s系列之核心概念介绍
- 2020 年 2 月 10 日
- 笔记

docker入门
核心概念
- 镜像
类似于虚拟机镜像,可以理解为一个面向Dokcer引擎的只读模板,包含了文件系统。
- 容器
类似于轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,但是所有的容器是相互隔离的,互不可见的,这就提供了一个实体机可以安装多个容器,且很轻量级相对于虚拟机。
镜像本身是只读的,容器从镜像启动的时候,Docker会在镜像的最上层创建一个可写层,镜像本身保持不变。
- 仓库
类似于代码库,是Dokcer集中存放镜像的场所。
根据存储的镜像公开分享与否,Docker仓库可以分为公开仓库(Public)和私有仓库(Private)两种形式。
常用命令
# 镜像列表 docker images # 移除镜像 docker rmi <image_id> # 查看镜像 docker search <image_name> # 拉取镜像 docker pull <image_name>[:tag] # 运行一个镜像到容器 docker run [OPTIONS] <image_name>[:tag] # 所有容器 docker ps -a # 移除一个容器 docker rm <container_id> # 提交一个容器到镜像 docker commit <container_id> [image_name:tag] # 推送镜像到仓库 docker push <image_name>[:tag]
k8s入门
核心概念

master,又称为master节点、集群控制面板、控制面板等,它的作用是治理Worker Node。一般来说,master上面不运行任何pod。
Worker Node,又称为worker节点、node节点等,node是机器的抽象,物理机或虚拟机。一般来说,所有的pod都运行在node上。

蓝色部分代表高层抽象,绿色部分代表node层及其子进程。

master包含api server、etcd、scheduler、kube-controller-manager、cloud-controller-manager。
api server,暴露 K8s API,是 K8s 控制的前端,即 kube-apiserver。
etcd,用于集群状态数据的分布式键值存储。
scheduler,调度器,为新 Pod 选择 Node,即 kube-scheduler,可以想象成匹配器
kube-controller-manager,运行控制器来处理集群后台任务的进程,可当做集群控制器。
cloud-controller-manager,运行控制器与云供应商交互,可以当做云接口。

Worker Node 的组件包括 kubelet、kube-proxy 及 container runtime。
kubelet,负责 Worker Node 的一切事务,与 Master 的 API server 通信。
kube-proxy,连接正确 Pod 的路由,也扮演跨 Pod 服务负载均衡的角色。
Container Runtime,容器运行时,下载镜像,运行容器,例如:Docker 就是一个容器运行时。

Deployment,部署,无状态,如果你想持续运行一个无状态的应用,那就用Deployment。Deployment 允许你在无需停机的状态下更新应用,并在 Pod 宕掉时根据策略重启 Pod。
ReplicaSet,无状态,Deployment 会创建 ReplicaSet 来保障你的应用所需 Pod 的数量,ReplicaSet 会基于 Deployment 中的触发器自动创建及伸缩 Pod 数量。老版本中有个名词“Replication Controller”,与ReplicaSet的概念等价。
Pod,是 K8s 的基础构建模块,一个 Pod 包含一组一个或多个容器。通常每个 Pod 包含一个容器。当应用需要水平扩展时,ReplicationSet 会复制 Pod。
StatefulSet,有状态,与 Deployment 不同,StatefulSet 的 Pod 是不可互换的。每个 Pod 都有一个唯一的、持久的标识符,在任何重新调度期间,控制器都要维护这个标识符。StatefulSet 用于持久的、有状态的后端,如数据库。
DaemonSet,用于处理连续的过程,在每个 Node 上运行一个 Pod,每个自动被放入集群的 Node 会通过 DaemonSet 启动 Pod。DaemonSet 对后台运行的任务(如监控和日志收集)非常有用。
StatefulSet 和 DaemonSet 不受 Deployment 控制,虽然两者与 ReplicaSet 位于同级别的抽象层,在当前 API 中没有针对它们更高层级的抽象层了。

PV,PersistentVolumes,持久化卷,与具体的存储关联,可以是本地磁盘,也可以是远程存储设置;
PVC,PersistentVolumeClaims,持久化卷清单,使用PV,Pod只能使用PVC,不与PV直接关联。

Service,Pod的访问入口,有三种类型ClusterIP、NodePort、LoadBalance。
ClusterIP,使用一个集群固定IP,这个是默认选项。 NodePort,使用一个集群固定IP,但是额外在每个pod上均暴露一个端口供外部访问 LoadBalancer,使用集群固定IP,额外还会申请一个负载均衡器来转发到服务(load balancer )
Ingress,通常情况下,service和Pod的IP仅可在集群内部访问。集群外部的请求需要通过负载均衡转发到service在Node上暴露的NodePort上,然后再由kube-proxy将其转发给相关的Pod。
Ingress可以给service提供集群外部访问的URL、负载均衡、SSL终止、HTTP路由等。为了配置这些Ingress规则,集群管理员需要部署一个Ingress controller,它监听Ingress和service的变化,并根据规则配置负载均衡并提供访问入口。常用的Ingress Controller有nginx-ingress和traefik-ingress。
常用命令
# 通过文件名或控制台输入,对资源进行创建。 kubectl create #通过文件名或控制台输入,对资源进行替换。 kubectl replace # 通过文件名或控制台输入,对资源进行配置,kubectl apply = kubectl create + kubectl replace。 kubectl apply # 集群信息 kubectl cluster-info # 查看组件信息 kubectl get # 修改组件配置 kubectl edit # 显示组件详情 kubectl describe # 删除组件 kubectl delete # 查看日志 kubectl logs
istio入门
核心概念

Envoy,一个 C++ 编写的高性能代理服务器,这里做了扩展,在 Istio 中会以 Sidecar 方式跟应用运行在同一 Pod 内,一方面可以接收并执行关于规则、流量拆分等方面的指令,另一方面能够产生各种指标用于监控和跟踪。
Mixer,主要进行访问控制以及策略控制,同时也负责从 Envoy 中获取各项指标。
Pilot,是用户和 Isito 之间的桥梁,负责接收各种配置,并发送给各个组件。
Istio Auth,内置认证和凭证管理,利用 TLS 提供服务之间、用户和服务之间的认证。可以用来将没有加密支持的服务升级为加密版本,并且在网络策略之外,提供服务级别的策略控制,今后还会增加更多的鉴权和审计方面的能力。
常用命令
# 将某个命名空间置为自动注入istio proxy kubectl label namespace docker-test istio-injection=enabled