Kubernetes 支持多个容器运行环境:Docker、 containerd、CRI-O 以及任何实现 Kubernetes CRI (容器运行环境接口)
Kubernetes 官方发布公告,宣布自 v1.20 起放弃对 Docker的支持。目前,Kubelet 中的 Docker支持功能现已弃用,并将在之后的版本中被删除。逐渐转移到containerd。不过本文仍以docker为基础到kubernetes的进阶~
一、Docker
Docker Engine
Docker Engine 是一种开源容器化技术,用于构建和容器化您的应用程序。是一个C/S架构的应用程序,主要包含以下几个组件:
①常驻后台进程dockerd
②一个用来和守护进程dockerd交互的REST API Server
③命令行界面 (CLI) 客户端(我们常使用的docker命令)
Docker架构
Docker 使用客户端-服务器架构。Docker客户端与 Docker守护进程对话,后者负责构建、运行和分发 Docker 容器的繁重工作。Docker 客户端和守护程序可以 运行在同一系统上,或者您可以将 Docker 客户端连接到远程 Docker 守护程序。Docker 客户端和守护进程使用 REST API、UNIX 套接字或网络接口进行通信。另一个 Docker 客户端是 Docker Compose,它允许您使用由一组容器组成的应用程序。
安装
Install Docker Engine on Ubuntu
二、Kubernetes
简介
kubernetes是Google基于borg开源的容器编排系统,它的目标是管理跨多个主机的容器,用于自动部署、扩展和管理容器化的应用程序,主要实现语言为go语言。
集群
当你部署完Kubernetes,即拥有了一个完整的集群。一个Kubernetes集群由一组被称作为节点的机器组成:
- master负责管理集群,协调集群中的所有活动,例如调度应用程序、维护应用程序所需的状态、扩展应用程序和滚动更新
- 节点是Kubernetes集群中的工作机器,可以是物理机或虚拟机。每个工作节点都有一个kubelet,它是管理节点并与k8s master节点进行通信的代理。在这些节点上运行Kubernetes所管理的容器化应用程序。
-
集群至少拥有一个工作节点。
Pod
Pod是可以在kubernetes中创建和管理的、最小的可部署的计算单元。
Pod是一组紧密关联的容器集合,它们共享存储、网络、以及怎样运行这些容器的声明。通常你不需要直接创建Pod,甚至单实例Pod。相反,你会使用Deployment 或Job这类工作负载资源来创建Pod。如果Pod需要跟踪状态,可以考虑statefulSet资源。
Label
Label 是识别 Kubernetes 对象的标签,以 key/value 的方式附加到对象上。Label 不提供唯一性,并且实际上经常是很多对象(如Pods)都使用相同的 label 来标志具体的应用。 Label 定义好后其他对象可以使用 Label Selector 来选择一组相同 label 的对象(比如Service 用 label 来选择一组 Pod)。Label Selector支持以下几种方式:
- 等式,如app=nginx和env!=production
- 集合,如env in (production, qa)
- 多个label(它们之间是AND关系),如app=nginx,env=test
Namespace
Kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群。 这些虚拟集群被称为名字空间。Namespace 是对一组资源和对象的抽象集合。
名字空间资源本身、底层资源(节点Node和持久化卷PV)不属于任何名字空间。
Deployment
一个Deployment为Pods和ReplicatSets提供声明式的更新能力。Deployment 确保任意时间都有指定数量的 Pod“副本”在运行。Deployment 还支持回滚和滚动升级。
当创建 Deployment 时,需要指定两个东西:
- Pod模板:用来创建 Pod 副本的模板
- Label标签:Deployment 需要监控的 Pod 的标签。
现在已经创建了 Pod 的一些副本,那么在这些副本上如何均衡负载呢?我们需要的是 Service。
Service
Service 是应用服务的抽象,通过 labels 为应用提供负载均衡和服务发现。匹配 labels 的Pod IP 和端口列表组成 endpoints,由 kube-proxy 负责将服务 IP 负载均衡到这些endpoints 上。
每个 Service 都会自动分配一个 cluster IP(仅在集群内部可访问的虚拟地址)和 DNS 名,其他容器可以通过该地址或 DNS 来访问服务,而不需要了解后端容器的运行。
安装kubernetes
可参考K8S安装部署
三、Harbor
简介
Harbor 是一个CNCF基金会托管的开源的可信的云原生docker registry项目,可以用于存储、签名、扫描镜像内容,Harbor 通过添加一些常用的功能如安全性、身份权限管理等来扩展 docker registry 项目,此外还支持在 registry 之间复制镜像,还提供更加高级的安全功能,如用户管理、访问控制和活动审计等,在新版本中还添加了Helm仓库托管的支持。
Harbor最核心的功能就是给 docker registry 添加上一层权限保护的功能,docker registry v2 就已经为我们提供了支持,v2 集成了一个安全认证的功能,将安全认证暴露给外部服务,让外部服务去实现。
安装Harbor
四、Jenkins
简介
Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。
Pipeline
Jenkins 流水线是一套插件,它支持实现和集成 continuous delivery pipelines 到Jenkins。对Jenkins 流水线的定义被写在一个文本文件中 (成为 Jenkinsfile),该文件可以被提交到项目的源代码的控制仓库。 这是"流水线即代码"的基础; 将CD 流水线作为应用程序的一部分,像其他代码一样进行版本化和审查。
流水线是用户定义的一个CD流水线模型 。流水线的代码定义了整个的构建过程, 他通常包括构建, 测试和交付应用程序的阶段 。
安装Jenkins
五、CI/CD
以下列实践过的流程来讲述整个CI/CD 过程
- 开发人员提交代码到 Gitlab 代码仓库
- 通过 Jenkins 的轮询SCM触发 Pipeline 自动构建
- Jenkins 触发构建构建任务,根据 Pipeline 脚本定义分步骤构建
- 先进行代码静态分析,单元测试(本文跳过)
- 根据构建结果构建 Docker 镜像
- 推送 Docker 镜像到 Harbor 仓库
- 触发更新服务阶段
- 查看服务是否更新成功
部署流程可参考Jenkins pipeline部署k8s应用