Kubernetes快速部署指南¶
0. 简介¶
参照本文档部署成功Kubernetes后 默认完成以下工作
功能组件覆盖情况
-
kubernetes 1.24.2 高可用部署
-
coredns 组件安装
-
node-local-dns 组件安装
-
ingress-nginx 组件安装
-
metrics-server 组件安装
-
openebs-provisioner 组件驱动安装
资源清单
1. “最低配置” 适合 POC 场景部署,只作功能验证,不适合作为生产环境使用。
2. 作为生产部署以实际接入数据量做评估,接入的数据量越多,TDengine、OpenSearch 的存储与规格配置相应也需要越高。
用途 | 资源类型 | 最低规格 | 推荐规格 | 数量 | 备注 |
---|---|---|---|---|---|
Kubernetes Master | 物理服务器|虚拟机 | 4C8GB 100GB | 8C16GB 100GB | 3 | 版本: 1.24.2 注:若是为虚拟机需适当提高资源规格,复用一台master节点充当部署节点 |
Kubernetes workerload | 物理服务器|虚拟机 | 4C8GB 100GB | 8C16GB 100GB | 4 | k8s集群worker节点,承载观测云应用、k8s组件、基础组件服务Mysql 5.7.18、Redis 6.0.6 |
观测云代理服务 | 物理服务器|虚拟机 | 2C4GB 100GB | 4C8GB 200GB | 1 | 用于部署nginx 反向代理服务器部署,代理到ingress 边缘节点 注: 出于安全考虑不直接将集群边缘节点直接暴露 |
观测云网络文件系统服务 | 物理服务器|虚拟机 | 2C4GB 200G | 4C8GB 1TB 高性能磁盘 | 1 | 部署网络文件系统、网络存储服务,默认NFS(若已有存在的nfs服务该机器可取消) |
DataWay | 物理服务器|虚拟机 | 2C4GB 100GB | 4C8GB 100GB | 1 | 用户部署 DataWay |
OpenSearch | 物理服务器|虚拟机 | 4C8GB 1TB | 8C16G 1TB | 3 | OpenSearch 版本:2.2.1 注:需要开启密码认证,安装匹配版本分词插件 analysis-ik |
TDengine | 物理服务器|虚拟机 | 4C8GB 500GB | 8C16G 1TB | 3 | TDengine 版本:2.6.0.18 |
其他 | 邮件服务器/短信 | - | - | 1 | 短信网关,邮件服务器,告警通道 |
已备案正式通配符域名 | - | - | 1 | 主域名需备案 | |
SSL/TLS证书 | 通配符域名证书 | 通配符域名证书 | 1 | 保障站点安全 |
1. 前置条件¶
重要
- 基础环境离线资源包上传到所有集群节点,并解压到服务器/etc目录
- 部署节点和集群其他节点已配置ssh免密登录(包括部署节点自身)
- 观测云平台离线资源包上传到所有集群节点,定导入到容器运行时环境(containerd)
1.1 免密登录设置参考¶
# 登录到部署机执行命令
# 生成公钥对
[root@k8s-node01 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:vruHbsWUUL5M9k0dg15zhIX5Y9MZVJ+enf0JhzF5lP0 root@k8s-node02
The key's randomart image is:
+---[RSA 2048]----+
| .. o@B|
| .. .**B|
| .+..+o+X|
| +oo +*=E|
| Soo .oo==|
| . o o o|
| .o ..|
| o.. |
| o=+ |
+----[SHA256]-----+
# $IP 为所有节点地址包括自身,按照提示输入yes 和root密码
ssh-copy-id $IP
# 为每个节点设置python软链接,默认不需要执行【针对使用 python3 的某些版本需要执行此操作】
# ssh $IP ln -s /usr/bin/python3 /usr/bin/python
2. 部署准备¶
2.1 资源包下载¶
基础环境离线资源包下载地址 Download
2.2 离线资源包结构说明¶
离线包内容简要说明
/etc/kubeasz
为kubeasz主目录/etc/kubeasz/example
包含示例配置文件/etc/kubeasz/clusters
包含创建的集群相关配置文件/etc/kubeasz/guance
包含观测云相关的charts、yaml 等信息/etc/kubeasz/bin
包含 k8s/etcd/docker/cni 等二进制文件/etc/kubeasz/down
包含集群安装时需要的离线容器镜像包等/etc/kubeasz/down/packages
包含集群安装时需要的系统基础软件
3. 安装集群¶
3.1 注意事项¶
重要
-
确保各节点时区设置一致、时间同步
-
文档中命令默认都需要root权限运行
-
确保在干净的系统上开始安装,不要使用曾经装过kubeadm或其他k8s发行版
-
执行一键安装前一定要配置并检查自定义集群生成的配置文件。主要是/etc/kubease/clusters/xxx/hosts和/etc/kubeasz/clusters/config.yaml
-
修改方便识别的主机名【可选】
3.2 集群角色规划¶
高可用集群所需节点配置如下
角色 | 数量 | 描述 |
---|---|---|
deploy(部署)节点 | 1 | 运行ansible/ezctl命令,一般复用第一个master节点 |
etcd节点 | 3 | 注意etcd集群需要1,3,5,...奇数个节点,一般复用master节点 |
master节点 | 3 | 高可用集群至少2个master节点 |
node节点 | N | 运行应用负载的节点,可根据需要提升机器配置/增加节点数 |
说明
默认配置下容器运行时和kubelet会占用/var的磁盘空间,如果磁盘分区特殊,可以在创建集群配置前,设置example/config.yml中的容器运行时和kubelet数据目录:CONTAINERD_STORAGE_DIR
DOCKER_STORAGE_DIR
KUBELET_ROOT_DIR
3.3 部署步骤¶
3.3.1 在部署节点编排k8s安装¶
登录到部署节点服务器 进入到/etc/kueasz目录,执行下面命令
更多关于ezdown的参数,运行ezdown 查看。
小贴士
若不能运行请进入到 /etc/kubeasz目录 执行./ezdwon -h 查看
3.3.2 创建集群配置实例¶
# 运行kubeasz 容器
./ezdown -S
# 创建新的集群 guancecloud
# 集群名称可以按需自定义,相应会生成和集群名匹配的目录
docker exec -it kubeasz ezctl new guancecloud
# 结果回显示例
2022-10-19 10:48:23 DEBUG generate custom cluster files in /etc/kubeasz/clusters/guancecloud
2022-10-19 10:48:23 DEBUG set version of common plugins
2022-10-19 10:48:23 DEBUG cluster k8s-01: files successfully created.
2022-10-19 10:48:23 INFO next steps 1: to config '/etc/kubeasz/clusters/guancecloud/hosts'
2022-10-19 10:48:23 INFO next steps 2: to config '/etc/kubeasz/clusters/guancecloud/config.yml'
然后根据提示配置修改集群配置文件
#根据前面集群角色规划修改hosts文件
'/etc/kubeasz/clusters/xxx/hosts'
#其他集群层面的主要配置选项可以在config.yml 文件中修改【建议使用默认,除非您对修改的参数非常清楚】
'/etc/kubeasz/clusters/xxx/config.yml'
配置文件示例内容如下
说明
需要自定义配置项,请参阅示例配置文件
示例配置文件
# config.yaml
############################
# prepare
############################
# 可选离线安装系统软件包 (offline|online)
# 离线环境默认为 "offline"
INSTALL_SOURCE: "offline"
# 可选进行系统安全加固 github.com/dev-sec/ansible-collection-hardening
OS_HARDEN: false
############################
# role:deploy
############################
# default: ca will expire in 100 years
# default: certs issued by the ca will expire in 50 years
CA_EXPIRY: "876000h"
CERT_EXPIRY: "438000h"
# kubeconfig 配置参数
CLUSTER_NAME: "cluster1"
CONTEXT_NAME: "context-{{ CLUSTER_NAME }}"
# k8s version
K8S_VER: "__k8s_ver__"
############################
# role:etcd
############################
# 设置不同的wal目录,可以避免磁盘io竞争,提高性能
# 建议修改为磁盘空间较大的目录,具体以实际情况为准
ETCD_DATA_DIR: "/var/lib/etcd"
ETCD_WAL_DIR: ""
############################
# role:runtime [containerd,docker]
############################
# ------------------------------------------- containerd
# [.]启用容器仓库镜像
ENABLE_MIRROR_REGISTRY: true
# [containerd]基础容器镜像
SANDBOX_IMAGE: "easzlab.io.local:5000/easzlab/pause:__pause__"
# [containerd]容器持久化存储目录
# 建议修改为磁盘空间较大的目录,具体以实际情况为准
CONTAINERD_STORAGE_DIR: "/var/lib/containerd"
# ------------------------------------------- docker
# [docker]容器存储目录
# 建议修改为磁盘空间较大的目录,具体以实际情况为准
# 只有部署机器上会有docker服务
DOCKER_STORAGE_DIR: "/var/lib/docker"
# [docker]开启Restful API
ENABLE_REMOTE_API: false
# [docker]信任的HTTP仓库
INSECURE_REG: '["http://easzlab.io.local:5000"]'
############################
# role:kube-master
############################
# k8s 集群 master 节点证书配置,可以添加多个ip和域名(比如增加公网ip和域名)
MASTER_CERT_HOSTS:
- "10.1.1.1"
- "k8s.easzlab.io"
#- "www.test.com"
# node 节点上 pod 网段掩码长度(决定每个节点最多能分配的pod ip地址)
# 如果flannel 使用 --kube-subnet-mgr 参数,那么它将读取该设置为每个节点分配pod网段
# https://github.com/coreos/flannel/issues/847
NODE_CIDR_LEN: 24
############################
# role:kube-node
############################
# Kubelet 根目录
# 建议修改为磁盘空间较大的目录,具体以实际情况为准
KUBELET_ROOT_DIR: "/var/lib/kubelet"
# node节点最大pod 数
MAX_PODS: 110
# 配置为kube组件(kubelet,kube-proxy,dockerd等)预留的资源量
# 数值设置详见templates/kubelet-config.yaml.j2
KUBE_RESERVED_ENABLED: "no"
# k8s 官方不建议草率开启 system-reserved, 除非你基于长期监控,了解系统的资源占用状况;
# 并且随着系统运行时间,需要适当增加资源预留,数值设置详见templates/kubelet-config.yaml.j2
# 系统预留设置基于 4c/8g 虚机,最小化安装系统服务,如果使用高性能物理机可以适当增加预留
# 另外,集群安装时候apiserver等资源占用会短时较大,建议至少预留1g内存
SYS_RESERVED_ENABLED: "no"
############################
# role:network [flannel,calico,cilium,kube-ovn,kube-router]
############################
# ------------------------------------------- flannel
# [flannel]设置flannel 后端"host-gw","vxlan"等
FLANNEL_BACKEND: "vxlan"
DIRECT_ROUTING: false
# [flannel] flanneld_image: "quay.io/coreos/flannel:v0.10.0-amd64"
flannelVer: "__flannel__"
flanneld_image: "easzlab.io.local:5000/easzlab/flannel:{{ flannelVer }}"
# ------------------------------------------- calico
# [calico]设置 CALICO_IPV4POOL_IPIP=“off”,可以提高网络性能,条件限制详见 docs/setup/calico.md
CALICO_IPV4POOL_IPIP: "Always"
# [calico]设置 calico-node使用的host IP,bgp邻居通过该地址建立,可手工指定也可以自动发现
IP_AUTODETECTION_METHOD: "can-reach={{ groups['kube_master'][0] }}"
# [calico]设置calico 网络 backend: brid, vxlan, none
CALICO_NETWORKING_BACKEND: "brid"
# [calico]设置calico 是否使用route reflectors
# 如果集群规模超过50个节点,建议启用该特性
CALICO_RR_ENABLED: false
# CALICO_RR_NODES 配置route reflectors的节点,如果未设置默认使用集群master节点
# CALICO_RR_NODES: ["192.168.1.1", "192.168.1.2"]
CALICO_RR_NODES: []
# [calico]更新支持calico 版本: [v3.3.x] [v3.4.x] [v3.8.x] [v3.15.x]
calico_ver: "__calico__"
# [calico]calico 主版本
calico_ver_main: "{{ calico_ver.split('.')[0] }}.{{ calico_ver.split('.')[1] }}"
# ------------------------------------------- cilium
# [cilium]镜像版本
cilium_ver: "__cilium__"
cilium_connectivity_check: true
cilium_hubble_enabled: false
cilium_hubble_ui_enabled: false
# ------------------------------------------- kube-ovn
# [kube-ovn]选择 OVN DB and OVN Control Plane 节点,默认为第一个master节点
OVN_DB_NODE: "{{ groups['kube_master'][0] }}"
# [kube-ovn]离线镜像tar包
kube_ovn_ver: "__kube_ovn__"
# ------------------------------------------- kube-router
# [kube-router]公有云上存在限制,一般需要始终开启 ipinip;自有环境可以设置为 "subnet"
OVERLAY_TYPE: "full"
# [kube-router]NetworkPolicy 支持开关
FIREWALL_ENABLE: true
# [kube-router]kube-router 镜像版本
kube_router_ver: "__kube_router__"
busybox_ver: "1.28.4"
############################
# role:cluster-addon
############################
# coredns 自动安装
dns_install: "yes"
corednsVer: "__coredns__"
ENABLE_LOCAL_DNS_CACHE: true
dnsNodeCacheVer: "__dns_node_cache__"
# 设置 local dns cache 地址
LOCAL_DNS_CACHE: "169.254.20.10"
# metric server 自动安装
metricsserver_install: "yes"
metricsVer: "__metrics__"
# dashboard 自动安装
dashboard_install: "no"
dashboardVer: "__dashboard__"
dashboardMetricsScraperVer: "__dash_metrics__"
# prometheus 自动安装
prom_install: "no"
prom_namespace: "monitor"
prom_chart_ver: "__prom_chart__"
# nfs-provisioner 自动安装
# 若有现存的 nfs 必须配置为 "yes" 并配置正确的 server 信息
nfs_provisioner_install: "no"
nfs_provisioner_namespace: "kube-system"
nfs_provisioner_ver: "__nfs_provisioner__"
nfs_storage_class: "managed-nfs-storage"
nfs_server: "192.168.1.10"
nfs_path: "/data/nfs"
# network-check 自动安装
network_check_enabled: false
network_check_schedule: "*/5 * * * *"
############################
# role:harbor
############################
# harbor version,完整版本号
HARBOR_VER: "__harbor__"
HARBOR_DOMAIN: "harbor.easzlab.io.local"
HARBOR_TLS_PORT: 8443
# if set 'false', you need to put certs named harbor.pem and harbor-key.pem in directory 'down'
HARBOR_SELF_SIGNED_CERT: true
# install extra component
HARBOR_WITH_NOTARY: false
HARBOR_WITH_TRIVY: false
HARBOR_WITH_CLAIR: false
HARBOR_WITH_CHARTMUSEUM: true
# ingress-nginx 相关配置
ingress_nginx_install: "yes"
ingressnginxVer: v1.4.0
certgenVer: v20220916-gd32f8c343
配置主机
主机配置示例
# 'etcd' cluster should have odd member(s) (1,3,5,...)
# 必须按照实际规划情况替换ip
[etcd]
192.168.1.1
192.168.1.2
192.168.1.3
# master node(s)
# 必须按照实际规划情况替换ip
[kube_master]
192.168.1.1
192.168.1.2
# work node(s)
# 必须按照实际规划情况替换ip
[kube_node]
192.168.1.3
192.168.1.4
# [optional] harbor server, a private docker registry
# 'NEW_INSTALL': 'true' to install a harbor server; 'false' to integrate with existed one
[harbor]
#192.168.1.8 NEW_INSTALL=false
# [optional] loadbalance for accessing k8s from outside
[ex_lb]
#192.168.1.6 LB_ROLE=backup EX_APISERVER_VIP=192.168.1.250 EX_APISERVER_PORT=8443
#192.168.1.7 LB_ROLE=master EX_APISERVER_VIP=192.168.1.250 EX_APISERVER_PORT=8443
# [optional] ntp server for the cluster
[chrony]
#192.168.1.1
[all:vars]
# --------- Main Variables ---------------
# Secure port for apiservers
SECURE_PORT="6443"
# Cluster container-runtime supported: docker, containerd
# if k8s version >= 1.24, docker is not supported
CONTAINER_RUNTIME="containerd"
# Network plugins supported: calico, flannel, kube-router, cilium, kube-ovn
# 建议使用该默认值,或者修改为 "flannel"
CLUSTER_NETWORK="calico"
# Service proxy mode of kube-proxy: 'iptables' or 'ipvs'
PROXY_MODE="ipvs"
# K8S Service CIDR, not overlap with node(host) networking
# 不能和主机ip段冲突
SERVICE_CIDR="10.68.0.0/16"
# Cluster CIDR (Pod CIDR), not overlap with node(host) networking
# 不能和主机ip段冲突
CLUSTER_CIDR="172.20.0.0/16"
# NodePort Range
NODE_PORT_RANGE="30000-32767"
# Cluster DNS Domain
CLUSTER_DNS_DOMAIN="cluster.local"
# -------- Additional Variables (don't change the default value right now) ---
# Binaries Directory
bin_dir="/opt/kube/bin"
# Deploy Directory (kubeasz workspace)
base_dir="/etc/kubeasz"
# Directory for a specific cluster
cluster_dir="{{ base_dir }}/clusters/_cluster_name_"
# CA and other components cert/key Directory
ca_dir="/etc/kubernetes/ssl"
3.3.3 一键部署¶
上述操作确认执行无误后执行如下命令进行快速部署
小贴士
# 一键安装命令,等价于执行docker exec -it kubeasz ezctl setup xxx all
# xxx 表示创建的集群名称
dk ezctl setup guancecloud all
# 或者分步安装,具体使用 dk ezctl help setup 查看分步安装帮助信息
# dk ezctl setup guancecloud 01
# dk ezctl setup guancecloud 02
# dk ezctl setup guancecloud 03
# dk ezctl setup guancecloud 04
# 命令跑完后task 不能有错误
TASK [cluster-addon : 准备 DNS的部署文件] *********************************************
changed: [10.200.14.144]
TASK [cluster-addon : 创建coredns部署] *********************************************
changed: [10.200.14.144]
TASK [cluster-addon : 准备dnscache的部署文件] *****************************************
changed: [10.200.14.144]
TASK [cluster-addon : 创建dnscache部署] ********************************************
changed: [10.200.14.144]
TASK [cluster-addon : 准备 metrics-server的部署文件] **********************************
changed: [10.200.14.144]
TASK [cluster-addon : 创建 metrics-server部署] *************************************
changed: [10.200.14.144]
TASK [cluster-addon : 准备 nfs-provisioner 配置目录] *********************************
changed: [10.200.14.144]
TASK [cluster-addon : 准备 nfs-provisioner部署文件] **********************************
changed: [10.200.14.144] => (item=nfs-provisioner.yaml)
changed: [10.200.14.144] => (item=test-pod.yaml)
TASK [cluster-addon : 创建 nfs-provisioner部署] ************************************
changed: [10.200.14.144]
TASK [cluster-addon : 准备 openebs-provisioner 配置目录] *****************************
changed: [10.200.14.144]
TASK [cluster-addon : 准备 openebs-provisioner 部署文件] *****************************
changed: [10.200.14.144] => (item=openebs-provisioner.yaml)
TASK [cluster-addon : 创建 openebs-provisioner 部署] *******************************
changed: [10.200.14.144]
TASK [cluster-addon : 准备 ingress-nginx 配置目录] ***********************************
changed: [10.200.14.144]
TASK [cluster-addon : 准备 ingress-nginx 部署文件] ***********************************
changed: [10.200.14.144] => (item=ingress-nginx.yaml)
TASK [cluster-addon : 创建 ingress-nginx 部署] *************************************
changed: [10.200.14.144]
PLAY RECAP *********************************************************************
10.200.14.144 : ok=110 changed=99 unreachable=0 failed=0 skipped=172 rescued=0 ignored=0
10.200.14.145 : ok=117 changed=106 unreachable=0 failed=0 skipped=199 rescued=0 ignored=0
10.200.14.146 : ok=93 changed=83 unreachable=0 failed=0 skipped=148 rescued=0 ignored=0
localhost : ok=33 changed=30 unreachable=0 failed=0 skipped=11 rescued=0 ignored=0
重要
-
必须返回信息全部成功,否者请重置系统,重新执行安装
-
清理集群 docker exec -it kubeasz ezctl destroy xxx 其中xxx 表示集群名称
-
重启节点,以确保清理残留的虚拟网卡、路由等信息
成功返回示例
PLAY RECAP *********************************************************************
10.200.14.144 : ok=110 changed=99 unreachable=0 failed=0 skipped=172 rescued=0 ignored=0
10.200.14.145 : ok=117 changed=106 unreachable=0 failed=0 skipped=199 rescued=0 ignored=0
10.200.14.146 : ok=93 changed=83 unreachable=0 failed=0 skipped=148 rescued=0 ignored=0
localhost : ok=33 changed=30 unreachable=0 failed=0 skipped=11 rescued=0 ignored=0
更多关于ezctl的参数,运行ezctl 查看,若不能运行请进入到 /etc/kubeasz目录 执行./ezctl 查看
4. 验证安装¶
4.1 集群组件状态¶
集群组件
确认所有返回结果无 ERROR
4.2 集群节点状态¶
集群节点
确认所有返回结果节点状态为 Ready
4.3 集群默认pod 状态¶
集群初始pod
[root@k8s-node01 ~]# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
ingress-nginx ingress-nginx-admission-create-sh5gb 0/1 Completed 0 22h
ingress-nginx ingress-nginx-admission-patch-dhsvl 0/1 Completed 0 22h
ingress-nginx ingress-nginx-controller-6d799ccc9c-rhgx5 1/1 Running 0 22h
kube-system calico-kube-controllers-5c8bb696bb-srlmd 1/1 Running 0 22h
kube-system calico-node-4rwfj 1/1 Running 0 22h
kube-system calico-node-lcm44 1/1 Running 0 22h
kube-system calico-node-nbc5w 1/1 Running 0 22h
kube-system calico-node-qfnw2 1/1 Running 0 22h
kube-system coredns-84b58f6b4-zgkvb 1/1 Running 0 22h
kube-system kubernetes-dashboard-5fc74cf5c6-kcpc7 1/1 Running 0 22h
kube-system metrics-server-69797698d4-nqfqf 1/1 Running 0 22h
kube-system node-local-dns-7w2kt 1/1 Running 0 22h
kube-system node-local-dns-gb4zp 1/1 Running 0 22h
kube-system node-local-dns-mw9pt 1/1 Running 0 22h
kube-system node-local-dns-zr5d9 1/1 Running 0 22h
确认所有pod状态为 Running 状态为 Ready
4.4 确认集群info信息
集群信息
[root@k8s-node01 ~]# kubectl cluster-info
Kubernetes control plane is running at https://127.0.0.1:6443
CoreDNS is running at https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
KubeDNSUpstream is running at https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/kube-dns-upstream:dns/proxy
kubernetes-dashboard is running at https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
4.5 确认集群资源使用情况
集群资源使用情况
确认能够正常返回集群资源使用情况
5. 常见问题¶
小贴士
验证安装阶段如果提示kubectl: command not found,退出重新ssh登录一下,环境变量生效即可
如果报错helm命令找不到,请退出后重新ssh登录到服务,查看环境变量,执行helm命令确认能否执行