一、背景

当前k8s几乎是各个公司的标配了,如果因为想学习,而去搭建原生的k8s集群或者购买云厂商的k8s集群,成本会很高。现在主流的就minikube与kind二种解决方案。下面是二者的对比,本文着重介绍kind解决方案的搭建

二、轻量级k8s解决方案对比

知乎——轻量级k8s解决方案对比https://zhuanlan.zhihu.com/p/2030058354882654863

三、kind集群的匹配要求

1. 官方最低要求2核2G;

2. 如果你创建单节点集群,4 GB 内存 是非常舒适的运行环境。

3. 如果你通过配置文件创建多节点集群(例如模拟 3 个控制平面 + 3 个工作节点),内存消耗会线性增加,此时建议宿主机至少有 8 GB 或 16 GB 内存

四、搭建步骤

  1. 安装docker环境

  2. 安装kubectl命令 本人是manjaro,直接在manjaro的应用市场就能下载。下面是linux所有发行版都通用的安装方式

# 1. 下载最新版本 (amd64 架构) 
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" 
# 2. 赋予执行权限 
chmod +x kubectl 
# 3. 移动到系统 PATH 路径下 
sudo mv kubectl /usr/local/bin/

3. 安装kind

# Linux (通用方法)
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.29.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind

4. 创建k8s集群的配置文件

下面是1主2worker的3个节点的集群的配置

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    protocol: TCP
  - containerPort: 443
    hostPort: 443
    protocol: TCP
- role: worker
- role: worker

5. 根据kind的k8s配置文件,创建k8s集群

# config-file.yaml是上一步创建的配置文件
kind create cluster --config config-file.yaml

#如果要更改k8s配置,要先删除。上面创建时没指定k8s集群的名字默认为kind。这里删除没指定集群名字,默认删除的是kind
kind delete cluster

# 删除时,指定集群名
kind delete cluster --name my-multi-node-cluster

6. 安装ingress

(1)配置文件https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/kind/deploy.yaml

(2)替换国内镜像

将 Controller 镜像
registry.k8s.io/ingress-nginx/controller:v1.11.2 (版本号可能不同)
替换为
registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.11.2

(3)创建的ingress,默认是使用load balance的,要修改成nodeport。可以使用kubuord之类的工具编辑,也可以直接修改deploy.yaml文件

添加图片注释,不超过 140 字(可选)

(4)如果是多节点集群,可能会随机指定一个节点通过nodeport将端口映射到宿主机,但上面的kind的配置,仅主节点(control-plane)配置了宿主机的端口映射,因此这里通过node selector指定ingress-controller部署在主节点上

#由于集群是多节点,只能有一个节点绑定到宿主机。否则会导致端口冲突
kubectl patch -n ingress-nginx deployment/ingress-nginx-controller --type json \
  -p='[{"op": "add", "path": "/spec/template/spec/nodeSelector", "value": {"node-role.kubernetes.io/control-plane": ""}}]'

7. 可以通过访问 localhost,看看配置是否成功。正常会返回404

五、常见问题

  1. 安装ingress controller,镜像下载不下来。可以替换成阿里云的镜像

将 Controller 镜像
registry.k8s.io/ingress-nginx/controller:v1.11.2 (版本号可能不同)
替换为
registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.11.2

2. 多节点k8s集群,部署ingress controller,无法访问

(1)在创建k8s集群时,没有将k8s集群的节点端口映射到宿主机上。需要通过extraPortMappings指定端口映射到宿主机上

(2)ingress controller是service是load balance类型,要指定为nodeport类型

(3)ingress controller的deployment可能随机分布在k8s的节点上,要通过node selector指定节点(这个节点在k8s集群创建时通过extraPortMappings指定映射)

3. 部署时,下载镜像下载不了

(1)方法1:手工将镜像导入k8s集群

kind load-images aaa:v1

(2)方法2:集群

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
containerdConfigPatches:
- |-
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
    endpoint = ["https://docker.1ms.run"]

六、云上搭建kind集群建议

  1. 如果仅想学习k8s,建议直接购买阿里云轻量级服务器即可,2核2G 68元/年;

  2. 如果既想搭建k8s环境,也想在k8s上部署一些服务,那建议购买京东云,4核16G 658/年

云小站_专享特惠_云产品推荐-阿里云https://www.aliyun.com/minisite/goods?userCode=nz4rlhu7

 

京东云https://3.cn/2mL-pxpE

添加图片注释,不超过 140 字(可选)

更多推荐