KubeKey自动化快速部署K8s集群
一、KubeKey自动化快速部署K8s集群
1.1、服务器安装前准备
此处操作未作任何声明的情况下,默认所有节点都要执行。
环境准备
| 主机名 | IP |
|---|---|
| k8s-master1 | 192.168.6.90 |
| k8s-worker1 | 192.168.6.91 |
1.1.1、设置主机名
根据机器的规划,分布设置两台主机名为k8s-master1、k8s-worker1。
# 修改配置文件方式,
vi /etc/hostname
##文件内容为:k8s-master1或k8s-worker1
# 命令行方式,临时修改
# 设置 master 主机名
hostnamectl set-hostname k8s-master1 && bash
hostnamectl set-hostname k8s-worker1 && bash
1.1.2、配置时间同步
采用ntpdate命令进行时间校对,设置Crontab定时任务进行定时校对。
# 设置时区
timedatectl set-timezone Asia/Shanghai
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 执行命令查看时区是否修改
timedatectl status
#安装工具
sudo yum install ntpdate
# 配置Crontab定时任务
crontab -e
# 添加如下内容:
0 */1 * * * ntpdate time1.aliyun.com
1.1.3、关闭系统防火墙
# Ubuntu默认的防火墙
systemctl stop ufw && systemctl disable ufw
# 或者
systemctl stop firewalld && systemctl disable firewalld
1.1.4、安装系统依赖
直接执行下面的命令为 Kubernetes 安装系统基本依赖包,所有节点都要执行。
# 安装 Kubernetes 系统依赖包
sudo apt update
sudo apt install -y curl socat conntrack ebtables ipset ipvsadm
# centos
yum install -y curl socat conntrack ebtables ipset ipvsadm
1.1.5、关闭swap分区
# 临时关闭
swapoff -a
# 编辑/etc/fstab,注释如下类似的内容,重启系统并验证。如果已经关闭那么该命令不会有输出。
vim /etc/fstab
...
注释掉swap一行
...
1.1.6、创建数据目录(非必须)
# 创建 OpenEBS 本地数据根目录
mkdir -p /data/openebs/local
# 创建Containerd数据目录
mkdir -p /data/containerd
# 创建Containerd数据目录软连接
ln -s /data/containerd /var/lib/containerd
这一步的操作不是非必须的,因为有的节点在安装的时候,磁盘挂载时,根路径并没有太多的内存。这时候则需要看主要的磁盘挂载到哪个路径下的,则可以在该路径下创建安装时需要的数据目录例如/data目录下
1.1.7、容器运行时docker(可选)
- 脚本安装省略
1.2、安装部署KubeKey+K8s(任一Master节点操作)
1.2.1、下载 KubeKey
#创建安装目录
mkdir ~/kubekey
cd ~/kubekey/
# 选择中文区下载,否则从Github拉取会超时
export KKZONE=cn
curl -sfL https://get-kk.kubesphere.io | sh -
# 执行失败可使用以下方式
# 浏览器输入https://get-kk.kubesphere.io会自动下载脚本然后上传到服务器
bash downloadKubekey.sh
下载后如下图:

查看 KubeKey 支持的 Kubernetes 版本列表
./kk version --show-supported-k8s

1.2.2、创建 K8s 集群部署配置文件
./kk create config -f k8s-v1288.yaml --with-kubernetes v1.28.2
1.2.3、修改部署配置文件
可以看到上一步已经输出了一个k8s-v1288.yaml文件,然后可以根据实际的安装情况进行对应的修改。
vim k8s-v1288.yaml
apiVersion: kubekey.kubesphere.io/v1alpha2
kind: Cluster
metadata:
name: sample
spec:
hosts:
- {name: k8s-master1, address: 192.168.6.90, internalAddress: 192.168.6.90, user: root, password: "123"}
- {name: k8s-worker1, address: 192.168.6.91, internalAddress: 192.168.6.91, user: root, password: "123"}
roleGroups:
etcd:
- k8s-master1
control-plane:
- k8s-master1
worker:
- k8s-worker1
controlPlaneEndpoint:
## Internal loadbalancer for apiservers
# internalLoadbalancer: haproxy
domain: lb.kubesphere.local
address: ""
port: 6443
kubernetes:
version: v1.28.2
clusterName: cluster.local
autoRenewCerts: true
containerManager: docker # containerd OR 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
storage:
openebs:
basePath: /data/openebs/local
registry:
privateRegistry: ""
namespaceOverride: ""
registryMirrors: []
insecureRegistries: []
addons: []
这三行没有,添加的
storage:
openebs:
basePath: /data/openebs/local
配置文件解析:
主要修改 spec: 下的相关配置,且此处为安装演示,所以是1个msater节点,1个worker节点
-
hosts:指定节点的 IP、ssh 用户、ssh 密码(可以不是root,但是要保证该用户有sudo的权限)
-
roleGroups:指定 2个 etcd、control-plane 节点,并复用为 worker 节点
-
internalLoadbalancer: 启用内置的 HAProxy 负载均衡器,做高可用负载均衡,用来分发客户端对 API Server 的请求到多个控制平面节点。
-
domain:自定义域名 ,一般使用默认值 lb.kubesphere.local,如果有购买域名也可自行修改
-
clusterName:集群名字,没特殊需求可使用默认值 cluster.local
-
autoRenewCerts:此参数可以实现证书到期自动续期,默认为 true
-
containerManager:容器运行时指定 containerd,支持containerd, cri-o, isula,默认为 docker
-
storage.openebs.basePath:默认没有,新增配置,指定 openebs 默认存储路径
-
registry.privateRegistry:可选配置, 可以解决 Docker 官方镜像不可用的问题,在export KKZONE=cn后默认从kubesphere的阿里云官方仓库地址拉取,默认为registry.cn-beijing.aliyuncs.com
-
registry.namespaceOverride: 可选配置, 默认为kubesphereio,仓库名
-
更多的配置可以参考官方文件:kubekey/docs/config-example.md at master · kubesphere/kubekey · GitHub
1.2.4、部署 K8s 集群
export KKZONE=cn
./kk create cluster -f k8s-v1288.yaml
执行命令后,KubeKey会检查部署 K8s 的依赖及其他详细要求。通过检查后,系统将提示您确认安装。输入 yes 并按 ENTER 继续部署。

如果不缺少组件,且没有其他疑难杂症,则会进入部署流程。根据运行内存和网速等条件,大概时间为 10-20 分钟左右。
部署过程中,KubeKey是从阿里云的镜像地址拉取的镜像。默认使用calico的IP in IP网络模式
1.2.5、检查集群是否部署成功
kubectl get nodes -o wide
kubectl get pods -o wide -n kube-system

安装自动补全命令
# 安装 bash-completion(如果没装)
yum install -y bash-completion
# 启用 kubectl 自动补全
source <(kubectl completion bash)
# 永久生效(加到 ~/.bashrc)
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc
1.2.6、测试集群是否可以成功部署和访问pod
以部署一个Nginx应用为例,以下是一个简单的Nginx部署的yaml文件:
vim nginx-deploy.yaml
apiVersion: apps/v1 #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment #该配置的类型,我们使用的是 Deployment
metadata: #译名为元数据,即 Deployment 的一些基本属性和信息
name: nginx-deployment #Deployment 的名称
labels: #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解
app: nginx #为该Deployment设置key为app,value为nginx的标签
spec: #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
replicas: 1 #使用该Deployment创建一个应用程序实例
selector: #标签选择器,与上面的标签共同作用,目前不需要理解
matchLabels: #选择包含标签app:nginx的资源
app: nginx
template: #这是选择或创建的Pod的模板
metadata: #Pod的元数据
labels: #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
app: nginx
spec: #期望Pod实现的功能(即在pod中部署)
containers: #生成container,与docker中的container是同一种
- name: nginx #container的名称
image: nginx:1.26.0 #使用镜像nginx:1.26.0创建container,该container默认80端口可访问
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service #Service 的名称
labels: #Service 自己的标签
app: nginx #为该 Service 设置 key 为 app,value 为 nginx 的标签
spec: #这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问
selector: #标签选择器
app: nginx #选择包含标签 app:nginx 的 Pod
ports:
- name: nginx-port #端口的名字
protocol: TCP #协议类型 TCP/UDP
port: 80 #集群内的其他容器组可通过 80 端口访问 Service
nodePort: 32600 #通过任意节点的 32600 端口访问 Service
targetPort: 80 #将请求转发到匹配 Pod 的 80 端口
type: NodePort #Serive的类型,ClusterIP/NodePort/LoaderBalancer
上述的资源清单创建了两种类型一个Deployment,一个Service,然后执行命令部署:
kubectl apply -f nginx-deploy.yaml
执行成功后,如下图:

然后通过node节点IP+32600的方式进行访问:

浙公网安备 33010602011771号