这次弄下k8s 分布式多机测试,这次专门多创建了几个机器进行安装,实时监控机器状态
k8s 实机分布式测试,这次弄一下这个,上次弄的是单机版本的minikube, 在单机上minikube替代了kubectl的工作,在单机上可以创建多个布署等,实际使用会有多个系统,分布式才是正常生产时发按它效率的时间。
k8s说明上要求机器要有2g内存,这里我创建了四个vm, 每个4g内存,这样可以更清晰地运行k8s,为了节省时间和安装,每个机器都安装ubuntu 22 stable, 采用basic的安装,不安装多余的工具组件。
这里采用nat(网络地址转换)的方式组vm网络,这种方式和host-only的区别仅是从机能够上网,但对外显示依旧只有主机,没有采用bridge桥接的方式暴露在外网。
在k8s里面要分清pod和node的概念,pod指的是一个布署,一般一个布署会包含多个服务,负载均衡器,选择器等, 而node一般指物理机器加入到k8s的master主机创建的集群里。
继续之前,先吃好饭,这个东西因为可能会很漫长,所以蛮费力气的,不然的话饿了,许多东西记性可能就不太好了,不过做笔记,常言说,好记性不如烂笔头,笔记可以跟随进度当一个备份,备后来查看。
23-11-8
我在上次写的时候使用的是wsl安装的minikube进行单机测试,这次要安装了,两个都要安装ubuntu上面,所以就打开vm, 因为两个vm都是全新基本安装,没有多余的工具,这里需要安装cri, 就是container runtime interface容器运行时接口。
先删除所有旧的docker 相关的安装:
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
如果之前有安装,可能还要手动删除docker残留文件:
sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd
docker-engine有几种安装方式,这里直接用安装docker的apt高级包工具进行安装:

# Add Docker's official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg # Add the repository to Apt sources: echo \ "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update
上面是apt 仓库源,下面安装docker:
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
验证docker已经被成功安装:
sudo docker run hello-world
小结:
上面写的是全新的docker相关安装, 进行了docker的删除,docker apt repo的安装, 还有docker的全新安装,验证了docker的成功安装。
docker的升级:
会有相关的升级。简单的安装步骤: www.getdocker.com 是一个在已经写好的在线安装脚本,直接可用。
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh ./get-docker.sh --dry-run
这里需要着重说明一下,k8s 提供了几种集成容器运行时的方式,不过第一个是containerd,这是一个容器运行时,但却不是docker, docker官方的容器编排系统是docker-swarm,这是它的系统,不过因为常用docker,这里就要安装一个docker到k8s的适配器 crim,它的socket路径在 /run/cri-dockerd.sock, 要记得linux下所有都是文件,socket也是。 在按上面安装好docker之后,里面也安装了containerd.io,因为cri-dockered在github上,无法连接到,它似乎是一个商业化的版本,这里就forgo它;还有一种是cri-o, 这个也是一个容器运行时,它的配置是最简单的; containerd的安装也在github上有文档,有它自己的安装方法,不过里面有说明在docker-engine的安装里面就提供了containerd.io它的安装,它是由docker官方提供的,这里既然安装了docker就用这个了,这就是apt的方式安装containerd,因为这种最简便,就先用这个继续,但是这个安装里面不包括 containerd里的cni plugin插件, 默认socket位置在 /run/containerd/containerd.sock, containerd的基本命令:
https://github.com/containerd/containerd/blob/main/docs/getting-started.md
ctr images pull docker.io/library/redis:alpine
ctr run docker.io/library/redis:alpine redis
这里配置要用linux的cgroup,是contstraint group,指组限制。systemd是linux下的system daemon 守护精灵。
这里首先去 /etc/containerd/config.toml, 在disable plugin列表里面去掉ctl, 要还原config.toml的配置可以使用如下命令:
containerd config default > /etc/containerd/config.toml
这里先执行上面的还原一下,因为docker 的deb包安装带的config.toml里面的内容缺少很多, 没有配置的节,还原好后,在配置的时候要使用runc这个工具运行,runc是linux上生成运行容器的一个命令行接口,这里要在config.toml配置找到下面节点并设置成下面的true选项来使用linux的systemd:
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] ... [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] SystemdCgroup = true
然后重启containerd 服务. 然后需要手动设置 linux的control group 即cgroup, https://v1-27.docs.kubernetes.io/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/#configuring-the-kubelet-cgroup-driver
这里就设置好了使用containerd 来作为container runtime了,重写sandbox 沙盒镜像: 找到里面的
[plugins."io.containerd.grpc.v1.cri"] sandbox_image = "registry.k8s.io/pause:3.2"
k8s的网络模型:
https://v1-27.docs.kubernetes.io/docs/concepts/services-networking/
实际安装k8s:
https://v1-27.docs.kubernetes.io/docs/tasks/
这里直接安装配套工具:
sudo apt-get update # apt-transport-https may be a dummy package; if so, you can skip that package sudo apt-get install -y apt-transport-https ca-certificates curl curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.27/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg # This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.27/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl
配置控制组cgroup驱动,手动创建如下yaml文件,版本改为对应已安装的,初始化配置,https://v1-27.docs.kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/ , 可以配置使用私有的image registry,
kubeadm 的使用:https://v1-27.docs.kubernetes.io/docs/reference/setup-tools/kubeadm/ :
# kubeadm-config.yaml kind: ClusterConfiguration apiVersion: kubeadm.k8s.io/v1beta3 kubernetesVersion: v1.21.0 --- kind: KubeletConfiguration apiVersion: kubelet.config.k8s.io/v1beta1 cgroupDriver: systemd
kubeadm init --config kubeadm-config.yaml
创建集群:
不过似乎又被墙了: sudo kubeadm config images pull, 这样没办法了么

sudo kubeadm config images pull I1108 10:55:18.280924 10788 version.go:256] remote version is much newer: v1.28.3; falling back to: stable-1.27 failed to pull image "registry.k8s.io/kube-apiserver:v1.27.7": output: E1108 10:57:10.525653 10814 remote_image.go:167] "PullImage from image service failed" err="rpc error: code = Unknown desc = failed to pull and unpack image \"registry.k8s.io/kube-apiserver:v1.27.7\": failed to resolve reference \"registry.k8s.io/kube-apiserver:v1.27.7\": failed to do request: Head \"https://us-west2-docker.pkg.dev/v2/k8s-artifacts-prod/images/kube-apiserver/manifests/v1.27.7\": dial tcp 64.233.188.82:443: connect: connection refused" image="registry.k8s.io/kube-apiserver:v1.27.7" time="2023-11-08T10:57:10+08:00" level=fatal msg="pulling image: rpc error: code = Unknown desc = failed to pull and unpack image \"registry.k8s.io/kube-apiserver:v1.27.7\": failed to resolve reference \"registry.k8s.io/kube-apiserver:v1.27.7\": failed to do request: Head \"https://us-west2-docker.pkg.dev/v2/k8s-artifacts-prod/images/kube-apiserver/manifests/v1.27.7\": dial tcp 64.233.188.82:443: connect: connection refused"
这里改用ali云的, ref: https://www.dandelioncloud.cn/article/details/1518251960347222017, 配置源 https://www.bilibili.com/read/cv26369270/,最终成功安装,使用b站一位b人的:
1. 安装 kubelet, kubeadm, kubectl 1.1 首先导入 gpg key 如果不存在文件夹 /etc/apt/keyrings 就手动创建 sudo apt-get install -y apt-transport-https ca-certificates curl curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg 如果文件下载不下来就用这个办法 cat << EOF > ~/kubernetes-archive-keyring.gpg -----BEGIN PGP PUBLIC KEY BLOCK----- mQENBGKItdQBCADWmKTNZEYWgXy73FvKFY5fRro4tGNa4Be4TZW3wZpct9Cj8Ejy kU7S9EPoJ3EdKpxFltHRu7QbDi6LWSNA4XxwnudQrYGxnxx6Ru1KBHFxHhLfWsvF cGMwit/znpxtIt9UzqCm2YTEW5NUnzQ4rXYqVQK2FLG4weYJ5bKwkY+ZsnRJpzxd HGJ0pBiqwkMT8bfQdJymUBown+SeuQ2HEqfjVMsIRe0dweD2PHWeWo9fTXsz1Q5a biGckyOVyoN9//DgSvLUocUcZsrWvYPaN+o8lXTO3GYFGNVsx069rxarkeCjOpiQ OWrQmywXISQudcusSgmmgfsRZYW7FDBy5MQrABEBAAG0UVJhcHR1cmUgQXV0b21h dGljIFNpZ25pbmcgS2V5IChjbG91ZC1yYXB0dXJlLXNpZ25pbmcta2V5LTIwMjIt MDMtMDctMDhfMDFfMDEucHViKYkBIgQTAQgAFgUCYoi11AkQtT3IDRPt7wUCGwMC GQEAAMGoB/98QBNIIN3Q2D3aahrfkb6axd55zOwR0tnriuJRoPHoNuorOpCv9aWM MvQACNWkxsvJxEF8OUbzhSYjAR534RDigjTetjK2i2wKLz/kJjZbuF4ZXMynCm40 eVm1XZqU63U9XR2RxmXppyNpMqQO9LrzGEnNJuh23icaZY6no12axymxcle/+SCm da8oDAfa0iyA2iyg/eU05buZv54MC6RB13QtS+8vOrKDGr7RYp/VYvQzYWm+ck6D vlaVX6VB51BkLl23SQknyZIJBVPm8ttU65EyrrgG1jLLHFXDUqJ/RpNKq+PCzWiy t4uy3AfXK89RczLu3uxiD0CQI0T31u/IuQENBGKItdQBCADIMMJdRcg0Phv7+CrZ z3xRE8Fbz8AN+YCLigQeH0B9lijxkjAFr+thB0IrOu7ruwNY+mvdP6dAewUur+pJ aIjEe+4s8JBEFb4BxJfBBPuEbGSxbi4OPEJuwT53TMJMEs7+gIxCCmwioTggTBp6 JzDsT/cdBeyWCusCQwDWpqoYCoUWJLrUQ6dOlI7s6p+iIUNIamtyBCwb4izs27Hd EpX8gvO9rEdtcb7399HyO3oD4gHgcuFiuZTpvWHdn9WYwPGM6npJNG7crtLnctTR 0cP9KutSPNzpySeAniHx8L9ebdD9tNPCWC+OtOcGRrcBeEznkYh1C4kzdP1ORm5u pnknABEBAAGJAR8EGAEIABMFAmKItdQJELU9yA0T7e8FAhsMAABJmAgAhRPk/dFj 71bU/UTXrkEkZZzE9JzUgan/ttyRrV6QbFZABByf4pYjBj+yLKw3280//JWurKox 2uzEq1hdXPedRHICRuh1Fjd00otaQ+wGF3kY74zlWivB6Wp6tnL9STQ1oVYBUv7H hSHoJ5shELyedxxHxurUgFAD+pbFXIiK8cnAHfXTJMcrmPpC+YWEC/DeqIyEcNPk zRhtRSuERXcq1n+KJvMUAKMD/tezwvujzBaaSWapmdnGmtRjjL7IxUeGamVWOwLQ bUr+34MwzdeJdcL8fav5LA8Uk0ulyeXdwiAK8FKQsixI+xZvz7HUs8ln4pZwGw/T pvO9cMkHogtgzZkBDQRgkbezAQgA5GCRx0EKC+rSq1vy25n0fZY8+4m9mlp6OCTt 1SkLy8I8lDD6av0l1zDp8fI18IFos6T8UGA0SdEkF0vVCydYV0S/zoDJ2QGL2A3l dowZyrACBHYhv3tapvD+FvaqViXPoTauxTk9d0cxlkcee0nS1kl6NCnmN/K/Zb44 zpk/3LjnJo8JQ0/V2H/0UjvsifwLMjHQK/mWw3kFHfR2CYj3SNOJRmhjNNjIwzJ8 fpqJ3PsueLfmfq8tVrUHc6ELfXR5SD5VdbUfsVeQxx7HowmcbvU1s80pS+cHwQXh M+0fziM4rxiaVkHSc3ftkA10kYPatl2Fj+WVbUoI1VSYzZW+mQARAQABtFRBcnRp ZmFjdCBSZWdpc3RyeSBSZXBvc2l0b3J5IFNpZ25lciA8YXJ0aWZhY3QtcmVnaXN0 cnktcmVwb3NpdG9yeS1zaWduZXJAZ29vZ2xlLmNvbT6JAU4EEwEKADgWIQQ1uqCz Pp6zlvWcqDjAulzm3GMVowUCYJG3swIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIX gAAKCRDAulzm3GMVo/ooCADBYeg6wGDHqvbG2dWRuqADK4p1IXhkGxKnu+pyA0Db GZ4Q8GdsFqoFQuw4DjKpYUJjps5uzOjc5qtnbz8Kt8QtjniPX0Ms40+9nXgU8yz+ zyaJPTyRTjHS3yC0rFJ5jLIXkLeA1DtI2AF9ilLljiF1yWmd9fUMqETQT2Guas+6 l0u8ByzmPPSA6nx7egLnfBEec4cjsocrXGDHmhgtYNSClpoHsJ4RKtNhWp7TCRpZ phYtngNBDw9Nhgt++NkBqkcS8I1rJuf06crlNuBGCkRgkZu0HVSKN7oBUnrSq59G 8jsVhgb7buHx/F1r2ZEU/rvssx9bOchWAanNiU66yb0V =UL8X -----END PGP PUBLIC KEY BLOCK----- EOF cat ~/kubernetes-archive-keyring.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg 1.2 新建文件 /etc/apt/sources.list.d/kubernetes.list, 这里用的是清华镜像源,改用其他国内镜像源也没有问题 deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/kubernetes/apt kubernetes-xenial main 1.3 更新索引,查看支持的 Kubernetes 版本 sudo apt-get update apt-cache madison kubeadm 1.4 安装对应版本的工具,这里选择的是 1.23.17 sudo apt-get install -y kubelet=1.23.17-00 kubeadm=1.23.17-00 kubectl=1.23.17-00 1.5 锁定版本 sudo apt-mark hold kubelet kubeadm kubectl 2. 拉取所需的镜像 国内无法访问谷歌的镜像仓库,所以使用阿里云提供的镜像 #!/bin/bash ALIYUN_GOOGLE_REPO=registry.aliyuncs.com/google_containers echo 'Pulling kubernetes images...' kubeadm config images pull --image-repository "${ALIYUN_GOOGLE_REPO}" for image in $(kubeadm config images list) ; do imageInfo=(${image//\// }) kubeRepo=${imageInfo[0]} commonImageName=${imageInfo[-1]} aliyunImageName=$(docker images --format '{{ .Repository }}:{{ .Tag }}' | grep "$commonImageName") if [ -z "$aliyunImageName" ]; then echo "error: Aliyun image not found: $commonImageName" continue fi echo "tag $aliyunImageName to $image" docker tag $aliyunImageName $image echo "remove $aliyunImageName" docker rmi $aliyunImageName done 3. 安装 Kubernetes sudo kubeadm init 4. 其他问题 4.1 如果 kubectl 使用的时候有 Unable to connect to the server 等类似的问题,可能是配置文件没有拷贝 mkdir -p $HOME/.kube sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
上面安装不成功似乎是阿里云的repo里面太新的版本好像没有,这里全部使用1.23.17版本,再次运行再次出错, 提示docker的版本又不对了,需要20.10,本机安装的版本是24.0.7,果然这个东西一下要一全套,很繁琐。
然后卸载所有k8s相关, mark-hold是指让这个包不会随apt更新! 这里卸载掉 kubeadm kubectl kubelete这三个,然后删掉所有docker镜像 docker rmi -f $(docker images -q), -q是安静选项,只显示id, 然后更换版本安装。
sudo apt search kubeadm -a, 查看所有版本,选择一个进行安装。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示