27、全球部署的仪表盘与监控及自建 Kubernetes 集群指南

全球部署的仪表盘与监控及自建 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. 将镜像写入每张存储卡。

首次启动
  1. 组装集群,确定 API 服务器节点。
  2. 插入存储卡,将板连接到 HDMI 输出,将键盘连接到 USB 端口。
  3. 接通电源启动板。
  4. 在提示处使用用户名 ubuntu 和密码 ubuntu 登录。
  5. 务必更改默认密码,以提高系统安全性。
  6. 对集群中的每个节点重复上述步骤。
网络设置

为 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
  1. 运行 sudo netplan apply 应用新的网络配置。
  2. 重启机器以获取 10.0.0.1 地址,可通过 ip addr 命令验证 eth0 接口的地址设置是否正确,并验证互联网连接是否正常。
  3. 安装 DHCP 服务器:
apt - get install isc - dhcp - server
  1. 配置 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;
  1. 编辑 /etc/default/isc - dhcp - server ,将 INTERFACES 环境变量设置为 eth0
  2. 重启 DHCP 服务器:
sudo systemctl restart isc - dhcp - server
  1. 编辑 /etc/hostname 文件将机器重命名为 node - 1
  2. 创建 /etc/modules - load.d/k8s.conf 文件,内容为 br_netfilter ,以加载 br_netfilter 模块到内核。
  3. 创建 /etc/sysctl.d/k8s.conf 文件并添加以下内容:
net.ipv4.ip_forward = 1
net.bridge.bridge - nf - call - ip6tables = 1
net.bridge.bridge - nf - call - iptables = 1
  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
  1. 插入并启动其余两个节点,编辑 /etc/hostname 文件分别命名为 node - 2 node - 3
  2. 通过查看 /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
  1. 安装 Docker 的签名密钥:
curl - fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor - o /usr/share/keyrings/docker - archive - keyring.gpg
  1. 创建 /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
  1. 安装 containerd.io:
sudo apt - get update; sudo apt - get install containerd.io
  1. 配置 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 -
  1. 添加存储库到存储库列表:
# echo "deb http://apt.kubernetes.io/ kubernetes - xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
  1. 更新并安装 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
  1. 默认的 Flannel 配置使用 vxlan 模式,将其替换为 host - gw 模式,可使用以下命令:
curl https://oreil.ly/kube - flannelyml | sed "s/vxlan/host - gw/g" > kube - flannel.yaml
  1. 创建 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 的新特性和最佳实践,将有助于更好地发挥其优势,提升开发和运维的效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值