这次弄下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
View Code

上面是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"
View Code

 这里改用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-----

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
=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, 查看所有版本,选择一个进行安装。

posted @ 2023-11-07 13:44  calochCN  阅读(57)  评论(1编辑  收藏  举报