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.jianshu.com/p/44c4c0fe7fc7: