全球部署的仪表盘与监控及自建 Kubernetes 集群指南
全球部署的版本管理与监控
在小规模开发时,应用不同版本在不同地区部署可能不是个明显问题,但在中大规模开发中,这会成为一个显著挑战。不同地区部署不同版本应用的情况可能因多种原因出现,如发布失败、中止或特定地区出现问题等。若不仔细跟踪,很快会出现全球部署版本混乱难以管理的局面。而且,当客户询问所遇 bug 的修复情况时,“是否已部署?”会成为常见问题。
为解决这些问题,开发仪表盘至关重要。仪表盘能让你一眼看清哪个版本在哪个地区运行,同时设置警报机制,当应用部署版本过多时发出提醒。最佳实践是将活跃版本数量限制在不超过三个:一个用于测试,一个正在推出,一个正被推出的版本所取代。超过这个数量就可能引发问题。
应用组织原则
管理 Kubernetes 应用可从软件版本、部署阶段和全球区域等方面入手。组织应用的基本原则包括:
-
依赖文件系统进行组织
:以文件系统为应用组织的基础,确保应用结构清晰。
-
利用代码审查保证质量
:通过代码审查确保应用配置和代码的质量,避免引入错误。
-
借助特性开关灵活增减功能
:使用特性开关(feature flags)能轻松地逐步添加或移除功能,提高开发和部署的灵活性。
自建 Kubernetes 集群
虽然很多时候通过公共云计算的虚拟世界体验 Kubernetes,但在裸机上物理构建一个 Kubernetes 集群也是非常有意义的体验。而且,现在构建自己的集群既不困难也不昂贵,借助低成本的片上系统计算机板和社区在简化 Kubernetes 安装方面的努力,几小时内就能构建一个小型 Kubernetes 集群。
所需部件清单
以构建一个四节点的集群为例,所需部件及大致价格如下:
| 部件 | 数量 | 价格 |
| — | — | — |
| 至少 2GB 内存的 Raspberry Pi 4 机器 | 4 台 | $180 |
| 至少 8GB 的 SDHC 存储卡(建议高质量) | 4 张 | $30 - $50 |
| 12 英寸 Cat. 6 以太网电缆 | 4 根 | $10 |
| 12 英寸 USB - A 转 USB - C 电缆 | 4 根 | $10 |
| 5 端口 10/100 快速以太网交换机 | 1 个 | $10 |
| 5 端口 USB 充电器 | 1 个 | $25 |
| 可容纳四个 Pi 的 Raspberry Pi 可堆叠机箱(或自制) | 1 个 | $40 |
| 用于为以太网交换机供电的 USB 转桶形插头(可选) | 1 个 | $5 |
若构建三节点集群并跳过机箱和交换机的 USB 电源线,总成本可降至约 $200。注意,存储卡不要选择低端产品,否则会导致集群不稳定。若想省钱,可选择高质量的小容量卡,如 8GB 的高质量卡网上约 $7 一张。
镜像烧录
默认的 Ubuntu 20.04 镜像支持 Raspberry Pi 4,也是许多 Kubernetes 集群常用的操作系统。可使用 Raspberry Pi 项目提供的 Raspberry Pi Imager 进行镜像烧录,支持 macOS、Windows 和 Linux 系统。操作步骤如下:
1. 打开 Raspberry Pi Imager。
2. 选择 Ubuntu 20.04 镜像(若不是默认选项,可手动选择)。
3. 将镜像写入每张存储卡。
首次启动
- 组装集群,确定 API 服务器节点。
- 插入存储卡,将板连接到 HDMI 输出,将键盘连接到 USB 端口。
- 接通电源启动板。
- 在提示处使用用户名 ubuntu 和密码 ubuntu 登录。
- 务必更改默认密码,以提高系统安全性。
- 对集群中的每个节点重复上述步骤。
网络设置
为 API 服务器设置网络,以下示例是设置一个单台机器通过无线网络连接到互联网,同时通过有线以太网连接到集群网络,并为集群中其余节点提供 DHCP 服务器的网络:
1. 编辑
/etc/netplan/50 - cloud - init.yaml
文件(若不存在则创建),内容如下:
network:
version: 2
ethernets:
eth0:
dhcp4: false
dhcp6: false
addresses:
- '10.0.0.1/24'
optional: true
wifis:
wlan0:
access - points:
<your - ssid - here>:
password: '<your - password - here>'
dhcp4: true
optional: true
-
运行
sudo netplan apply应用新的网络配置。 -
重启机器以获取 10.0.0.1 地址,可通过
ip addr命令验证 eth0 接口的地址设置是否正确,并验证互联网连接是否正常。 - 安装 DHCP 服务器:
apt - get install isc - dhcp - server
-
配置 DHCP 服务器
/etc/dhcp/dhcpd.conf:
option domain - name "cluster.home";
option domain - name - servers 8.8.8.8, 8.8.4.4;
subnet 10.0.0.0 netmask 255.255.255.0 {
range 10.0.0.1 10.0.0.10;
option subnet - mask 255.255.255.0;
option broadcast - address 10.0.0.255;
option routers 10.0.0.1;
}
default - lease - time 600;
max - lease - time 7200;
authoritative;
-
编辑
/etc/default/isc - dhcp - server,将INTERFACES环境变量设置为eth0。 - 重启 DHCP 服务器:
sudo systemctl restart isc - dhcp - server
-
编辑
/etc/hostname文件将机器重命名为node - 1。 -
创建
/etc/modules - load.d/k8s.conf文件,内容为br_netfilter,以加载br_netfilter模块到内核。 -
创建
/etc/sysctl.d/k8s.conf文件并添加以下内容:
net.ipv4.ip_forward = 1
net.bridge.bridge - nf - call - ip6tables = 1
net.bridge.bridge - nf - call - iptables = 1
-
编辑
/etc/rc.local(或等效文件)并添加 iptables 规则:
iptables - t nat - A POSTROUTING - o wlan0 - j MASQUERADE
iptables - A FORWARD - i wlan0 - o eth0 - m state --state RELATED,ESTABLISHED - j ACCEPT
iptables - A FORWARD - i eth0 - o wlan0 - j ACCEPT
-
插入并启动其余两个节点,编辑
/etc/hostname文件分别命名为node - 2和node - 3。 -
通过查看
/var/lib/dhcp/dhcpd.leases文件验证节点分配的 IP 地址,然后 SSH 到节点(记得先更改默认密码),验证节点是否能连接到外部互联网。
额外优化步骤
-
编辑
/etc/hosts文件 :在每台机器上添加以下内容,方便使用名称连接机器:
10.0.0.1 kubernetes
10.0.0.2 node - 1
10.0.0.3 node - 2
10.0.0.4 node - 3
-
设置无密码 SSH 访问
:运行
ssh - keygen命令,然后将$HOME/.ssh/id_rsa.pub文件复制到node - 1、node - 2和node - 3的/home/ubuntu/.ssh/authorized_keys文件中。
安装容器运行时
在安装 Kubernetes 之前,需要安装容器运行时。建议使用 Docker 的 containerd,虽然 Ubuntu 标准包管理器提供 containerd,但版本可能较旧,建议从 Docker 项目本身安装,步骤如下:
1. 添加一些先决条件:
sudo apt - get install ca - certificates curl gnupg lsb - release
- 安装 Docker 的签名密钥:
curl - fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor - o /usr/share/keyrings/docker - archive - keyring.gpg
-
创建
/etc/apt/sources.list.d/docker.list文件,内容如下:
deb [arch = arm64 signed - by = /usr/share/keyrings/docker - archive - keyring.gpg] https://download.docker.com/linux/ubuntu focal stable
- 安装 containerd.io:
sudo apt - get update; sudo apt - get install containerd.io
- 配置 containerd:
containerd config default > config.toml
sudo mv config.toml /etc/containerd/config.toml
sudo systemctl restart containerd
安装 Kubernetes
当所有节点都有 IP 地址且能访问互联网后,可在所有节点上安装 Kubernetes 的
kubelet
和
kubeadm
工具,步骤如下:
1. 添加包的加密密钥(注释部分为原内容,可根据实际情况操作):
# curl - s https://packages.cloud.google.com/apt/doc/apt - key.gpg | sudo apt - key add -
- 添加存储库到存储库列表:
# echo "deb http://apt.kubernetes.io/ kubernetes - xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
- 更新并安装 Kubernetes 工具:
# sudo apt - get update
sudo apt - get upgrade
sudo apt - get install - y kubelet kubeadm kubectl kubernetes - cni
设置集群
在 API 服务器节点(运行 DHCP 并连接到互联网的节点)上运行以下命令初始化集群:
sudo kubeadm init --pod - network - cidr 10.244.0.0/16 --apiserver - advertise - address 10.0.0.1 --apiserver - cert - extra - sans kubernetes.cluster.home
注意,这里宣传的是内部 IP 地址,而非外部地址。初始化完成后,会输出一个用于节点加入集群的命令,类似如下:
kubeadm join --token = <token> 10.0.0.1
通过 SSH 登录到集群中的每个工作节点并运行该命令。完成后,可运行以下命令查看工作集群:
kubectl get nodes
设置集群网络
虽然已设置节点级网络,但还需设置 Pod 到 Pod 的网络。由于集群中的所有节点都运行在同一物理以太网网络上,可在主机内核中设置正确的路由规则。使用 CoreOS 创建并由 Flannel 项目支持的 Flannel 工具来管理,步骤如下:
1. 下载 Flannel 示例配置文件:
curl https://oreil.ly/kube - flannelyml > kube - flannel.yaml
- 默认的 Flannel 配置使用 vxlan 模式,将其替换为 host - gw 模式,可使用以下命令:
curl https://oreil.ly/kube - flannelyml | sed "s/vxlan/host - gw/g" > kube - flannel.yaml
- 创建 Flannel 网络设置:
kubectl apply - f kube - flannel.yaml
这将创建两个对象:一个用于配置 Flannel 的 ConfigMap 和一个运行实际 Flannel 守护进程的 DaemonSet。可使用以下命令检查:
kubectl describe --namespace = kube - system configmaps/kube - flannel - cfg
kubectl describe --namespace = kube - system daemonsets/kube - flannel - ds
完成以上步骤后,你将拥有一个运行在 Raspberry Pi 上的工作 Kubernetes 集群,可用于探索 Kubernetes 的各种功能,如调度作业、打开 UI 界面,还可通过重启机器或断开网络来测试集群的自愈能力。
全球部署的仪表盘与监控及自建 Kubernetes 集群指南
Kubernetes 相关概念与组件
Kubernetes 是一个强大的容器编排平台,在其架构中有众多重要的概念和组件。
标签与选择器
标签(Labels)是 Kubernetes 中用于组织和选择资源的键值对。可以为 Pods、Deployments 等资源添加标签,方便进行过滤和查找。例如,为不同环境(开发、测试、生产)的 Pods 添加不同的标签。标签选择器(Label Selectors)则用于根据标签筛选资源,有多种操作符可供使用,如
=
,
!=
,
In
,
NotIn
等。例如,使用
kubectl get pods -l app=myapp
可以获取所有带有
app=myapp
标签的 Pods。
| 标签操作符 | 示例 | 说明 |
|---|---|---|
=
|
app=myapp
|
选择标签键为
app
且值为
myapp
的资源
|
!=
|
env!=production
|
选择标签键为
env
且值不为
production
的资源
|
In
|
role in (frontend, backend)
|
选择标签键为
role
且值为
frontend
或
backend
的资源
|
NotIn
|
tier notin (web, db)
|
选择标签键为
tier
且值不为
web
和
db
的资源
|
服务发现
服务发现(Service Discovery)是 Kubernetes 中一个重要的功能,用于在集群内实现服务之间的通信。Service 对象是实现服务发现的核心,它为一组 Pods 提供了一个稳定的网络端点。Service 有多种类型,如 ClusterIP、NodePort、LoadBalancer 等。
-
ClusterIP
:默认类型,为 Service 分配一个集群内部的 IP 地址,只能在集群内部访问。
-
NodePort
:在每个节点上开放一个端口,通过节点的 IP 地址和该端口可以访问 Service。
-
LoadBalancer
:使用云提供商的负载均衡器将流量导向 Service。
例如,创建一个 ClusterIP 类型的 Service:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 8080
配置管理
ConfigMaps 和 Secrets 用于管理应用的配置信息。ConfigMaps 用于存储非敏感的配置数据,如环境变量、命令行参数等;Secrets 用于存储敏感数据,如密码、密钥等。
创建一个 ConfigMap:
kubectl create configmap my-config --from-literal=key1=value1 --from-literal=key2=value2
使用 ConfigMap 作为环境变量:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
env:
- name: CONFIG_KEY1
valueFrom:
configMapKeyRef:
name: my-config
key: key1
应用部署与管理
在 Kubernetes 中部署和管理应用需要遵循一定的策略和流程。
部署策略
Deployment 是 Kubernetes 中用于管理 Pods 和 ReplicaSets 的对象,支持多种部署策略。
-
Recreate
:在部署新的版本时,先删除所有旧的 Pods,然后创建新的 Pods。这种策略会导致服务短暂中断。
-
RollingUpdate
:逐步更新 Pods,先创建新的 Pods,然后逐步删除旧的 Pods,保证服务的连续性。
例如,使用 RollingUpdate 策略更新 Deployment:
kubectl set image deployment/my-deployment my-container=my-image:newversion
自动伸缩
Horizontal Pod Autoscaling(HPA)可以根据 CPU 使用率、内存使用率等指标自动调整 Deployment 中的 Pod 数量。使用 HPA 需要安装 metrics-server 来收集指标数据。
创建一个 HPA:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: my-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-deployment
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
安全与策略管理
Kubernetes 提供了多种安全机制和策略来保护应用和集群。
RBAC(基于角色的访问控制)
RBAC 用于控制用户和服务账户对 Kubernetes 资源的访问权限。通过定义角色(Role)和角色绑定(RoleBinding),可以精确地控制谁可以对哪些资源执行哪些操作。
创建一个角色:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: my-namespace
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
创建一个角色绑定:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: my-namespace
subjects:
- kind: User
name: jane
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
Pod 安全标准
Pod 安全标准(Pod Security Standards)定义了不同级别的安全策略,如 Audit、Warn、Enforce 等。可以通过标签和注解将这些标准应用到 Pods 上。
例如,将 Pod 安全标准应用到命名空间:
kubectl label namespace my-namespace pod-security.kubernetes.io/enforce=baseline
总结
通过以上对全球部署的版本管理与监控、自建 Kubernetes 集群、Kubernetes 相关概念与组件、应用部署与管理以及安全与策略管理等方面的介绍,我们可以看到 Kubernetes 是一个功能强大且复杂的容器编排平台。在实际应用中,需要根据具体的需求和场景,合理运用这些技术和策略,以确保应用的高效运行和集群的安全稳定。同时,不断学习和探索 Kubernetes 的新特性和最佳实践,将有助于更好地发挥其优势,提升开发和运维的效率。
超级会员免费看
7万+

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



