Kubernetes(K8s)基础知识与部署

Kubernetes(K8s)基础知识与部署

一、Kubernetes 概述

Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化容器的部署、扩展和管理。它由 Google 发起并捐赠给 Cloud Native Computing Foundation(CNCF),现已成为容器编排领域的事实标准。

官网:https://kubernetes.io/

二、应用部署方式对比

1. 传统部署

  • 方式:直接将应用程序部署在物理机上
  • 优点:简单,无需额外技术支持
  • 缺点
    • 无法定义资源使用边界,资源分配不合理
    • 程序间易相互影响,隔离性差

2. 虚拟化部署

  • 方式:在物理机上运行多台虚拟机,每个虚拟机为独立环境
  • 优点
    • 程序环境隔离,互不影响
    • 提供基础安全性保障
  • 缺点
    • 需额外运行操作系统,资源浪费严重
    • 性能开销较大

3. 容器化部署

  • 方式:共享操作系统内核,容器封装应用及依赖
  • 优点
    • 拥有独立文件系统、CPU、内存和进程空间
    • 资源占用低,与底层架构解耦
    • 可跨云服务商、跨 Linux 发行版部署
  • 挑战:容器编排问题(故障恢复、扩展、负载均衡等)

三、容器编排工具

解决容器化部署中的编排问题的主流工具:

  • Swarm:Docker 官方提供的轻量级编排工具
  • Mesos:Apache 开源的资源管控工具,需与 Marathon 配合使用
  • Kubernetes:Google 开源的功能全面的容器编排平台,生态最完善

四、Kubernetes 主要功能

Kubernetes 通过集群管理实现资源自动化,核心功能包括:

  1. 自我修复:容器崩溃后 1 秒内自动重启
  2. 弹性伸缩:根据需求自动调整容器数量
  3. 服务发现:服务间自动发现依赖关系
  4. 负载均衡:自动实现多容器实例的请求分发
  5. 版本回退:支持快速回滚到历史稳定版本
  6. 存储编排:根据容器需求自动创建存储卷

五、Kubernetes 核心组件

K8s 集群由控制节点(Master)工作节点(Node) 构成,各组件分工如下:

1. 控制节点(Master)

  • Apiserver:资源操作唯一入口,提供认证、授权及 API 注册
  • Scheduler:负责资源调度,选择合适 Node 运行 Pod
  • Controller-manager:维护集群状态(部署安排、故障检测、自动扩展等)
  • Etcd:集群数据存储中心,保存所有资源对象信息

2. 工作节点(Node)

  • Kubelet:维护容器生命周期,通过控制 Docker 实现容器的创建、更新和销毁
  • Docker:负责节点上容器的实际操作
  • Kube-proxy:实现 Pod 网络代理,提供负载均衡和服务暴露能力

组件调用流程(以 Nginx 部署为例)

  1. 集群启动后,Master 和 Node 信息自动存储到 Etcd
  2. Nginx 部署请求发送至 Master 的 Apiserver
  3. Apiserver 调用 Scheduler 确定部署的 Node 节点
  4. Apiserver 通过 Controller-manager 调度 Node 执行部署
  5. Node 节点的 Kubelet 通知 Docker 启动 Nginx 容器(运行在 Pod 中)
  6. 外部通过 Kube-proxy 访问 Nginx 服务

六、Kubernetes 核心概念

  • Master:集群控制节点,负责集群管控(至少 1 个)
  • Node:工作负载节点,接收 Master 调度并运行容器
  • Pod:K8s 最小操作单元,一个 Pod 可包含 1 个或多个容器
  • Controller:管理 Pod 的控制器,负责 Pod 的启动、停止和伸缩
  • Service:Pod 对外服务的统一入口,维护同一类 Pod 的访问
  • Label:标签,用于对 Pod 分类,同一类 Pod 拥有相同标签
  • Namespace:命名空间,实现 Pod 运行环境的隔离

七、Kubernetes 集群部署指南(基于 Rocky Linux 9.4)

1. 集群规划

采用 "1 主 2 从" 架构,节点信息如下:

|--------|-----------------|------|-----------------|-------------------|--------------------------------------------------------|
| 主机名 | IP 地址 | 角色 | 操作系统 | 硬件配置 | 核心作用 |
| master | 192.168.100.100 | 管理节点 | Rocky Linux 9.4 | 2core/4G 内存 / 50G | 运行控制平面组件(API Server、etcd、Controller Manager、Scheduler) |
| node01 | 192.168.100.110 | 工作节点 | Rocky Linux 9.4 | 2core/4G 内存 / 50G | 运行容器化应用,接受 Master 调度 |
| node02 | 192.168.100.120 | 工作节点 | Rocky Linux 9.4 | 2core/4G 内存 / 50G | 同 node01,提供冗余能力 |

扩展说明

  • 生产环境建议 Master 节点升级至 4 核 8G 内存,工作节点配置根据应用需求调整
  • Rocky Linux 9.4 为 CentOS 兼容版本,支持 K8s 官方推荐内核

2. 操作系统准备(所有节点)

2.1 配置主机名称
复制代码
# master节点

hostnamectl hostname master

# node01节点

hostnamectl hostname node01

# node02节点

hostnamectl hostname node02
2.2 配置 hosts 文件
复制代码
echo "192.168.100.100 master" >> /etc/hosts

echo "192.168.100.110 node01" >> /etc/hosts

echo "192.168.100.120 node02" >> /etc/hosts

验证:执行ping master和ping node01测试连通性

2.3 关闭防火墙和 SELinux
复制代码
# 关闭防火墙

systemctl stop firewalld.service

systemctl disable firewalld.service

# 关闭SELinux

setenforce 0

sed -i 's#SELINUX=enforcing#SELINUX=disabled#' /etc/selinux/config

验证:

  • 防火墙:systemctl status firewalld显示 "inactive (dead)"
  • SELinux:getenforce输出 "Permissive"(临时),重启后输出 "Disabled"(永久)
2.4 配置国内镜像源
复制代码
# 配置阿里云系统源

sed -e 's|^mirrorlist=|#mirrorlist=|g' \

-e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \

-i.bak \

/etc/yum.repos.d/rocky-*.repo

# 配置EPEL源(华为云)

cat > /etc/yum.repos.d/epel.repo << EOF

[epel]

name=Extra Packages for Enterprise Linux \$releasever - \$basearch

baseurl=https://repo.huaweicloud.com/epel/\$releasever/Everything/\$basearch/

enabled=1

gpgcheck=1

countme=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-\$releasever

EOF

# 安装工具

yum -y install vim bash-completion net-tools lrzsz

yum makecache
2.5 时间同步
复制代码
systemctl restart chronyd

systemctl enable chronyd

hwclock -w

timedatectl # 验证时区为Asia/Shanghai
2.6 修改最大打开文件数
复制代码
cat >> /etc/security/limits.conf << EOF

* soft nofile 65535

* hard nofile 65535

EOF

生效:重新登录后执行ulimit -n验证输出 65535

2.7 修改内核参数
复制代码
cat >> /etc/sysctl.conf << EOF

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_max_tw_buckets = 20480

net.ipv4.tcp_max_syn_backlog = 20480

net.core.netdev_max_backlog = 262144

net.ipv4.tcp_fin_timeout = 20

EOF

sysctl -p
2.8 关闭 Swap
复制代码
swapoff -a

sed -ri 's/.*swap.*/#&/' /etc/fstab

验证:free -m显示 Swap 总量为 0

2.9 安装系统工具
复制代码
yum install -y gcc autoconf sysstat
2.10 开启 Bridge 网桥过滤
复制代码
# 配置参数

cat > /etc/sysctl.d/k8s.conf << EOF

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

EOF

# 加载模块

modprobe br_netfilter && lsmod | grep br_netfilter

# 生效配置

sysctl -p /etc/sysctl.d/k8s.conf

3. Docker 环境配置(所有节点)

3.1 配置阿里云 Docker 源
复制代码
yum install -y yum-utils

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.2 安装指定版本 Docker
复制代码
# 查看可用版本

yum list docker-ce.x86_64 --showduplicates | sort -r

# 安装25.0.5版本

yum -y install docker-ce-25.0.5-1.el9
3.3 配置 Docker Cgroup 驱动
复制代码
cat > /etc/docker/daemon.json << EOF

{

"registry-mirrors": [

"https://docker.m.daocloud.io",

"https://dockerproxy.com",

"https://docker.mirrors.ustc.edu.cn",

"https://docker.nju.edu.cn"

],

"exec-opts": ["native.cgroupdriver=systemd"]

}

EOF
3.4 启动 Docker
复制代码
systemctl enable docker --now

验证:systemctl status docker显示 "active (running)"

4. cri-docker 配置(所有节点)

4.1 下载并解压 cri-docker(Master 节点先行)
复制代码
# 下载二进制包

wget -c https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.9/cri-dockerd-0.3.9.amd64.tgz

# 解压

tar -xvf cri-dockerd-0.3.9.amd64.tgz --strip-components=1 -C /usr/local/bin/
4.2 配置 systemd 服务(Master 节点先行)
复制代码
# 下载服务文件

wget -O /etc/systemd/system/cri-docker.service https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.service

wget -O /etc/systemd/system/cri-docker.socket https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.socket

# 修改服务文件

sed -i 's#ExecStart=.*#ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --cri-dockerd-root-directory=/var/lib/dockershim --cri-dockerd-root-directory=/var/lib/docker#' /etc/systemd/system/cri-docker.service

# 修改socket文件

sed -i 's#ListenStream=.*#ListenStream=/var/run/cri-dockerd.sock#' /etc/systemd/system/cri-docker.socket
4.3 复制到其他节点(Master 执行)
复制代码
# 复制到node01

scp cri-dockerd-0.3.9.amd64.tgz root@192.168.100.70:/root/

scp /etc/systemd/system/cri-docker.s* root@192.168.100.70:/etc/systemd/system/

# 复制到node02

scp cri-dockerd-0.3.9.amd64.tgz root@192.168.100.80:/root/

scp /etc/systemd/system/cri-docker.s* root@192.168.100.80:/etc/systemd/system/

其他节点执行解压命令:tar -xvf cri-dockerd-0.3.9.amd64.tgz --strip-components=1 -C /usr/local/bin/

4.4 启动 cri-docker(所有节点)
复制代码
systemctl daemon-reload

systemctl enable cri-docker.service --now

验证:systemctl status cri-docker显示 "active (running)"

5. K8s 集群部署

5.1 配置阿里云 K8s 源(所有节点)
复制代码
cat > /etc/yum.repos.d/k8s.repo << EOF

[kubernetes]

name=Kubernetes

baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/

enabled=1

gpgcheck=1

gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key

EOF
5.2 安装 K8s 组件(所有节点)
复制代码
yum install -y kubelet kubeadm kubectl
5.3 配置 kubelet Cgroup(所有节点)
复制代码
cat > /etc/sysconfig/kubelet << EOF

KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"

EOF

systemctl enable kubelet.service
5.4 初始化 Master 节点(仅 Master 执行)
复制代码
# 生成配置文件

kubeadm config print init-defaults > kubeadm-config.yaml

# 编辑配置文件(关键修改)

cat > kubeadm-config.yaml << EOF

apiVersion: kubeadm.k8s.io/v1beta3

bootstrapTokens:

- groups:

- system:bootstrappers:kubeadm:default-node-token

token: abcdef.0123456789abcdef

ttl: 24h0m0s

usages:

- signing

- authentication

kind: InitConfiguration

localAPIEndpoint:

advertiseAddress: 192.168.100.60 # Master节点IP

bindPort: 6443

nodeRegistration:

criSocket: unix:///var/run/cri-dockerd.sock # cri-docker端点

imagePullPolicy: IfNotPresent

name: master01 # Master主机名

taints: null

---

apiServer:

timeoutForControlPlane: 4m0s

apiVersion: kubeadm.k8s.io/v1beta3

certificatesDir: /etc/kubernetes/pki

clusterName: kubernetes

controllerManager: {}

dns: {}

etcd:

local:

dataDir: /var/lib/etcd

imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers # 阿里云镜像仓库

kind: ClusterConfiguration

kubernetesVersion: 1.28.0

networking:

dnsDomain: cluster.local

serviceSubnet: 10.96.0.0/12

scheduler: {}

EOF

# 初始化集群

kubeadm init --config kubeadm-config.yaml --upload-certs
5.5 配置 kubectl(仅 Master 执行)
复制代码
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile

source /etc/profile

验证:kubectl version显示客户端和服务端版本

5.6 工作节点加入集群(node01 和 node02 执行)
复制代码
# 使用Master初始化输出的join命令,示例:

kubeadm join 192.168.100.60:6443 --token abcdef.0123456789abcdef \

--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \

--cri-socket=unix:///var/run/cri-dockerd.sock

若 token 过期,在 Master 执行:kubeadm token create --print-join-command重新生成

5.7 部署 Calico 网络插件(仅 Master 执行)
复制代码
# 下载配置文件

wget https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/calico.yaml

# 部署

kubectl apply -f calico.yaml

验证:kubectl get pods -n kube-system查看 Calico 组件运行状态

6. 集群状态验证(Master 节点执行)

6.1 检查节点状态
复制代码
kubectl get nodes
  • 正常输出示例(所有节点状态为Ready):

    NAME STATUS ROLES AGE VERSION

    master Ready control-plane 10m v1.28.0

    node01 Ready <none> 5m v1.28.0

    node02 Ready <none> 5m v1.28.0

  • 若节点状态为NotReady,等待 2-3 分钟(网络插件初始化需要时间),或通过kubectl describe node <节点名>排查原因。

6.2 检查系统组件状态
复制代码
kubectl get pods -n kube-system
  • 核心组件(kube-apiserver、kube-controller-manager、kube-scheduler、etcd、calico-*)状态应为Running。

拉取完成后,重启 Pod:kubectl delete pods -n kube-system <calico-pod-name>。

7. 常见故障排查

7.1 节点状态为 NotReady
  • 检查网络插件状态:kubectl get pods -n kube-system | grep calico,确保 Calico 正常运行;
  • 检查 kubelet 状态:systemctl status kubelet,查看日志:journalctl -u kubelet -f;
  • 检查容器运行时:systemctl status cri-docker,确保 Docker 和 cri-dockerd 正常。
7.2 Pod 镜像拉取失败(ImagePullBackOff)
  • 手动拉取镜像:docker pull <镜像名>,验证镜像是否可访问;
  • 配置镜像仓库加速器(已在 Docker 配置中包含,若仍失败可更换加速器地址);
7.3 节点无法加入集群(Unauthorized)
  • 重新生成 join 命令:在 Master 节点执行kubeadm token create --print-join-command;
  • 清理节点残留配置:在 Node 节点执行kubeadm reset -f --cri-socket=unix:///var/run/cri-dockerd.sock,再重新加入。

8. 集群维护建议

8.1 备份 etcd 数据(Master 节点)
复制代码
# 备份数据到/backup目录

ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \

--cacert=/etc/kubernetes/pki/etcd/ca.crt \

--cert=/etc/kubernetes/pki/apiserver-etcd-client.crt \

--key=/etc/kubernetes/pki/apiserver-etcd-client.key \

snapshot save /backup/etcd-snapshot-$(date +%Y%m%d).db
8.2 升级集群版本(谨慎操作)
  • 先升级 Master 节点:kubeadm upgrade apply v1.28.x(x 为具体版本号);
  • 再升级各 Node 节点:kubeadm upgrade node,并重启 kubelet。
8.3 清理无用资源
复制代码
# 删除终止状态的Pod

kubectl delete pods --field-selector=status.phase=Succeeded -A

kubectl delete pods --field-selector=status.phase=Failed -A

# 清理未使用的镜像(Node节点)

docker system prune -a -f

10. 总结

Kubernetes 通过组件协同实现了容器的自动化管理,核心优势在于自愈能力弹性伸缩跨环境部署。本文基于 kubeadm 工具完成了 "1 主 2 从" 集群的部署,涵盖环境准备、组件安装、网络配置等关键步骤,并通过 Nginx 示例演示了基本操作。

后续学习可重点关注:

  • 深入理解 Pod 生命周期与控制器(Deployment/StatefulSet/DaemonSet);
  • 掌握 Service 与 Ingress 的网络转发机制;
  • 学习配置管理(ConfigMap/Secret)和存储卷(PV/PVC)的使用;
  • 了解集群监控(Prometheus+Grafana)和日志收集(EFK Stack)方案。
相关推荐
半梦半醒*11 小时前
k8s——services资源+pod详解1
linux·运维·docker·kubernetes·centos·负载均衡
hello_25011 小时前
k8s证书过期时间扫描
云原生·容器·kubernetes
2302_7995257411 小时前
【k8s】Deployment、StatefulSet、DaemonSet
云原生·容器·kubernetes
维尔切11 小时前
K8s 资源管理与操作
云原生·容器·kubernetes
问道飞鱼13 小时前
【Kubernets】Kubernetes 资源类型大全:使用场景与配置示例
云原生·容器·kubernetes·资源类型
稚辉君.MCA_P8_Java13 小时前
RocketMQ 是什么?它的架构是怎么样的?和 Kafka 又有什么区别?
后端·架构·kafka·kubernetes·rocketmq
JavaLearnerZGQ14 小时前
单机部署docker-nacos(通过下载nacos源码的方式)
运维·docker·容器
忧郁的橙子.15 小时前
二十、kubernetes 1.29 之 运维
运维·容器·kubernetes
zmjjdank1ng16 小时前
k8s问答题(1)
云原生·容器·kubernetes