深入了解Kubernetes:架构、实践与应用
1. 技术要求
若要跟随代码实践,你需要安装Docker Desktop和一款代码编辑器,推荐使用Visual Studio Code。具体操作步骤如下:
1. 导航至克隆示例仓库的文件夹,通常为 ~/The-Ultimate-Docker-Container-Book :
$ cd ~/The-Ultimate-Docker-Container-Book
- 创建一个名为
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
- 按照控制台说明的步骤2初始化Kubernetes集群的网络(以下命令应在一行中):
$ kubectl apply -f https://raw.githubusercontent.com/
cloudnativelabs/kube-router/master/daemonset/kubeadm-
kuberouter.yaml
- 再次点击“ADD NEW INSTANCE”按钮创建第二个集群节点。
- 节点准备好后,运行步骤4中输出的加入命令,其中
<token-1>和<token-2>是特定于你的集群的:
$ kubeadm join 192.168.0.13:6443 --token <token-1> \
--discovery-token-ca-cert-hash <token-2>
- 第二个节点加入集群后,在初始化集群的第一个节点上运行以下命令列出新集群中的节点:
$ 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
- 复制上述
yaml文件的内容,在集群的node1上创建一个新文件:- 使用
vi创建一个名为sample-pod.yaml的新文件。 - 按下
I键切换到vi的插入模式。 - 使用
Ctrl + V(Mac上使用Command + V)粘贴复制的代码片段。 - 按下
Esc键进入vi的命令模式。 - 输入
:wq并按下Enter键保存文件并退出vi。
- 使用
- 使用Kubernetes CLI
kubectl部署这个Pod:
$ kubectl create -f sample-pod.yaml
输出结果如下:
pod/nginx created
- 列出所有的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
- 创建这个服务:
$ kubectl create -f sample-service.yaml
- 列出集群上定义的所有服务:
$ 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"
- 使用
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
- 复制
docker-compose.yml文件到当前位置:
$ cp ../sample-solutions/ch16/docker-compose.yml .
- 安装
kompose工具:- 在Mac上,使用
$ brew install kompose安装。 - 在Windows上,使用
$ choco install kubernetes-kompose安装。
- 在Mac上,使用
- 运行
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"
...
- 使用
kubectl将这四个资源部署到Kubernetes集群:
$ kubectl apply -f '*.yaml'
输出结果如下:
deployment.apps/db created
persistentvolumeclaim/pets-data created
deployment.apps/web created
service/web created
- 查找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的应用程序。
Kubernetes架构与实践指南
超级会员免费看
9199

被折叠的 条评论
为什么被折叠?



