前戏
小白:你好,老花!我对在 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
部署高可用分片集群,敬请关注~