Kubernetes核心概念+集群部署+Pod/Service/Deployment管理实战

在容器化技术普及的当下,单台服务器的容器管理早已无法满足微服务架构的需求——手动启停容器、跨主机容器通信、服务扩缩容等问题,让运维工作变得繁琐且易出错。Kubernetes(简称K8s) 作为开源的容器编排平台,能实现容器的自动化部署、扩缩容、负载均衡与故障自愈,成为云原生时代的核心技术。

一、K8s核心概念:搞懂这些才算入门

K8s的核心是“集群”,所有功能都围绕集群展开,先理清这些核心组件和资源概念,才能避免后续操作“一头雾水”。

1. 集群架构:Master与Node节点

K8s集群由控制平面(Master节点)工作节点(Node节点) 组成,各自承担不同职责:

  • Master节点(控制平面):集群的“大脑”,负责集群的管理和决策,核心组件包括:
    • kube-apiserver:所有操作的统一入口,提供REST API接口;
    • etcd:集群的数据库,存储所有集群状态和配置信息;
    • kube-scheduler:负责Pod的调度,将Pod分配到合适的Node节点;
    • kube-controller-manager:集群的控制器中心,负责节点管理、副本控制、服务发现等核心功能。
  • Node节点(工作节点):集群的“干活机器”,负责运行容器化应用,核心组件包括:
    • kubelet:与Master节点通信,管理本机的Pod生命周期;
    • kube-proxy:负责节点的网络代理,实现Service的负载均衡;
    • 容器运行时:如Docker、containerd,负责容器的创建和运行。

2. 核心资源:Pod、Service、Deployment

K8s中所有操作都围绕“资源”展开,这三类是入门最核心的资源:

资源名称 作用说明
Pod K8s最小的部署单元,包含一个或多个容器,共享网络和存储资源,是容器的“包装器”
Service 为Pod提供稳定的网络访问入口,解决Pod动态创建销毁导致的IP变化问题
Deployment 声明式管理Pod的控制器,负责Pod的创建、扩缩容、滚动更新和故障恢复

除此之外,还有Namespace(命名空间,资源隔离)、ConfigMap(配置管理)、Secret(敏感信息存储)等资源,后续实战中会逐步接触。

二、K8s集群部署:kubeadm快速搭建单Master集群

对于新手,kubeadm是官方推荐的集群部署工具,无需复杂的手动配置,能快速搭建测试集群。本文以Ubuntu 22.04 LTS系统为例,部署“1个Master节点+1个Node节点”的集群(也可单节点部署)。

1. 环境准备(所有节点执行)

(1)基础环境配置

# 关闭防火墙
sudo ufw disable
# 关闭SELinux(Ubuntu默认未安装,可跳过)
# sudo setenforce 0
# sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# 关闭swap分区(K8s要求禁用swap)
sudo swapoff -a
sudo sed -i '/swap/s/^/#/' /etc/fstab

# 配置主机名(Master节点执行)
sudo hostnamectl set-hostname k8s-master
# 配置主机名(Node节点执行)
sudo hostnamectl set-hostname k8s-node1

# 配置hosts解析(所有节点,替换为实际IP)
sudo echo "192.168.1.100 k8s-master" >> /etc/hosts
sudo echo "192.168.1.101 k8s-node1" >> /etc/hosts

(2)安装容器运行时(containerd)

K8s 1.24+不再默认支持Docker,推荐使用containerd作为容器运行时:

# 安装依赖
sudo apt update && sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release

# 添加Docker官方源(containerd包含在Docker源中)
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装containerd
sudo apt update && sudo apt install -y containerd.io

# 生成containerd配置文件
sudo containerd config default | sudo tee /etc/containerd/config.toml

# 修改配置,设置SystemdCgroup为true(K8s要求)
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml

# 重启containerd并设置开机自启
sudo systemctl restart containerd
sudo systemctl enable containerd

(3)安装kubeadm、kubelet、kubectl

# 添加K8s官方源
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/trusted.gpg.d/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

# 安装工具
sudo apt update && sudo apt install -y kubeadm kubelet kubectl

# 锁定版本,避免自动更新
sudo apt-mark hold kubeadm kubelet kubectl

2. 初始化Master节点

仅在Master节点执行以下命令,初始化集群控制平面:

# 初始化集群(指定Pod网络网段,需与后续网络插件一致)
sudo kubeadm init --apiserver-advertise-address=192.168.1.100 --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.29.0

# 配置kubectl权限(普通用户执行)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 验证Master节点状态
kubectl get nodes

执行完成后,终端会输出Node节点加入集群的命令(形如kubeadm join 192.168.1.100:6443 --token xxx --discovery-token-ca-cert-hash sha256:xxx),请保存该命令,后续Node节点需要使用。

3. 安装网络插件(Calico)

K8s集群需要网络插件实现Pod间通信,Calico是轻量且常用的选择,仅在Master节点执行:

# 安装Calico网络插件
kubectl apply -f https://docs.projectcalico.org/v3.27/manifests/calico.yaml

# 等待插件运行(约1分钟)
kubectl get pods -n kube-system

当所有calico-xxx的Pod状态为Running时,网络插件安装完成。

4. 加入Node节点

在Node节点执行之前保存的kubeadm join命令,将节点加入集群:

sudo kubeadm join 192.168.1.100:6443 --token xxx --discovery-token-ca-cert-hash sha256:xxx

加入后,在Master节点执行kubectl get nodes,若所有节点状态为Ready,则集群部署成功!

若忘记join命令,可在Master节点执行kubeadm token create --print-join-command重新生成。

三、K8s实战:Pod/Service/Deployment管理

集群部署完成后,接下来通过实际操作,掌握核心资源的创建、管理与删除,真正上手K8s。

1. Pod管理:创建、查看与删除

Pod是K8s的最小部署单元,我们先创建一个Nginx Pod,体验最基础的Pod操作。

(1)创建Pod

通过yaml文件创建Pod是K8s的标准方式,创建nginx-pod.yaml文件:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.25-alpine
    ports:
    - containerPort: 80

执行创建命令:

kubectl apply -f nginx-pod.yaml

(2)查看Pod状态

# 查看所有Pod
kubectl get pods
# 查看Pod详细信息
kubectl describe pod nginx-pod
# 查看Pod日志
kubectl logs nginx-pod

当Pod状态为Running时,说明Nginx容器已成功启动。

(3)删除Pod

kubectl delete pod nginx-pod
# 或通过yaml文件删除
kubectl delete -f nginx-pod.yaml

注意:直接创建的Pod被删除后不会自动重建,生产环境中通常用Deployment管理Pod。

2. Deployment管理:声明式管控Pod

Deployment是管理Pod的控制器,能实现Pod的自动重建、扩缩容和滚动更新,是生产环境的首选方式。

(1)创建Deployment

创建nginx-deployment.yaml文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2 # 部署2个Pod副本
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25-alpine
        ports:
        - containerPort: 80

执行创建命令:

kubectl apply -f nginx-deployment.yaml

(2)查看Deployment与Pod

# 查看Deployment
kubectl get deployments
# 查看Deployment创建的Pod
kubectl get pods -l app=nginx # 通过标签筛选Pod

会看到2个Nginx Pod副本,这就是replicas: 2的作用。

(3)Pod扩缩容

修改Deployment的副本数,实现Pod的扩缩容:

# 扩缩容到3个副本
kubectl scale deployment nginx-deployment --replicas=3
# 再次查看Pod
kubectl get pods -l app=nginx

(4)滚动更新与回滚

当需要更新容器镜像时,Deployment支持滚动更新(不中断服务):

# 更新Nginx镜像版本
kubectl set image deployment nginx-deployment nginx=nginx:1.26-alpine
# 查看更新状态
kubectl rollout status deployment nginx-deployment

# 若更新出错,执行回滚
kubectl rollout undo deployment nginx-deployment

3. Service管理:为Pod提供稳定访问入口

Pod的IP是动态的,删除重建后会变化,Service通过标签选择器绑定Pod,提供固定的访问地址。

(1)创建NodePort类型的Service

Service主要有3种类型:ClusterIP(仅集群内访问)、NodePort(通过节点端口暴露服务)、LoadBalancer(云平台负载均衡)。我们创建NodePort类型的Service,让外部能访问Nginx服务。

创建nginx-service.yaml文件:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    app: nginx # 绑定标签为app=nginx的Pod
  ports:
  - port: 80 # Service内部端口
    targetPort: 80 # Pod的端口
    nodePort: 30080 # 节点暴露的端口(30000-32767之间)

执行创建命令:

kubectl apply -f nginx-service.yaml

(2)访问Service

# 查看Service信息
kubectl get services

输出中会看到nginx-serviceNodePort为30080,此时在浏览器访问http://任意节点IP:30080,就能看到Nginx的欢迎页面,说明Service配置成功。

(3)删除Service

kubectl delete service nginx-service

四、K8s入门常见问题与解决方案

  1. 节点状态为NotReady:大概率是网络插件未安装或运行失败,执行kubectl get pods -n kube-system查看Calico Pod状态,重新安装网络插件;
  2. Pod镜像拉取失败:国内可使用阿里云镜像仓库,修改yaml中的镜像为registry.cn-hangzhou.aliyuncs.com/google_containers/nginx:1.25-alpine
  3. kubeadm init失败:检查swap是否关闭、防火墙是否禁用、主机名和hosts配置是否正确;
  4. NodePort访问不通:检查节点防火墙是否开放对应端口(如30080),云服务器需在安全组中放行端口。
posted @ 2025-12-23 21:59  永动空间  阅读(0)  评论(0)    收藏  举报