标签:dmi use 灵活 fail force 高可用集群 http hyper system
Kubernetes(k8s) 凭借着其优良的架构,灵活的扩展能力,丰富的应用编排模型,成为了容器编排领域的事实标准。越来越多的企业拥抱这一趋势,选择 k8s 作为容器化应用的基础设施,逐渐将自己的核心服务迁移到 k8s 之上。
可用性对基础设施而言至关重要。各大云计算厂商纷纷推出了高可用、可扩展的 k8s 托管服务,其中比较有代表性的有 Amazon EKS、Azure Kubernetes Service (AKS)、Google Kubernetes Engine、阿里云容器服务 Kubernetes 版等。
虽然公有云托管的 k8s 服务百花齐放,但很多企业仍有自建集群的需求。正是这样的原因,促进了一大批出色的 k8s 集群部署方案的诞生,他们的特点如下表所示。
上述方案中,RKE 在易用性和灵活性上占有优势。本文接下来将介绍如何通过 RKE 部署一套高可用 k8s 集群,文中使用的 RKE 版本为v0.2.2。
首先需要了解高可用 k8s 集群的架构特点,下图是官方推荐的高可用集群架构图。
其核心思想是让 k8s master 节点中的各类组件具备高可用性,消除单点故障。
此外,构建集群的时还需要注意下列问题。
节点规划
构建集群的第一步是将拥有的服务器按节点功能进行划分,下表展示了笔者环境下的节点规划情况。
规划说明:
环境准备
在完成节点规划后,需要进行环境准备工作,主要包含以下内容:
在完成环境准备后,需要通过 cluster.yml 描述集群的组成和 k8s 的部署方式。
配置集群组成
配置文件 cluster.yml 中的 nodes 配置项用于描述集群的组成。根据节点规划,对于 k8s master 节点,指定其角色为controlplane和etcd。对于 k8s worker 节点,指定其角色为worker。
nodes:
- address: 192.168.0.1
user: admin
role:
- controlplane
- etcd
...
- address: 192.168.0.7
user: admin
role:
- worker
设置资源预留
K8s 的 worker node 除了运行 pod 类进程外,还会运行很多其他的重要进程,包括 k8s 管理进程,如 kubelet、dockerd,以及系统进程,如 systemd。这些进程对整个集群的稳定性至关重要,因此需要为他们专门预留一定的资源。
笔者环境中的 worker 设置如下:
在此场景下,节点可分配的 CPU 资源是 29 核,可分配的内存资源是 60.5Gi,可分配的磁盘资源是 88Gi。对于不可压缩资源,当 pod 的内存使用总量超过 60.5Gi 或者磁盘使用总量超过 88Gi 时,QoS 较低的 pod 将被优先驱逐。对于可压缩资源,如果节点上的所有进程都尽可能多的使用 CPU,则 pod 类进程加起来不会使用超过 29 核的 CPU 资源。
上述资源预留设置在 cluster.yml 中具体形式如下。
services:
kubelet:
extra_args:
cgroups-per-qos: True
cgroup-driver: cgroupfs
kube-reserved: cpu=1,memory=2Gi,ephemeral-storage=1Gi
kube-reserved-cgroup: /runtime.service
system-reserved: cpu=1,memory=1Gi,ephemeral-storage=1Gi
system-reserved-cgroup: /system.slice
enforce-node-allocatable: pods,kube-reserved,system-reserved
eviction-hard: memory.available<500Mi,nodefs.available<10%
关于资源预留更详细的内容可参考文章 Reserve Compute Resources for System Daemons。
https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/
部署 k8s 集群
当 cluster.yml 文件配置完成后,可以通过命令rke up完成集群的部署任务。下图展示了通过 RKE 部署的 k8s 集群架构图。
该架构有如下特点:
在完成了集群部署后,可以通过 API server 访问 k8s。由于环境中启动了多个 kube-apiserver 实例以实现高可用,需要为这些实例架设一个负载均衡器。这里在192.168.0.10上部署了一台 nginx 实现了负载均衡的功能,nginx.conf 的具体配置如下。
...
stream {
upstream apiserver {
server 192.168.0.11:6443 weight=5 max_fails=3 fail_timeout=60s;
server 192.168.0.12:6443 weight=5 max_fails=3 fail_timeout=60s;
server 192.168.0.13:6443 weight=5 max_fails=3 fail_timeout=60s;
}
server {
listen 6443;
proxy_connect_timeout 1s;
proxy_timeout 10s;
proxy_pass apiserver;
}
}
...
这时,通过负载均衡器提供的端口访问 API server 会出现异常Unable to connect to the server: x509: certificate is valid for xxx, not 192.168.0.10。这里需要将负载均衡器的 IP 地址或域名加入到 API server 的 PKI 证书中,可以通过 cluster.yml 中的 authentication 配置项完成此功能。
authentication:
strategy: x509
sans:
- "192.168.0.10"
修改完 cluster.yml 后,运行命令rke cert-rotate。
验证
在完成上述所有步骤后,可以通过命令kubectl get nodes查看节点状态。如果所有节点的状态均为 Ready,则表示集群部署成功。
NAME STATUS ROLES AGE VERSION
192.168.0.11 Ready controlplane,etcd 1d v1.13.5
192.168.0.12 Ready controlplane,etcd 1d v1.13.5
192.168.0.13 Ready controlplane,etcd 1d v1.13.5
192.168.0.14 Ready worker 1d v1.13.5
192.168.0.15 Ready worker 1d v1.13.5
192.168.0.16 Ready worker 1d v1.13.5
192.168.0.17 Ready worker 1d v1.13.5
Rancher Kubernetes Engine(RKE)为用户屏蔽了创建 k8s 集群的复杂细节,简化了部署步骤,降低了构建门槛。对于那些有自建 k8s 集群需求的企业是一个不错的选择。
https://rancher.com/announcing-rke-lightweight-kubernetes-installer/
https://rancher.com/an-introduction-to-rke/
作者:吴波bruce_wu
标签:dmi use 灵活 fail force 高可用集群 http hyper system
原文地址:https://www.cnblogs.com/johnnyblog/p/11421448.html