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的方式进行访问:

图片

posted @ 2025-09-02 20:42  kennyy  阅读(28)  评论(0)    收藏  举报