【k8s】k8s安装与集群部署脚本
建议先阅读上一篇k8s概念深入理解k8s架构再阅读本脚本。
#- 5.1 #
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
为什么要关闭交换分区:如果内存满了,将一部分数据放到了硬盘,让scheduler误认为该节点资源空闲,放置更多的pod运行,导致部分pod性能极差,不利于负载均衡。而且k8s不在开启了swap分区的节点运行。
#- 5.2 #
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
modprobe br_netfilter
让 Linux 把网桥(bridge)上的流量也交给 iptables/netfilter 处理,这对 Kubernetes 网络非常重要。
modprobe br_netfilter:手动加载该模块(立即生效)
cat <<EOF | sudo 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
EOFsudo sysctl --system
net.bridge.bridge-nf-call-ip6tables = 1:让网桥上的 IPv6 流量经过 ip6tables。
net.bridge.bridge-nf-call-iptables = 1:让网桥上的 IPv4 流量经过 iptables。
net.ipv4.ip_forward = 1:开启 IPv4 转发功能,使节点可以转发数据包(类似路由器)。
这些设置写入到 /etc/sysctl.d/k8s.conf,然后通过 sysctl --system生效(包括立即生效 + 开机自动加载)。
#- 5.3 #
cat > /etc/apt/sources.list.d/k8s.list <<EOF
deb https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.33/deb /
EOF
第一部分创建 /etc/apt/sources.list.d/k8s.list文件,添加阿里云的 Kubernetes 软件源地址
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/deb/Release.key | apt-key add -apt-get update
然后通过 curl下载该版本的 GPG key,并用 apt-key add -导入(⚠️ 注意:新版 Ubuntu 已逐步废弃 apt-key,推荐使用 gpg+ /etc/apt/trusted.gpg.d/,但这里仍兼容老方式)。
apt-get update:更新软件包索引。
apt-mark hold ...:锁定这三个包,防止被 apt upgrade 自动升级,避免版本不一致导致集群问题。
#apt-get install -y kubelet kubeadm kubectl
apt-get install -y kubelet=1.33.0-1.1 kubeadm=1.33.0-1.1 kubectl=1.33.0-1.1
apt-mark hold kubelet kubeadm kubectl
#- 5.4 #
将补全脚本输出到 /etc/bash_completion.d/目录下,然后通过 source加载使其立即生效。
kubectl completion bash > /etc/bash_completion.d/kubectl
kubeadm completion bash > /etc/bash_completion.d/kubeadm
source /etc/bash_completion.d/kubectl
source /etc/bash_completion.d/kubeadm
#- 5.5 #
crictl config runtime-endpoint unix:///run/cri-dockerd.sock
crictl images
runtime-endpoint指向 cri-dockerd 的 socket 文件:/run/cri-dockerd.sock
这是你使用 cri-dockerd(而不是 containerd)作为容器运行时 的关键配置。
crictl images是测试命令,查看当前能看到的镜像列表。
#- 5.6 # master only
kubeadm config print init-defaults > kubeadm.yaml
kubeadm 是 Kubernetes 官方提供的一个命令行工具,用于快速搭建 Kubernetes 集群(如 Master 节点和 Worker 节点的初始化)。
kubeadm.yaml用于在 kubeadm init 或 kubeadm join 时自定义 Kubernetes 集群的初始化参数
sed -i 's/.*advert.*/ advertiseAddress: 192.168.30.132/g' kubeadm.yaml
sed -i 's/.*name.*/ name: cka-master/g' kubeadm.yaml
Sed-i 's/imageRepo.*/imageRepository: registry.cn-hangzhou.aliyuncs.com\/google_containers/g' kubeadm.yaml
sed -i 's/ criSocket.*/ criSocket: unix:\/\/\/run\/cri-dockerd.sock/' kubeadm.yaml
kubeadm config print init-defaults:输出默认的 init 配置,重定向到 kubeadm.yaml。
接着用 sed修改如下字段:
advertiseAddress: 集群通信 IP(你的 Master 节点 IP,如 192.168.30.130)
name: 节点名称为 cka-master
imageRepository: 使用阿里云的镜像仓库(加速拉取)
criSocket: 指定使用 cri-dockerd 的 socket 路径
modprobe br_netfilter
kubeadm init --config kubeadm.yaml
再次加载 br_netfilter(确保生效)
最后执行:kubeadm init --config kubeadm.yaml,正式初始化 Kubernetes Master 节点
#- 5.7 #
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
将集群的 admin 配置文件拷贝到当前用户的 ~/.kube/config,这样你就能用 kubectl命令控制集群了。
#- 5.8 #
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
部署 Calico 网络插件
#- 5.9 #
kubectl get pod -Akubectl get node
查看pod状态以及node是否ready
#- 5.10 #
kubeadm join 192.168.30.132:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:4376be99ad95b47cc8289ba1ac908358661c85457027b4ff7a1d8911c2f2f522 \--cri-socket=unix:///var/run/cri-dockerd.sock
这是 Worker 节点用来加入集群的命令,包括:
集群 API Server 地址
Token(身份令牌)
CA 证书 Hash
指定使用 cri-dockerd 的 socket
这个 token和 hash是示例,实际使用时需要用 kubeadm token create重新生成,或者查看 Master 初始化时输出的 join 命令。
kubectl label nodes cka-worker1 cka-worker2 node-role.kubernetes.io/worker=worker
给 Worker 节点打标签,标识它们是“Worker 角色”,方便后续调度 Pod 时区分 Master 和 Worker。
kubectl get nodes
查看节点状态