文章目录
- 前言
- 理论部分
- 实验部分
- 结语
前言
本文档系统介绍Kubernetes基础概念与安装流程,涵盖云原生技术演进、K8S核心架构、集群部署步骤及资源管理方法。通过理论与实践结合,详细说明K8S的组件原理、安装配置及日常操作,帮助读者构建完整的云原生知识体系。
- 云原生的基础概述
- K8S_是什么
- 为什么要用_K8S
- Kubernetes_集群架构与组件
- Kubernetes_核心概念与资源对象
- Kubernetes_核心能力与特性
- 部署方式_常见部署方案
- kubeadm_部署K8S
- Kubernetes_操作管理概述
- 项目生命周期管理
- 发布策略
- 声明式资源管理方法
理论部分
1_云原生的基础概述
云原生是一种基于云环境构建和运行应用的技术体系,使企业能够弹性扩展应用程序。
1.1_云原生的发展介绍
云原生技术发展历程以容器化和编排为核心脉络:
- 2004年:Google开始在内部大规模使用容器技术。
- 2008年:Google将Cgroups技术合并进Linux内核,为容器化技术奠定基础。
- 2013年:Docker项目正式发布,推动容器技术进入开源领域。
- 2014年:Kubernetes项目正式发布,成为容器编排的行业标准。
- 2015年:Google、Redhat、微软等共同发起成立CNCF(云原生计算基金会),推进云原生技术的开源生态。
- 2017年:CNCF成员达到170个,基金项目数量为14个。
- 2018年:CNCF迎来三周年,成员数达195个,基金项目19个。
1.2_云原生的定义
云原生技术帮助企业在公有云、私有云和混合云等动态环境中构建和运行可弹性扩展的应用。
①_公有云
公有云是一种云计算服务,其基础设施由云服务提供商在互联网上公开提供。用户按需使用和付费,无需拥有或管理基础设施。常见提供商包括亚马逊云、微软Azure、谷歌云等。
②_私有云
私有云是企业或组织在自己数据中心搭建的自有云平台,完全由企业拥有和控制,提供更高安全性和灵活性,用于托管核心应用程序。
③_混合云
混合云由公有云、私有云、本地IT基础设施和第三方云服务组成,使企业能按需选择云环境。敏感数据存储在私有云,非敏感应用部署在公有云,平衡成本与安全性。
1.3_云原生的技术栈
云原生技术栈包括容器化、服务网格、微服务架构等关键技术:
- 容器化:如Docker、containerd,提供应用的轻量级封装和环境一致性。
- 服务网格:例如Istio,管理服务间通信、安全性和流量控制。
- 微服务架构:将应用拆解为独立服务,支持灵活扩展和部署。
- 不可变基础设施:服务部署后不再修改,使用版本化镜像保持一致性。
- 声明式API:通过定义期望状态,由系统自动管理资源。
云原生 = 容器化(docker+k8s) + 微服务 + 无服务 + DevOps + Service Mesh + 云
①_微服务
微服务将应用拆解为多个独立服务,实现解耦和内聚。依据康威定律组织架构,可通过DDD(领域驱动设计)划分服务。
②_容器化
Docker是广泛应用的容器引擎(基于LXC技术),容器化为微服务提供隔离保障。K8S是容器编排系统,用于管理容器间负载均衡。
③_DevOps
DevOps是开发(Dev)与运维(Ops)的融合,倡导敏捷思维和协作文化,支撑云原生的持续交付。
④_持续交付
持续交付支持不停机更新和小步快跑,要求开发版与稳定版并存,需流程和工具支撑。
1.4_云原生的特征
云原生系统具备五大关键特征:
- 符合12因素应用:遵循12因素开发原则
- 面向微服务架构:服务解耦、松耦合
- 自服务敏捷架构:开发者自主管理云资源
- 基于API的协作:服务间通过API通信
- 抗脆弱性:系统具备自愈能力
①_12因素应用原则
| 序号 | 原则 | 说明 |
|---|---|---|
| 1 | 基准代码 | 同一代码库支持多部署 |
| 2 | 依赖管理 | 显式声明和隔离依赖项 |
| 3 | 配置管理 | 配置存储在环境中,避免硬编码 |
| 4 | 后端服务 | 外部服务作为附加资源 |
| 5 | 构建发布分离 | 清晰区分构建与运行阶段 |
| 6 | 无状态进程 | 应用以无状态运行,便于扩展 |
| 7 | 端口绑定 | 通过端口提供服务 |
| 8 | 并发处理 | 通过进程模型扩展 |
| 9 | 快速启动 | 启动迅速,终止时保证数据一致性 |
| 10 | 环境一致 | 开发/预发布/生产环境尽量一致 |
| 11 | 日志管理 | 统一收集展示日志 |
| 12 | 管理进程 | 管理性任务使用与常驻进程相同的环境 |
2_K8S_是什么
K8S是Kubernetes的简写,意为"舵手/导航者",是自动化容器化应用部署、扩展和管理的开源平台。
2.1_K8S的起源与定义
源起 :受Google的Borg系统启发,使用Go语言重写并捐赠给CNCF
名称含义 :源自希腊语,意为"舵手/导航者"
官网:
- 英文:https://kubernetes.io
- 中文:https://kubernetes.io/zh-cn/docs
版本节奏 :每年约四个发布版本(如1.12、1.15...1.30、1.34)
关键时间线: - 2014年:Docker与Kubernetes蜜月期
- 2015~2016年:Kubernetes与RKT vs Docker竞争(Docker胜出)
- 2017年:rkt和containerd捐献给CNCF
- 2020年:Kubernetes宣布废弃dockershim
- 2022年5月3日:Kubernetes v1.24正式发布(移除dockershim)
2.2_版本特性
Kubernetes 1.24起移除对Docker的内建支持,节点必须使用符合CRI(Container Runtime Interface)的运行时(如containerd、CRI-O)。Docker构建的镜像仍兼容(符合OCI标准),但需使用CRI运行时。
3_为什么要用_K8S
Kubernetes解决传统部署在扩展、管理和容错方面的困难,主要解决以下问题:
3.1_核心优势
- 自动化运维:通过命令或声明式方式自动完成部署、更新等操作
- 弹性伸缩:依据CPU、内存等指标自动扩缩Pod副本数
- 容灾/自愈:自动重建故障Pod,维持副本数量
- 服务发现与负载均衡:通过Service提供稳定访问入口
- 滚动升级与回滚:支持渐进式升级和回滚
- 集中管理配置:通过ConfigMap/Secret统一管理配置与密钥
- 存储编排:集成NFS、Ceph等外部存储
- 批处理支持:通过Job/CronJob管理定时任务
4_Kubernetes_集群架构与组件
Kubernetes采用控制平面+工作节点的主从架构,控制平面负责调度管理,节点运行实际负载。
4.1_控制平面组件
| 组件 | 角色 | 职责 |
|---|---|---|
| kube-apiserver | 核心大脑 | 集群API接口入口,处理资源操作请求 |
| kube-controller-manager | 控制器 | 运行控制器(Node/ReplicaSet等),确保状态符合期望 |
| kube-scheduler | 调度器 | 为Pod选择合适节点,基于预选和优选策略 |
| etcd | 核心存储 | 分布式键值存储,用于持久化保存所有资源状态 |
高可用建议:生产环境部署多实例避免单点故障
4.2_工作节点组件
| 组件 | 职责 |
|---|---|
| kubelet | 节点代理,执行Pod任务并汇报状态 |
| kube-proxy | 实现Service网络规则与负载转发 |
| container runtime | 负责容器镜像拉取、容器生命周期管理(CRI运行时) |
①_Docker_dockershim_与_containerd
- Kubernetes 1.20起弃用Docker支持,1.24正式移除dockershim
- 节点必须使用CRI兼容运行时(containerd、CRI-O等)
- containerd是主流轻量级CRI运行时(K8S 1.28默认推荐)
5_Kubernetes_核心概念与资源对象
Kubernetes通过多种资源对象管理容器化应用。
5.1_核心概念
| 资源 | 含义与用途 |
|---|---|
| Pod | 最小可调度单位,共享网络/存储的容器组 |
| 控制器 | 确保Pod数量/状态的控制器(Deployment/ReplicaSet/StatefulSet等) |
| Service 4层网络 | 为Pod提供稳定访问入口,带负载均衡功能 |
| Ingress 7层网络 | 管理HTTP/HTTPS层外部流量路由 |
| Label/Annotation | Label标识资源,Annotation存储元数据 |
| Namespace | 逻辑隔离集群资源 |
5.2_资源定义结构
Kubernetes资源通过YAML/JSON定义,包含字段:
apiVersion:API版本kind:资源类型metadata:对象元数据spec:期望状态status:当前状态(只读)
5.3_部署方式对比
| 部署方式 | 适用场景 |
|---|---|
| Minikube | 本地单节点体验 |
| kubeadm | 官方推荐的中小型集群部署 |
| 二进制/源码 | 高可控生产环境 |
| 云托管服务 | 企业级生产环境(如GKE/EKS/AKS) |
6_Kubernetes_核心能力与特性
Kubernetes提供七项关键能力:
- 自动伸缩:Horizontal/Vertical Pod Autoscaler
- 服务发现与负载均衡:DNS服务发现,Service负载均衡
- 滚动更新/回滚:声明式更新与回溯
- 容错/自愈:节点/Pod故障自动迁移
- 集中配置/密钥管理:ConfigMap/Secret机制
- 存储编排与持久化:PV/PVC/StorageClass
- 安全管理:RBAC/NetworkPolicy等
7_部署方式_常见部署方案
7.1_典型集群环境
| 节点 | 角色 | IP | 主机名 |
|---|---|---|---|
| node13 | 管理节点 | 192.168.100.13 | k8s-master01 |
| node14 | 工作节点 | 192.168.100.14 | k8s-node01 |
| node15 | 工作节点 | 192.168.100.15 | k8s-node02 |
kubeadm + containerd 或 二进制部署 + containerd 兼顾灵活性与稳定性
故障日志 :k8s不能使用有下划线的主机名,例如k8s-node01。
操作系统 :CentOS 7.9.2009
Kubelet版本:v1.28.2
实验部分
8_kubeadm_部署K8S
8.1_集群部署环境准备
所有节点
①_配置主机名
shell
hostnamectl set-hostname k8s-master01
hostnamectl:系统主机名管理工具
set-hostname:设置主机名的子命令
k8s-master01:指定新主机名,另外两个节点为k8s-node01、k8s-node02
②_配置主机映射
shell
cat >>/etc/hosts <<EOF
192.168.100.13 k8s-master01
192.168.100.14 k8s-node01
192.168.100.15 k8s-node02
EOF
/etc/hosts:本地DNS解析文件
cat >>:追加内容到文件
EOF:文件结束符标记
③_关闭防火墙和selinux
shell
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
systemctl stop:临时停止服务
systemctl disable:禁用开机自启
setenforce 0:临时关闭SELinux
sed -i:文件内编辑替换
④_关闭swap分区
shell
swapoff -a
sed -i '/swap/s/^/#/g' /etc/fstab
swapoff -a:关闭所有swap分区
sed -i:注释/etc/fstab中swap条目
⑤_配置内核参数和优化
shell
cat >/etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
/etc/sysctl.d/k8s.conf:K8S专用内核参数文件
sysctl --system:加载所有配置
⑥_安装ipset和ipvsadm
shell
yum -y install conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
ipvsadm:IPVS管理工具(提供L4负载均衡)
ipset:IP集合工具(提升iptables效率)
⑦_加载IPVS内核模块
shell
cat >/etc/modules-load.d/ipvs.conf <<EOF
# Load IPVS at boot
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
nf_conntrack_ipv4
EOF
systemctl enable --now systemd-modules-load.service
- 验证模块加载状态
shell
lsmod |egrep "ip_vs|nf_conntrack_ipv4"
ini
nf_conntrack_ipv4 15053 0
nf_defrag_ipv4 12729 1 nf_conntrack_ipv4
ip_vs_sh 12688 0
ip_vs_wrr 12697 0
ip_vs_rr 12600 0
ip_vs 145458 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack 139264 2 ip_vs,nf_conntrack_ipv4
libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
⑧_安装Containerd运行时
shell
yum -y install yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
cat >>/etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
yum -y install containerd.io
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
sed -i '/SystemdCgroup/s/false/true/g' /etc/containerd/config.toml
sed -i '/sandbox_image/s/registry.k8s.io/registry.aliyuncs.com\/google_containers/g' /etc/containerd/config.toml
systemctl enable --now containerd
containerd config default:生成默认配置
SystemdCgroup=true:使用systemd作为cgroup驱动
registry.aliyuncs.com/google_containers:阿里镜像加速源
8.2_安装kubectl_kubelet_kubeadm
①_添加阿里Kubernetes源
shell
cat >/etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
②_安装核心组件
shell
yum -y install kubectl-1.28.2 kubelet-1.28.2 kubeadm-1.28.2
systemctl enable --now kubelet
kubeadm:集群初始化工具
kubelet:节点代理进程
kubectl:命令行管理工具
8.3_部署Kubernetes集群
node13 管理节点 192.168.100.13 k8s-master01
①_初始化集群配置
shell
cat >/tmp/kubeadm-init.yaml <<EOF
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.28.2
controlPlaneEndpoint: 192.168.100.13:6443
imageRepository: registry.aliyuncs.com/google_containers
networking:
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/16
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
EOF
controlPlaneEndpoint: 192.168.100.13:6443:API服务器端点
podSubnet: 10.244.0.0/16:Pod网络CIDR(需与CNI一致)
serviceSubnet: 10.96.0.0/16:Service网络CIDR
mode: ipvs:启用IPVS负载均衡
②_初始化集群
shell
kubeadm init --config=/tmp/kubeadm-init.yaml --ignore-preflight-errors=all
--ignore-preflight-errors=all:忽略所有预检错误(仅测试环境用)输出关键信息:
kubeadm join ...用于节点加入
ini
Your Kubernetes control-plane has initialized successfully!
# 根据以下提示创建kubectl
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
# 加入其他控制平面节点
kubeadm join 192.168.100.13:6443 --token lt5k3r.7wz0mwhyc65635by \
--discovery-token-ca-cert-hash sha256:ce4424ab492a2a635b96e0b3b04ab6c907eb4d1b2c31d4671a6c32bc0322fd27 \
--control-plane
Then you can join any number of worker nodes by running the following on each as root:
# 加入工作节点
kubeadm join 192.168.100.13:6443 --token lt5k3r.7wz0mwhyc65635by \
--discovery-token-ca-cert-hash sha256:ce4424ab492a2a635b96e0b3b04ab6c907eb4d1b2c31d4671a6c32bc0322fd27
③_根据提示配置kubectl
shell
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
admin.conf:集群管理配置文件路径非root用户需执行此操作
- 查看node节点和pod
shell
kubectl get node
kubectl get pod -A
注:Node节点为NotReady,因为corednspod没有启动,缺少网络pod
④_安装CNI网络插件Calico
shell
wget https://docs.tigera.io/archive/v3.25/manifests/calico.yaml
vim calico.yaml # 修改第4551行
conf
4551 - name: CALICO_IPV4POOL_CIDR
4552 value: "10.244.0.0/16"
将
CALICO_IPV4POOL_CIDR改为与podSubnet一致(10.244.0.0/16)
shell
kubectl apply -f calico.yaml
Calico官网:https://docs.tigera.io/archive/v3.25/manifests/calico.yaml
⑤_添加工作节点
k8s-node节点
shell
kubeadm join 192.168.100.13:6443 --token lt5k3r.7wz0mwhyc65635by \
--discovery-token-ca-cert-hash sha256:ce4424ab492a2a635b96e0b3b04ab6c907eb4d1b2c31d4671a6c32bc0322fd27
该命令在master节点初始化输出中获取
192.168.100.13:6443:控制平面接口端口
8.4_部署Kubernetes_Dashboard
①_下载配置文件
shell
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
②_修改Service类型
shell
vim recommended.yaml
conf
32 kind: Service
33 apiVersion: v1
34 metadata:
35 labels:
36 k8s-app: kubernetes-dashboard
37 name: kubernetes-dashboard
38 namespace: kubernetes-dashboard
39 spec:
40 type: NodePort
41 ports:
42 - port: 443
43 targetPort: 8443
44 nodePort: 30000
45 selector:
46 k8s-app: kubernetes-dashboard
type: NodePort:启用节点端口访问
nodePort: 30000:固定访问端口
③_创建Dashboard资源
shell
kubectl apply -f recommended.yaml
④_创建管理员账户
shell
cat >dashboard-admin.yaml <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin
namespace: kubernetes-dashboard
---
apiVersion: v1
kind: Secret
metadata:
name: kubernetes-dashboard-admin
namespace: kubernetes-dashboard
annotations:
kubernetes.io/service-account.name: "admin"
type: kubernetes.io/service-account-token
EOF
kubectl apply -f dashboard-admin.yaml
cluster-admin:K8S最高权限角色
⑤_获取访问Token
shell
Token=$(kubectl -n kubernetes-dashboard get secret |awk '/kubernetes-dashboard-admin/ {print $1}')
kubectl describe secrets -n kubernetes-dashboard ${Token} |grep token |awk 'NR==NF {print $2}'
输出的长字符串即为登录Token
结语
K8S核心组件:控制平面(apiserver/controller/scheduler/etcd)与工作节点(kubelet/kube-proxy)构成分布式架构,1.24+版本依赖CRI运行时(如containerd)。
部署关键点:需关闭防火墙/SELinux/Swap,配置内核参数,Calico网络CIDR必须与kubeadm配置一致,serviceSubnet固定为10.96.0.0/16。
服务暴露方式:NodePort端口范围30000-32767,Service中port为集群内部端口,nodePort为外部访问端口。
发布策略:滚动更新(默认)、蓝绿发布(通过Service切换)、金丝雀发布(通过pratition控制)。
!question\] 请问Kubernetes移除Dockershim后如何处理容器运行时? 官方要求使用CRI兼容运行时(如containerd、CRI-O),Docker镜像仍兼容但需通过CRI接口调用。 \[!question\] 请问K8S网络如何实现跨节点通信? Calico方案:通过BGP路由协议构建全互联网络;Flannel方案:VXLAN/VLAN封装实现overlay网络。 \[!question\] 请问Service的三种关键端口区别? port:ClusterIP访问端口;nodePort:节点外部访问端口;targetPort:Pod容器实际端口。 \[!question\] 金丝雀发布如何操作? 通过`kubectl set image`更新镜像后立即`rollout pause`,观察部分流量验证,确认后`rollout resume`继续更新。