测试开发右移 — Kubernetes 初识,搭建 k8s 集群
基础操作
# ========================
# Kubernetes 集群部署前系统初始化脚本(适用于所有节点)
# ========================
# 关闭防火墙(firewalld)
# 原因:Kubernetes 组件(如 kube-apiserver、etcd、kubelet)依赖大量端口通信(6443, 2379, 10250 等),
# 防火墙可能阻止这些端口,导致节点无法加入集群或组件间通信失败。
systemctl stop firewalld # 临时关闭(立即生效)
systemctl disable firewalld # 永久关闭(开机不自启)
# 关闭 SELinux
# 原因:SELinux 的安全策略可能限制容器对宿主机文件系统的访问(如挂载卷、读取配置),
# 导致 Pod 启动失败或权限错误。K8s 官方推荐禁用。
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久关闭(直接替换 enforcing 为 disabled)
setenforce 0 # 临时关闭(立即生效,无需重启)
# 关闭 swap 分区
# 原因:Kubernetes 默认不允许节点启用 swap(避免内存压力下性能不可控),
# 若未关闭,kubelet 会启动失败并报错 "swap is enabled"。
swapoff -a # 临时关闭(立即生效)
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久关闭(注释掉 /etc/fstab 中的 swap 行,防止重启后自动挂载)
# 【重要】关闭 swap 后必须重启虚拟机!
# 原因:仅执行 swapoff -a 无法彻底清除内核对 swap 的依赖状态,
# 某些系统(如 CentOS 7)需重启才能确保 swap 完全禁用,否则 kubeadm init 可能失败。
# 设置主机名(根据规划,每台机器设置唯一名称)
# 原因:Kubernetes 要求每个节点有唯一的主机名,用于标识 Node 对象;
# 避免使用默认 localhost 或重复名称,否则会导致调度异常或证书验证失败。
hostnamectl set-hostname k8s-master # 示例:在 master 节点执行(node1/node2 类似)
# 配置 /etc/hosts 文件(在所有节点上添加集群节点解析)
# 原因:在没有内部 DNS 服务的小型集群中,需手动绑定 IP 与主机名,
# 确保各节点能通过主机名互相访问(如 apiserver 地址、etcd 成员通信)。
cat >> /etc/hosts << EOF
192.168.113.120 k8s-master
192.168.113.121 k8s-node1
192.168.113.122 k8s-node2
EOF
# 启用桥接流量传递到 iptables
# 原因:Docker/containerd 使用 Linux bridge 网络,但默认不经过 iptables 规则;
# K8s 的 Service、NetworkPolicy 依赖 iptables 实现流量转发和策略控制,
# 必须开启此内核参数以确保网络功能正常。
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-iptables = 1 # IPv4 流量
net.bridge.bridge-nf-call-ip6tables = 1 # IPv6 流量(若使用)
EOF
sysctl --system # 重新加载所有 sysctl 配置,使上述参数立即生效
# 同步系统时间(NTP)
# 原因:Kubernetes 组件(尤其是 etcd 和 TLS 证书)对时间敏感;
# 节点间时间偏差超过一定阈值(通常几分钟)会导致证书失效、集群脑裂或日志混乱。
yum install ntpdate -y # 安装时间同步工具(CentOS/RHEL)
ntpdate time.windows.com # 从公共 NTP 服务器同步时间(也可用 pool.ntp.org)
# 【生产建议】:配置 chronyd 或 systemd-timesyncd 实现持续时间同步
安装Docker
k8s 仓库源
sudo cat <<EOF | sudo 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
安装kubeadm、kubelet、kubectl
yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
systemctl enable kubelet
# 配置关闭 Docker 的 cgroups,修改 `/etc/docker/daemon.json`,加入以下内容
"exec-opts": ["native.cgroupdriver=systemd"]
# 重启docker
systemctl daemon-reload
systemctl restart docker
部署 Master
# 在 Master 节点下执行
kubeadm init \
--apiserver-advertise-address=192.168.113.120 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.6 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
# 安装成功后,复制如下配置并执行
mkdir -p $ HOME/.kube
加入node
# 下方命令可以在 k8s master 控制台初始化成功后复制 join 命令
kubeadm join 192.168.113.120:6443 --token <master 控制台的 token> \
--discovery-token-ca-cert-hash <master 控制台的 hash>
# 如果初始化的 token 不小心清空了,可以通过如下命令获取或者重新申请
kubeadmin token create
# token 没有过期可以通过如下命令获取
kubeadmin token list
# 获取 --discovery-token-ca-cert-hash 值,得到值后需要在前面拼接上 sha256:
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \ openssl dgst -sha256 -hex | sed 's/^.*//'
kubeadm join 192.168.113.120:6443 --token 你的token --discovery-token-ca-cert-hash sha256:你的哈希
部署 CNI 网络插件
# 在 master 节点上执行
# 下载 calico 配置文件,可能会网络超时
curl https://docs.projectcalico.org/manifests/calico.yaml -O
# 修改 calico.yaml 文件中的 CALICO_IPV4POOL_CIDR 配置,修改为与初始化的 cidr 相同
# 修改 IP_AUTODETECTION_METHOD 下的网卡名称
# 删除镜像 docker.io/ 前缀,避免下载过慢导致失败
# 执行calico安装
kubectl apply -f calico.yaml
# 查看系统命名空间(kube-system)中所有 Pod 的状态。
kubectl get po -n kube-system
# 查看置顶pod 信息
kubectl describe po <pod-name> -n kube-system
测试 kubenetes 集群
# 创建部署
kubectl create deployment nginx --image=nginx
# 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看 pod 以及服务信息
kubectl get pod,svc
在任意节点使用 kubelet
# 1. 将 master 节点中 /etc/kubernetes/admin.conf 拷贝到需要运行的服务器的 /etc/kubernetes 目录中
scp /etc/kubernetes/admin.conf root@k8s-node1:/etc/kubernetes
# 2. 在对应的服务器上配置环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu