当前位置:   article > 正文

Kubernetes1.29 部署_ubuntu22.04安装kubernetes 1.29

ubuntu22.04安装kubernetes 1.29

Kubernetes1.29 集群部署文档记录,使用VMware虚拟机部署。

主机环境

系统:Ubuntu22.04.5 LTS
Kubernetes:v1.29.2
Container Runtime:Docker CE 25.0.3 和 cri-dockerd v0.3.10

主机名IP
master01192.168.48.50
node01192.168.48.51
node02192.168.48.52
node03192.168.48.53

主机预配置

部署系统要求:

  1. 时间同步一致
  2. 关闭防火墙
  3. 配置hosts
  4. 禁用swap分区
  5. 关闭iptables
  6. 安装docker
  7. 安装 cri-dockerd
    8. 转发 IPv4 并让 iptables 看到桥接流量
时间同步
apt install chrony -y
systemctl enable --now chrony
  • 1
  • 2
关闭防火墙
systemctl stop ufw
systemctl disable ufw
  • 1
  • 2
配置hosts
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
  • 1
  • 2
  • 3
  • 4
禁用swap分区
# 关闭当前已启用的所有Swap设备
swapoff -a
# 而后编辑/etc/fstab配置文件,注释用于挂载Swap设备的所有行。


# 在Ubuntu 2004及之后版本的系统上,若要彻底禁用Swap,可以需要类似如下命令进一步完成
systemctl --type swap
# 而后,将上面命令列出的每个设备,使用systemctl mask命令加以禁用。
systemctl mask SWAP_DEV
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

如果需要在节点上使用Swap设备,也可选择让kubeam忽略Swap设备的相关设定。
我们编辑kubelet的配置文件/etc/default/kubelet,设置其忽略Swap启用的状态错误即可,文件内容如下:

KUBELET_EXTRA_ARGS="--fail-swap-on=false"
  • 1
关闭iptables
$ systemctl stop iptables
$ systemctl disable iptables
  • 1
  • 2
安装docker
$ 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
安装 cri-dockerd
# 下载安装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
  • 1
  • 2
  • 3
# 下载安装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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
# 配置启动服务
$ 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

对于cri-dockerd ExecStart 服务参数说明:

  • –network-plugin:指定网络插件规范的类型,这里要使用CNI;
  • –cni-bin-dir:指定CNI插件二进制程序文件的搜索目录;
  • –cni-cache-dir:CNI插件使用的缓存目录;
  • –cni-conf-dir:CNI插件加载配置文件的目录;
  • –pod-infra-container-image:Pod中的puase容器要使用的Image,默认为registry.k8s.io上的pause仓库中的镜像;不能直接获取到该Image时,需要明确指定为从指定的位置加载,例如“registry.aliyuncs.com/google_containers/pause:3.9”。
转发 IPv4 并让 iptables 看到桥接流量
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

Kubernetes 部署

安装kubelet、kubeadm和kubectl
$ 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
  • 1
  • 2
  • 3
  • 4
  • 5

安装完成后,确定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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
创建一个 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 restart cri-docker
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
初始化第一个主节点
初始化操作在主节点上执行
$ 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

参数说明:

  • --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
  • 1
  • --cri-socket /var/run/cri-dockerd.sock:使用前面创建的 socket 文件通信

如果各个节点没有禁用 Swap设备,还需要附加选项“–ignore-preflight-errors=Swap”,从而让kubeadm忽略该错误设定;

init01
init02
将上述信息保存下来,一会儿加入节点的时候会用到上面的token
根据上面提示进行操作:
配置Kubernetes的配置文件

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

查看节点:

kubectl get nodes
NAME       STATUS     ROLES           AGE     VERSION
master01   NotReady   control-plane   6m52s   v1.29.2
  • 1
  • 2
  • 3

部署网络插件 flannel

$ kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
  • 1

等一分钟节点状态就正常了

$ kubectl get nodes
NAME       STATUS   ROLES           AGE   VERSION
master01   Ready    control-plane   10m   v1.29.2
  • 1
  • 2
  • 3
其他节点加入集群

用初始化节点成功回显的token加入集群

kubeadm join kubeapi.cc.io:6443 \
  --cri-socket /var/run/cri-dockerd.sock \
  --token x7s833.x2iixqpa7r78lf39 \
  --discovery-token-ca-cert-hash sha256:6be14a3887f8560fb45ad60052062ee8f3805653cfbf52b7643793c384a8fd4b
  • 1
  • 2
  • 3
  • 4

注意:这里需要加入 --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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
Kubectl 一些常用指令
# 获取集群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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

排错

桥接网络错误

报错信息:

[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=...'
  • 1
  • 2

参考 主机预配置 里面的 转发 IPv4 并让 iptables 看到桥接流量

初始化失败,kubelet 检查信息

报错信息:

[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.
  • 1

docker 容器引擎默认使用的是 cgroup,改成systemd
参考 主机预配置 里面的 安装docker部分

Port 10250 is in use

报错信息:

[ERROR Port-10250]: Port 10250 is in use
  • 1

重置,重新初始化集群

kubeadm reset
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/828674
推荐阅读
相关标签
  

闽ICP备14008679号