赞
踩
Kubernetes1.29 集群部署文档记录,使用VMware虚拟机部署。
系统:Ubuntu22.04.5 LTS
Kubernetes:v1.29.2
Container Runtime:Docker CE 25.0.3 和 cri-dockerd v0.3.10
主机名 | IP |
---|---|
master01 | 192.168.48.50 |
node01 | 192.168.48.51 |
node02 | 192.168.48.52 |
node03 | 192.168.48.53 |
部署系统要求:
apt install chrony -y
systemctl enable --now chrony
systemctl stop ufw
systemctl disable ufw
192.168.48.50 master01.cc.io master01 kubeapi.cc.io kubeapi
192.168.48.51 node01.cc.io node01
192.168.48.52 node02.cc.io node02
192.168.48.53 node03.cc.io node03
# 关闭当前已启用的所有Swap设备
swapoff -a
# 而后编辑/etc/fstab配置文件,注释用于挂载Swap设备的所有行。
# 在Ubuntu 2004及之后版本的系统上,若要彻底禁用Swap,可以需要类似如下命令进一步完成
systemctl --type swap
# 而后,将上面命令列出的每个设备,使用systemctl mask命令加以禁用。
systemctl mask SWAP_DEV
如果需要在节点上使用Swap设备,也可选择让kubeam忽略Swap设备的相关设定。
我们编辑kubelet的配置文件/etc/default/kubelet
,设置其忽略Swap启用的状态错误即可,文件内容如下:
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
$ systemctl stop iptables
$ systemctl disable iptables
$ apt update -y $ apt -y install apt-transport-https ca-certificates curl software-properties-common $ curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add - $ add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" $ apt update -y $ apt install -y docker-ce $ systemctl enable --now docker # 配置 docker 容器引擎为 systemd ,镜像加速等 $ vim /etc/docker/daemon.json { "registry-mirrors": [ "https://registry.docker-cn.com" ], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "200m" }, "storage-driver": "overlay2" } # 启动服务 $ systemctl daemon-reload $ systemctl start docker.service $ systemctl enable docker.service
# 下载安装1 推荐,这个安装后就会自动启动,也不用配置下面的启动服务了
$ curl -LO https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.10/cri-dockerd_0.3.10.3-0.ubuntu-jammy_amd64.deb
$ apt install ./cri-dockerd_0.3.10.3-0.ubuntu-jammy_amd64.deb -y
# 下载安装2
$ wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.10/cri-dockerd-0.3.10.amd64.tgz
$ tar -xf cri-dockerd-0.3.1.amd64.tgz
$ cp cri-dockerd/cri-dockerd /usr/bin/
$ chmod +x /usr/bin/cri-dockerd
# 配置启动服务 $ vim /usr/lib/systemd/system/cri-docker.service [Unit] Description=CRI Interface for Docker Application Container Engine Documentation=https://docs.mirantis.com After=network-online.target firewalld.service docker.service Wants=network-online.target Requires=cri-docker.socket [Service] Type=notify ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-cache-dir=/var/lib/cni/cache --cni-conf-dir=/etc/cni/net.d --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 ExecReload=/bin/kill -s HUP $MAINPID TimeoutSec=0 RestartSec=2 Restart=always StartLimitBurst=3 StartLimitInterval=60s LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TasksMax=infinity Delegate=yes KillMode=process [Install] WantedBy=multi-user.target # 这里的参数 `--pod-infra-container-image`,这个值要根据实际情况调整,如果你的安装环境不能访问互联网,那你就需要配置为内部镜像仓库。 # 创建一个 socket 文件以便 kubelet 与 cri-dockerd 通信 $ cat <<"EOF" > /usr/lib/systemd/system/cri-docker.socket [Unit] Description=CRI Docker Socket for the API PartOf=cri-docker.service [Socket] ListenStream=%t/cri-dockerd.sock SocketMode=0660 SocketUser=root SocketGroup=docker [Install] WantedBy=sockets.target EOF # 启动 cri-docker $ systemctl daemon-reload ; systemctl enable --now cri-docker
对于cri-dockerd ExecStart 服务参数说明:
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF sudo modprobe overlay sudo modprobe br_netfilter # 设置所需的 sysctl 参数,参数在重新启动后保持不变 cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF # 应用 sysctl 参数而不重新启动 sudo sysctl --system # 通过运行以下指令确认 br_netfilter 和 overlay 模块被加载: $ lsmod | grep br_netfilter $ lsmod | grep overlay # 通过运行以下指令确认 net.bridge.bridge-nf-call-iptables、net.bridge.bridge-nf-call-ip6tables 和 net.ipv4.ip_forward 系统变量在你的 sysctl 配置中被设置为 1 $ sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
$ apt-get update && apt-get install -y apt-transport-https
$ curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
$ echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list
$ apt-get update -y
$ apt-get install -y kubelet kubeadm kubectl
安装完成后,确定kubeadm等程序文件的版本
$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"29", GitVersion:"v1.29.2", GitCommit:"4b8e819355d791d96b7e9d9efe4cbafae2311c88", GitTreeState:"clean", BuildDate:"2024-02-14T10:39:04Z", GoVersion:"go1.21.7", Compiler:"gc", Platform:"linux/amd64"}
$ kubectl version
Client Version: v1.29.2
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
The connection to the server localhost:8080 was refused - did you specify the right host or port?
$ kubelet --version
Kubernetes v1.29.2
cat <<"EOF" > /usr/lib/systemd/system/cri-docker.socket [Unit] Description=CRI Docker Socket for the API PartOf=cri-docker.service [Socket] ListenStream=%t/cri-dockerd.sock SocketMode=0660 SocketUser=root SocketGroup=docker [Install] WantedBy=sockets.target EOF # 重启 cri-docker 服务 $ systemctl daemon-reload && systemctl restart cri-docker
$ kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.29.2 \
--control-plane-endpoint kubeapi.cc.io \
--apiserver-advertise-address 192.168.48.50 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr 10.244.0.0/16 \
--token-ttl 0 \
--upload-certs \
--cri-socket /var/run/cri-dockerd.sock
参数说明:
--image-repository registry.aliyuncs.com/google_containers
: 由于服务器在国内,不能直接访问默认的官方镜像 registry.k8s.io ,所以配置为阿里云镜像--control-plane-endpoint
:控制平面的固定访问端点,可以是IP地址或DNS名称,会被用于集群管理员及集群组件的kubeconfig配置文件的API Server的访问地址;单控制平面部署时可以不使用该选项;--apiserver-advertise-address 192.168.48.50
:apiserver通告给其他组件的IP地址,一般应该为Master节点的用于集群内部通信的IP地址,0.0.0.0表示节点上所有可用地址;--pod-network-cidr 10.244.0.0/16
:Pod网络的地址范围,其值为CIDR格式的网络地址,通常,Flannel网络插件的默认为10.244.0.0/16,Project Calico插件的默认值为192.168.0.0/16,而Cilium的默认值为10.0.0.0/8;--service-cidr=10.96.0.0/12
:Service的网络地址范围,其值为CIDR格式的网络地址,kubeadm使用的默认为10.96.0.0/12;通常,仅在使用Flannel一类的网络插件需要手动指定该地址;--token-ttl 0
:共享令牌(token)的过期时长,默认为24小时,0表示永不过期;为防止不安全存储等原因导致的令牌泄露危及集群安全,建议为其设定过期时长。未设定该选项时,在token过期后,若期望再向集群中加入其它节点,可以使用如下命令重新创建token,并生成节点加入命令。$ kubeadm token create --print-join-command
--cri-socket /var/run/cri-dockerd.sock
:使用前面创建的 socket 文件通信如果各个节点没有禁用 Swap设备,还需要附加选项“–ignore-preflight-errors=Swap”,从而让kubeadm忽略该错误设定;
将上述信息保存下来,一会儿加入节点的时候会用到上面的token
根据上面提示进行操作:
配置Kubernetes的配置文件
$ mkdir -p $HOME/.kube
$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ chown $(id -u):$(id -g) $HOME/.kube/config
查看节点:
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 NotReady control-plane 6m52s v1.29.2
部署网络插件 flannel
$ kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
等一分钟节点状态就正常了
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 Ready control-plane 10m v1.29.2
用初始化节点成功回显的token加入集群
kubeadm join kubeapi.cc.io:6443 \
--cri-socket /var/run/cri-dockerd.sock \
--token x7s833.x2iixqpa7r78lf39 \
--discovery-token-ca-cert-hash sha256:6be14a3887f8560fb45ad60052062ee8f3805653cfbf52b7643793c384a8fd4b
注意:这里需要加入
--cri-socket /var/run/cri-dockerd.sock
参数。
加入之后需要一点时间,节点状态会变为 Ready
验证:
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 Ready control-plane 14m v1.29.2
node01 Ready <none> 41s v1.29.2
node02 Ready <none> 35s v1.29.2
node03 Ready <none> 33s v1.29.2
# 获取集群api $ kubectl api-resources # 获取命名空间 $ kubectl get ns NAME STATUS AGE default Active 17m kube-flannel Active 8m14s kube-node-lease Active 17m kube-public Active 17m kube-system Active 17m # 获取节点信息 -o wide 可以显示更多信息 $ kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME master01 Ready control-plane 17m v1.29.2 192.168.48.50 <none> Ubuntu 22.04.3 LTS 5.15.0-94-generic docker://25.0.3 node01 Ready <none> 4m26s v1.29.2 192.168.48.51 <none> Ubuntu 22.04.3 LTS 5.15.0-94-generic docker://25.0.3 node02 Ready <none> 4m20s v1.29.2 192.168.48.52 <none> Ubuntu 22.04.3 LTS 5.15.0-94-generic docker://25.0.3 node03 Ready <none> 4m18s v1.29.2 192.168.48.53 <none> Ubuntu 22.04.3 LTS 5.15.0-94-generic docker://25.0.3
报错信息:
[ERROR Fileontent-proc-sys-net-bridge-bridge-nf-call-iptable): /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to
ipreflight] If you know what you are doing, you can make a check non-fatal with '.ignore-preflight-errors=...'
参考 主机预配置 里面的 转发 IPv4 并让 iptables 看到桥接流量
报错信息:
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused.
docker 容器引擎默认使用的是 cgroup,改成systemd
参考 主机预配置 里面的 安装docker部分
报错信息:
[ERROR Port-10250]: Port 10250 is in use
重置,重新初始化集群
kubeadm reset
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。