测试开发右移 — Kubernetes 初识,搭建 k8s 集群

AI摘要
该内容为一份详细的Kubernetes集群部署初始化与安装指南,属于技术知识分享。它系统性地阐述了在部署K8s前,对所有节点进行系统环境准备的必要步骤,包括关闭防火墙、SELinux、Swap分区,配置主机名、网络参数、时间同步,以及安装Docker、kubeadm等核心组件。随后,文档进一步说明了Master节点初始化、Node节点加入集群、部署Calico网络插件以及进行基本功能测试的完整操作流程。

基础操作

# ========================
# 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
k8s
本作品采用《CC 协议》,转载必须注明作者和本文链接
保持好奇,求知若饥,终身编程
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!