KubeKey 与 KubeSphere:快速构建 Kubernetes 集群
深度解析 KubeKey 与 KubeSphere:快速构建现代化 Kubernetes 集群
一、技术栈概述
KubeKey(KK)是由 KubeSphere 团队开发的轻量级 Kubernetes 集群部署工具,其优势在于:
基于 Ansible 的安装程序具有大量软件依赖性,例如 Python。KubeKey 是使用 Go 语言开发的,可以消除在各种环境中出现的问题,从而提高安装成功率。
KubeKey 使用 Kubeadm 在节点上尽可能多地并行安装 K8s 集群,以降低安装复杂性并提高效率。与较早的安装程序相比,它将大大节省安装时间。
KubeKey 支持将集群从 all-in-one 扩展到多节点集群甚至 HA 集群。
KubeKey 旨在将集群当作一个对象操作,即 CaaO。
有三种情况可以使用 KubeKey
仅安装 Kubernetes
用一个命令中安装 Kubernetes 和 KubeSphere
首先安装 Kubernetes,然后使用 ks-installer 在其上部署 KubeSphere
二、环境支持
Linux 发行版
Ubuntu 16.04, 18.04, 20.04, 22.04
Debian Bullseye, Buster, Stretch
CentOS/RHEL 7
AlmaLinux 9.0
SUSE Linux Enterprise Server 15
建议使用 Linux Kernel 版本: 4.15 or later 可以通过命令 uname -srm 查看 Linux Kernel 版本。
Kubernetes 版本
v1.19: v1.19.15
v1.20: v1.20.10
v1.21: v1.21.14
v1.22: v1.22.15
v1.23: v1.23.10 (default)
v1.24: v1.24.7
v1.25: v1.25.3
要求和建议
最低资源要求(仅对于最小安装 KubeSphere):
2 核虚拟 CPU
4 GB 内存
20 GB 储存空间
/var/lib/docker 主要用于存储容器数据,在使用和操作过程中会逐渐增大。对于生产环境,建议 /var/lib/docker 单独挂盘。
操作系统要求:
SSH 可以访问所有节点。
所有节点的时间同步。
sudo/curl/openssl 应在所有节点使用。
docker 可以自己安装,也可以通过 KubeKey 安装。
Red Hat 在其 Linux 发行版本中包括了 SELinux,建议关闭SELinux或者将SELinux的模式切换为Permissive[宽容]工作模式
建议您的操作系统环境足够干净 (不安装任何其他软件),否则可能会发生冲突。
如果在从 dockerhub.io 下载镜像时遇到问题,建议准备一个容器镜像仓库 (加速器)。为 Docker 守护程序配置镜像加速。
默认情况下,KubeKey 将安装 OpenEBS 来为开发和测试环境配置 LocalPV,这对新用户来说非常方便。对于生产,请使用 NFS/Ceph/GlusterFS 或商业化存储作为持久化存储,并在所有节点中安装相关的客户端 。
如果遇到拷贝时报权限问题Permission denied,建议优先考虑查看SELinux的原因。
依赖要求:
KubeKey 可以同时安装 Kubernetes 和 KubeSphere。在版本1.18之后,安装kubernetes前需要安装一些依赖。你可以参考下面的列表,提前在你的节点上检查并安装相关依赖。
网络和 DNS 要求:
确保 /etc/resolv.conf 中的 DNS 地址可用。否则,可能会导致集群中出现某些 DNS 问题。
如果您的网络配置使用防火墙或安全组,则必须确保基础结构组件可以通过特定端口相互通信。建议您关闭防火墙或遵循链接配置:网络访问。
三、KubeKey 安装
安装必要工具
yum install -y curl wget openssl socat conntrack
离线安装包(推荐)
下载解压后可直接使用。
kubekey-v3.1.7-linux-amd64
添加到环境变量下可任意位置调用(可选)
chmod +x kk
sudo mv kk /usr/local/bin/
使用脚本获取 KubeKey(可选)
如果无法访问 https://github.com, 请先执行 export KKZONE=cn.
curl -sfL https://get-kk.kubesphere.io | sh -
从源代码生成二进制文件(可选)
git clone https://github.com/kubesphere/kubekey.git
cd kubekey
make kk
四、创建集群
注意: 由于 Kubernetes 暂不支持大写 NodeName, hostname 中包含大写字母将导致后续安装过程无法正常结束
如果无法访问 https://storage.googleapis.com, 请先执行 export KKZONE=cn.
./kk create cluster [--with-kubernetes version] [--with-kubesphere version]
使用默认版本创建一个纯 Kubernetes 集群
./kk create cluster
创建指定一个(支持的版本)的 Kubernetes 集群
./kk create cluster --with-kubernetes v1.19.8
创建一个部署了 KubeSphere 的 Kubernetes 集群 (例如 --with-kubesphere v3.1.0)
./kk create cluster --with-kubesphere [version]
创建一个指定的 container runtime 的 Kubernetes 集群(docker, crio, containerd and isula)
./kk create cluster --container-manager containerd
通过指定配置文件来创建集群。
如果无法访问 https://storage.googleapis.com, 请先执行 export KKZONE=cn.
创建一个示例配置文件
./kk create config [--with-kubernetes version] [--with-kubesphere version] [(-f | --filename) path]
使用默认配置创建一个示例配置文件。您也可以指定文件名称或文件所在的文件夹。
./kk create config [-f ~/myfolder/config-sample.yaml]
同时安装 KubeSphere
./kk create config --with-kubesphere
根据环境修改配置文件 config-sample.yaml
当指定安装KubeSphere时,要求集群中有可用的持久化存储。默认使用localVolume
使用配置文件创建集群。
./kk create cluster -f ~/myfolder/config-sample.yaml
标准配置文件示例
apiVersion: kubekey.kubesphere.io/v1alpha2
kind: Cluster
metadata:
name: sample
spec:
hosts:
- {name: k8s-master, address: 172.16.8.58, internalAddress: 172.16.8.58, user: root, password: "123456"}
- {name: k8s-node, address: 172.16.8.59, internalAddress: 172.16.8.59, user: root, password: "123456"}
- {name: node2, address: 10.2.12.39, internalAddress: 10.2.12.39, user: root, password: "123456"}
- {name: gpu-node-v100, address: 172.16.8.62, internalAddress: 172.16.8.62, user: root, password: "123456"}
roleGroups:
etcd:
- k8s-master
control-plane:
- k8s-master
worker:
- k8s-master
- k8s-node
- node2
- gpu-node-v100
controlPlaneEndpoint:
## Internal loadbalancer for apiservers
# internalLoadbalancer: haproxy
domain: lb.kubesphere.local
address: ""
port: 6443
kubernetes:
version: v1.23.15
imageRepo: registry.cn-hangzhou.aliyuncs.com/google_containers
clusterName: cluster.local
autoRenewCerts: true
containerManager: docker
etcd:
type: kubekey
network:
plugin: calico
kubePodsCIDR: 10.233.64.0/18
kubeServiceCIDR: 10.233.0.0/18
## multus support. https://github.com/k8snetworkplumbingwg/multus-cni
multusCNI:
enabled: false
registry:
privateRegistry: ""
namespaceOverride: ""
registryMirrors: []
insecureRegistries: []
addons: []
---
apiVersion: installer.kubesphere.io/v1alpha1
kind: ClusterConfiguration
metadata:
name: ks-installer
namespace: kubesphere-system
labels:
version: v3.3.2
spec:
persistence:
storageClass: ""
authentication:
jwtSecret: ""
zone: ""
local_registry: ""
namespace_override: ""
# dev_tag: ""
etcd:
monitoring: false
endpointIps: localhost
port: 2379
tlsEnable: true
common:
core:
console:
enableMultiLogin: true
port: 30880
type: NodePort
# apiserver:
# resources: {}
# controllerManager:
# resources: {}
redis:
enabled: false
volumeSize: 2Gi
openldap:
enabled: false
volumeSize: 2Gi
minio:
volumeSize: 20Gi
monitoring:
# type: external
endpoint: http://prometheus-operated.kubesphere-monitoring-system.svc:9090
GPUMonitoring:
enabled: false
gpu:
kinds:
- resourceName: "nvidia.com/gpu"
resourceType: "GPU"
default: true
es:
# master:
# volumeSize: 4Gi
# replicas: 1
# resources: {}
# data:
# volumeSize: 20Gi
# replicas: 1
# resources: {}
logMaxAge: 7
elkPrefix: logstash
basicAuth:
enabled: false
username: ""
password: ""
externalElasticsearchHost: ""
externalElasticsearchPort: ""
alerting:
enabled: false
# thanosruler:
# replicas: 1
# resources: {}
auditing:
enabled: false
# operator:
# resources: {}
# webhook:
# resources: {}
devops:
enabled: false
# resources: {}
jenkinsMemoryLim: 8Gi
jenkinsMemoryReq: 4Gi
jenkinsVolumeSize: 8Gi
events:
enabled: false
# operator:
# resources: {}
# exporter:
# resources: {}
# ruler:
# enabled: true
# replicas: 2
# resources: {}
logging:
enabled: true
logsidecar:
enabled: true
replicas: 2
# resources: {}
metrics_server:
enabled: false
monitoring:
storageClass: ""
node_exporter:
port: 9100
# resources: {}
# kube_rbac_proxy:
# resources: {}
# kube_state_metrics:
# resources: {}
# prometheus:
# replicas: 1
# volumeSize: 20Gi
# resources: {}
# operator:
# resources: {}
# alertmanager:
# replicas: 1
# resources: {}
# notification_manager:
# resources: {}
# operator:
# resources: {}
# proxy:
# resources: {}
gpu:
nvidia_dcgm_exporter:
enabled: false
# resources: {}
multicluster:
clusterRole: none
network:
networkpolicy:
enabled: false
ippool:
type: none
topology:
type: none
openpitrix:
store:
enabled: false
servicemesh:
enabled: false
istio:
components:
ingressGateways:
- name: istio-ingressgateway
enabled: false
cni:
enabled: false
edgeruntime:
enabled: false
kubeedge:
enabled: false
cloudCore:
cloudHub:
advertiseAddress:
- ""
service:
cloudhubNodePort: "30000"
cloudhubQuicNodePort: "30001"
cloudhubHttpsNodePort: "30002"
cloudstreamNodePort: "30003"
tunnelNodePort: "30004"
# resources: {}
# hostNetWork: false
iptables-manager:
enabled: true
mode: "external"
# resources: {}
# edgeService:
# resources: {}
terminal:
timeout: 600
五、KubeSphere
k8s集群及KubeSphere 安装完成后访问地址为:
https:// < node-ip > :30880
用户名是 admin,默认密码是 P@88w0rd
登录后可通过图形化界面管理集群
六、官方资源与社区支持
文档中心:https://kubesphere.io/docs/
GitHub 仓库:https://github.com/kubesphere/kubesphere