【k8s】k8s安装与集群部署脚本

建议先阅读上一篇k8s概念深入理解k8s架构再阅读本脚本。

#- 5.1 #

bash 复制代码
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab

为什么要关闭交换分区:如果内存满了,将一部分数据放到了硬盘,让scheduler误认为该节点资源空闲,放置更多的pod运行,导致部分pod性能极差,不利于负载均衡。而且k8s不在开启了swap分区的节点运行。

#- 5.2 #

bash 复制代码
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
modprobe br_netfilter

让 Linux 把网桥(bridge)上的流量也交给 iptables/netfilter 处理,这对 Kubernetes 网络非常重要。

modprobe br_netfilter:手动加载该模块(立即生效)

bash 复制代码
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
EOF

sudo 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 #

bash 复制代码
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 软件源地址

bash 复制代码
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 自动升级,避免版本不一致导致集群问题。

bash 复制代码
#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加载使其立即生效。

bash 复制代码
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 #

bash 复制代码
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

bash 复制代码
kubeadm config print init-defaults > kubeadm.yaml

kubeadm 是 Kubernetes 官方提供的一个命令行工具,用于快速搭建 Kubernetes 集群(如 Master 节点和 Worker 节点的初始化)。

kubeadm.yaml用于在 kubeadm init 或 kubeadm join 时自定义 Kubernetes 集群的初始化参数

bash 复制代码
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 路径

bash 复制代码
modprobe br_netfilter
kubeadm init --config kubeadm.yaml

再次加载 br_netfilter(确保生效)

最后执行:kubeadm init --config kubeadm.yaml,正式初始化 Kubernetes Master 节点

#- 5.7 #

bash 复制代码
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 #

bash 复制代码
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

​部署 Calico 网络插件

#- 5.9 #

bash 复制代码
kubectl get pod -A

kubectl get node

查看pod状态以及node是否ready

#- 5.10 #

bash 复制代码
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 命令。

bash 复制代码
kubectl label nodes cka-worker1 cka-worker2 node-role.kubernetes.io/worker=worker

给 Worker 节点打标签,标识它们是"Worker 角色",方便后续调度 Pod 时区分 Master 和 Worker。

bash 复制代码
kubectl get nodes

查看节点状态

相关推荐
虚伪的空想家22 分钟前
K8S删除命名空间卡住一直Terminating状态
云原生·容器·kubernetes·删除·卡顿·delete·命名空间
衍余未了2 小时前
k8s除了主server服务器可正常使用kubectl命令,其他节点不能使用原因,以及如何在其他k8s节点正常使用kubectl命令??
云原生·容器·kubernetes
Clownseven2 小时前
Mattermost教程:用Docker搭建自己的开源Slack替代品 (团队聊天)
docker·容器·开源
❀͜͡傀儡师2 小时前
Docker部署Drawnix开源白板工具
docker·容器·开源·drawnix
❀͜͡傀儡师2 小时前
Docker部署Lunalytics开源监控工具
docker·容器·开源·lunalytics
To_再飞行2 小时前
K8s 存储配置资源
linux·云原生·容器·kubernetes
To_再飞行4 小时前
K8s 调度管理
linux·云原生·kubernetes
milanyangbo4 小时前
“卧槽,系统又崩了!”——别慌,这也许是你看过最通俗易懂的分布式入门
分布式·后端·云原生·架构
大咖分享课5 小时前
系统越拆越乱?你可能误解了微服务的本质!
微服务·云原生·架构