From b3ac7c91b3a10edb67a8ea57678a2c16404620d8 Mon Sep 17 00:00:00 2001 From: "huanqing.shao" Date: Sat, 5 Oct 2019 14:43:29 +0800 Subject: [PATCH] =?UTF-8?q?kubectl=E5=AE=89=E8=A3=85/Kubernetes=E4=BB=8B?= =?UTF-8?q?=E7=BB=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vuepress/config.js | 14 ++- install/config-kubectl.md | 35 ++++++ install/install-kubectl.md | 3 +- learning/README.md | 5 + .../container_evolution.svg | 1 + .../image-20191005103155435.png | Bin 0 -> 47756 bytes learning/k8s-bg/what-is-k8s.md | 101 ++++++++++++++++++ .../workload/wl-deployment/index.md | 2 +- 8 files changed, 157 insertions(+), 4 deletions(-) create mode 100644 install/config-kubectl.md create mode 100644 learning/k8s-bg/what-is-k8s.assets/container_evolution.svg create mode 100644 learning/k8s-bg/what-is-k8s.assets/image-20191005103155435.png create mode 100644 learning/k8s-bg/what-is-k8s.md diff --git a/.vuepress/config.js b/.vuepress/config.js index 11ee561..466d241 100644 --- a/.vuepress/config.js +++ b/.vuepress/config.js @@ -162,7 +162,6 @@ module.exports = { 'install-docker-desktop', ['install-k8s', '安装Kubernetes单Master节点'], 'install-kubernetes', - 'install-kubectl' ] }, { @@ -175,9 +174,11 @@ module.exports = { ] }, { - title: '安装 Kuboard', + title: '管理 Kubernetes', collapsable: false, children: [ + 'install-kubectl', + // 'config-kubectl', 'install-dashboard', 'install-dashboard-upgrade' ] @@ -192,6 +193,15 @@ module.exports = { ], '/learning/': [ + '', + { + title: 'Kubernetes 介绍', + collapsable: true, + sidebarDepth: 3, + children: [ + 'k8s-bg/what-is-k8s', + ] + }, { title: 'Kubernetes 入门', collapsable: true, diff --git a/install/config-kubectl.md b/install/config-kubectl.md new file mode 100644 index 0000000..83660c3 --- /dev/null +++ b/install/config-kubectl.md @@ -0,0 +1,35 @@ +--- +vssueId: 115 +description: Kubernete安装文档_kubectl命令行工具从一个配置文件中查找用于调用APIServer接口的信息_可以在一个或多个文件中配置多个集群的访问信息_并在kubectl中切换不同的集群访问 +meta: + - name: keywords + content: kubectl,kubectl配置,kubectl访问多个集群 +--- + +# 配置Kubectl + +> 参考文档: Kubernetes官网文档 [Organizing Cluster Access Using kubeconfig Files](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/)、[Configure Access to Multiple Clusters](https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/) + +`kubectl` 命令行工具从配置文件kubeconfig中查找用于调用 API Server 接口的信息: +* 集群 cluster +* 用户 user +* 名称空间 namespace +* 认证机制 authentication mechanism + +> kubeconfig 并不是一个文件的名字,而是 kubectl 配置文件的统称 + +默认情况下,`kubectl` 读取 `$HOME/.kube/config` 作为配置文件。您可以通过两种方式为 `kubectl` 指定配置文件: +* 环境变量 `KUBECONFIG` +* 命令行参数 `--kubeconfig` + +可以在一个或多个kubeconfig文件中配置多个集群的访问信息,并使用 `kubectl config use-context` 命令切换要访问哪个集群。本文描述了如何配置 kubectl 以访问多个集群。 + +::: tip +kubectl的版本号必须大于等于集群的版本号,执行命令 `kubectl version` 可查看 kubectl 版本 +::: + +## 创建配置文件 + +## 创建第二个配置文件 + +## 设置KUBECONFIG环境变量 diff --git a/install/install-kubectl.md b/install/install-kubectl.md index af057af..2c0b1d7 100644 --- a/install/install-kubectl.md +++ b/install/install-kubectl.md @@ -1,12 +1,13 @@ --- vssueId: 18 +titlePrefix: 从客户端电脑远程管理Kubernetes description: Kubernete安装文档_日常工作中您可能需要在自己的笔记本电脑上执行kubectl命令以管理远程Linux服务器上的Kubernetes集群_本文档介绍了如何在您的笔记本电脑上安装和配置kubectl工具 meta: - name: keywords content: kubectl,kubectl安装,远程管理Kubernetes,远程管理K8S --- -# 从客户端电脑远程管理Kubernetes +# 安装Kubectl 日常工作中,您可能需要在自己的笔记本电脑上执行 kubectl 命令以管理远程 Linux 服务器上的 Kubernetes 集群。 diff --git a/learning/README.md b/learning/README.md index 885efc1..a524433 100644 --- a/learning/README.md +++ b/learning/README.md @@ -1,6 +1,7 @@ --- vssueId: 9 layout: LearningLayout +sidebarDepth: 0 description: 本教程的主要依据是:Kubernetes官网文档,以及使用Kubernetes落地SpringCloud微服务并投产的实战经验,在线答疑。适用人群_ Kubernetes 初学者_学习过 Kubernetes,但在投产过程中仍有诸多疑虑和困惑的技术爱好者 meta: - name: keywords @@ -20,6 +21,10 @@ meta: +## **Kubernetes 介绍** + + * [什么是Kubernetes](/learning/k8s-bg/what-is-k8s.html) + ## **Kubernetes 体验** * [安装 Kubernetes 单Master节点](/install/install-k8s.html) (30分钟,初学者也许需要更多) * 参照经过众多网友验证,不断优化的安装文档,迅速完成 Kubernetes 安装,拥有属于自己的 Kubernetes 集群。 diff --git a/learning/k8s-bg/what-is-k8s.assets/container_evolution.svg b/learning/k8s-bg/what-is-k8s.assets/container_evolution.svg new file mode 100644 index 0000000..3e6eca3 --- /dev/null +++ b/learning/k8s-bg/what-is-k8s.assets/container_evolution.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/learning/k8s-bg/what-is-k8s.assets/image-20191005103155435.png b/learning/k8s-bg/what-is-k8s.assets/image-20191005103155435.png new file mode 100644 index 0000000000000000000000000000000000000000..6eec0c5e385ebd88c8c51c84b3d3fde99654a650 GIT binary patch literal 47756 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

>%e&g|l_Zz(! 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 literal 0 HcmV?d00001 diff --git a/learning/k8s-bg/what-is-k8s.md b/learning/k8s-bg/what-is-k8s.md new file mode 100644 index 0000000..31d56af --- /dev/null +++ b/learning/k8s-bg/what-is-k8s.md @@ -0,0 +1,101 @@ +--- +vssueId: 116 +description: Kubernete教程_Kubernetes介绍 +meta: + - name: keywords + content: Kubernetes 教程,Kubernetes介绍,什么是Kubernetes,K8S简介,K8S介绍 +--- + +# Kubernetes介绍 + +> 参考文档: [What is Kubernetes](https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/) + +Kubernetes是一个可以移植、可扩展的开源平台,使用 [声明式的配置](/learning/k8s-intermediate/workload/wl-deployment/#deployment-概述) 并依据配置信息自动地执行容器化应用程序的管理。在所有的容器编排工具中(类似的还有 docker swarm / mesos等),Kubernetes的生态系统更大、增长更快,有更多的支持、服务和工具可供用户选择。 + +Kubernetes的名字起源于希腊语,含义是 `舵手`、`领航员`、`向导`。Google于2014年将Brog系统开源为Kubernetes。Kubernetes构建在Google Brog [十五年运行大规模分布式系统的经验](https://ai.google/research/pubs/pub43438) 基础之上,并结合了开源社区最好的想法和实践。 + +以下是使用 google trends 对比 `kubernetes` 、 `docker swarm`、 `mesos` 三个关键词的截图。 + +![Kubernetes教程_Google_Trends_Kubernetes](./what-is-k8s.assets/image-20191005103155435.png) + +## 回顾 + +为了理解Kubernetes的用处,我们先回顾一下历史。 + +![Kubernetes教程_部署方式演化](./what-is-k8s.assets/container_evolution.svg) + +大致来说,在部署应用程序的方式上,我们主要经历了三个时代: + +* **传统部署时代**:早期,企业直接将应用程序部署在物理机上。由于物理机上不能为应用程序定义资源使用边界,我们也就很难合理地分配计算资源。例如:如果多个应用程序运行在同一台物理机上,可能发生这样的情况:其中的一个应用程序消耗了大多数的计算资源,导致其他应用程序不能正常运行。应对此问题的一种解决办法是,将每一个应用程序运行在不同的物理机上。然而,这种做法无法大规模实施,因为资源利用率很低,且企业维护更多物理机的成本昂贵。 +* **虚拟化部署时代**:针对上述问题,虚拟化技术应运而生。用户可以在单台物理机的CPU上运行多个虚拟机(Virtual Machine)。 + * 虚拟化技术使得应用程序被虚拟机相互分隔开,限制了应用程序之间的非法访问,进而提供了一定程度的安全性。 + * 虚拟化技术提高了物理机的资源利用率,可以更容易地安装或更新应用程序,降低了硬件成本,因此可以更好地规模化实施。 + * 每一个虚拟机可以认为是被虚拟化的物理机之上的一台完整的机器,其中运行了一台机器的所有组件,包括虚拟机自身的操作系统。 +* **容器化部署时代**:容器与虚拟机类似,但是降低了隔离层级,共享了操作系统。因此,容器可以认为是轻量级的。 + * 与虚拟机相似,每个容器拥有自己的文件系统、CPU、内存、进程空间等 + * 运行应用程序所需要的资源都被容器包装,并和底层基础架构解耦 + * 容器化的应用程序可以跨云服务商、跨Linux操作系统发行版进行部署 + +容器化越来越流行,主要原因是它带来的诸多好处: +* **敏捷地创建和部署应用程序**:相较于创建虚拟机镜像,创建容器镜像更加容易和快速 +* 持续构建集成:可以更快更频繁地构建容器镜像、部署容器化的应用程序、并且轻松地回滚应用程序 +* **分离开发和运维的关注点**:在开发构建阶段就完成容器镜像的构建,构建好的镜像可以部署到多种基础设施上。这种做法将开发阶段需要关注的内容包含在如何构建容器镜像的过程中,将部署阶段需要关注的内容聚焦在如何提供基础设施以及如何使用容器镜像的过程中。降低了开发和运维的耦合度 +* **可监控性**:不仅可以查看操作系统级别的资源监控信息,还可以查看应用程序健康状态以及其他信号的监控信息 +* **开发、测试、生产不同阶段的环境一致性**:开发阶段在笔记本上运行的容器与测试、生产环境中运行的容器一致 +* **跨云服务商、跨操作系统发行版的可移植性**:容器可运行在 Ubuntu、RHEL、CoreOS、CentOS等不同的操作系统发行版上,可以运行在私有化部署、Google Kubernetes Engine、AWS、阿里云等不同的云供应商的环境中 +* **以应用程序为中心的管理**:虚拟机时代的考虑的问题是在虚拟硬件上运行一个操作系统,而容器化时代,问题的焦点则是在操作系统的逻辑资源上运行一个应用程序 +* **松耦合、分布式、弹性、无约束的微服务**:应用程序被切分成更小的、独立的微服务,并可以动态部署和管理,而不是一个部署在专属机器上的庞大的单片应用程序 +* **资源隔离**:确保应用程序性能不受干扰 +* **资源利用**:资源高效、高密度利用 + + +## Kubernetes的功能 + +容器是一个非常好的打包并运行应用程序的方式。在生产环境中,您需要管理容器化应用程序,并且确保其不停机地连续运行。例如:一个容器故障停机,另外一个容器需要立刻启动以替补停机的容器。类似的这种对容器的管理动作由系统来执行会更好更快速。 + +Kubernetes针对此类问题,提供了容器化编排解决方案,可以使你非常健壮地运行分布式系统。Kubernetes可以处理应用程序的伸缩、failover、部署模式等多种需求。例如,Kubernetes可以轻易地管理系统的金丝雀发布(灰度发布)。 + +Kubernetes提供的特性有: + +* **服务发现和负载均衡** + + Kubernetes 可以通过 DNS 名称或 IP 地址暴露容器的访问方式。并且可以在同组容器内分发负载以实现负载均衡 + +* **存储编排** + + Kubernetes可以自动挂载指定的存储系统,例如 local stroage/nfs/云存储等 + +* **自动发布和回滚** + + 您可以在 Kubernetes 中声明您期望应用程序容器应该达到的状态,Kubernetes将以合适的速率调整容器的实际状态,并逐步达到最终期望的结果。请参考 [声明式的配置](/learning/k8s-intermediate/workload/wl-deployment/#deployment-概述) + +* **自愈** + + Kubernetes提供如下自愈能力: + * 重启已经停机的容器 + * 替换、kill 那些不满足自定义健康检查条件的容器 + * 在容器就绪之前,避免调用者发现该容器 + +* **密钥及配置管理** + + Kubernetes可以存储和管理敏感信息(例如,密码、OAuth token、ssh密钥等)。您可以更新容器应用程序的密钥、配置等信息,而无需: + * 重新构建容器的镜像 + * 在不合适的地方暴露密码信息 + +## Kubernetes的边界 + +Kubernetes不是一个传统意义的、保罗万象的 PaaS(Platform as a Service)系统。Kubernetes在容器层面工作,而不是硬件层面,它提供了与 PaaS 平台相似的通用特性,例如:部署、伸缩、负载均衡、日志、监控等。然而,Kubernetes并不是一个单一整体,这些特性都是可选、可插拔的。Kubernetes提供用于搭建开发平台的基础模块,同时为用户提供了不同模块的选择性和多样性。 + +Kubernetes: + +* 不限制应用程序的类型。Kubernetes的目标是广泛支持不同类型的工作负载,包括:有状态、无状态、数据处理等类型的应用。只要应用可以在容器中运行,就能够非常好地在 Kubernetes 上运行 +* 不部署源码、不编译或构建应用程序。持续集成、分发、部署(CI/CD)的工作流极大程度上取决于组织的文化、偏好以及技术要求。Kubernetes可以作为部署平台参与到 CI/CD 流程,但是不涉及镜像构建和分发的过程 + > 译者注:可选的有 Jenkins / Gitlab Runner / docker registry / harbour 等 +* 不提供应用程序级别的服务,包括:中间件(例如,消息总线)、数据处理框架(例如,Spark)、数据库(例如,mysql)、缓存(例如,Redis),或者分布式存储(例如,Ceph)。此类组件可以在 Kubernetes 上运行,或者可以被运行在 Kubernetes 上的应用程序访问 +* 不限定日志、监控、报警的解决方案。Kubernetes 提供一些样例展示如何与日志、监控、报警等组件集成,同时提供收集、导出监控度量(metrics)的一套机制。您可以根据自己的需要选择日志、监控、报警组件 + > 译者注:可选的有 ELK / Prometheus / Graphana / Pinpoint / Skywalking / Metrics Server 等 +* 不提供或者限定配置语言(例如,jsonnet)。Kubernetes提供一组声明式的 API,您可以按照自己的方式定义部署信息。 + > 译者注:可选的有 helm/kustomize/kubectl/kubernetes dashboard/kuboard/octant/k9s 等 +* 不提供或限定任何机器的配置、维护、管理或自愈的系统。 + > 译者注:在这个级别上,可选的组件有 puppet、ansible、open stack 等 +* 此外,Kubernetes不是一个纯粹意义上的容器编排系统。事实上,Kubernetes 消除了容器编排的需求。容器编排的技术定义是`预定义流程的执行`(先做A、再做B、然后做C)。与此相对应,Kubernetes构建了一系列相互独立、可预排的控制过程,以持续不断地将系统从当前状态调整到声明的目标状态。如何从 A 达到 C,并不重要。集中化的控制也就不需要了。这个设计思想使得Kubernetes使用更简单、更强大、稳健、反脆弱和可扩展。 diff --git a/learning/k8s-intermediate/workload/wl-deployment/index.md b/learning/k8s-intermediate/workload/wl-deployment/index.md index f859ad2..c3ab9ee 100644 --- a/learning/k8s-intermediate/workload/wl-deployment/index.md +++ b/learning/k8s-intermediate/workload/wl-deployment/index.md @@ -67,7 +67,7 @@ ReplicaSet 副本集的主要几个字段有: Deployment 是最常用的用于部署无状态服务的方式。Deployment 控制器使得您能够以声明的方式更新 Pod(容器组)和 ReplicaSet(副本集)。 -::: tip +::: tip 声明式配置 声明的方式是相对于非声明方式而言的。例如,以滚动更新为例,假设有 3 个容器组,现需要将他们的容器镜像更新为新的版本。 * 非声明的方式,您需要手动逐步执行以下过程: * 使用 kubectl 创建一个新版本镜像的容器组