Kubernetes(K8s)集群安装

参考资料:https://cloud.tencent.com/developer/article/2347138

1禁用Ubuntu Swap

sudo gedit /etc/fstab

image.png

ubuntu24.04这个swapfile配置文件略有调整
image

2 Ubuntu安装网桥工具

sudo apt-get install bridge-utils -y

image.png

3添加k8sAPT源

新版命令

# 1. 安装必要工具
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl gpg

# 2. 创建 keyring 目录
sudo mkdir -p /etc/apt/keyrings

# 3. 下载官方 GPG 密钥
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# 4. 添加 APT 源(官方地址,支持 noble)
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list

# 5. 更新并安装
sudo apt update
sudo apt install -y kubelet kubeadm kubectl

# 6. 锁定版本(防止意外升级)
sudo apt-mark hold kubelet kubeadm kubectl

旧版命令

下面这个是旧版的命令,在Ubuntu24.04里已经不支持了。权且保留以作参考。

sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - 
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

sudo curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
sudo add-apt-repository "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main"

4配置containerd

旧版命令

这里需要安装containerd,但是我在docker安装的时候已经装好了,相关命令为

sudo apt-get install containerd.io

(1)Containerd安装完成后,其自带的配置文件/etc/containerd/config.toml中的内容,需要用打印出的containerd默认配置替换。
(2)Containerd的Cgroup设为systemd,以和k8s默认的Cgroup保持一致。
(3)pause镜像路径改为国内源registry.aliyuncs.com/google_containers/pause:3.9。

sudo cp /etc/containerd/config.toml /etc/containerd/config.toml.ori

sudo chmod 777 /etc/containerd/config.toml

sudo containerd config default > /etc/containerd/config.toml

image.png

sudo gedit /etc/containerd/config.toml

image.png
image.png

使用Ubuntu官方仓库的container(Ubuntu官方仓库叫containerd,不叫containerd.io)。安装命令如下:

sudo apt install containerd
# 配置containrd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

编辑 /etc/containerd/config.toml,找到以下行:
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options],修改SystemdCgroup = true

配置后,重启containerd服务,并保证containerd状态正确

sudo systemctl restart containerd.service
sudo systemctl status containerd.service

图片.png

新版命令

使用Ubuntu官方仓库的container(Ubuntu官方仓库叫containerd,不叫containerd.io,containerd.io是docder仓库的包)。安装命令如下:

sudo apt install containerd
# 配置containrd
sudo mkdir -p /etc/containerd
# 创建/etc/containerd/config.yaml,修改镜像源和cgroup
sudo tee /etc/containerd/config.toml << 'EOF'
version = 2

[plugins."io.containerd.grpc.v1.cri"]
  sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
    runtime_type = "io.containerd.runc.v2"
    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
      SystemdCgroup = true
  [plugins."io.containerd.grpc.v1.cri".registry]
    config_path = "/etc/containerd/certs.d"
EOF

创建/etc/containerd/certs.d目录,在这个目录填入docker.io和registry.k8s.io的镜像源。新版本的k8s在config.yaml改会有冲突问题,不能生效。

注意:k8s里修改镜像源之后,使用kubectl describe pod <pod_name> 查看时还是显示的docker.ioregistry.k8s.io。配置镜像源只物理修改从哪里修改,不改镜像拉取的逻辑源。所以改好镜像源之后也不太好验证成功,随便拉个镜像sudo crictl pull nginx:1.14.2,能拉下来就是成了。

# Docker Hub 加速
sudo mkdir -p /etc/containerd/certs.d/docker.io
sudo tee /etc/containerd/certs.d/docker.io/hosts.toml << 'EOF'
server = "https://registry-1.docker.io"

[host."https://docker.m.daocloud.io"]
  capabilities = ["pull", "resolve"]
EOF

# K8s 镜像加速
sudo mkdir -p /etc/containerd/certs.d/registry.k8s.io
sudo tee /etc/containerd/certs.d/registry.k8s.io/hosts.toml << 'EOF'
server = "https://registry.k8s.io"

[host."https://registry.aliyuncs.com/google_containers"]
  capabilities = ["pull", "resolve"]
  override_path = true
EOF

重启containerd

sudo systemctl restart containerd
sudo systemctl status containerd

5 安装Kubernetes

安装k8s软件,这里会默认下载最新的kubernetes(阿里云镜像源上的),后面指定版本时需要根据自己的版本进行修改。这里也可以手动指定kubernetes版本。

sudo apt install kubelet kubeadm kubectl

图片.png
此时k8s没有启动成功是正常的,因为kubelet服务成功启动的先决条件,需要kubelet的配置文件,所在目录/var/lib/kubelet还没有建立。

6 k8s配置单机节点

查看k8s版本

kubeadm config images list

图片.png
将kubernetes的控制面的几个镜像拉到本地,为了保证镜像和安装的k8s软件版本严格一致,这里的镜像拉取时,显性指定版本。

sudo kubeadm config images pull --kubernetes-version v1.28.10 --image-repository registry.aliyuncs.com/google_containers

图片.png
kubernetes初始化
图片.png

sudo kubeadm init --control-plane-endpoint=192.168.146.111 --kubernetes-version v1.28.10 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers

图片.png
初始化成功如下图
图片.png

7克隆虚拟机作为从节点

关闭虚拟机,克隆虚拟机作为从节点。
右键虚拟机,克隆虚拟机。选择当前状态,创建完整克隆,完成克隆。
克隆完成后修改从节点的hosts、hostname和ip。
为了便于管理,修改主节点的hosts为k8s1,从节点分别取名k8s2和k8s3。对应ip指定为192.168.146.112和192.168.146.113。(这里的ip和host要根据自己的情况进行修改,主节点的名字也可以通过修改hotsname来改变)
图片.png
图片.png
创建hosts映射。
图片.png

8配置Kubernetes集群

在主节点上跟着初始化成功后的提示继续后续工作

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

图片.png
查看集群状态

kubectl cluster-info
kubectl get nodes

图片.png
在k8s1上创建永久token

kubeadm token create --print-join-command

图片.png
如果在克隆虚拟机作为从节点之前就已经跟着k8s提示完成了上面几步,那么在从节点上执行提示的join命令,会遇见报错。
图片.png
原因:拷贝虚拟机时已完成k8s集群配置文件创建,应该在初始化后,配置文件创建前进行克隆。
解决办法:在虚拟机重置节点后加入集群。这个重置节点的命令也可以在后续k8s出现问题时恢复默认设置重做时使用。

sudo rm -rf /etc/kubernetes/kubelet.conf /etc/kubernetes/pki/ca.crt
sudo kubeadm reset

图片.png
重新加入集群(join命令为主节点创建永久token时回显的命令)
图片.png
在k8s3上进行相同步骤。
在k8s1上查看集群节点,集群搭建成功。
图片.png
细心的读者可能发现了我的1号机之前交VirtualClass,但是现在却叫k8s1,这是因为我在1号机初始化之前没有修改一号机的名字,导致集群建立后节点名字如下,但是这个看着不太舒服,我就把三台机都使用上面的重置命令重置后再重做了一遍上述步骤。
图片.png

9配置Kubernetes网络插件Calico

curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O
kubectl apply -f calico.yaml

成功截图如下(我这里因为网络问题没有成功,姑且偷一张图),如果失败可以使用另外一种手动方法如下(我的办法)。
图片.png
手动解决办法:
打开链接(可能需要借助某些上网工具)
https://projectcalico.docs.tigera.io/manifests/calico.yaml
全选复制,粘贴到~/calico.yaml
重新执行

kubectl apply -f calico.yaml

图片.png
成功截图,这里要看见所有的pod状态都为Running才是成功,如果是ContainerCreating则表明正在制作容器,需要稍等一会(可能会很慢,但也不会超过十分钟)。如果过了很久还没Running,可以通过kubectl describe pods <pod-name> -n kube-system 查看pod进度。 -n的意思是指定命名空间(namespace),默认的pod命名空间是default,所以使用kubectl get pods会得到defalut下的pods。

kubectl get pods -n kube-system
kubectl get nodes

图片.png
k8s命名空间查看,更多命令及参数可以通过kubectl --help查看

kubectl get namespace

图片.png
如果应用calico.yaml后查看状态如下,pod的镜像一直拉取不下来(ImagePullBackOff)。查看pod情况,发现镜像用的是docker.io的,calico镜像拉不下来。解决办法就是自己手动拉取(用docker/nerdctl/ 拉下来,保存成tar包,再应用到k8s上)。没装docker建议用nerdctl,nerdctl是 containerd的官方CLI工具,功能和docker命令几乎一样,但它是为containerd设计的。

rust@k8s1:~$ kubectl get pods -n kube-system
NAME                                       READY   STATUS                  RESTARTS       AGE
calico-kube-controllers-5b9b456c66-j54xc   0/1     Pending                 0              4m43s
calico-node-4h4kb                          0/1     Init:ImagePullBackOff   0              2m56s
calico-node-l7mrg                          0/1     Init:ImagePullBackOff   0              2m56s
calico-node-psvnr                          0/1     Init:ImagePullBackOff   0              2m56s
coredns-6d58d46f65-4gfzx                   0/1     Pending                 0              129m
coredns-6d58d46f65-hsl2c                   0/1     Pending                 0              129m
etcd-k8s1                                  1/1     Running                 3 (120m ago)   129m
kube-apiserver-k8s1                        1/1     Running                 3 (120m ago)   129m
kube-controller-manager-k8s1               1/1     Running                 3 (120m ago)   129m
kube-proxy-hd4sr                           1/1     Running                 2 (120m ago)   129m
kube-proxy-hpcdx                           1/1     Running                 0              108m
kube-proxy-trwf6                           1/1     Running                 0              108m
kube-scheduler-k8s1                        1/1     Running                 3 (120m ago)   129m
rust@k8s1:~$ kubectl describe pod -n kube-system calico-node-4h4kb
# 拉取镜像
docker pull calico/cni:v3.25.0
docker pull calico/node:v3.25.0
docker pull calico/kube-controllers:v3.25.0
docker pull calico/pod2daemon-flexvol:v3.25.0

# 打包成 tar
docker save \
  calico/cni:v3.25.0 \
  calico/node:v3.25.0 \
  calico/kube-controllers:v3.25.0 \
  calico/pod2daemon-flexvol:v3.25.0 \
  -o calico-v3.25.0-images.tar

# 在每个k8s节点上应用calico镜像,ctr是containerd原生命令
sudo ctr -n k8s.io images import calico-v3.25.0-images.tar

# 删除旧pod,触发重建
kubectl delete pod -n kube-system -l k8s-app=calico-node
kubectl delete pod -n kube-system -l app=calico-kube-controllers
posted @ 2024-06-02 10:27  rusthx  阅读(81)  评论(0)    收藏  举报