36、深入了解Kubernetes:架构、实践与应用

Kubernetes架构与实践指南

深入了解Kubernetes:架构、实践与应用

1. 技术要求

若要跟随代码实践,你需要安装Docker Desktop和一款代码编辑器,推荐使用Visual Studio Code。具体操作步骤如下:
1. 导航至克隆示例仓库的文件夹,通常为 ~/The-Ultimate-Docker-Container-Book

$ cd ~/The-Ultimate-Docker-Container-Book
  1. 创建一个名为 ch16 的新子文件夹并进入该文件夹:
$ mkdir ch16 && cd ch16

所有示例的完整解决方案可在 sample-solutions/ch16 文件夹中找到,也可直接在GitHub上查看: https://github.com/PacktPublishing/The-Ultimate-Docker-Container-Book/tree/main/sample-solutions/ch16

2. 理解Kubernetes架构

2.1 集群组成

Kubernetes集群由一组服务器组成,这些服务器可以是虚拟机(VM)或物理服务器(裸金属)。集群中的每个成员有两种角色:Kubernetes主节点或工作节点。主节点用于管理集群,工作节点运行应用程序负载。

在集群中,主节点数量较少且为奇数,工作节点数量按需而定。小型集群可能只有几个工作节点,而更实际的集群可能有数十个甚至数百个工作节点。理论上,集群的工作节点数量没有限制,但处理数千个节点时,某些管理操作可能会显著变慢。

2.2 网络要求

所有集群成员需通过物理网络(底层网络)连接。Kubernetes为整个集群定义了一个扁平网络,但它本身不提供网络实现,而是依赖第三方插件。Kubernetes仅定义了容器网络接口(CNI),要求集群中每个Pod能直接访问其他Pod,无需网络地址转换(NAT),集群节点与Pod之间也应如此。

2.3 集群架构图

Kubernetes集群的高级架构如下:

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    A(etcd集群):::process --> B(Kubernetes主节点集群):::process
    B --> C(Kubernetes工作节点集群):::process
    D(负载均衡器LB):::process --> B
    E(应用负载均衡器/反向代理):::process --> C

2.4 各组件详细介绍

  • etcd节点集群 :分布式键值存储,用于存储集群的所有状态信息。节点数量必须为奇数,遵循Raft共识协议。该集群对整个集群至关重要,生产环境中不应仅运行单个etcd服务器。
  • Kubernetes主节点集群 :用于管理整个集群,形成共识组,节点数量也应为奇数。生产环境中至少应有三个主节点。主节点使用etcd集群作为后备存储,建议在主节点前放置负载均衡器(LB),所有管理工具应通过LB访问集群。
  • Kubernetes工作节点集群 :数量可从一个到无上限。主节点和工作节点之间双向通信,与Docker Swarm不同。所有访问集群中应用程序的入站流量应通过应用负载均衡器或反向代理。

3. Kubernetes主节点

3.1 运行环境

Kubernetes主节点目前仅支持在Linux上运行,常见的Linux发行版如RHEL、CentOS和Ubuntu都受支持。

3.2 运行服务

主节点上至少运行以下四个Kubernetes服务:
| 服务名称 | 功能描述 |
| ---- | ---- |
| API Server | 是Kubernetes的网关,所有列出、创建、修改或删除集群资源的请求都必须通过该服务。它暴露REST接口,供kubectl等工具管理集群和应用程序。 |
| Controller(Controller Manager) | 控制循环,通过API服务器观察集群状态,若当前状态与期望状态不同,则进行更改。 |
| Scheduler | 尝试在考虑各种边界条件(如资源需求、策略、服务质量要求等)的情况下,将Pod调度到工作节点上。 |
| Cluster Store(etcd实例) | 用于存储集群状态的所有信息。etcd不一定安装在与其他Kubernetes服务相同的节点上,有时会使用独立的etcd服务器集群。 |

3.3 高可用性

为实现高可用性,需要三个或更多主节点。Kubernetes主节点不运行应用程序负载,专门用于管理集群。主节点形成Raft共识组,Raft协议常用于成员组决策,许多知名软件产品如MongoDB、Docker SwarmKit和Kubernetes都使用该协议。

3.4 特殊情况

在开发和测试场景中,可使用单节点Kubernetes集群,此时该节点既是主节点又是工作节点,但生产环境应避免这种情况。

3.5 状态存储与备份

Kubernetes集群的状态存储在etcd节点中,若要实现高可用性,etcd节点也应配置为高可用模式,通常至少需要三个etcd实例运行在不同节点上。因此,为这个键值存储制定可靠的备份策略至关重要。

4. 集群节点(工作节点)

4.1 运行环境

工作节点可以运行在虚拟机、裸金属、本地或云端。最初,工作节点只能配置在Linux上,但自Kubernetes 1.10版本起,也可运行在Windows Server 2010或更高版本上,混合使用Linux和Windows工作节点是可行的。

4.2 运行服务

每个工作节点需要运行以下三个服务:
| 服务名称 | 功能描述 |
| ---- | ---- |
| Kubelet | 主要节点代理,使用Pod规格文件确保对应Pod的所有容器都在运行且健康。Pod规格文件以YAML或JSON格式编写,主要通过API服务器提供给Kubelet。 |
| 容器运行时 | 默认情况下,自Kubernetes 1.9版本起使用containerd作为容器运行时,之前使用Docker守护进程。也可使用其他容器运行时,如rkt或CRI - O,负责管理和运行Pod中的各个容器。 |
| kube - proxy | 作为守护进程运行,是该节点上所有应用程序服务的简单网络代理和负载均衡器。 |

5. Play with Kubernetes入门

Play with Kubernetes是Docker赞助的免费沙箱环境,用户可在此学习使用Docker容器并将其部署到Kubernetes。具体操作步骤如下:
1. 访问 https://labs.play-with-k8s.com/
2. 使用GitHub或Docker凭证登录。
3. 登录成功后,点击屏幕左侧的“+ ADD NEW INSTANCE”按钮创建第一个集群节点。
4. 按照屏幕上的说明为Kubernetes沙箱集群创建第一个主节点。
5. 在终端窗口中,按照说明的步骤1初始化集群主节点,建议直接复制命令:

$ kubeadm init --apiserver-advertise-address \
   $(hostname -i) --pod-network-cidr 10.5.0.0/16
  1. 按照控制台说明的步骤2初始化Kubernetes集群的网络(以下命令应在一行中):
$ kubectl apply -f https://raw.githubusercontent.com/
cloudnativelabs/kube-router/master/daemonset/kubeadm-
kuberouter.yaml
  1. 再次点击“ADD NEW INSTANCE”按钮创建第二个集群节点。
  2. 节点准备好后,运行步骤4中输出的加入命令,其中 <token-1> <token-2> 是特定于你的集群的:
$ kubeadm join 192.168.0.13:6443 --token <token-1> \
    --discovery-token-ca-cert-hash <token-2>
  1. 第二个节点加入集群后,在初始化集群的第一个节点上运行以下命令列出新集群中的节点:
$ kubectl get nodes

输出示例如下:

NAME    STATUS   ROLES                  AGE     VERSION
node1   Ready    control - plane,master   6m28s   v1.20.1
node2   Ready    <none>                 32s     v1.20.1

6. 在Play with Kubernetes上部署Pod和服务

6.1 部署Pod

在Play with Kubernetes上部署Pod的步骤如下:
1. 在章节代码文件夹中创建一个名为 sample-pod.yaml 的新文件,并添加以下内容:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:alpine
    ports:
    - containerPort: 80
    - containerPort: 443
  1. 复制上述 yaml 文件的内容,在集群的 node1 上创建一个新文件:
    • 使用 vi 创建一个名为 sample-pod.yaml 的新文件。
    • 按下 I 键切换到 vi 的插入模式。
    • 使用 Ctrl + V (Mac上使用 Command + V )粘贴复制的代码片段。
    • 按下 Esc 键进入 vi 的命令模式。
    • 输入 :wq 并按下 Enter 键保存文件并退出 vi
  2. 使用Kubernetes CLI kubectl 部署这个Pod:
$ kubectl create -f sample-pod.yaml

输出结果如下:

pod/nginx created
  1. 列出所有的Pod:
$ kubectl get pods

预期输出如下:

NAME      READY   STATUS    RESTARTS  AGE
nginx     1/1     Running      0      51s

6.2 创建服务

为了能够访问这个Pod,需要创建一个服务,步骤如下:
1. 使用 sample-service.yaml 文件,内容如下:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - name: nginx-port
    protocol: TCP
    port: 80
    targetPort: http-web-svc
  1. 创建这个服务:
$ kubectl create -f sample-service.yaml
  1. 列出集群上定义的所有服务:
$ kubectl get services

输出示例如下,注意 PORT(S) 列,这里Kubernetes将Nginx的80容器端口映射到了31384节点端口,实际使用时需使用自己系统分配的端口:
| NAME | TYPE | CLUSTER-IP | EXTERNAL-IP | PORT(S) | AGE |
| ---- | ---- | ---- | ---- | ---- | ---- |
| kubernetes | ClusterIP | 10.96.0.1 | | 443/TCP | 10d |
| nginx-service | NodePort | 0.111.98.154 | | 80:31384/TCP | 5m33s |

6.3 访问服务

使用 curl 访问服务:

$ curl -4 http://localhost:31384

应该会收到Nginx欢迎页面作为响应。

6.4 清理资源

在继续之前,删除刚刚创建的两个对象:

$ kubectl delete po/nginx
$ kubectl delete svc/nginx-service

7. Docker Desktop中的Kubernetes支持

7.1 启用Kubernetes

在Docker Desktop中启用Kubernetes的步骤如下:
1. 在macOS上,点击菜单栏中的Docker图标;在Windows上,进入系统托盘并选择“Preferences”。
2. 在打开的对话框中,选择“Kubernetes”。
3. 勾选“Enable Kubernetes”复选框,同时勾选“Show system containers (advanced)”复选框。
4. 点击“Apply & restart”按钮,安装和配置Kubernetes需要几分钟时间。

7.2 配置kubectl

安装完成后,需要配置 kubectl 以访问Docker Desktop的Kubernetes集群:
1. 列出所有的上下文:

$ kubectl config get-contexts

示例输出可能如下,其中带有星号的为当前活动上下文:
| CURRENT | NAME | CLUSTER | AUTHINFO | NAMESPACE |
| ---- | ---- | ---- | ---- | ---- |
| * | kind-demo | kind-demo | kind-demo | default |
| | docker-desktop | docker-desktop-cluster | docker-desktop | default |
| | minikube | minikube | minikube | default |
2. 切换到 docker-desktop 上下文:

$ kubectl config use-context docker-desktop

输出结果如下:

Switched to context "docker-desktop"
  1. 使用 kubectl 访问集群:
$ kubectl get nodes

预期输出如下,显示节点状态和版本信息:

NAME    STATUS   ROLES             AGE      VERSION
node1     Ready    control-plane  6m28s   v1.25.9

7.3 查看系统容器

列出当前在Docker Desktop上运行的所有容器:

$ docker container list --format "table {{.ID}}\t{{.Names}}"

可以看到组成Kubernetes的各个组件,如API服务器、etcd、kube - proxy等。若不想让这些系统容器干扰容器列表,可取消勾选“Show system containers (advanced)”复选框。

7.4 使用Docker Compose部署应用到Kubernetes

使用Docker Compose部署应用到Kubernetes的步骤如下:
1. 导航到 ch16 子文件夹:

$ cd ~/The-Ultimate-Docker-Container-Book/ch16
  1. 复制 docker-compose.yml 文件到当前位置:
$ cp ../sample-solutions/ch16/docker-compose.yml .
  1. 安装 kompose 工具:
    • 在Mac上,使用 $ brew install kompose 安装。
    • 在Windows上,使用 $ choco install kubernetes-kompose 安装。
  2. 运行 kompose 工具:
$ kompose convert

该工具将创建四个文件:
- db-deployment.yaml
- pets-data-persistentvolumeclaim.yaml
- web-deployment.yaml
- web-service.yaml
5. 打开 web-service.yaml 文件,在第11行( spec 条目)后添加 NodePort 条目类型,修改后的文件部分内容如下:

...
spec:
  type: NodePort
  ports:
    - name: "3000"
...
  1. 使用 kubectl 将这四个资源部署到Kubernetes集群:
$ kubectl apply -f '*.yaml'

输出结果如下:

deployment.apps/db created
persistentvolumeclaim/pets-data created
deployment.apps/web created
service/web created
  1. 查找Kubernetes将3000服务端口映射到的主机端口:
$ kubectl get service

输出示例如下,这里将3000端口映射到了32134主机端口,实际使用时需使用自己系统分配的端口:
| NAME | TYPE | CLUSTER-IP | EXTERNAL-IP | PORT(S) | AGE |
| ---- | ---- | ---- | ---- | ---- | ---- |
| kubernetes | ClusterIP | 10.96.0.1 | | 443/TCP | 10d |
| web | NodePort | 0.111.98.154 | | 3000:32134/TCP | 5m33s |
8. 使用 curl 测试应用:

$ curl localhost:32134/pet

应该能看到应用正常运行。
9. 查看Kubernetes上的所有资源:

$ kubectl get all

通过以上步骤,我们全面了解了Kubernetes的架构、在不同环境下的部署和使用方法,以及如何利用Docker Desktop更便捷地开发和部署针对Kubernetes的应用程序。

【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器的建模仿真展开,重点介绍了基于Matlab的飞行器动力学模型构建控制系统设计方法。通过对四轴飞行器非线性运动方程的推导,建立其在三维空间中的姿态位置动态模型,并采用数值仿真手段实现飞行器在复杂环境下的行为模拟。文中详细阐述了系统状态方程的构建、控制输入设计以及仿真参数设置,并结合具体代码实现展示了如何对飞行器进行稳定控制轨迹跟踪。此外,文章还提到了多种优化控制策略的应用背景,如模型预测控制、PID控制等,突出了Matlab工具在无人机系统仿真中的强大功能。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及从事无人机系统开发的工程师;尤其适合从事飞行器建模、控制算法研究及相关领域研究的专业人士。; 使用场景及目标:①用于四轴飞行器非线性动力学建模的教学科研实践;②为无人机控制系统设计(如姿态控制、轨迹跟踪)提供仿真验证平台;③支持高级控制算法(如MPC、LQR、PID)的研究对比分析; 阅读建议:建议读者结合文中提到的Matlab代码仿真模型,动手实践飞行器建模控制流程,重点关注动力学方程的实现控制器参数调优,同时可拓展至多自由度或复杂环境下的飞行仿真研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值