Ubuntu安装K8S

在这里插入图片描述

1. 服务器初始化(所有节点)

vim /etc/hosts
127.0.0.1 localhost
# 127.0.1.1 yww

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

192.168.163.3 k8s-master
192.168.163.4 k8s-node1
192.168.163.5 k8s-node2
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
sudo apt update
sudo timedatectl set-timezone Asia/Shanghai
sudo apt install ntpsec-ntpdate

# 同步一
sudo ntpdate time.windows.com

# 同步二
sudo ntpdate pool.ntp.org
  • 禁用swap分区
// 1方式
// 注释掉 /etc/fstab 中的 Swap 条目
// 备份 fstab 文件
sudo cp /etc/fstab /etc/fstab.bak
//编辑 fstab 文件
sudo vim /etc/fstab
//在文件中找到包含 swap 的行,在行首添加 # 注释掉:
示例:
/dev/disk/by-uuid/63c40f44-82d7-4ae8-9e1c-e85209d91664 / ext4 defaults 0 1
# /swap.img     none    swap    sw      0       0
  • 修改linux的内核参数
sudo modprobe br_netfilter
sudo sysctl net.bridge.bridge-nf-call-iptables=1
  • 配置ipvs功能
//1. 安装必要的软件包,更新系统
sudo apt update
// 安装 ipset 和 ipvsadm
sudo apt install ipset ipvsadm -y
// 验证安装
ipset --version
ipvsadm --version
//2. 加载 IPVS 内核模块
// 加载 IPVS 相关内核模块
sudo modprobe ip_vs
sudo modprobe ip_vs_rr
sudo modprobe ip_vs_wrr
sudo modprobe ip_vs_sh
sudo modprobe nf_conntrack
// 验证模块是否加载
lsmod | grep ip_vs
  • 重启
reboot

2. 安装docker(所有节点)

// 设置 Docker 的 apt 仓库
// 1. 添加 Docker 官方的 GPG 密钥:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
// 2. 将存储库添加到 Apt 源:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
//3. 安装 Docker 软件包。
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
//4. 配置镜像源
sudo nano /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://dockerproxy.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://docker.nju.edu.cn",
    "http://hub-mirror.c.163.com"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "200m",
    "max-file": "5"
  }
}
5. 重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
6. 检查配置是否生效
docker info
docker info | grep -E "Cgroup|Logging"
docker info | grep -A 5 "Registry Mirrors"
# Cgroup Driver: systemd
# Logging Driver: json-file
8. 测试docker
sudo docker run hello-world

避免 docker containerd 使用系统盘(可忽略)

# /var/lib/docker 已经是数据盘
# /var/lib/containerd ---> 数据盘
# 停服务
systemctl stop docker
systemctl stop containerd
# 创建目录
mkdir -p /var/lib/docker/containerd
# 迁移数据
mv /var/lib/containerd /var/lib/docker/containerd/
# 做软链接
ln -s /var/lib/docker/containerd/containerd /var/lib/containerd
# 启动服务
systemctl daemon-reexec
systemctl restart containerd
systemctl restart docker

3. 安装 cri-docker(所有节点)

//1. 安装依赖
sudo apt update
sudo apt install -y curl wget
//2. 下载 cri-dockerd 二进制文件
// 获取最新版本号
CRI_DOCKERD_VERSION=$(curl -s https://api.github.com/repos/Mirantis/cri-dockerd/releases/latest | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
//3. 下载并解压
wget https://github.com/Mirantis/cri-dockerd/releases/download/${CRI_DOCKERD_VERSION}/cri-dockerd-${CRI_DOCKERD_VERSION#v}.amd64.tgz
tar xvf cri-dockerd-${CRI_DOCKERD_VERSION#v}.amd64.tgz
//4. 安装到系统路径
sudo mv cri-dockerd/cri-dockerd /usr/local/bin/
sudo chmod +x /usr/local/bin/cri-dockerd
//5. 创建新的服务文件
sudo tee /etc/systemd/system/cri-docker.service > /dev/null <<EOF
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target docker.service
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/local/bin/cri-dockerd \\
  --network-plugin=cni \\
  --pod-infra-container-image=registry.k8s.io/pause:3.9 \\
  --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock
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
EOF
//6. 重新加载 systemd
sudo systemctl daemon-reload
//7. 启用并启动服务
sudo systemctl enable cri-docker.service
sudo systemctl start cri-docker.service
//8. 检查状态
sudo systemctl status cri-docker.service
//9. 检查 socket 文件是否创建
ls -la /var/run/cri-dockerd.sock

4. 安装kubernetes组件(所有节点)

//1. 更新镜像源
sudo apt update
sudo apt upgrade -y
sudo apt install -y curl gnupg apt-transport-https ca-certificates
//2. 添加 Kubernetes 国内镜像源(阿里云)
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-aliyun.gpg
//3. 添加 Kubernetes 源
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-aliyun.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
//4. 更新包列表并安装
sudo apt update
//5. 安装指定版本的 kubeadm、kubelet、kubectl
//6.  查看可用版本
apt-cache madison kubeadm
//7. 安装最新稳定版本
sudo apt install -y kubelet kubeadm kubectl
//8. 或者安装特定版本(推荐)
# sudo apt install -y kubelet=1.28.0-00 kubeadm=1.28.0-00 kubectl=1.28.0-00
//9. 锁定版本,防止自动更新
sudo apt-mark hold kubelet kubeadm kubectl
//10. 配置K8S使用clidocker
sudo mkdir -p /etc/systemd/system/kubelet.service.d
//11. 创建 kubelet 服务配置
sudo tee /etc/systemd/system/kubelet.service.d/0-cri-docker.conf > /dev/null <<EOF
[Service]
Environment="KUBELET_EXTRA_ARGS=--container-runtime-endpoint=unix:///var/run/cri-dockerd.sock"
EOF
# 拉 pause 镜像
sudo docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9

# 给 kubelet 用的镜像打 tag
sudo docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9 k8s.gcr.io/pause:3.9
sudo docker tag k8s.gcr.io/pause:3.9 registry.k8s.io/pause:3.9
vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
# Note: This dropin only works with kubeadm and kubelet v1.11+
[Service]
# kubeconfig 文件路径
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"

# kubeadm 动态生成的参数
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env

# 用户自定义参数文件
EnvironmentFile=-/etc/default/kubelet

# 指定 pause 镜像使用本地或国内源
# 如果你的本地已经有 registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9
# 或者你已经打了 tag 对应 registry.k8s.io/pause:3.9,可以改为你本地镜像
Environment="KUBELET_EXTRA_ARGS=--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9"

# 清空 ExecStart,使用自定义参数
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

# 重启策略
Restart=always
StartLimitInterval=0
RestartSec=10
sudo systemctl daemon-reload

5. 安装kubernetes组件(仅master节点执行)

//1.  正确的镜像拉取脚本,修改为你下载的版本
images=(
    kube-apiserver:v1.28.2
    kube-controller-manager:v1.28.2
    kube-scheduler:v1.28.2
    kube-proxy:v1.28.2
    pause:3.9
    etcd:3.5.9-0
    coredns:v1.10.1
)
//2. 进行下载
for imageName in ${images[@]} ; do
    echo "Pulling $imageName"
    sudo docker pull registry.aliyuncs.com/google_containers/$imageName
    sudo docker tag registry.aliyuncs.com/google_containers/$imageName registry.k8s.io/$imageName
    sudo docker rmi registry.aliyuncs.com/google_containers/$imageName
done
//3.  验证镜像
sudo docker images | grep k8s.io

6. 集群初始化(仅master节点执行)

sudo modprobe br_netfilter
echo "br_netfilter" | sudo tee /etc/modules-load.d/br_netfilter.conf
sudo sysctl net.bridge.bridge-nf-call-iptables=1
sudo sysctl -p
cat /proc/sys/net/bridge/bridge-nf-call-iptables
# 如果返回 1 就正常了。

sudo kubeadm init \
  --cri-socket unix:///var/run/cri-dockerd.sock \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.28.2 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16
# 创建必要文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 日志查看
sudo journalctl -u kubelet -f

7. 集群初始化(node节点)

sudo modprobe br_netfilter
echo "br_netfilter" | sudo tee /etc/modules-load.d/br_netfilter.conf
sudo sysctl net.bridge.bridge-nf-call-iptables=1
sudo sysctl -p
cat /proc/sys/net/bridge/bridge-nf-call-iptables

sudo kubeadm join 192.168.163.3:6443 \
  --token od0g5i.r538ydrdho8nbybs \
  --discovery-token-ca-cert-hash sha256:324358e41cd704c75a70ae1111e96f245013b8e244faa622096a96585aee306b \
  --cri-socket unix:///var/run/cri-dockerd.sock

8. 安装网络插件(master节点)

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

至此所有K8S安装步骤完成,可以使用 kubectl get nodes 等等所有节点 Ready 即可。

  • 等待所有节点 Ready 需要一点时间,耐心等待!
  • 安装失败,或者节点始终 NotReady,一定是步骤漏输,或输错;实在不行,使用 <<断电重置方法>> 重置之后,在初始化 k8s 集群。

9. 断电重置

  • master
# 停止 kubelet 和 docker/cri
sudo systemctl stop kubelet
sudo systemctl stop docker   # 或者 containerd/cri-o

# 重置 kubeadm 配置
sudo kubeadm reset -f --cri-socket unix:///var/run/cri-dockerd.sock

# 删除 CNI 网络插件配置
sudo rm -rf /etc/cni/net.d
sudo rm -rf /etc/kubernetes/manifests
sudo rm -rf /var/lib/etcd
sudo rm -rf /var/lib/kubelet/*
sudo rm -rf /etc/kubernetes/pki

# 清理 kubelet、kube-proxy 数据
sudo rm -rf /var/lib/kube-proxy
sudo rm -rf /var/lib/calico /var/lib/flannel  # 如果安装了

# 重启 docker 和 kubelet
sudo systemctl restart docker
sudo systemctl restart kubelet
sudo kubeadm init \
  --cri-socket unix:///var/run/cri-dockerd.sock \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.28.2 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16
  
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
  • node节点
sudo kubeadm reset -f --cri-socket unix:///var/run/cri-dockerd.sock
sudo rm -rf /etc/kubernetes/*
sudo rm -rf /var/lib/kubelet/*
sudo rm -rf /etc/cni/net.d/*
sudo rm -rf /var/lib/cni/*
sudo rm -rf /run/flannel/*
sudo systemctl stop kubelet
sudo fuser -k 10250/tcp || true
sudo systemctl daemon-reload
sudo systemctl restart kubelet
sudo kubeadm join 192.168.163.3:6443 \
  --token g1ky1i.amhisjcq62fivryb \
  --discovery-token-ca-cert-hash sha256:975d7ed132348ec49093391eac632cd546996df382e86694882b6f229a33cb28 \
  --cri-socket unix:///var/run/cri-dockerd.sock

10. 断电重启(所有节点)

# docker
sudo systemctl start docker
sudo 

# 检查 kubelet
sudo systemctl status kubelet
sudo systemctl start kubelet

11 部署nginx进行测试

kubectl create deployment nginx --image=nginx:1.14-alpine
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pods,service
----------------------------------------------------------------------------------
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-596ff96db7-8cms5   1/1     Running   0          30s

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        16m
service/nginx        NodePort    10.105.192.235   <none>        80:30613/TCP   5s
----------------------------------------------------------------------------------

kubectl delete deployment nginx
kubectl delete service nginx
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐