Kubernetes 入门到实战:概念详解 + kubeadm 安装 + 节点克隆全流程

如果你刚接触容器编排,Kubernetes(K8s)一定是绕不开的核心技术。作为业界主流的容器管理平台,它能帮我们自动部署、扩缩容、自愈应用,让集群管理变得简单高效。

但很多新手都会卡在概念看不懂、安装踩坑、集群搭不起来这几步。

这篇文章就用最通俗的语言,把 K8s 核心概念、Pod 原理、集群架构、kubeadm 安装、节点克隆、网络插件部署一次性讲清楚,全程干货、可直接照着实操,帮你快速从入门到搭建可用集群。


kubernetes启动过程

先启动systemd >docker > cri-docker > kubelet > 整体的kubernetes集群组件的pod启动 > k8s启动

pod组成

一、Pod 是什么?

Pod 是 Kubernetes 中最小的可部署单元。
它代表 一个或多个紧密关联的容器(Containers),这些容器:

  • 共享同一个 网络(IP、端口空间)
  • 共享同一个 存储卷(Volumes)
  • 同一个调度单元 一起运行在同一个 Node 上

你可以理解为:

Pod 就像一台“迷你虚拟机”,里面跑着一个或多个容器,它们共享这台小机子的网络和存储环境。


二、Pod 的组成结构

一个 Pod 通常包含以下几个主要部分

组成部分

作用

示例

1. 一个或多个容器(Containers)

实际运行应用的地方,例如 Nginx、MySQL、Redis 等。

主容器、辅助容器

2. 存储卷(Volumes)

提供持久化或共享数据存储。

挂载 ConfigMap、Secret 或 PV

3. 网络命名空间(Network Namespace)

Pod 内所有容器共享同一个 IP、端口空间、lo 回环接口。

localhost

互通

4. Pod Metadata(元数据)

记录 Pod 的名称、标签、注解、命名空间等信息。

metadata.name

metadata.labels

5. Pod Spec(规范)

描述 Pod 中运行的容器定义、卷、端口等。

spec.containers

6. Init Containers(初始化容器)

Pod 启动前运行的准备性任务。

初始化配置、检查依赖

7. Sidecar 容器(边车容器)

附加功能容器,如日志收集、代理。

Promtail、Istio proxy


三、Pod 内部结构图(示意)

+-------------------------------------------------+
|                   Pod (共享网络/IP)              |
|-------------------------------------------------|
|  容器A(主容器)    |  容器B(Sidecar容器)        |
|  nginx              |  日志收集器、代理程序       |
|  共享:             |                            |
|   - 网络命名空间    |                             |
|   - 存储卷 volume   |                             |
|---------------------------------------------- ---|
|  存储卷:/data, /config                           |
+-------------------------------------------------+

每个 Pod:

  • 一个独立的 IP 地址
  • Pod 内多个容器通过 localhost 通信;
  • Pod 外通信通过 Service 访问。

四、为什么要设计成 Pod(而不是直接运行容器)?

如果直接使用 Docker,一个容器只能运行一个应用进程。
但在很多场景下,我们需要多个进程配合运行,比如:

场景

主容器

辅助容器(Sidecar)

日志收集

Nginx

Fluentd(日志发送)

服务代理

应用服务

Envoy(代理)

初始化任务

应用服务

Init 容器(初始化配置)

所以 Kubernetes 设计了 Pod 来将这些容器绑在一起,形成一个完整的工作单元。


五、Pod 示例文件(YAML)

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
    - name: nginx-container
      image: nginx:latest
      ports:
        - containerPort: 80
    - name: sidecar-logger
      image: busybox
      command: ["sh", "-c", "tail -f /var/log/nginx/access.log"]
  volumes:
    - name: log-volume
      emptyDir: {}

📌 解释:

  • nginx-container 是主容器,提供 Web 服务;
  • sidecar-logger 是边车容器,负责实时查看日志;
  • emptyDir 是一个共享卷,两个容器都可以访问。

六、Pod 的生命周期(Lifecycle)

Pod 的常见状态:

状态

含义

Pending

Pod 已创建但容器还未全部启动

Running

Pod 正在运行中

Succeeded

Pod 任务成功结束(如 Job)

Failed

Pod 任务失败退出

Unknown

无法获取状态(节点通信问题)


七、Pod 管理方式

在实际生产中,我们不会直接手动创建 Pod,而是通过更高级的控制器来管理:

控制器

功能

Deployment

管理无状态应用(自动滚动更新、回滚)

StatefulSet

管理有状态应用(如数据库)

DaemonSet

每个节点都运行一个 Pod

Job / CronJob

运行一次性或定时任务

这些控制器会自动创建、监控、恢复 Pod。


小结

名称

说明

Pod 是 K8s 中的最小运行单位

一个 Pod 可包含一个或多个容器

共享网络、存储、生命周期

由容器(containers)+ 卷(volumes)+ 元数据(metadata)+ 规范(spec)组成

生产中通过 Deployment、StatefulSet 等控制器管理

Pause特征

Pod内部第一个启动的容器

初始化网络栈

挂载需要的存储卷

挥手僵尸进程

其他容器特征

与Pause容器共享名字空间(Network,PID,IPC)

Kubernetes 入门基础知识讲解

一、Kubernetes 是什么?

Kubernetes(K8s) 是一个 容器编排系统,用于:

  • 自动部署(自动启动容器)
  • 自动扩缩容(根据负载调整容器数量)
  • 自动恢复(容器异常自动重启)
  • 服务发现与负载均衡(让容器能被访问)
  • 统一管理配置、存储与安全

👉 简单理解:

K8s 就像一个“集群操作系统”,统一调度多台服务器,把容器当作“应用进程”来运行和管理。


二、Kubernetes 架构组成

K8s 由两大部分组成:

控制平面(Control Plane)

负责“管控全局”的大脑部分:

组件

作用

kube-apiserver

所有命令的入口,提供 API 接口

etcd

分布式键值数据库,存储整个集群状态

kube-scheduler

调度器,决定 Pod 应该在哪个 Node 运行

kube-controller-manager

控制器,维持系统期望状态(比如副本数量)

工作节点(Node)

负责“干活”的执行部分:

组件

作用

kubelet

负责和 API Server 通信,创建/销毁 Pod

kube-proxy

管理容器之间的网络转发和负载均衡

Container Runtime

容器运行时(Docker、containerd等)


三、核心资源对象

K8s 中的每个功能都围绕这些资源展开👇

资源

说明

示例命令

Pod

最小运行单位(一个或多个容器)

kubectl get pods

ReplicaSet

确保 Pod 数量始终满足要求

kubectl get rs

Deployment

管理应用版本、滚动更新

kubectl get deploy

Service

提供固定访问入口(IP + 端口)

kubectl get svc

Namespace

逻辑隔离空间(类似文件夹)

kubectl get ns

ConfigMap / Secret

管理应用配置与敏感信息

kubectl get cm / secret

Ingress

HTTP/HTTPS 流量入口控制器

kubectl get ingress

Volume / PVC

数据持久化存储

kubectl get pvc


四、Pod 是什么?(最核心概念)

Pod 是 K8s 中 最小的调度单位,一个 Pod 里可以包含:

  • 一个容器(最常见)
  • 或多个容器(共享网络与存储)

Pod 的作用:

  • 把容器打包成逻辑单元
  • 提供稳定的网络标识(Pod IP)
  • 当 Pod 异常时,K8s 会自动重建它(即“自愈”)

📘 示例命令:

kubectl run nginx --image=nginx
kubectl get pods
kubectl describe pod nginx

五、Service:让 Pod 能被访问

Pod 的 IP 是临时的,每次重建都会变化。
Service 用来提供一个固定的访问入口。

Service 有三种常用类型:

类型

说明

示例

ClusterIP

集群内访问(默认)

内部服务调用

NodePort

集群外访问(暴露端口)

http://nodeIP:port

LoadBalancer

云端自动负载均衡

需云服务支持

📘 示例:

kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svc

六、Kubernetes 网络原理入门

在 K8s 中,每个 Pod 都有独立 IP,Pod 之间可以直接通信。
这套网络是由 CNI(Container Network Interface)插件 提供的。
常见的网络插件有:

  • Flannel
  • Calico
  • Cilium
  • Weave Net

💡 什么是 Calico?

Calico 是最常用的 K8s 网络插件之一,提供:

  1. Pod 之间的网络通信
  2. 网络策略(NetworkPolicy)控制安全访问
  3. 支持多种网络模式(IPIP、VXLAN、BGP)

💡 那什么是 VXLAN?

VXLAN(Virtual eXtensible LAN)是一种 虚拟局域网封装技术
简单来说:

VXLAN 会把二层数据包(例如 Pod 网络)封装在三层 UDP 中传输,让不同主机上的 Pod 像在一个局域网中一样通信。


💡 Calico VXLAN 模式

Calico VXLAN 就是 Calico + VXLAN 封装 的工作模式。

工作原理:

  • 每个 Node 上的 Pod 都有独立的虚拟子网(CIDR)
  • 当 Pod A(Node1)访问 Pod B(Node2)时:
    • Calico 把数据包封装成 VXLAN
    • 通过宿主机网络(Node IP)发送
    • 对端 Calico 解封装,还原为原始 Pod 包
  • 对 Pod 来说,它们像在同一个局域网中

📘 优点:

  • 不依赖物理网络配置
  • 各 Node 之间自动通信
  • 适合本地实验、虚拟机环境(如 VMware)

📘 可通过命令查看 VXLAN Tunnel:

ip link show type vxlan

七、YAML 配置文件

K8s 所有资源都可以用 YAML 文件定义。
格式清晰、可版本管理。

例:Deployment 示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

部署命令:

kubectl apply -f nginx-deploy.yaml

八、命令行常用命令总结

分类

常用命令

查看资源

kubectl get pods,svc,deploy

详细信息

kubectl describe pod <name>

日志排错

kubectl logs <pod>

进入容器

kubectl exec -it <pod> -- /bin/bash

应用YAML

kubectl apply -f file.yaml

删除资源

kubectl delete -f file.yaml


安装方式

kubeadm

组件通过容器化方式运行

优势:简单,自愈

缺点:掩盖一些细节

一主两从

M 1

        CPU >= 2

        MEM内存 >= 4

        NIC 网卡>= 1

        DISK 磁盘空间= 100GB

N 2

        CPU >= 1

        MEM >= 1GB

        NIC >= 1

        DISK = 100GB

二进制安装

组件变成系统进程的方式运行

优势:能够更灵活的安装处集群

缺点:难

Linux > docker > cri-docker > kubelet > AS\CM\SCH

docker run --restart=always

从节点克隆选择

一、克隆节点的最佳时机(黄金时刻)

最推荐的克隆时机:

在主节点安装完基础运行环境(系统 + Docker/containerd + kubeadm/kubelet/kubectl + 网络配置)
还没有执行 kubeadm init 之前!

也就是:

「安装好 K8s 环境依赖」 ➜ 「未初始化集群」 ➜ 此时克隆最完美


理由分析

阶段

克隆后会发生的问题

是否推荐

克隆前未装K8s环境

每个节点都要重新安装所有依赖(Docker、kubelet、kubeadm、kubectl)

❌ 太麻烦

克隆后再init(推荐)

每个节点环境一致、干净,机器 ID 不冲突

✅ 最理想

克隆后已init的主节点

所有克隆节点会带上相同集群配置、CA证书、etcd数据、machine-id,加入集群时冲突

⚠️ 容易出错,不推荐


二、推荐操作流程(实战顺序)

下面是最稳妥、通用的流程👇


步骤 1:在主节点安装系统并更新环境

# 设置主机名
hostnamectl set-hostname k8s-01

# 更新系统
yum update -y

# 设置时区和时间同步
timedatectl set-timezone Asia/Shanghai
yum install -y chrony
systemctl enable --now chronyd

步骤 2:配置网络与 hosts

cat >> /etc/hosts <<EOF
192.168.163.90 k8s-01
192.168.163.91 k8s-02
192.168.163.92 k8s-03
EOF

步骤 3:安装容器运行时(推荐 containerd 或 Docker)

以 containerd 为例:

yum install -y containerd
systemctl enable --now containerd

或者 Docker:

yum install -y docker
systemctl enable --now docker

步骤 4:关闭防火墙和 swap

systemctl disable --now firewalld
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

步骤 5:安装 kubeadm、kubelet、kubectl

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
EOF

yum install -y kubelet kubeadm kubectl
systemctl enable kubelet

【此时停止!不要执行 kubeadm init】

💡 到这一步为止:

  • 系统、网络、Docker/containerd、K8s 环境都装好了;
  • 但还没有初始化集群;
  • 所以还 没有生成任何集群证书、machine-id、etcd 数据

👉 现在正是 克隆 Node 节点的黄金时刻!


接下来执行前,请逐项确认以下环境检查表:

检查项

命令或验证方式

要求

关闭防火墙

systemctl disable --now firewalld

inactive (dead)

关闭swap

swapoff -a && sed -ri '/swap/s/^/#/' /etc/fstab

free -h

中 swap=0

启用 br_netfilter 模块

`modprobe br_netfilter && lsmod

grep br_netfilter`

sysctl 参数设置

/etc/sysctl.d/k8s.conf

文件中需有:
\nnet.bridge.bridge-nf-call-iptables=1\nnet.ipv4.ip_forward=1\nnet.bridge.bridge-nf-call-ip6tables=1\n


执行 sysctl --system

三项为1

Docker 与 cri-dockerd 运行中

systemctl status docker cri-docker

均为 active

主机名正确

hostnamectl set-hostname k8s-01

名称明确

时间同步

timedatectl status

时间准确、NTP启用

网络配置正确

cat /etc/sysconfig/network-scripts/ifcfg-ens33

IP、网关正确、DNS可用

三、克隆节点操作步骤(VMware中)

1️⃣ 关闭主节点虚拟机
2️⃣ 在 VMware 中右键 → 克隆(Clone)
3️⃣ 选择:

  • 克隆整个虚拟机
  • 创建完整副本(不要链接克隆)
    4️⃣ 克隆两份,命名为:
    • k8s-02
    • k8s-03
      5️⃣ 启动后分别修改:
hostnamectl set-hostname k8s-02
vim /etc/sysconfig/network-scripts/ifcfg-ens33   # 修改IP

6️⃣ 执行清理机器ID命令:

rm -f /etc/machine-id /var/lib/dbus/machine-id
systemd-machine-id-setup

四、克隆完成后再初始化主节点

回到主节点执行:

kubeadm init \
--apiserver-advertise-address=192.168.163.90 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.26.0 \
--service-cidr=10.10.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all \
--cri-socket unix:///var/run/cri-dockerd.sock

初始化成功后复制 join 命令:

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

五、在两个 Node 节点上执行 join 命令

kubeadm join 192.168.163.90:6443 --token ty8jm5.ljtxjumoths15o0v \
--discovery-token-ca-cert-hash sha256:bdfff1178fccd3e4504494c1181720604d4579668ee4a64c84ca8a3d224185ff \
--cri-socket unix:///var/run/cri-dockerd.sock

[root@k8s-03 ~]# kubeadm join 192.168.163.90:6443 --token ty8jm5.ljtxjumoths15o0v \
> --discovery-token-ca-cert-hash sha256:bdfff1178fccd3e4504494c1181720604d4579668ee4a64c84ca8a3d224185ff \
> --cri-socket unix:///var/run/cri-dockerd.sock
[preflight] Running pre-flight checks
	[WARNING Service-Kubelet]: kubelet service is not enabled, please run 'systemctl enable kubelet.service'
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

#此节点已加入集群:
#证书签名请求已发送到apiserver并收到响应。
#Kubelet被告知新的安全连接细节。
#在控制平面上运行“kubectl get node”以查看此节点加入集群。

验证:

kubectl get nodes

结果:

[root@k8s-01 ~]# kubectl get nodes
NAME     STATUS     ROLES           AGE     VERSION
k8s-01   NotReady   control-plane   19m     v1.26.0
k8s-02   NotReady   <none>          6m31s   v1.26.0
k8s-03   NotReady   <none>          105s    v1.26.0

🎉 集群组建成功!

查看核心组件运行情况

kubectl get pods -n kube-system

总结口诀

💡「init 之前克隆,join 之后验证」

时机

是否适合克隆

说明

安装完 K8s 环境、未 init

✅ 强烈推荐

环境一致、无冲突

已执行 kubeadm init

❌ 不推荐

会导致 Node 无法正常 join

完全空白系统

✅ 可行

但安装步骤重复、慢

安装网络插件

导入calico模块,通过docker load -i命令, 将从本地文件导入镜像

截取当前所有pod信息

[root@k8s-01 calico]# kubectl get pod -A
NAMESPACE     NAME                                      READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-cf895cc9c-xqmsb   1/1     Running   0          24m
kube-system   calico-node-9b6pm                         1/1     Running   0          24m
kube-system   calico-node-khwtr                         1/1     Running   0          24m
kube-system   calico-node-pwdxn                         1/1     Running   0          24m
kube-system   calico-typha-7c44676c7f-bb5sk             1/1     Running   0          24m
kube-system   coredns-5bbd96d687-5bk4g                  1/1     Running   0          72m
kube-system   coredns-5bbd96d687-sm77k                  1/1     Running   0          72m
kube-system   etcd-k8s-01                               1/1     Running   0          72m
kube-system   kube-apiserver-k8s-01                     1/1     Running   0          72m
kube-system   kube-controller-manager-k8s-01            1/1     Running   0          72m
kube-system   kube-proxy-896cn                          1/1     Running   0          54m
kube-system   kube-proxy-8gvkw                          1/1     Running   0          72m
kube-system   kube-proxy-b2kz6                          1/1     Running   0          59m
kube-system   kube-scheduler-k8s-01                     1/1     Running   0          72m
/etc/kubernetes/pki  目录下存放证书   此证书默认只能使用一年
当前kubernetes组件之间的联通都是通过HTTPS协议实现,所以需要这么多证书
架构逐渐从B/S(浏览器/服务器)转向C/S(客户端/服务器)
[root@k8s-01 pki]# ls
apiserver.crt              apiserver.key                 ca.crt  front-proxy-ca.crt      front-proxy-client.key
apiserver-etcd-client.crt  apiserver-kubelet-client.crt  ca.key  front-proxy-ca.key      sa.key
apiserver-etcd-client.key  apiserver-kubelet-client.key  etcd    front-proxy-client.crt  sa.pub


[root@k8s-01 kubernetes]# ls
admin.conf  controller-manager.conf  kubelet.conf  manifests  pki  scheduler.conf
admin文件是管理员文件,是集群部署的钥匙

[root@k8s-01 kubernetes]# cd /etc/kubernetes/manifests
[root@k8s-01 manifests]# ls
etcd.yaml  kube-apiserver.yaml  kube-controller-manager.yaml  kube-scheduler.yaml
这些文件启动,构成集群的Master端

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值