本文最后更新于45 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
应用部署演进之路
传统部署的痛点
- 隔离性差
- 移植性差
- 维护成本高
- 资源占用问题(如端口冲突)
虚拟机时代
- 解决了资源隔离问题,但带来了额外开销
- 性能变差(CPU、内存、磁盘、网卡等资源虚拟化)
- 移植性有一定提升,但迁移仍有痛点(虚拟化产品不兼容)
容器时代
- 启动速度快
- 性能强
- 迁移方便
- 部署方便
云计算的实现方式
- IaaS(基础设施即服务)
- PaaS(平台即服务)
- SaaS(软件即服务)
- BaaS(后端即服务)
- FaaS(函数即服务)
Kubernetes 介绍
Kubernetes(简称 K8s)是一款跨节点的容器编排工具,通常以集群方式运行。它用于自动部署、扩缩容和管理容器化应用程序,源自 Google 15 年生产环境的运维经验,凝聚了社区的最佳创意和实践。
官网地址:https://kubernetes.io/zh-cn/
K8S 简史
- 2013 年:Docker 开源,备受关注。
- 2014 年 6 月:Google 基于 Borg 系统开源 Kubernetes,底层使用 Docker 作为容器运行时。
- 2014 年 12 月:Docker 公司推出 K8S 竞品 Docker Swarm。
- 2017 年底:Kubernetes 在容器编排市场完胜 Docker Swarm(K8S 占 72%,Swarm 占 13%)。
- 2018 年:国内开始大规模使用 K8S,各大云厂商推出 K8S 产品。
- 2020 年:Google 宣布 K8S 1.22+ 版本后弃用 Docker 容器运行时。
- 2022 年初:K8S 1.24 版本移除 docker-shim 组件,改用 containerd。
- 2025 年初:K8S 1.33.X 版本发布。
K8S 架构
Master(控制平面)
- etcd:数据库,存储集群状态。
- api-server:集群访问入口,负责认证、鉴权和资源访问控制。
- scheduler:负责 Pod 的调度。
- controller-manager:维护集群状态。
- cloud-controller-manager:可选组件,云厂商使用。
Worker Node(工作节点)
- kubelet:管理 Pod 生命周期,监控节点资源状态。
- kube-proxy:负责 Pod 负载均衡,支持 iptables 和 ipvs。
CNI(容器网络接口)
- 常见 CNI 插件:Flannel、Calico 等。
K8S 网络类型
- 组件通信网络:默认网段
10.0.0.0/24
。 - 跨节点容器通信网段:推荐
10.100.0.0/16
,可根据规模调整。 - Service 网段:提供负载均衡和服务发现功能,推荐
10.200.0.0/16
。
K8S 部署方式
官方部署方式
- 二进制部署:手动部署各组件,配置繁琐,适合老手。
- kubeadm 部署:快速部署,适合新手,支持高可用环境。
第三方部署方式
- 国内:
- KubeSphere:基于 kubeadm,提供图形化管理界面。
- KubeBoard:基于 kubeadm,提供图形化管理界面。
- Kubeasz:基于二进制 + Ansible 实现快速部署。
- 国外:
- Rancher:提供图形化管理界面,研发了轻量级 K8S(K3S)。
- 云厂商:
- 阿里云 ACK
- 腾讯云 TKE
- 华为云 CCE
- 亚马逊 EKS
- 京东云、百度云等。
其他部署方式
- Minikube:适合 Windows 开发环境,不建议用于生产。
- Kind:轻量级命令行工具,适合多套 K8S 环境部署。
二进制部署与 kubeadm 部署的区别
- 相同点:都可以部署 K8S 高可用集群。
- 不同点:
- 部署难度:kubeadm 简单。
- 部署时间:kubeadm 更短。
- 证书管理:kubeadm 自建 10 年有效期 CA 证书,各组件证书有效期 1 年。
- 软件安装:kubeadm 需单独安装
kubeadm
、kubectl
和kubelet
,而二进制部署需手动安装更多组件。
K8S 集群环境准备
硬件与软件要求
- 硬件配置:2 核 CPU,4GB 内存,50GB+ 磁盘。
- 操作系统:推荐 Ubuntu 22.04.04 LTS。
节点配置
- IP 和主机名示例:复制
10.0.0.231 master231 10.0.0.232 worker232 10.0.0.233 worker233
- 所有节点需联网,机器需“干净”。
配置步骤
- 关闭 swap 分区:bash复制
swapoff -a && sysctl -w vm.swappiness=0 sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
- 确保节点 MAC 地址或 product_uuid 唯一:bash复制
ifconfig eth0 | grep ether | awk '{print $2}' cat /sys/class/dmi/id/product_uuid
- 检查网络节点互通性:bash复制
ping baidu.com -c 10
- 允许 iptables 检查桥接流量:bash复制
cat <<EOF | tee /etc/modules-load.d/k8s.conf br_netfilter EOF cat <<EOF | tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sysctl --system
- 检查端口占用情况: 参考链接:https://kubernetes.io/zh-cn/docs/reference/networking/ports-and-protocols/
- 修改 cgroup 管理进程为 systemd:bash复制
docker info | grep "Cgroup Driver:"
确保输出为Cgroup Driver: systemd
。 - 安装 kubeadm、kubelet 和 kubectl:
- 配置软件源:bash复制
apt-get update && apt-get install -y apt-transport-https curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF apt-get update
- 安装指定版本:bash复制
apt-get -y install kubelet=1.23.17-00 kubeadm=1.23.17-00 kubectl=1.23.17-00
- 检查版本:bash复制
kubeadm version kubectl version kubelet --version
- 配置软件源:bash复制
- 检查时区:bash复制
ln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime date -R
基于 kubeadm 初始化 K8S Master 组件
初始化步骤
- 导入镜像:bash复制
wget http://192.168.15.253/Resources/Kubernetes/K8S%20Cluster/oldboyedu-master-1.23.17.tar.gz docker load -i oldboyedu-master-1.23.17.tar.gz
- 使用 kubeadm 初始化 master 节点:bash复制
kubeadm init --kubernetes-version=v1.23.17 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.100.0.0/16 --service-cidr=10.200.0.0/16 --service-dns-domain=oldboyedu.com
初始化成功后,会生成加入集群的 token 和命令。 - 拷贝授权文件:bash复制
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 查看 master 组件状态:bash复制
kubectl get componentstatuses
- 查看工作节点:bash复制
kubectl get nodes
初始化失败解决方法
- 检查是否禁用 swap 分区、CPU 核心数是否不足、是否手动导入镜像。
- 使用
kubeadm reset -f
重置环境后重新初始化。
基于 kubeadm 部署 Worker 组件
部署步骤
- 导入镜像:bash复制
wget http://192.168.15.253/Resources/Kubernetes/K8S%20Cluster/oldboyedu-slave-1.23.17.tar.gz docker load -i oldboyedu-slave-1.23.17.tar.gz
- 将 worker 节点加入集群(使用 master 节点生成的 token):bash复制
kubeadm join 10.0.0.231:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
- 验证 worker 节点加入成功:bash复制
kubectl get nodes
部署 Flannel CNI 插件
部署步骤
- 导入 Flannel 镜像:bash复制
wget http://192.168.15.253/Resources/Kubernetes/K8S%20Cluster/oldboyedu-flannel-v1.6.2-v0.26.4.tar.gz docker load -i oldboyedu-flannel-v1.6.2-v0.26.4.tar.gz
- 获取资源清单:bash复制
wget http://192.168.15.253/Resources/Kubernetes/K8S%20Cluster/kube-flannel.yml
- 部署 Flannel 组件:bash复制
kubectl apply -f kube-flannel.yml
- 验证部署成功:bash复制
kubectl get pods -o wide -n kube-flannel
网络配置
- 手动创建
cni0
网卡(如需手动配置):bash复制ip link add cni0 type bridge ip link set dev cni0 up ip addr add <IP>/24 dev cni0
- 检查网卡信息:bash复制
ifconfig
验证 Pod 网络
验证步骤
- 编写 Pod 资源清单:yaml复制
apiVersion: v1 kind: Pod metadata: name: xiuxian-v1 spec: nodeName: worker232 containers: - image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1 name: xiuxian --- apiVersion: v1 kind: Pod metadata: name: xiuxian-v2 spec: nodeName: worker233 containers: - image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2 name: xiuxian
- 部署应用:bash复制
kubectl apply -f <file>
- 访问测试:bash复制
curl <Pod-IP>
Kubectl 自动补全功能
- 添加环境变量:bash复制
kubectl completion bash > ~/.kube/completion.bash.inc echo source '$HOME/.kube/completion.bash.inc' >> ~/.bashrc source ~/.bashrc
- 验证自动补全功能: 输入
kubectl
并按两次 Tab 键。
K8S 主机巡检流程
- 查看 master 组件状态:bash复制
kubectl get cs
- 查看工作节点状态:bash复制
kubectl get nodes
- 检查 Flannel 组件状态:bash复制
kubectl get pods -n kube-flannel -o wide
- 检查网卡信息: 确认
cni0
和flannel.1
网段一致。 - 验证网络连通性: 参考 Pod 网络验证步骤。
- 检查节点互联网访问:bash复制
ping baidu.com
部署 K8S 可能出现的错误
- 时区配置错误。
- CPU 核心不足或未禁用 swap。
- 镜像拉取失败:手动导入镜像。
- 节点名称不一致:建议重做。
- Flannel 网段不一致:删除
cni0
网卡后重试。 - 虚拟机无法联网:检查网络配置。
- 虚拟机无法启动:检查资源文件。
K8S 内置资源
查看集群内置资源:bash复制
kubectl api-resources
相关字段说明:
- NAME:资源名称。
- SHORTNAMES:资源简称。
- APIVERSION:资源 API 版本号。
- NAMESPACED:是否支持命名空间。
- KIND:资源类型。
资源清单结构
- apiVersion:资源 API 版本号。
- kind:资源类型。
- metadata:元数据,描述资源信息。
- spec:期望状态。
- status:实际状态(由 K8S 自动维护)。
Pod 资源管理
创建 Pod
- 编写资源清单:yaml复制
apiVersion: v1 kind: Pod metadata: name: oldboyedu-linux95-xiuxian spec: containers: - name: c1 image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
- 创建资源:bash复制
kubectl apply -f <file>
查看 Pod
bash复制
kubectl get pods -o wide
删除 Pod
bash复制
kubectl delete -f <file>
标签管理
- 给 Pod 打标签:bash复制
kubectl label pod <pod-name> label=value
- 基于标签删除 Pod:bash复制
kubectl delete pods -l label=value
指定节点调度
yaml复制
apiVersion: v1
kind: Pod
metadata:
name: oldboyedu-linux95-nodename
spec:
nodeName: worker232
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
使用宿主机网络
yaml复制
apiVersion: v1
kind: Pod
metadata:
name: oldboyedu-linux95-hostnetwork
spec:
hostNetwork: true
nodeName: worker233
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
多个资源合并为一个文件
yaml复制
apiVersion: v1
kind: Pod
metadata:
name: xiuxian-v1
spec:
nodeName: worker232
containers:
- image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
name: xiuxian
---
apiVersion: v1
kind: Pod
metadata:
name: xiuxian-v2
spec:
nodeName: worker233
containers:
- image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2
name: xiuxian