前戏

小白:你好,老花!我对在 Kubernetes 上使用 Helm 部署 MongoDB Sharded 集群很感兴趣,但我对 Kind 和 Helm 不太熟悉,你能详细教我一下吗?

老花:当然可以,小白!我们先从 Kind 和 Helm 的安装开始,然后详细介绍 Helm 中的每个角色配置,最后解释 Helm 应用是如何运行起来的。

Kind 快速构建集群

Kind 是一个使用 Docker 容器作为节点来运行本地 Kubernetes 集群的工具。可以通过以下步骤安装 Kind:

安装 Docker

Kind 需要 Docker 来运行 Kubernetes 集群,所以首先确保你已经安装了 Docker。

安装 Kind

可以使用以下两种方式中一种下载:

> sudo apt-get install kind
> go install sigs.k8s.io/kind@v0.25.0

Tip: 如果镜像无法拉取, 可以配置一些国内源:

cat /etc/docker/daemon.json
{
    "registry-mirrors": [
        "https://docker.m.daocloud.io",
        "https://dockerproxy.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://docker.nju.edu.cn"
    ]
}

或者使用代理:

{
	"proxies": {
		"default": {
			"httpProxy": "http://xxxx:xx",
			"httpsProxy": "https://xxxx:xx",
			"noProxy": "docker.m.daocloud.io,127.0.0.0/8"
		}
	}
}

创建Kind集群:

配置docker和环境

下面的命令修改了docker运行时, 并配置了ulimits上限:

> cat /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://registry.cn-hangzhou.aliyuncs.com",
    "https://dockerhub.icu",
    "https://docker.chenby.cn",
    "https://docker.1panel.live",
    "https://docker.awsl9527.cn",
    "https://docker.anyhub.us.kg",
    "https://dhub.kubesre.xyz",
    "https://docker.13140521.xyz"
  ],
  "exec-opts": [
    "native.cgroupdriver=systemd"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "default-ulimits": {
    "nofile": {
      "name": "nofile",
      "hard": 65536,
      "soft": 65536
    }
  }
}

> systemctl daemon-reload && systemctl restart docker

查看 cgroup 是否生效:

> docker info |grep -i cgroup
Cgroup Driver: systemd
Cgroup Version: 1

执行swapoff:

swapoff -a

开启转发:

sudo sysctl -w net.ipv6.conf.all.forwarding=1
sudo sysctl -w net.ipv4.ip_forward=1

开启cgroup v2(高版本推荐):

sudo nano /etc/default/grub
GRUB_CMDLINE_LINUX="quiet splash systemd.unified_cgroup_hierarchy=1"
sudo update-grub
sudo reboot

正常模式

cat cluster.yaml

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 31000  # 将主机 31000 端口映射到容器的 31000 端口
    hostPort: 31000
    listenAddress: "0.0.0.0" # Optional, defaults to "0.0.0.0"
    protocol: tcp # Optional, defaults to tcp
- role: worker
kind create cluster --config cluster.yaml --name mongodb-sharded

国内模式

参考博客:

cat cluster.yaml

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 31000  # 将主机 31000 端口映射到容器的 31000 端口
    hostPort: 31000
    listenAddress: "0.0.0.0" # Optional, defaults to "0.0.0.0"
    protocol: tcp # Optional, defaults to tcp
- role: worker
kubeadmConfigPatches:
- |
  apiVersion: kubeadm.k8s.io/v1beta3
  kind: ClusterConfiguration
  metadata:
    name: config
  networking:
    serviceSubnet: 10.0.0.0/16
  imageRepository: registry.aliyuncs.com/google_containers
  nodeRegistration:
    kubeletExtraArgs:
      pod-infra-container-image: registry.aliyuncs.com/google_containers/pause:3.1
- |
  apiVersion: kubeadm.k8s.io/v1beta3
  kind: InitConfiguration
  metadata:
    name: config
  networking:
    serviceSubnet: 10.0.0.0/16
  imageRepository: registry.aliyuncs.com/google_containers

成功创建集群

其他配置: 参考官方文档

> kind create cluster --config cluster.yaml --name mongodb-sharded --image kindest/node:v1.25.3
Creating cluster "mongodb-sharded" ...
 ✓ Ensuring node image (kindest/node:v1.25.3) 🖼
 ✓ Preparing nodes 📦 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
 ✓ Joining worker nodes 🚜
Set kubectl context to "kind-mongodb-sharded"
You can now use your cluster with:

kubectl cluster-info --context kind-mongodb-sharded

Have a nice day! 👋

> kubectl get po -n kube-system
NAME                                                    READY   STATUS    RESTARTS      AGE
coredns-c676cc86f-4fz5s                                 1/1     Running   1 (58m ago)   71m
coredns-c676cc86f-gh6bc                                 1/1     Running   1 (58m ago)   71m
etcd-mongodb-sharded-control-plane                      1/1     Running   0             58m
kindnet-l26fb                                           1/1     Running   1 (58m ago)   71m
kindnet-x26gq                                           1/1     Running   1 (58m ago)   71m
kube-apiserver-mongodb-sharded-control-plane            1/1     Running   0             58m
kube-controller-manager-mongodb-sharded-control-plane   1/1     Running   1 (58m ago)   71m
kube-proxy-8nxr2                                        1/1     Running   8 (60m ago)   71m
kube-proxy-9c2km                                        1/1     Running   8 (59m ago)   71m
kube-scheduler-mongodb-sharded-control-plane            1/1     Running   1 (58m ago)   71m

虽然, 我们现在可以看到k8s生态所需要的pod了, 执行docker ps发现这些pod 运行在kind的镜像中, kind其实就是k8s in docker的缩写啦~

> docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS          PORTS                                                 NAMES
d75686260f85   kindest/node:v1.25.3   "/usr/local/bin/entr…"   13 minutes ago   Up 13 minutes                                                         mongodb-sharded-worker3
8627b5cd41f9   kindest/node:v1.25.3   "/usr/local/bin/entr…"   13 minutes ago   Up 13 minutes   0.0.0.0:31000->31000/tcp, 127.0.0.1:38823->6443/tcp   mongodb-sharded-control-plane
b0a00cb36381   kindest/node:v1.25.3   "/usr/local/bin/entr…"   13 minutes ago   Up 13 minutes                                                         mongodb-sharded-worker
aff9e82d00be   kindest/node:v1.25.3   "/usr/local/bin/entr…"   13 minutes ago   Up 13 minutes                                                         mongodb-sharded-worker2

小白: kubectl cluster-info --context kind-mongodb-sharded 这个命令, 又是什么意思?

老花: 这个其实就是kubectl这个客户端利用/root/.kube/config这个默认的kubeconfig来执行集群上下文切换, 方便管理多个集群啦~ 你也可以使用--kubeconfig 来指定其他路径的配置文件进行操作! 其实, 这个配置文件还是挺重要的, 提供了访问远程k8s的方法, 不管是写测试代码还是本地调试, 都需要用到它!

后记

常见Kind命令汇总

  • kind create cluster –config cluster.yaml –name mongodb-sharded –image kindest/node:v1.25.3 # 创建集群
  • kind get clusters # 获取集群
  • kind delete clusters mongodb-sharded # 删除集群
  • kind load docker-image docker.io/bitnami/mongodb-sharded:8.0.3-debian-12-r0 –name mongodb-sharded # 向kind集群中导入镜像
  • kubectl cluster-info –context kind-mongodb-sharded # 切换到kind创建的集群

小白: 经过几个小时的来回折腾, 咱们终于用上Kind创建的集群了~

老花: 测试不易,求关注~ 下篇我们将使用helm部署高可用分片集群,敬请关注~