Use a better structure

This commit is contained in:
Baohua Yang
2026-02-09 09:32:05 -08:00
parent fdb879dcf2
commit e669ee0fe8
167 changed files with 2462 additions and 2462 deletions

View File

@@ -1,4 +1,4 @@
# 容器编排
# 第十一章 容器编排
本章将介绍容器编排相关的技术与工具

View File

@@ -1,3 +1,3 @@
# etcd
## etcd
`etcd` `CoreOS` 团队发起的一个管理配置信息和服务发现`Service Discovery`的项目在这一章里面我们将基于 `etcd 3.x` 版本介绍该项目的目标安装和使用以及实现的技术

View File

@@ -1,4 +1,4 @@
# etcd 集群
## etcd 集群
下面我们使用 [Docker Compose](../compose/) 模拟启动一个 3 节点的 `etcd` 集群

View File

@@ -1,4 +1,4 @@
# 使用 etcdctl
## 使用 etcdctl
`etcdctl` 是一个命令行客户端它能提供一些简洁的命令供用户直接跟 `etcd` 服务打交道而无需基于 `HTTP API` 方式这在某些情况下将很方便例如用户对服务进行测试或者手动修改数据库内容我们也推荐在刚接触 `etcd` 时通过 `etcdctl` 命令来熟悉相关的操作这些操作跟 `HTTP API` 实际上是对应的
@@ -81,7 +81,7 @@ OPTIONS:
-w, --write-out="simple" set the output format (fields, json, protobuf, simple, table)
```
## 数据库操作
### 数据库操作
数据库操作围绕对键值和目录的 CRUD 符合 REST 风格的一套操作Create完整生命周期的管理
@@ -89,14 +89,14 @@ etcd 在键的组织上采用了层次化的空间结构(类似于文件系统
>CRUD Create, Read, Update, Delete是符合 REST 风格的一套 API 操作
### put
#### put
```bash
$ etcdctl put /testdir/testkey "Hello world"
OK
```
### get
#### get
获取指定键的值例如
@@ -114,7 +114,7 @@ hello
`--consistent` 将请求发给主节点保证获取内容的一致性
### del
#### del
删除某个键值例如
@@ -123,9 +123,9 @@ $ etcdctl del testkey
1
```
## 非数据库操作
### 非数据库操作
### watch
#### watch
监测一个键值的变化一旦键值发生更新就会输出最新的值
@@ -138,7 +138,7 @@ testkey
2
```
### member
#### member
通过 `list``add``update``remove` 命令列出添加更新删除 etcd 实例到 etcd 集群中

View File

@@ -1,10 +1,10 @@
# 安装
## 安装
`etcd` 基于 `Go` 语言实现因此用户可以从 [项目主页](https://github.com/etcd-io/etcd) 下载源代码自行编译,也可以下载编译好的二进制文件,甚至直接使用制作好的 `Docker` 镜像文件来体验。
>注意本章节内容基于 etcd `3.4.x` 版本
## 二进制文件方式下载
### 二进制文件方式下载
编译好的二进制文件都在 [github.com/etcd-io/etcd/releases](https://github.com/etcd-io/etcd/releases/) 页面,用户可以选择需要的版本,或通过下载工具下载。
@@ -13,7 +13,7 @@
```bash
$ curl -L https://github.com/etcd-io/etcd/releases/download/v3.4.0/etcd-v3.4.0-linux-amd64.tar.gz -o etcd-v3.4.0-linux-amd64.tar.gz
# 国内用户可以使用以下方式加快下载
## 国内用户可以使用以下方式加快下载
$ curl -L https://download.fastgit.org/etcd-io/etcd/releases/download/v3.4.0/etcd-v3.4.0-linux-amd64.tar.gz -o etcd-v3.4.0-linux-amd64.tar.gz
$ tar xzvf etcd-v3.4.0-linux-amd64.tar.gz
@@ -60,7 +60,7 @@ hello world
说明 etcd 服务已经成功启动了
## Docker 镜像方式运行
### Docker 镜像方式运行
镜像名称为 `quay.io/coreos/etcd`可以通过下面的命令启动 `etcd` 服务监听到 `2379` `2380` 端口
@@ -88,7 +88,7 @@ quay.io/coreos/etcd:v3.4.0 \
打开新的终端按照上一步的方法测试 `etcd` 是否成功启动
## macOS 中运行
### macOS 中运行
```bash
$ brew install etcd

View File

@@ -1,4 +1,4 @@
# 简介
## 简介
![](../_images/etcd_logo.png)

View File

@@ -1,4 +1,4 @@
# kubectl 使用
## kubectl 使用
[kubectl](https://github.com/kubernetes/kubernetes) 是 Kubernetes 自带的客户端,可以用它来直接操作 Kubernetes。
@@ -8,74 +8,74 @@ kubectl [flags]
kubectl [command]
```
## get
### get
显示一个或多个资源
## describe
### describe
显示资源详情
## create
### create
从文件或标准输入创建资源
## update
### update
从文件或标准输入更新资源
## delete
### delete
通过文件名标准输入资源名或者 label selector 删除资源
## log
### log
输出 pod 中一个容器的日志
## rolling-update
### rolling-update
对指定的 replication controller 执行滚动升级
## exec
### exec
在容器内部执行命令
## port-forward
### port-forward
将本地端口转发到Pod
## proxy
### proxy
Kubernetes API server 启动代理服务器
## run
### run
在集群中使用指定镜像启动容器
## expose
### expose
replication controller service pod 暴露为新的 kubernetes service
## label
### label
更新资源的 label
## config
### config
修改 kubernetes 配置文件
## cluster-info
### cluster-info
显示集群信息
## api-versions
### api-versions
"组/版本" 的格式输出服务端支持的 API 版本
## version
### version
输出服务端和客户端的版本信息
## help
### help
显示各个命令的帮助信息

View File

@@ -1,4 +1,4 @@
# Kubernetes
## Kubernetes
`Kubernetes` Google 团队发起并维护的基于 Docker 的开源容器集群管理系统它不仅支持常见的云平台而且支持内部数据中心

View File

@@ -1,8 +1,8 @@
# Kubernetes 高级特性
## Kubernetes 高级特性
掌握了 Kubernetes 的核心概念Pod, Service, Deployment我们需要了解更多高级特性以构建生产级应用
## Helm - 包管理工具
### Helm - 包管理工具
[Helm](https://helm.sh/) 被称为 Kubernetes 的包管理器(类似于 Linux 的 apt/yum。它将一组 Kubernetes 资源定义文件打包为一个 **Chart**。
@@ -10,7 +10,7 @@
* **版本管理**轻松回滚应用的发布版本
* **模板化**支持复杂的应用部署逻辑配置
## Ingress - 服务的入口
### Ingress - 服务的入口
Service 虽然提供了负载均衡但通常是 4 TCP/UDP**Ingress** 提供了 7 HTTP/HTTPS路由能力充当集群的网关
@@ -20,7 +20,7 @@ Service 虽然提供了负载均衡,但通常是 4 层TCP/UDP。**Ingres
常见的 Ingress Controller有 Nginx Ingress Controller, Traefik, Istio Gateway
## Persistent Volume (PV) StorageClass
### Persistent Volume (PV) StorageClass
容器内的文件是临时的对于有状态应用如数据库需要持久化存储
@@ -28,7 +28,7 @@ Service 虽然提供了负载均衡,但通常是 4 层TCP/UDP。**Ingres
* **PV (Persistent Volume)**实际的存储资源NFS, AWS EBS, Ceph
* **StorageClass**定义存储类支持动态创建 PV
## Horizontal Pod Autoscaling (HPA)
### Horizontal Pod Autoscaling (HPA)
HPA 根据 CPU 利用率或其他指标如内存自定义指标自动扩缩 Deployment ReplicaSet 中的 Pod 数量
@@ -53,7 +53,7 @@ spec:
averageUtilization: 50
```
## ConfigMap Secret
### ConfigMap Secret
* **ConfigMap**存储非机密的配置数据配置文件环境变量
* **Secret**存储机密数据密码Token证书 Etcd 中加密存储

View File

@@ -1,4 +1,4 @@
# 基本概念
## 基本概念
![](../_images/kubernetes_design.jpg)
@@ -13,27 +13,27 @@
* web 界面`ux`用户可以通过 web 界面操作 Kubernetes
* 命令行操作`cli``kubectl`命令
## 节点
### 节点
`Kubernetes` 节点是实际工作的点节点可以是虚拟机或者物理机器依赖于一个集群环境每个节点都有一些必要的服务以运行容器组并且它们都可以通过主节点来管理必要服务包括 Dockerkubelet 和代理服务
### 容器状态
#### 容器状态
容器状态用来描述节点的当前状态现在其中包含三个信息
#### 主机IP
##### 主机IP
主机 IP 需要云平台来查询`Kubernetes` 把它作为状态的一部分来保存如果 `Kubernetes` 没有运行在云平台上节点 ID 就是必需的IP 地址可以变化并且可以包含多种类型的 IP 地址如公共 IP私有 IP动态 IPipv6 等等
#### 节点周期
##### 节点周期
通常来说节点有 `Pending``Running``Terminated` 三个周期如果 Kubernetes 发现了一个节点并且其可用那么 Kubernetes 就把它标记为 `Pending`然后在某个时刻Kubernetes 将会标记其为 `Running`节点的结束周期称为 `Terminated`一个已经 `Terminated` 的节点不会接受和调度任何请求并且已经在其上运行的容器组也会删除
#### 节点状态
##### 节点状态
节点的状态主要是用来描述处于 `Running` 的节点当前可用的有 `NodeReachable` `NodeReady`以后可能会增加其他状态`NodeReachable` 表示集群可达`NodeReady` 表示 kubelet 返回 Status Ok 并且 HTTP 状态检查健康
### 节点管理
#### 节点管理
节点并非 Kubernetes 创建而是由云平台创建或者就是物理机器虚拟机 Kubernetes 节点仅仅是一条记录节点创建之后Kubernetes 会检查其是否可用 Kubernetes 节点用如下结构保存
@@ -56,7 +56,7 @@
Kubernetes 校验节点可用依赖于 ID在当前的版本中有两个接口可以用来管理节点节点控制和 Kube 管理
### 节点控制
#### 节点控制
Kubernetes 主节点中节点控制器是用来管理节点的组件主要包含
@@ -65,15 +65,15 @@ Kubernetes 校验节点可用依赖于 ID。在当前的版本中有两个接
节点控制有一个同步轮询主要监听所有云平台的虚拟实例会根据节点状态创建和删除可以通过 `--node_sync_period`标志来控制该轮询如果一个实例已经创建节点控制将会为其创建一个结构同样的如果一个节点被删除节点控制也会删除该结构 Kubernetes 启动时可用通过 `--machines`标记来显示指定节点同样可以使用 `kubectl` 来一条一条的添加节点两者是相同的通过设置 `--sync_nodes=false`标记来禁止集群之间的节点同步你也可以使用 api/kubectl 命令行来增删节点
## 容器组
### 容器组
Kubernetes 使用的最小单位是容器组容器组是创建调度管理的最小单位 一个容器组使用相同的 Docker 容器并共享卷挂载点一个容器组是一个特定应用的打包集合包含一个或多个容器
和运行的容器类似一个容器组被认为只有很短的运行周期容器组被调度到一组节点运行直到容器的生命周期结束或者其被删除如果节点死掉运行在其上的容器组将会被删除而不是重新调度也许在将来的版本中会添加容器组的移动
### 容器组设计的初衷
#### 容器组设计的初衷
### 资源共享和通信
#### 资源共享和通信
容器组主要是为了数据共享和它们之间的通信
@@ -81,11 +81,11 @@ Kubernetes 校验节点可用依赖于 ID。在当前的版本中有两个接
容器组有一组存储卷挂载点主要是为了让容器在重启之后可以不丢失数据
### 容器组管理
#### 容器组管理
容器组是一个应用管理和部署的高层次抽象同时也是一组容器的接口容器组是部署水平放缩的最小单位
### 容器组的使用
#### 容器组的使用
容器组可以通过组合来构建复杂的应用其本来的意义包含
@@ -95,7 +95,7 @@ Kubernetes 校验节点可用依赖于 ID。在当前的版本中有两个接
* 代理网桥
* 控制器管理配置以及更新
### 替代方案
#### 替代方案
为什么不在一个单一的容器里运行多个程序
@@ -104,27 +104,27 @@ Kubernetes 校验节点可用依赖于 ID。在当前的版本中有两个接
* 3.方便使用用户不必运行独立的程序管理也不用担心每个应用程序的退出状态
* 4.高效考虑到基础设施有更多的职责容器必须要轻量化
### 容器组的生命状态
#### 容器组的生命状态
包括若干状态值`pending``running``succeeded``failed`
#### pending
##### pending
容器组已经被节点接受但有一个或多个容器还没有运行起来这将包含某些节点正在下载镜像的时间这种情形会依赖于网络情况
#### running
##### running
容器组已经被调度到节点并且所有的容器都已经启动至少有一个容器处于运行状态或者处于重启状态
#### succeeded
##### succeeded
所有的容器都正常退出
#### failed
##### failed
容器组中所有容器都意外中断了
### 容器组生命周期
#### 容器组生命周期
通常来说如果容器组被创建了就不会自动销毁除非被某种行为触发而触发此种情况可能是人为或者复制控制器所为唯一例外的是容器组由 succeeded 状态成功退出或者在一定时间内重试多次依然失败
@@ -173,16 +173,16 @@ Kubernetes 校验节点可用依赖于 ID。在当前的版本中有两个接
* 节点控制器标记容器组 `failed`
* 如果容器组运行在一个控制器下容器组将会在其他地方重新创建
## Replication Controllers
### Replication Controllers
## 服务
### 服务
##
###
## 标签
### 标签
## 接口权限
### 接口权限
## web界面
### web界面
## 命令行操作
### 命令行操作

View File

@@ -1,8 +1,8 @@
# 架构设计
## 架构设计
任何优秀的项目都离不开优秀的架构设计本小节将介绍 Kubernetes 在架构方面的设计考虑
## 基本考虑
### 基本考虑
如果让我们自己从头设计一套容器管理平台有如下几个方面是很容易想到的
@@ -11,7 +11,7 @@
* 一套资源调度系统管理哪个容器该分配到哪个节点上
* 一套对容器内服务进行抽象和 HA 的系统
## 运行原理
### 运行原理
下面这张图完整展示了 Kubernetes 的运行原理
@@ -23,9 +23,9 @@
从这张图上我们没有能发现 Kubernetes 中对于控制平面的分布式实现但是由于数据后端自身就是一套分布式的数据库 Etcd因此可以很容易扩展到分布式实现
## 控制平面
### 控制平面
### 主节点服务
#### 主节点服务
主节点上需要提供如下的管理服务
@@ -33,7 +33,7 @@
* `scheduler` 负责对资源进行调度分配某个 pod 到某个节点上 pluggable 意味着很容易选择其它实现方式
* `controller-manager` 负责管理控制器包括 endpoint-controller刷新服务和 pod 的关联信息 replication-controller维护某个 pod 的复制为配置的数值
### Etcd
#### Etcd
这里 Etcd 即作为数据后端又作为消息中间件
@@ -41,7 +41,7 @@
组件可以自动的去侦测 Etcd 中的数值变化来获得通知并且获得更新后的数据来执行相应的操作
## 工作节点
### 工作节点
* kubelet 是工作节点执行操作的 agent负责具体的容器生命周期管理根据从数据库中获取的信息来管理容器并上报 pod 运行状态等
* kube-proxy 是一个简单的网络访问代理同时也是一个 Load Balancer它负责将访问到某个服务的请求具体分配给工作节点上的 Pod同一类标签

View File

@@ -1,8 +1,8 @@
# Kubernetes 简介
## Kubernetes 简介
![](../_images/kubernetes_logo.png)
## 什么是 Kubernetes
### 什么是 Kubernetes
Kubernetes常简称为 K8s Google 开源的容器编排引擎如果说 Docker 解决了"如何打包和运送集装箱"的问题那么 Kubernetes 解决的就是"如何管理海量集装箱的调度、运行和维护"的问题
@@ -12,7 +12,7 @@ Kubernetes常简称为 K8s是 Google 开源的容器编排引擎。如果
---
## 为什么需要 Kubernetes
### 为什么需要 Kubernetes
当我们在单机运行几个容器时Docker Compose 就足够了但在生产环境中我们需要面对
@@ -26,26 +26,26 @@ Kubernetes 完美解决了这些问题。
---
## 核心概念
### 核心概念
### Pod (豆荚)
#### Pod (豆荚)
Kubernetes 的最小调度单位一个 Pod 可以包含一个或多个紧密协作的容器共享网络和存储就像豌豆荚里的豌豆一样
### Node (节点)
#### Node (节点)
运行 Pod 的物理机或虚拟机
### Deployment (部署)
#### Deployment (部署)
定义应用的期望状态需要 3 个副本镜像版本为 v1K8s 会持续确保当前状态符合期望状态
### Service (服务)
#### Service (服务)
定义一组 Pod 的访问策略提供稳定的 Cluster IP DNS 名称负责负载均衡
### Namespace (命名空间)
#### Namespace (命名空间)
用于多租户资源隔离
---
## Docker 用户如何过渡
### Docker 用户如何过渡
如果你已经熟悉 Docker学习 K8s 会很容易
@@ -58,7 +58,7 @@ Kubernetes 的最小调度单位。一个 Pod 可以包含一个或多个紧密
---
## 架构
### 架构
Kubernetes 也是 C/S 架构 **Master (控制平面)** **Worker (工作节点)** 组成
@@ -67,7 +67,7 @@ Kubernetes 也是 C/S 架构,由 **Master (控制平面)** 和 **Worker (工
---
## 学习建议
### 学习建议
Kubernetes 的学习曲线较陡峭建议的学习路径
1. **理解基本概念**Pod, Deployment, Service
@@ -77,7 +77,7 @@ Kubernetes 的学习曲线较陡峭。建议的学习路径:
---
## 延伸阅读
### 延伸阅读
- [Minikube 安装](../kubernetes/setup/README.md)本地体验 K8s
- [Kubernetes 官网](https://kubernetes.io/):官方文档

View File

@@ -1,14 +1,14 @@
# Kubernetes 实战练习
## Kubernetes 实战练习
本章将通过一个具体的案例部署一个 Nginx 网站并为其配置 Service Ingress来串联前面学到的知识
## 目标
### 目标
1. 部署一个 Nginx Deployment
2. 创建一个 Service 暴露 Nginx
3. 可选通过 Ingress 访问服务
## 步骤 1创建 Deployment
### 步骤 1创建 Deployment
创建一个名为 `nginx-deployment.yaml` 的文件
@@ -42,7 +42,7 @@ spec:
kubectl apply -f nginx-deployment.yaml
```
## 步骤 2创建 Service
### 步骤 2创建 Service
创建一个名为 `nginx-service.yaml` 的文件
@@ -75,7 +75,7 @@ kubectl get svc nginx-service
如果输出端口是 `80:30080/TCP`你可以通过 `http://<NodeIP>:30080` 访问 Nginx
## 步骤 3模拟滚动更新 (Rolling Update)
### 步骤 3模拟滚动更新 (Rolling Update)
修改 `nginx-deployment.yaml`将镜像版本改为 `nginx:latest`
@@ -89,7 +89,7 @@ kubectl apply -f nginx-deployment.yaml
kubectl rollout status deployment/nginx-deployment
```
## 步骤 4清理资源
### 步骤 4清理资源
练习结束后记得清理资源

View File

@@ -1,4 +1,4 @@
# 部署 Kubernetes
## 部署 Kubernetes
目前Kubernetes 支持在多种环境下使用包括本地主机UbuntuDebianCentOSFedora 云服务[腾讯云](https://cloud.tencent.com/act/cps/redirect?redirect=10058&cps_key=3a5255852d5db99dcd5da4c72f05df61)、[阿里云](https://www.aliyun.com/product/kubernetes?source=5176.11533457&userCode=8lx5zmtu&type=copy)、[百度云](https://cloud.baidu.com/product/cce.html) 等)。

View File

@@ -1,10 +1,10 @@
# Kubernetes Dashboard
## Kubernetes Dashboard
[Kubernetes Dashboard](https://github.com/kubernetes/dashboard) 是基于网页的 Kubernetes 用户界面。
![](https://d33wubrfki0l68.cloudfront.net/349824f68836152722dab89465835e604719caea/6e0b7/images/docs/ui-dashboard.png)
## 部署
### 部署
执行以下命令即可部署 Dashboard
@@ -12,7 +12,7 @@
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
```
## 访问
### 访问
通过命令行代理访问执行以下命令
@@ -22,7 +22,7 @@ $ kubectl proxy
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ 即可访问。
## 登录
### 登录
目前Dashboard 仅支持使用 Bearer 令牌登录下面教大家如何创建该令牌
@@ -40,6 +40,6 @@ echo ${DASHBOARD_LOGIN_TOKEN}
将结果粘贴到登录页面即可登录
## 参考文档
### 参考文档
* [官方文档](https://kubernetes.io/zh/docs/tasks/access-application-cluster/web-ui-dashboard/)

View File

@@ -1,8 +1,8 @@
# Docker Desktop 启用 Kubernetes
## Docker Desktop 启用 Kubernetes
使用 Docker Desktop 可以很方便的启用 Kubernetes
## 启用 Kubernetes
### 启用 Kubernetes
Docker Desktop 设置页面点击 `Kubernetes`选择 `Enable Kubernetes`稍等片刻看到左下方 `Kubernetes` 变为 `running`Kubernetes 启动成功
@@ -10,7 +10,7 @@
> 注意Kubernetes 的镜像存储在 `registry.k8s.io`如果国内网络无法直接访问可以在 Docker Desktop 配置中的 `Docker Engine` 处配置镜像加速器或者利用国内云服务商的镜像仓库手动拉取镜像并 retag
## 测试
### 测试
```bash
$ kubectl version

View File

@@ -1,17 +1,17 @@
# K3s - 轻量级 Kubernetes
## K3s - 轻量级 Kubernetes
[K3s](https://k3s.io/) 是一个轻量级的 Kubernetes 发行版,由 Rancher Labs 开发。它专为边缘计算、物联网、CI、ARM 等资源受限的环境设计。K3s 被打包为单个二进制文件,只有不到 100MB但通过了 CNCF 的一致性测试。
## 核心特性
### 核心特性
* **轻量级**移除过时的非必须的 Kubernetes 功能如传统的云提供商插件使用 SQLite 作为默认数据存储也支持 Etcd/MySQL/Postgres
* **单一二进制**所有组件API Server, Controller Manager, Scheduler, Kubelet, Kube-proxy打包在一个进程中运行
* **开箱即用**内置 Helm ControllerTraefik Ingress controllerServiceLBLocal-Path-Provisioner
* **安全**默认启用安全配置基于 TLS 通信
## 安装
### 安装
### 脚本安装Linux
#### 脚本安装Linux
K3s 提供了极为便捷的安装脚本
@@ -21,7 +21,7 @@ curl -sfL https://get.k3s.io | sh -
安装完成后K3s 会自动启动并配置好 `systemd` 服务
### 查看状态
#### 查看状态
```bash
sudo k3s kubectl get nodes
@@ -33,19 +33,19 @@ NAME STATUS ROLES AGE VERSION
k3s-master Ready control-plane,master 1m v1.28.2+k3s1
```
## 快速使用
### 快速使用
K3s 内置了 `kubectl` 命令通过 `k3s kubectl` 调用为了方便通常会建立别名或配置 `KUBECONFIG`
```bash
# 读取 K3s 的配置文件
## 读取 K3s 的配置文件
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
# 现在可以直接使用 kubectl
## 现在可以直接使用 kubectl
kubectl get pods -A
```
## 清理卸载
### 清理卸载
```bash
/usr/local/bin/k3s-uninstall.sh

View File

@@ -1,34 +1,34 @@
# Kind - Kubernetes IN Docker
## Kind - Kubernetes IN Docker
[Kind](https://kind.sigs.k8s.io/) (Kubernetes in Docker) 是一个使用 Docker 容器作为节点运行本地 Kubernetes 集群的工具。主要用于测试 Kubernetes 本身,也非常适合本地开发和 CI 环境。
## 为什么选择 Kind
### 为什么选择 Kind
* **轻量便捷**只要有 Docker 环境即可无需额外虚拟机
* **多集群支持**可以轻松在本地启动多个集群
* **多版本支持**支持指定 Kubernetes 版本进行测试
* **HA 支持**支持模拟高可用集群 Control Plane
## 安装 Kind
### 安装 Kind
### macOS
#### macOS
```bash
brew install kind
```
### Linux / Windows (WSL2)
#### Linux / Windows (WSL2)
可以下载二进制文件
```bash
# Linux AMD64
## Linux AMD64
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
```
## 创建集群
### 创建集群
最简单的创建方式
@@ -42,7 +42,7 @@ kind create cluster
kind create cluster --name my-cluster
```
## 与集群交互
### 与集群交互
Kind 会自动将 kubeconfig 合并到 `~/.kube/config`
@@ -51,7 +51,7 @@ kubectl cluster-info --context kind-kind
kubectl get nodes
```
## 高级用法配置集群
### 高级用法配置集群
创建一个 `kind-config.yaml` 来定制集群例如映射端口到宿主机
@@ -74,7 +74,7 @@ nodes:
kind create cluster --config kind-config.yaml
```
## 删除集群
### 删除集群
```bash
kind delete cluster

View File

@@ -1,14 +1,14 @@
# 使用 kubeadm 部署 kubernetes(使用 Docker)
## 使用 kubeadm 部署 kubernetes(使用 Docker)
`kubeadm` 提供了 `kubeadm init` 以及 `kubeadm join` 这两个命令作为快速创建 `kubernetes` 集群的最佳实践
## 安装 Docker
### 安装 Docker
参考 [安装 Docker](../../install) 一节安装 Docker
## 安装 **kubelet** **kubeadm** **kubectl**
### 安装 **kubelet** **kubeadm** **kubectl**
### Ubuntu/Debian
#### Ubuntu/Debian
```bash
$ apt-get update && apt-get install -y apt-transport-https
@@ -22,7 +22,7 @@ $ apt-get update
$ apt-get install -y kubelet kubeadm kubectl
```
### CentOS/Fedora
#### CentOS/Fedora
```bash
$ cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
@@ -38,7 +38,7 @@ EOF
$ sudo yum install -y kubelet kubeadm kubectl
```
## 修改内核的运行参数
### 修改内核的运行参数
```bash
$ cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
@@ -47,18 +47,18 @@ net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
# 应用配置
## 应用配置
$ sysctl --system
```
## 配置 kubelet
### 配置 kubelet
### 修改 `kubelet.service`
#### 修改 `kubelet.service`
`/etc/systemd/system/kubelet.service.d/10-proxy-ipvs.conf` 写入以下内容
```bash
# 启用 ipvs 相关内核模块
## 启用 ipvs 相关内核模块
[Service]
ExecStartPre=-/sbin/modprobe ip_vs
ExecStartPre=-/sbin/modprobe ip_vs_rr
@@ -72,9 +72,9 @@ ExecStartPre=-/sbin/modprobe ip_vs_sh
$ sudo systemctl daemon-reload
```
## 部署
### 部署
### master
#### master
```bash
$ sudo kubeadm init --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
@@ -114,7 +114,7 @@ kubeadm join 192.168.199.100:6443 --token cz81zt.orsy9gm9v649e5lf \
--discovery-token-ca-cert-hash sha256:5edb316fd0d8ea2792cba15cdf1c899a366f147aa03cba52d4e5c5884ad836fe
```
### node 工作节点
#### node 工作节点
**另一主机** 重复 **部署** 小节以前的步骤安装配置好 kubelet根据提示加入到集群
@@ -123,11 +123,11 @@ $ kubeadm join 192.168.199.100:6443 --token cz81zt.orsy9gm9v649e5lf \
--discovery-token-ca-cert-hash sha256:5edb316fd0d8ea2792cba15cdf1c899a366f147aa03cba52d4e5c5884ad836fe
```
## 查看服务
### 查看服务
所有服务启动后查看本地实际运行的 Docker 容器这些服务大概分为三类主节点服务工作节点服务和其它服务
### 主节点服务
#### 主节点服务
* `apiserver` 是整个系统的对外接口提供 RESTful 方式供客户端和其它组件调用
@@ -135,15 +135,15 @@ $ kubeadm join 192.168.199.100:6443 --token cz81zt.orsy9gm9v649e5lf \
* `controller-manager` 负责管理控制器包括 endpoint-controller刷新服务和 pod 的关联信息 replication-controller维护某个 pod 的复制为配置的数值
### 工作节点服务
#### 工作节点服务
* `proxy` pod 上的服务提供访问的代理
### 其它服务
#### 其它服务
* Etcd 是所有状态的存储数据库
## 使用
### 使用
`/etc/kubernetes/admin.conf` 复制到 `~/.kube/config`
@@ -151,18 +151,18 @@ $ kubeadm join 192.168.199.100:6443 --token cz81zt.orsy9gm9v649e5lf \
由于未部署 CNI 插件CoreDNS 未正常启动如何使用 Kubernetes请参考后续章节
## 部署 CNI
### 部署 CNI
这里以 `flannel` 为例进行介绍
### flannel
#### flannel
检查 podCIDR 设置
```bash
$ kubectl get node -o yaml | grep CIDR
# 输出
## 输出
podCIDR: 10.244.0.0/16
podCIDRs:
```
@@ -171,17 +171,17 @@ $ kubectl get node -o yaml | grep CIDR
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.11.0/Documentation/kube-flannel.yml
```
## master 节点默认不能运行 pod
### master 节点默认不能运行 pod
如果用 `kubeadm` 部署一个单节点集群默认情况下无法使用请执行以下命令解除限制
```bash
$ kubectl taint nodes --all node-role.kubernetes.io/master-
# 恢复默认值
# $ kubectl taint nodes NODE_NAME node-role.kubernetes.io/master=true:NoSchedule
## 恢复默认值
## $ kubectl taint nodes NODE_NAME node-role.kubernetes.io/master=true:NoSchedule
```
## 参考文档
### 参考文档
* [官方文档](https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/)

View File

@@ -1,22 +1,22 @@
# 使用 kubeadm 部署 kubernetes(CRI 使用 containerd)
## 使用 kubeadm 部署 kubernetes(CRI 使用 containerd)
`kubeadm` 提供了 `kubeadm init` 以及 `kubeadm join` 这两个命令作为快速创建 `kubernetes` 集群的最佳实践
> **版本说明**Kubernetes 版本更新较快约每 4 个月一个新版本本文档基于 Kubernetes 1.35 编写请访问 [Kubernetes 官方发布页](https://kubernetes.io/releases/) 获取最新版本信息。
## 安装 containerd
### 安装 containerd
参考 [安装 Docker](../../install) 一节添加 apt/yum 之后执行如下命令
```bash
# debian 系
## debian 系
$ sudo apt install containerd.io
# rhel 系
## rhel 系
$ sudo yum install containerd.io
```
## 配置 containerd
### 配置 containerd
新建 `/etc/systemd/system/cri-containerd.service` 文件
@@ -35,13 +35,13 @@ Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
## Having non-zero Limit*s causes performance problems due to accounting overhead
## in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
## Comment TasksMax if your systemd version does not supports it.
## Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999
@@ -53,14 +53,14 @@ WantedBy=multi-user.target
```toml
version = 2
# persistent data location
## persistent data location
root = "/var/lib/cri-containerd"
# runtime state information
## runtime state information
state = "/run/cri-containerd"
plugin_dir = ""
disabled_plugins = []
required_plugins = []
# set containerd's OOM score
## set containerd's OOM score
oom_score = 0
[grpc]
@@ -201,9 +201,9 @@ oom_score = 0
async_remove = false
```
## 安装 **kubelet** **kubeadm** **kubectl** **cri-tools** **kubernetes-cni**
### 安装 **kubelet** **kubeadm** **kubectl** **cri-tools** **kubernetes-cni**
### Ubuntu/Debian
#### Ubuntu/Debian
```bash
$ apt-get update && apt-get install -y apt-transport-https
@@ -217,7 +217,7 @@ $ apt-get update
$ apt-get install -y kubelet kubeadm kubectl
```
### CentOS/Fedora
#### CentOS/Fedora
```bash
$ cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
@@ -233,7 +233,7 @@ EOF
$ sudo yum install -y kubelet kubeadm kubectl
```
## 修改内核的运行参数
### 修改内核的运行参数
```bash
$ cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
@@ -242,18 +242,18 @@ net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
# 应用配置
## 应用配置
$ sysctl --system
```
## 配置 kubelet
### 配置 kubelet
### 修改 `kubelet.service`
#### 修改 `kubelet.service`
`/etc/systemd/system/kubelet.service.d/10-proxy-ipvs.conf` 写入以下内容
```bash
# 启用 ipvs 相关内核模块
## 启用 ipvs 相关内核模块
[Service]
ExecStartPre=-/sbin/modprobe ip_vs
ExecStartPre=-/sbin/modprobe ip_vs_rr
@@ -267,9 +267,9 @@ ExecStartPre=-/sbin/modprobe ip_vs_sh
$ sudo systemctl daemon-reload
```
## 部署
### 部署
### master
#### master
```bash
$ systemctl enable cri-containerd
@@ -315,7 +315,7 @@ kubeadm join 192.168.199.100:6443 --token cz81zt.orsy9gm9v649e5lf \
--discovery-token-ca-cert-hash sha256:5edb316fd0d8ea2792cba15cdf1c899a366f147aa03cba52d4e5c5884ad836fe
```
### node 工作节点
#### node 工作节点
**另一主机** 重复 **部署** 小节以前的步骤安装配置好 kubelet根据提示加入到集群
@@ -330,7 +330,7 @@ $ kubeadm join 192.168.199.100:6443 \
--cri-socket /run/cri-containerd/cri-containerd.sock
```
## 查看服务
### 查看服务
所有服务启动后通过 `crictl` 查看本地实际运行的容器这些服务大概分为三类主节点服务工作节点服务和其它服务
@@ -338,7 +338,7 @@ $ kubeadm join 192.168.199.100:6443 \
CONTAINER_RUNTIME_ENDPOINT=/run/cri-containerd/cri-containerd.sock crictl ps -a
```
### 主节点服务
#### 主节点服务
* `apiserver` 是整个系统的对外接口提供 RESTful 方式供客户端和其它组件调用
@@ -346,15 +346,15 @@ CONTAINER_RUNTIME_ENDPOINT=/run/cri-containerd/cri-containerd.sock crictl ps -a
* `controller-manager` 负责管理控制器包括 endpoint-controller刷新服务和 pod 的关联信息 replication-controller维护某个 pod 的复制为配置的数值
### 工作节点服务
#### 工作节点服务
* `proxy` pod 上的服务提供访问的代理
### 其它服务
#### 其它服务
* Etcd 是所有状态的存储数据库
## 使用
### 使用
`/etc/kubernetes/admin.conf` 复制到 `~/.kube/config`
@@ -362,18 +362,18 @@ CONTAINER_RUNTIME_ENDPOINT=/run/cri-containerd/cri-containerd.sock crictl ps -a
由于未部署 CNI 插件CoreDNS 未正常启动如何使用 Kubernetes请参考后续章节
## 部署 CNI
### 部署 CNI
这里以 `flannel` 为例进行介绍
### flannel
#### flannel
检查 podCIDR 设置
```bash
$ kubectl get node -o yaml | grep CIDR
# 输出
## 输出
podCIDR: 10.244.0.0/16
podCIDRs:
```
@@ -382,18 +382,18 @@ $ kubectl get node -o yaml | grep CIDR
$ kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.26.1/Documentation/kube-flannel.yml
```
## master 节点默认不能运行 pod
### master 节点默认不能运行 pod
如果用 `kubeadm` 部署一个单节点集群默认情况下无法使用请执行以下命令解除限制
```bash
$ kubectl taint nodes --all node-role.kubernetes.io/master-
# 恢复默认值
# $ kubectl taint nodes NODE_NAME node-role.kubernetes.io/master=true:NoSchedule
## 恢复默认值
## $ kubectl taint nodes NODE_NAME node-role.kubernetes.io/master=true:NoSchedule
```
## 参考文档
### 参考文档
* [官方文档](https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/)
* [Container runtimes](https://kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd)

View File

@@ -1,3 +1,3 @@
# 一步步部署 kubernetes 集群
## 一步步部署 kubernetes 集群
可以参考 [opsnull/follow-me-install-kubernetes-cluster](https://github.com/opsnull/follow-me-install-kubernetes-cluster) 项目一步步部署 kubernetes 集群。