1 初始化操作

修改机器名称
hostnamectl set-hostname node/master
更改/etc/hosts
192.168.10.67 node01

v1.28需要使用cri-dockerd界面

shell如下

#!/bin/bash
set -x
echo "请修改你的hostname和hosts文件"
# 检查root权限
if [ "$(id -u)" != "0" ]; then
    echo "请使用root用户执行此脚本"
    exit 1
fi

# 全局配置
K8S_VERSION="1.28.0"
CRI_DOCKER_VERSION="0.3.10"
POD_CIDR="10.244.0.0/16"
SERVICE_CIDR="10.96.0.0/12"
ADVERTISE_ADDR=$(hostname -I | awk '{print $1}')
IMAGE_REPO="registry.aliyuncs.com/google_containers"
CRI_SOCKET="unix:///var/run/cri-dockerd.sock"

# 系统初始化配置
init_system() {
    # 禁用SELinux
    setenforce 0
    sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

    # 关闭防火墙
    systemctl stop firewalld
    systemctl disable firewalld

    # 禁用swap
    swapoff -a
    sed -i '/ swap /s/^/#/g' /etc/fstab

    # 加载内核模块
    cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
    modprobe overlay
    modprobe br_netfilter

    # 设置内核参数
    cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
    sysctl --system
}

# 安装基础工具
install_tools() {
    # 配置阿里云yum源
    curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    yum -y install epel-release
    yum -y install wget net-tools iftop htop iotop yum-utils device-mapper-persistent-data lvm2
}

# 安装Docker
install_docker() {
    yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    yum install -y docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io

    # 配置Docker
    mkdir -p /etc/docker
    cat <<EOF | tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "registry-mirrors": [
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.udayun.com/",
"https://docker.xuanyuan.me/",
"https://docker.wanpeng.top",
"https://docker.rainbond.cc",
"https://xdark.top"
],
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF

    systemctl enable docker
    systemctl start docker
}

# 安装CRI-Docker
install_cri_docker() {
    if [ ! -f /usr/local/bin/cri-dockerd ] ; then 
    curl -LO https://github.com/Mirantis/cri-dockerd/releases/download/v${CRI_DOCKER_VERSION}/cri-dockerd-${CRI_DOCKER_VERSION}.amd64.tgz
    tar xvf cri-dockerd-${CRI_DOCKER_VERSION}.amd64.tgz
    mv cri-dockerd/cri-dockerd /usr/local/bin/

    cat <<EOF | tee /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 docker.service
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/local/bin/cri-dockerd --container-runtime-endpoint unix:///var/run/cri-dockerd.sock --network-plugin=cni --cni-conf-dir=/etc/cni/net.d
ExecReload=/bin/kill -s HUP \$MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

[Install]
WantedBy=multi-user.target
EOF

fi

    systemctl daemon-reload
    systemctl enable cri-docker.service
    systemctl start cri-docker.service
}

# 安装Kubernetes组件
install_k8s() {
    cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

    yum install -y kubelet-${K8S_VERSION}-0 kubeadm-${K8S_VERSION}-0 kubectl-${K8S_VERSION}-0 --disableexcludes=kubernetes
    systemctl enable kubelet
}

# 预拉取镜像
pull_images() {
    local images=(
        "kube-apiserver:v${K8S_VERSION}"
        "kube-controller-manager:v${K8S_VERSION}"
        "kube-scheduler:v${K8S_VERSION}"
        "kube-proxy:v${K8S_VERSION}"
        "etcd:3.5.9-0"
        "coredns:v1.10.1"
        "pause:3.6"
    )

    for image in "${images[@]}"; do
        docker pull ${IMAGE_REPO}/${image}
        docker tag ${IMAGE_REPO}/${image} registry.k8s.io/${image}
    done
}

# 初始化Master节点
init_master() {
    kubeadm init \
        --image-repository ${IMAGE_REPO} \
        --kubernetes-version v${K8S_VERSION} \
        --pod-network-cidr=${POD_CIDR} \
        --service-cidr=${SERVICE_CIDR} \
        --cri-socket ${CRI_SOCKET} \
        --apiserver-advertise-address=${ADVERTISE_ADDR}

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

    # 安装网络插件
  #  kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
    docker pull calico/node:v3.26.1
    docker pull calico/cni:v3.26.1
    docker pull calico/kube-controllers:v3.26.1

     kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

    # 输出加入命令
    echo "Master节点初始化完成!"
    JOIN_CMD=$(kubeadm token create --print-join-command)
    echo "工作节点加入命令:"
    echo "$JOIN_CMD --cri-socket ${CRI_SOCKET}"
}

# 加入集群
join_cluster() {
    if [ -z "$JOIN_CMD" ]; then
        echo "请输入Master节点生成的加入命令:"
        read JOIN_CMD
    fi
    echo "正在加入集群..."
    $JOIN_CMD --cri-socket ${CRI_SOCKET}
}

# 主执行逻辑
main() {
    init_system
    install_tools
    install_docker
    install_cri_docker
    install_k8s
    pull_images

    echo "请选择安装模式:"
    echo "1) 初始化Master节点"
    echo "2) 加入现有集群"
    if [ $# -gt 0 ] ; then
        if [ "$1" == master ] ; then
            init_master
        else
            join_cluster
        fi
    else
     read -p "请输入选择(1/2): " choice

    case $choice in
        1) init_master ;;
        2) join_cluster ;;
        *) echo "无效选择" && exit 1 ;;
    esac

    fi

    echo "安装完成!"
    kubectl get nodes
}

main

生成join-cmd命令

kubeadm token create --ttl 87600h --print-join-command

join

kubeadm join 192.168.230.138:6443 --token g0xz04.4d7flxqulg4xqj3m --discovery-token-ca-cert-hash sha256:a89b89b565ac767641e2cdc7098eada3abcbe26f3a76c4588da23fb869f7cdea --cri-socket unix:///var/run/cri-dockerd.sock

清理node

kubectl delete node node02

docker ps -a | awk '{print $1 }' | xargs docker rm -f
kubeadm reset -f  --cri-socket unix:///var/run/cri-dockerd.sock

1. 安装 bash-completion

CentOS/RHEL 系统上执行:

sudo yum install -y bash-completion

2. 配置 kubectl 自动补全

# 临时生效(当前会话)
source <(kubectl completion bash)

# 永久生效(写入 bashrc)
echo 'source <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc

作者:严锋  创建时间:2025-05-05 18:02
最后编辑:严锋  更新时间:2025-05-09 15:48