当前位置: 首页 > news >正文

保姆级教程:在CentOS 7.6上从零搭建Kubernetes 1.18.6集群(含镜像拉取避坑指南)

保姆级教程:在CentOS 7.6上从零搭建Kubernetes 1.18.6集群(含镜像拉取避坑指南)

当你第一次接触Kubernetes时,可能会被它复杂的架构和繁琐的配置过程吓到。但别担心,这篇教程将手把手带你完成从零开始搭建一个完整的Kubernetes集群的全过程。我们会特别关注在国内网络环境下可能遇到的镜像拉取问题,并提供多种解决方案。

1. 环境准备与系统配置

在开始之前,确保你有至少三台运行CentOS 7.6的虚拟机或物理机。官方建议每台机器至少配置双核CPU和2GB内存。以下是我们的实验环境配置示例:

主机名IP地址角色操作系统
k8s-master192.168.203.212控制节点CentOS 7.6
k8s-node1192.168.203.213工作节点CentOS 7.6
k8s-node2192.168.203.214工作节点CentOS 7.6

提示:在开始前,请确保所有节点的MAC地址和product_uuid是唯一的。可以通过以下命令检查:

ip link cat /sys/class/dmi/id/product_uuid

1.1 基础环境配置

在所有节点上执行以下配置步骤:

  1. 更新系统并安装必要工具

    yum install -y epel-release conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
  2. 关闭防火墙和SELinux

    systemctl stop firewalld && systemctl disable firewalld iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT setenforce 0 sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
  3. 关闭swap分区

    swapoff -a sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

1.2 内核参数优化

Kubernetes对Linux内核有一些特殊要求,我们需要进行相应配置:

cat > /etc/sysconfig/modules/ipvs.modules <<EOF #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 modprobe -- br_netfilter EOF chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules

然后设置内核参数:

cat << EOF | tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1 net.ipv4.tcp_tw_recycle=0 vm.swappiness=0 vm.overcommit_memory=1 vm.panic_on_oom=0 fs.inotify.max_user_watches=89100 fs.file-max=52706963 fs.nr_open=52706963 net.ipv6.conf.all.disable_ipv6=1 net.netfilter.nf_conntrack_max=2310720 EOF sysctl -p /etc/sysctl.d/k8s.conf

2. Docker安装与配置

Kubernetes 1.18.6推荐使用Docker作为容器运行时环境。以下是安装步骤:

2.1 安装Docker CE

# 卸载旧版本 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine # 安装依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加阿里云Docker CE镜像源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安装Docker yum makecache fast yum -y install docker-ce

2.2 配置Docker

# 配置阿里云镜像加速和cgroup驱动 tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://bk6kzfqm.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ] } EOF # 启动Docker并设置开机自启 systemctl daemon-reload systemctl restart docker systemctl enable docker

注意:Kubernetes要求Docker使用systemd作为cgroup驱动,这是我们在daemon.json中配置"exec-opts": ["native.cgroupdriver=systemd"]的原因。

3. Kubernetes组件安装

3.1 配置Kubernetes yum源

cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF yum makecache fast

3.2 安装kubeadm、kubelet和kubectl

yum install -y kubelet-1.18.6 kubeadm-1.18.6 kubectl-1.18.6 systemctl enable --now kubelet

3.3 配置命令自动补全

yum install bash-completion -y kubectl completion bash > /etc/bash_completion.d/kubectl kubeadm completion bash > /etc/bash_completion.d/kubeadm

4. 镜像拉取与避坑指南

在国内网络环境下,直接从k8s.gcr.io拉取镜像可能会遇到困难。以下是几种解决方案:

4.1 使用阿里云镜像仓库

# 查看需要的镜像列表 kubeadm config images list --kubernetes-version v1.18.6

输出结果类似:

k8s.gcr.io/kube-apiserver:v1.18.6 k8s.gcr.io/kube-controller-manager:v1.18.6 k8s.gcr.io/kube-scheduler:v1.18.6 k8s.gcr.io/kube-proxy:v1.18.6 k8s.gcr.io/pause:3.2 k8s.gcr.io/etcd:3.4.3-0 k8s.gcr.io/coredns:1.6.7

我们可以使用以下脚本从阿里云拉取镜像并重新打标签:

#!/bin/bash KUBE_VERSION=v1.18.6 PAUSE_VERSION=3.2 CORE_DNS_VERSION=1.6.7 ETCD_VERSION=3.4.3-0 # 从阿里云拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:$KUBE_VERSION docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:$KUBE_VERSION docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:$KUBE_VERSION docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:$KUBE_VERSION docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:$PAUSE_VERSION docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:$CORE_DNS_VERSION docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:$ETCD_VERSION # 重新打标签 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:$KUBE_VERSION k8s.gcr.io/kube-apiserver:$KUBE_VERSION docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:$KUBE_VERSION k8s.gcr.io/kube-controller-manager:$KUBE_VERSION docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:$KUBE_VERSION k8s.gcr.io/kube-scheduler:$KUBE_VERSION docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:$KUBE_VERSION k8s.gcr.io/kube-proxy:$KUBE_VERSION docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:$PAUSE_VERSION k8s.gcr.io/pause:$PAUSE_VERSION docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:$CORE_DNS_VERSION k8s.gcr.io/coredns:$CORE_DNS_VERSION docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:$ETCD_VERSION k8s.gcr.io/etcd:$ETCD_VERSION # 删除原始标签 docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:$KUBE_VERSION docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:$KUBE_VERSION docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:$KUBE_VERSION docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:$KUBE_VERSION docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/pause:$PAUSE_VERSION docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:$CORE_DNS_VERSION docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:$ETCD_VERSION

4.2 离线安装方案

如果网络条件特别差,可以考虑离线安装:

  1. 在一台可以访问外网的机器上拉取所有镜像
  2. 使用docker save命令导出镜像包
  3. 将镜像包复制到内网机器
  4. 使用docker load命令导入镜像

具体操作:

# 在可以访问外网的机器上 docker save $(docker images | grep -v REPOSITORY | awk 'BEGIN{OFS=":";ORS=" "}{print $1,$2}') -o k8s-1.18.6-images.tar # 在内网机器上 docker image load -i k8s-1.18.6-images.tar

5. 初始化Kubernetes集群

5.1 在主节点上初始化集群

kubeadm init \ --kubernetes-version=v1.18.6 \ --apiserver-advertise-address=192.168.203.212 \ --pod-network-cidr=10.244.0.0/16 \ --service-cidr=10.1.0.0/16

初始化成功后,会输出类似下面的节点加入命令,请保存好:

kubeadm join 192.168.203.212:6443 --token u7x1ds.5tiiipijzgoyhfim \ --discovery-token-ca-cert-hash sha256:b2b18c68862df62971aaf94652acb447c437003d30f34a7e84f870ce17a1a3d4

5.2 配置kubectl

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

5.3 安装网络插件

Kubernetes需要网络插件来实现Pod之间的通信。我们以Flannel为例:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

或者使用国内镜像源:

curl -o kube-flannel.yml https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml sed -i "s/quay.io\/coreos\/flannel/quay-mirror.qiniu.com\/coreos\/flannel/g" kube-flannel.yml kubectl apply -f kube-flannel.yml rm -f kube-flannel.yml

6. 加入工作节点

在每个工作节点上执行之前保存的kubeadm join命令:

kubeadm join 192.168.203.212:6443 --token u7x1ds.5tiiipijzgoyhfim \ --discovery-token-ca-cert-hash sha256:b2b18c68862df62971aaf94652acb447c437003d30f34a7e84f870ce17a1a3d4

在主节点上检查节点状态:

kubectl get nodes

7. 部署Kubernetes Dashboard

Kubernetes Dashboard提供了Web界面来管理集群。

7.1 部署Dashboard

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml

7.2 创建访问服务

kubectl expose deployment kubernetes-dashboard -n kubernetes-dashboard --type=NodePort --port=443 --target-port=8443

7.3 创建管理员账号

cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard EOF cat <<EOF | kubectl apply -f - apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard EOF

7.4 获取访问令牌

kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

复制输出的token,然后通过以下URL访问Dashboard:

https://<master-ip>:<node-port>

8. 常见问题排查

在搭建过程中可能会遇到各种问题,这里列出几个常见问题及解决方案:

  1. kubelet无法启动

    • 检查Docker是否正常运行
    • 检查cgroup驱动配置是否正确
    • 查看日志:journalctl -xeu kubelet
  2. 节点NotReady

    • 检查网络插件是否安装成功
    • 检查kube-proxy是否正常运行
    • 查看节点详情:kubectl describe node <node-name>
  3. 镜像拉取失败

    • 尝试使用阿里云镜像源
    • 考虑离线安装方案
    • 检查Docker配置的镜像加速器是否生效
  4. Dashboard无法访问

    • 检查Service的NodePort是否正确暴露
    • 检查防火墙是否放行了对应端口
    • 确认token是否正确复制

9. 集群维护建议

  1. 定期备份

    • 备份/etc/kubernetes目录
    • 备份~/.kube/config文件
    • 考虑使用etcdctl备份集群数据
  2. 版本升级

    • 先升级kubeadm
    • 然后升级控制平面节点
    • 最后升级工作节点
  3. 监控与日志

    • 部署Prometheus监控集群状态
    • 配置EFK日志收集系统
    • 设置适当的告警规则
  4. 安全加固

    • 定期轮换证书
    • 限制Dashboard的访问
    • 配置网络策略限制Pod间通信

10. 性能优化技巧

  1. 调整kubelet参数

    --max-pods=110 --kube-api-qps=100 --kube-api-burst=100
  2. 启用IPVS模式

    kubectl edit configmap kube-proxy -n kube-system # 修改mode: "ipvs"
  3. 优化etcd性能

    • 使用SSD存储
    • 适当增加etcd的heartbeat-interval和election-timeout
    • 考虑独立部署etcd集群
  4. 节点资源预留

    --kube-reserved=cpu=500m,memory=1Gi --system-reserved=cpu=500m,memory=1Gi

在实际使用中,我发现最常遇到的问题还是网络相关的配置。特别是在混合云或多数据中心环境下,网络策略和CNI插件的选择会直接影响集群的稳定性和性能。建议在生产环境部署前,先在测试环境充分验证网络方案。

http://www.jsqmd.com/news/656586/

相关文章:

  • 济南大巴车日租800-2600元?3分钟看懂报价套路,附5家正规公司电话 - 土星买买买
  • 如何快速掌握VanJS:世界最小响应式UI框架入门指南
  • Inventor装配中如何精准调整零件方向?5种实用技巧解析
  • 别再只盯着Kaggle了!这5个国内外手语数据集(含RWTH、DEVISIGN)帮你快速上手AI手语识别
  • 从网球冠军到高效学习:拆解‘贝克尔境界’,帮你搞定Python/React/任何新技能
  • UI-TARS桌面版终极指南:3步配置实现自然语言控制电脑
  • 为什么你训练的Copilot插件复用失败?揭秘4层抽象断层——语法层、语义层、领域层、组织层
  • 给定百万级订单表,实现高效分页 + 动态条件查询 + 导出 Excel(避免内存爆炸) (编程题)
  • Squeel高级查询技巧:复杂SQL条件的简单Ruby实现
  • 深入CamX/CHI架构:从Framework的open()到HAL3的initialize(),高通相机驱动如何完成“握手”?
  • Windows平台AirPlay 2接收器架构深度解析与实现原理
  • 6.--JWT鉴权
  • 从零构建MinIO Java Starter:实战封装、权限控制与云原生集成
  • Display Driver Uninstaller:显卡驱动问题的终极手术刀
  • Zero123++:如何从单张图片生成一致的多视角3D内容?
  • 视频内容智能分析终极指南:用AI快速理解视频核心信息
  • 别再死记硬背OSI七层模型了!用TwinCAT TCP/IP通信实例,带你真正理解网络协议栈
  • 从Wi-Fi到5G:OFDM技术是如何成为现代无线通信‘扛把子’的?
  • 从LLM输出到可执行逻辑:用可视化AST图谱定位生成代码的3类隐性缺陷(含开源诊断工具链)
  • Material —— RBD(Houdini To UE)
  • 终极指南:如何使用Infinity构建高性能推荐系统与对话AI
  • 别再暴力匹配了!用DBoW2词袋模型为你的SLAM系统加速回环检测(附ORB-SLAM2实战代码)
  • 2026国产云端 PCB 设计工具推荐,支持多人协作,适合消费电子行业 - 品牌2026
  • AD5686R高精度DAC:从硬件选型到SPI驱动实战
  • NIS实战指南:从零搭建高效用户认证系统
  • 如何快速上手Tinymist:Typst语言服务的完整指南
  • PyTorch环境配置Jupyter Notebook后,命令启动不自动打开浏览器的排查与修复
  • element-plus中Cascader级联选择器组件的使用
  • 终极指南:如何掌握obs-websocket协议的RPC通信机制与消息格式
  • NVIDIA Profile Inspector终极指南:5个步骤彻底解决游戏性能问题