初识Kubernetes
本文最后更新于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 需单独安装 kubeadmkubectlkubelet,而二进制部署需手动安装更多组件。

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
  • 所有节点需联网,机器需“干净”。

配置步骤

  1. 关闭 swap 分区:bash复制swapoff -a && sysctl -w vm.swappiness=0 sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
  2. 确保节点 MAC 地址或 product_uuid 唯一:bash复制ifconfig eth0 | grep ether | awk '{print $2}' cat /sys/class/dmi/id/product_uuid
  3. 检查网络节点互通性:bash复制ping baidu.com -c 10
  4. 允许 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
  5. 检查端口占用情况: 参考链接:https://kubernetes.io/zh-cn/docs/reference/networking/ports-and-protocols/
  6. 修改 cgroup 管理进程为 systemd:bash复制docker info | grep "Cgroup Driver:"确保输出为 Cgroup Driver: systemd
  7. 安装 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
  8. 检查时区:bash复制ln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime date -R

基于 kubeadm 初始化 K8S Master 组件

初始化步骤

  1. 导入镜像: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
  2. 使用 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 和命令。
  3. 拷贝授权文件:bash复制mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
  4. 查看 master 组件状态:bash复制kubectl get componentstatuses
  5. 查看工作节点:bash复制kubectl get nodes

初始化失败解决方法

  • 检查是否禁用 swap 分区、CPU 核心数是否不足、是否手动导入镜像。
  • 使用 kubeadm reset -f 重置环境后重新初始化。

基于 kubeadm 部署 Worker 组件

部署步骤

  1. 导入镜像: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
  2. 将 worker 节点加入集群(使用 master 节点生成的 token):bash复制kubeadm join 10.0.0.231:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
  3. 验证 worker 节点加入成功:bash复制kubectl get nodes

部署 Flannel CNI 插件

部署步骤

  1. 导入 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
  2. 获取资源清单:bash复制wget http://192.168.15.253/Resources/Kubernetes/K8S%20Cluster/kube-flannel.yml
  3. 部署 Flannel 组件:bash复制kubectl apply -f kube-flannel.yml
  4. 验证部署成功: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 网络

验证步骤

  1. 编写 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
  2. 部署应用:bash复制kubectl apply -f <file>
  3. 访问测试:bash复制curl <Pod-IP>

Kubectl 自动补全功能

  1. 添加环境变量:bash复制kubectl completion bash > ~/.kube/completion.bash.inc echo source '$HOME/.kube/completion.bash.inc' >> ~/.bashrc source ~/.bashrc
  2. 验证自动补全功能: 输入 kubectl 并按两次 Tab 键。

K8S 主机巡检流程

  1. 查看 master 组件状态:bash复制kubectl get cs
  2. 查看工作节点状态:bash复制kubectl get nodes
  3. 检查 Flannel 组件状态:bash复制kubectl get pods -n kube-flannel -o wide
  4. 检查网卡信息: 确认 cni0flannel.1 网段一致。
  5. 验证网络连通性: 参考 Pod 网络验证步骤。
  6. 检查节点互联网访问: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

  1. 编写资源清单:yaml复制apiVersion: v1 kind: Pod metadata: name: oldboyedu-linux95-xiuxian spec: containers: - name: c1 image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
  2. 创建资源: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
文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇