云原生概述

image-20230518232331173

We bring together the world’s top developers, end users, and vendors and run the largest open source developer conferences. CNCF is part of the nonprofit Linux Foundation.
我们汇集了世界顶级开发人员、最终用户和供应商,并举办最大的开源开发人员会议。CNCF是非营利性Linux基金会的一部分。

Cloud Native Definition 云原生定义

Cloud native technologies empower organizations to build and run scalable applications in modern, dynamic environments such as public, private, and hybrid clouds. Containers, service meshes, microservices, immutable infrastructure, and declarative APIs exemplify this approach.
云原生技术使组织能够在现代动态环境(如公有云、私有云和混合云)中构建和运行可扩展的应用程序。容器、服务网格、微服务、不可变基础结构和声明性 API 就是这种方法的例证。

These techniques enable loosely coupled systems that are resilient, manageable, and observable. Combined with robust automation, they allow engineers to make high-impact changes frequently and predictably with minimal toil.
这些技术支持松散耦合的系统,这些系统具有弹性、可管理和可观察性。结合强大的自动化功能,它们使工程师能够以最少的工作量频繁且可预测地进行高影响力的更改。

The Cloud Native Computing Foundation seeks to drive adoption of this paradigm by fostering and sustaining an ecosystem of open source, vendor-neutral projects. We democratize state-of-the-art patterns to make these innovations accessible for everyone.
云原生计算基金会旨在通过培育和维持开源、供应商中立项目的生态系统来推动这种范式的采用。我们将最先进的模式民主化,使每个人都能获得这些创新。

生态

image-20230518232851127

容器

容器调用链路

image-20230518233056197

主流容器技术之间的联系

image-20230518233206953

image-20230518233231362

为什么要移除 Dockershim 呢?

image-20230518233243137

不可变基础设施

image-20230518233615666

image-20230518233810639

声明式API

  • 通过一行命令执行多个命令的集合

声明式API实战演练

单机部署: docker-compose

多机部署: Kubernetes

image-20230518234845095

安装步骤

Master 节点

  • 实验机器上面默认没有防火墙 所以将其注释了 如果需要手动取消注释即可

Node 节点

  • 加入集群的命令在 /var/log/install_k8s.log

微服务

Bookinfo 示例

image-20230519012355931

检测服务是否可以 Ping 通

image-20230519160009514

image-20230519160120415

  • 和一般的 SpringCloud 微服务架构图

image-20230519160303986

服务网格

image-20230519160445539

服务网格解决方案 Istio

image-20230519160516731

image-20230519160600488

image-20230519164307751

image-20230519173519935

可以看到流量的详细走势和相关请求数据

image-20230520034554383

本章小结

概述

  • 定义: 云原生技术使得企业能够在公有云、私有云、混合云的环境下, 构建和运行可扩展的应用程序, 云原生技术包括容器、服务网格、微服务、不可变基础设施和声明式 API 5 个关键技术
  • 生态: 云原生技术的生态系统包括开源项目、云服务提供商、云原生计算基金会

容器

  • 容器调用链路: 运行容器的工具 -> Kubernetes 的 API -> 容器运行时 -> 容器运行规范 -> 容器镜像
  • K8s与Docker: K8s 是一个容器编排工具, Docker 是一个容器运行时, K8s 可以管理多个 Docker 容器, Dockershim 是 K8s 与 Docker 之间的桥梁, 后续 K8s 会使用 CRI 替代 Dockershim, CRI 是容器运行时接口, 用于定义容器运行时与 K8s 之间的接口, 因为 Docker 和 K8s 之间的功能重叠

不可变基础设施

  • 可变基础设施: 通过手动或自动的方式, 在服务器上安装操作系统和应用程序, 通常使用配置管理工具, 如 Ansible, Chef, Puppet
  • 不可变基础设施: 通过镜像的方式, 在服务器上安装操作系统和应用程序, 通常使用 Packer, Vagrant, Dockerfile
  • 容器: 不可变基础设施的最佳实践

难点:

  • 基础设施的理解: 基础设施是指服务器、网络、存储、操作系统、中间件、应用程序等
  • 从可变基础设施到不可变基础设施的转变: 从手动安装到自动化安装, 从配置管理工具到镜像, 从物理机到虚拟机到容器

声明式 API

  • 举例: K8s 的 API 对象包括 Pod、Service、Deployment、Namespace、ConfigMap、Secret 等, 这些 API 对象都是声明式的, 通过 YAML 或 JSON 文件定义, 通过 kubectl 命令行工具或 API 接口进行管理
  • 声明式 API 的优势: 1. 通过 YAML 或 JSON 文件定义, 便于版本控制, 便于管理, 便于迁移 2. 通过 kubectl 命令行工具或 API 接口进行管理, 便于自动化管理, 便于集成到 CI/CD 流程中
  • Docker-Compose: Docker-Compose 是 Docker 官方提供的一个工具, 用于定义和运行多个 Docker 容器
  • kubectl: kubectl 是 K8s 官方提供的命令行工具, 用于管理 K8s 集群
  • Docker-Compose 与 K8s 的区别:
      1. Docker-Compose 是 Docker 官方提供的工具, K8s 是 CNCF 提供的工具
      1. Docker-Compose 适用于单机环境, K8s 适用于多机环境

难点

  • Docker-Compose 实践:
      1. 安装 Docker-Compose
      1. 编写 Docker-Compose YAML 文件
      1. 运行 Docker-Compose YAML 文件
      1. 查看 Docker-Compose 运行状态
      1. 停止 Docker-Compose 运行
  • K8s 环境搭建与实践:

微服务

  • Bookinfo 应用程序: Bookinfo 是一个简单的应用程序, 用于演示 K8s 的功能, Bookinfo 应用程序包括四个微服务, 分别是 productpage、details、reviews、ratings
  • seriveName: 服务名称, 用于标识服务, 通常使用 DNS 域名格式, 如 reviews.default.svc.cluster.local
  • kube-dns: K8s 集群中的 DNS 服务, 用于解析服务名称, 通常使用 CoreDNS 作为 DNS 服务
  • pod: K8s 中的最小调度单元, 通常包含一个或多个容器, 通常使用 YAML 或 JSON 文件定义, 通常使用 kubectl 命令行工具或 API 接口进行管理
  • 与 SpringCloud 对比:
      1. SpringCloud 是 Java 生态圈的微服务框架, K8s 是云原生技术的微服务框架
      1. SpringCloud 适用于 Java 生态圈, K8s 适用于多语言生态圈

服务网格

  • 概念: 服务网格是一种基础设施层面的微服务框架, 用于管理微服务之间的通信, 服务网格通常使用 Sidecar 模式实现, 服务网格通常使用 Envoy 作为 Sidecar
  • istio: istio 是一个开源的服务网格框架, 用于管理微服务之间的通信, istio 通常使用 Sidecar 模式实现, istio 通常使用 Envoy 作为 Sidecar
  • bookinfo 升级版: 与之前不同的是 不同服务之间的通信不再使用 K8s 的 Service, 而是使用 istio 的 Service, 通信方式不再是 HTTP, 而是使用 Envoy 的代理协议, 不再是组件之间的直接通信, 而是通过 Sidecar 通信
  • istio路由规则:
      1. 路由规则: 用于定义流量的路由规则, 通常使用 YAML 或 JSON 文件定义, 通常使用 istioctl 命令行工具或 API 接口进行管理
      1. 路由规则类型: 路由规则包括 VirtualService、DestinationRule、Gateway、ServiceEntry、Sidecar、EnvoyFilter 等类型
      1. 路由规则作用: 路由规则用于定义流量的路由规则, 用于流量控制、流量管理、流量监控、流量安全等
      1. 路由规则实践: 通过 YAML 文件定义路由规则, 通过 istioctl 命令行工具管理路由规则
  • 与 SpringCloud 对比: 可以通过 Prometheus 和 Grafana 进行监控, 可以通过 Jaeger 进行链路追踪, 可以通过 Kiali 进行流量监控, 可以通过 Kiali 进行流量安全

【附录】K8S入门你至少需要会这些

K8S是云原生技术的典型代表,后续的课程当中我们也会大量用到 K8S 技术,如果对 K8S 基础比较弱的同学,切记盲目的去花大量的时间学习 K8S,先掌握以下基本内容,然后其余的部分跟着课程学习即可:

  • Docker的使用
  • K8S架构设计及其环境搭建
  • Deployment的使用
  • Service的使用
  • ConfigMap的使用

限于篇幅,这里不会对技术的细节做说明,小伙伴们根据知识点去查询相关的资料即可。

Docker的使用

Docker的使用需要同学掌握以下内容:

  • Dockerfile编写
  • 常用的docker命令
  • docker-compose的使用

K8S架构设计及其环境搭建

K8S架构设计及其环境搭建需要同学会以下内容:

  • K8S由哪些组件构成,组件之间是如何协同工作的
  • minikube搭建 K8S 学习或测试环境
  • kubeadm搭建生产环境

Deployment的使用

Deployment是 K8S 下用的最多资源定义,同学需要掌握以下内容:

  • 创建Deployment,并且了解常用的Deployment定义参数
  • Deployment版本回滚操作
  • 了解Deployment的什么周期

推荐阅读:K8S官方文档Deployment部分

Service的使用

Service是一种可以访问 Pod 逻辑分组的策略, Service通常是通过 LabelSelector 访问 Pod 组。利用 Service 就能对外暴露服务。

同学需要知道 Service 的常用操作:

  • (必学)ClusterIp <只能是集群内部访问,可以通过proxy让外部访问>
  • (必学)NodePort <NodePort来暴露服务让外部访问>
  • (选学)LoadBalancer <生产环境一般都是使用LoadBalancer的方式>
  • (选学)Ingress <通过域名访问的方式>

ConfigMap的使用

ConfigMap 就是为了让镜像和配置文件解耦。好比一个动态的数据源,创建后可以在创建 Deployment 的时候指定用它。然后你想要动态更新,容器内也能监听到文件内容更改,进行热重载。

K8S的另外一个类似的功能叫 SecretSecret类似于 ConfigMap,数据是用Base64加密,密文显示,一般存放敏感数据。