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.namemetadata.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)
日志收集NginxFluentd(日志发送)
服务代理应用服务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 的常见状态:

状态含义
PendingPod 已创建但容器还未全部启动
RunningPod 正在运行中
SucceededPod 任务成功结束(如 Job)
FailedPod 任务失败退出
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)

img

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
IngressHTTP/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
应用YAMLkubectl 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 firewalldinactive (dead)
关闭swapswapoff -a && sed -ri '/swap/s/^/#/' /etc/fstabfree -h 中 swap=0
启用 br_netfilter 模块`modprobe br_netfilter && lsmodgrep 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-ens33IP、网关正确、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

img

初始化成功后复制 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

img

[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

img

集群组建成功!

查看核心组件运行情况

kubectl get pods -n kube-system

总结

时机是否适合克隆说明
安装完 K8s 环境、未 init✅ 强烈推荐环境一致、无冲突
已执行 kubeadm init❌ 不推荐会导致 Node 无法正常 join
完全空白系统✅ 可行但安装步骤重复、慢

安装网络插件

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

img

截取当前所有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端

更多推荐