k8s

概述:k8s

知识点

  1. Kubernetes 集群包含:

    • 1 * Master

    • N * Node

  2. Kubernetes 中部署的最小单位是 pod

  3. 一个 pod 中可以包含一个或多个 Docker 容器,通常只有一个容器

  4. Master节点:

    • API Server:处理API操作,所有组件都会与API Server连接,组件之间不通常不独立连接,可水平扩展的组件
    • Scheduler:调度器,完成调度操作,把一个用户提交的放置于合适的节点,可进行热备
    • Controller Manager:控制器,对集群、状态的管理,比如自动对容器修复、自动水平扩张,可进行热备,面向用户的 API 服务、负责维护集群状态
    • etcd:分布式存储系统,API Server的所需要的元信息都存储在etcd
  5. Node节点:

    • Pod:运行一个或者多个容器,真正运行这些pod的组件是kubelet
    • Kubelet:通过api server接收pod运行所需的状态,提交到Container runtime组件中,在os真正创建容器需要的环境[监视指派到它所在Node上的Pod,包括创建、修改、监控、删除]
    • Container Runtime:
    • Storage Plugin:完成存储操作
    • Network Plugin:完成网络操作,提供service network搭网组网,真正完成service组网的组件是kube-proxy,是利用ip table能力来组件kube network
    • Kube-proxy:为Pod对象提供代理
  6. Kubernets 分层架构

  • Ecosystem

  • Interface layer: client libraries and tools

  • governance layer: automation and policy enforcement

  • Application layer: deployment and routing

  • Nucleus: api and execution

  • (Container runtime, network plugin,volume plugin, image registry, cloud provider, identity provider)

- 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境

- 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)

- 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)

- 接口层:kubectl命令行工具、客户端SDK以及集群联邦

- 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范

Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等
Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等

  • kubelet: kubelet负责管理pods和它们上面的容器,images镜像、volumes、etc。

  • kube-proxy:每一个节点也运行一个简单的网络代理和负载均衡

  • etcd:所有master的持续状态都存在etcd的一个实例中。这可以很好地存储配置数据

  • Scheduler:调度器把未调度的pod通过binding api绑定到节点上。调度器是可插拔的,并且我们期待支持多集群的调度,未来甚至希望可以支持用户自定义的调度器。

  1. 工作负载 Workload

    类型 描述
    Deployment 声明了 Pod 的模板和控制 Pod 的运行策略,适用于部署无状态的应用程序。您可以根据业务需求,对 Deployment 中运行的 Pod 的副本数、调度策略、更新策略等进行声明。
    StatefulSet 主要用于管理有状态的应用,创建的 Pod 拥有根据规范创建的持久型标识符。Pod 迁移或销毁重启后,标识符仍会保留。在需要持久化存储时,您可以通过标识符对存储卷进行一一对应。如果应用程序不需要持久的标识符,建议您使用 Deployment 部署应用程序。
    固定 Pod IP 类型 StatefulSet 腾讯云容器服务提供扩展 StatefulSet 固定 IP 的能力,该类型的 StatefulSet 创建的 Pod 将通过弹性网卡分配真实的私有网络内的 IP 地址。腾讯云容器服务 VPC-CNI 的插件负责 IP 分配,当 Pod 重启或迁移,可实现 IP 地址不变。
    DaemonSet 主要用于部署常驻集群内的后台程序,例如节点的日志采集。DaemonSet 保证在所有或部分节点上均运行指定的 Pod。新节点添加到集群内时,也会有自动部署 Pod。节点被移除集群后,Pod 将自动回收。
    Job Job 控制器会创建 1 - N 个 Pod,这些 Pod 按照运行规则运行,直至运行结束。
    CronJob 根据指定的预定计划周期性地运行一个 Job。
  2. 配置项

    • ConfigMap:key-value 类型的键值对,通过 ConfigMap 您可以将配置和运行的镜像进行解耦,使得应用程序有更强的移植性。
    • Secret:key-value 类型的键值对,用于存储密码、令牌、密钥等敏感信息,降低直接对外暴露的风险。
  3. 存储卷

    存储卷(Volume)的核心只是一个目录,其中可能包含一些数据,Pod 中的容器可以访问该目录。存储卷的生命周期与 Pod 相同,并且长于该 Pod 下运行的容器,通常会在容器重启时保留数据。

  4. PersistentVolume(PV)

    集群内的存储资源。例如,节点是集群的资源。PV 独立于 Pod 的生命周期,根据不同的 StorageClass 类型创建不同类型的 PV。

  5. PersistentVolumeClaim(PVC)

集群内的存储请求。例如,PV 是 Pod 使用节点资源,PVC 则声明使用 PV 资源。当 PV 资源不足时,PVC 也可以动态创建 PV。

  1. StorageClass

描述存储的类型,集群管理员可以为集群定义不同的存储类别,容器服务当前仅支持私有网络,不支持基础网络。

  1. Volume
  • 声明在Pod中容器可访问的文件目录;
  • 可以被挂载在Pod中一个或者多个容器指定路径下;
  1. Deployment
  • 定义一组pod的副本数目、版本等
  • 通过控制器(Controller)维持pod的数目:自动恢复失败的pod
  • 通过控制器以指定的策略控制版本:滚动升级、重新生成、会滚等
  1. Service
  • 提供访问一个或者多个Pod实例的稳定访问地址(可以避免用户访问具体Pod对应各自的IP address,对于外部用户而言仅了解单个IP address,当某个Pod崩后可自动切换至另一Pod)
  • 支持多种访问方式实现
    • ClusterIP
    • NodePort
    • LoadBalancer
  1. Namespaces
  • 一个集群内部的逻辑隔离机制(鉴权、资源额度)
  • 每一个资源(比如pod、deployment、service)都属于一个namespace
  • 同一个namespace中资源命名唯一
  • 不同namespace资源可重名
  1. API - Label
  • 一组key:value
  • 可以被selector所查询,比如select color=red
  • 资源集合默认表达形式:例如service对应的一组pod
  1. kubelet:在集群中的每个节点上用来启动 pod 和容器等。
  2. kubectl:用来与集群通信的命令行工具。

docker实践

  1. 编写Dockerfile
1
2
FROM nginx
COPY html/* /html
  1. 构建Docker镜像
1
docker build -t docker-demo:0.1 .
  1. 查看Docker镜像
1
docker image ls
  1. 运行Docker镜像
1
docker run --name docker-demo -d -p 8080:80 docker-demo:0.1
  1. 查看容器运行状态
1
docker container ps
  1. 容器清理
1
2
docker container stop docker-demo
docker container rm docker-demo

安装 Kubernetes

  1. kubectl k8s的命令后客户端
  2. 本地运行k8s环境的minikube
  3. 给minikube使用的虚拟化引擎xhyve
1
2
3
4
5
brew install kubectl
brew cask install minikube

# 如果需要使用xhyve作为虚拟化引擎
brew install docker-machine-driver-xhyve
  1. minikube的默认虚拟化引擎是virtualbox,xhyve 是一个更轻量、性能更好的替代,安装后需要把所有者改为 root:wheel,并把 setuid 权限打开
1
2
3
# 如果需要使用xhyve作为虚拟化引擎
sudo chown root:wheel /usr/local/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
sudo chmod u+s /usr/local/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
  1. 启动 Minikube
1
2
3
4
minikube start

# 如果需要使用xhyve作为虚拟化引擎
minikube start --vm-driver xhyve

如果你在第一次启动 Minikube 时遇到错误或被中断,后面重试仍然失败时,可以尝试运行 minikube delete 把集群删除,重新来过。

  1. Minikube 启动时会自动配置 kubectl,把它指向 Minikube 提供的 Kubernetes API 服务。可以用下面的命令确认:
1
2
kubectl config current-context
minikube