K8s 云原生技术 1

3559 字
18 分钟
K8s 云原生技术 1

1. 了解 K8s#

1.1 什么是 K8s#

Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。它的核心目标是让大规模分布式系统的运维更高效、更稳定。

1.2 核心功能#

  • 容器编排:统一管理多个容器实例,确保应用按预期运行。
  • 自动扩缩容:根据负载自动增加或减少容器数量。
  • 服务发现与负载均衡:为容器分配统一访问入口,并自动分发流量。
  • 自愈能力:容器故障时自动重启或替换,保证服务可用性。
  • 滚动更新与回滚:支持零停机部署新版本,并可快速回退。

1.3 为什么需要 K8s#

在使用 Docker 等容器技术后,如果容器数量增加,手动管理会变得复杂。K8s 提供了统一的 API 和调度机制,可以在裸机、虚拟机、公有云、私有云、混合云等多种环境中运行,并保持一致的部署体验。

1.4 K8s的架构简述#

K8s 集群主要由两部分组成

  • 控制平面(Master):包括 kube-apiserver(API 接口)、etcd(存储集群状态)、kube-scheduler(调度容器)、kube-controller-manager(控制器管理)。
  • 节点(Node):运行容器的工作机器,包含 kubelet(与控制平面通信)、kube-proxy(网络代理)以及容器运行时(如 Docker、containerd)。

arch
arch

控制平面是集群的大脑,核心组件包括:

  • kube-apiserver:集群 API 接口,负责认证、授权、状态管理。
  • etcd:分布式键值存储,保存所有集群状态数据。
  • kube-scheduler:根据资源与策略将 Pod 调度到合适节点。
  • kube-controller-manager:运行各种控制器,维持集群状态一致性。
  • cloud-controller-manager:与云平台 API 集成,管理云资源。

工作节点负责运行实际的应用容器,核心组件包括:

  • kubelet:与 API Server 通信,管理本节点 Pod 生命周期。
  • kube-proxy:维护网络规则,实现服务发现与负载均衡。
  • 容器运行时(如 containerd、CRI-O):负责容器启动、停止、镜像管理。

网络模型

  • Pod 网络:每个 Pod 拥有唯一 IP,集群内可直接通信。
  • Service 网络:通过虚拟 IP(ClusterIP)暴露一组 Pod,并支持负载均衡。
  • 网络策略:基于标签控制 Pod 间通信,实现安全隔离。

存储架构

  • Volume:与 Pod 生命周期绑定的存储单元(emptyDir、hostPath、NFS 等)。
  • PersistentVolume(PV)/PersistentVolumeClaim(PVC):实现持久化存储,支持动态供应。
  • StorageClass:定义不同存储类型和性能等级。

安全机制

  • 认证:支持客户端证书、Token、服务账户、OIDC 等。
  • 授权:RBAC、ABAC、节点授权等多种模式。
  • 密钥管理:Secret 对象安全存储敏感数据,可挂载到 Pod。

应用管理

  • Deployment:无状态应用的声明式部署与滚动更新。
  • StatefulSet:有状态应用的稳定标识与存储绑定。
  • DaemonSet:在每个节点运行系统级 Pod。
  • Job/CronJob:一次性或定时批处理任务。

这种架构设计使 Kubernetes 能够在多云、混合云环境中稳定运行,并支持自我修复、自动扩展、滚动升级等特性,满足现代微服务的高可用与弹性需求。

2. 部署 K8s#

2.1 系统环境准备#

  • 配置hosts文件
Terminal window
# 我这里准备搭建5节点集群,因此这里添加了五个节点
cat >> /etc/hosts << EOF
172.22.160.154 k8s-master1
172.22.160.107 k8s-master2
172.22.160.226 k8s-master3
172.22.160.187 k8s-worker1
172.22.160.230 k8s-worker2
EOF
  • 关闭swap

如果开启swap, kubelet会默认拒绝启动

必须关闭swap的原因:

  • 避免断崖式性能下降
  • 防止调度器误判,将更多的pod调度到该节点
  • swap会破坏k8s的内存保护机制
Terminal window
sudo swapoff -a
sudo sed -i '/swap/d' /etc/fstab
  • 加载内核模块
模块名称作用详解(Kubernetes 场景)
overlay联合文件系统(OverlayFS)。容器镜像由多层只读层叠加而成,容器运行时(如 containerd、Docker)需要依靠 OverlayFS 来堆叠这些层,并生成可写的容器顶层。若不加载,容器无法正常启动。
br_netfilter桥接网络过滤。Kubernetes 的 Pod 网络通常基于 Linux 网桥(Bridge)实现。该模块允许 iptables 规则(Kubernetes 的 Service 和 NetworkPolicy 依赖它)能够穿透网桥流量,对经过网桥的数据包进行防火墙规则匹配和 NAT 转发。若不加载,集群网络策略和 Service 访问会失效。
Terminal window
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay && sudo modprobe br_netfilter
  • 配置内核参数

打开 IPv4 转发

Terminal window
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system

2.2 安装 containerd#

这里我们使用 containerd 作为 k8s 的容器运行时

  • 安装 containerd
Terminal window
apt-get update
apt-get install -y containerd
  • 配置 containerd

先生成默认配置

Terminal window
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
  • 修改 containerd 配置(使用国内镜像)
Terminal window
# 编辑配置文件,修改 sandbox_image 为国内源
sed -i "s|sandbox = 'registry.k8s.io/pause:3.10.1'|sandbox = 'registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9'|g" /etc/containerd/config.toml
# 设置SystemCgroup
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
  • 重启 containerd
Terminal window
systemctl restart containerd
systemctl enable containerd
  • 永久配置指定crictl连接containerd socket
Terminal window
cat > /etc/crictl.yaml << EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

2.3 添加kubernetes APT源#

  • 安装依赖
Terminal window
apt-get update
apt-get install -y apt-transport-https ca-certificates curl gpg
  • 添加 kubernetes APT 源
Terminal window
# 添加阿里云 kubernetes APY 源
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | gpg --dearmor -o /usr/share/keyrings/kubernetes-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list
  • 重新安装 kubernetes 组件
Terminal window
apt-get update
apt-get install -y kubeadm kubelet kubectl
# 锁定版本防止自动升级
apt-mark hold kubeadm kubelet kubectl

2.4 初始化master节点#

  • 在master节点执行初始化
Terminal window
sudo kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \ # service虚拟IP值
--control-plane-endpoint=172.22.160.154 \ # 私网ip/域名
--apiserver-advertise-address=172.22.160.154 \ # 私网ip
--image-repository=registry.aliyuncs.com/google_containers \
--upload-certs # 证书上传
参数你填的值大白话解释(看完就懂)
--pod-network-cidr10.244.0.0/16给 Pod(容器)分配的“小区地址范围”。 每个 Pod 启动时都会从这个网段里拿一个 IP。注意:这个网段必须和你接下来要装的网络插件(比如 Flannel)完全一致,否则网络不通。
--service-cidr10.96.0.0/12给 Service(服务)分配的“虚拟 VIP 地址范围”。 你在集群里创建的 Service(比如 Nginx 服务),它的固定 Cluster-IP 就从这里出。 ⚠️ 极其重要:这个网段绝对不能和 Pod 网段重叠,也不能和宿主机的内网 IP(172.22.x.x)重叠,幸好你写的 10.96.x.x 都没撞上。
--control-plane-endpoint172.22.160.154控制平面(Master 节点)的“统一入口地址”。 所有 Worker 节点(工作节点)和 kubectl 工具都通过这个 IP 来找 API Server 聊天。 👉 如果你以后想搭建高可用(多个 Master),这里填的是负载均衡器的 IP;如果只是单机测试,直接填 Master 自己的内网 IP 就行(你这里填的就是单机或入口地址)。
--apiserver-advertise-address172.22.160.154API Server 绑定的“本机监听网卡 IP”。 Kubernetes 的 API 服务会监听在这台机器的这个内网 IP 上。 👉 小白注意:必须填你这台机器上真实存在的内网 IP(用 ifconfig 能看到的),不能填 127.0.0.1,否则其他机器连不上。
--image-repositoryregistry.aliyuncs.com/google_containers拉取镜像的“国内加速仓库”。 因为 Kubernetes 官方的镜像在国外(k8s.gcr.io),你大概率拉不下来。换成阿里云的镜像仓库,就能正常下载初始化所需的组件镜像(如 kube-apiserver、etcd 等)了。
--upload-certs(此参数没有赋值,仅作为开关)把证书“上传到集群里存一份”。 如果以后你想再加一台 Master 节点(高可用架构),开启这个参数,新加入的 Master 就能直接从集群里下载证书,不用你手动来回拷贝文件了。如果只搭单节点,加不加影响不大。
  • 配置 kubectl (只需要在第一个master上配置即可)
Terminal window
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
  • 安装网络插件:实现pod之间的跨节点通信
Terminal window
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
  • 查看集群状态
Terminal window
kubectl get nodes
Important

安装网络插件时由于需要从GitHub上拉取镜像因此需要先在节点上配置代理

Terminal window
# 配置代理
export http_proxy="http://<ip>:<端口>"
export https_proxy="http://<ip>:<端口>"

2.5 添加Worker节点#

Terminal window
kubeadm join 172.22.160.100:6443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash>

3. K8s 的简单使用#

3.1 创建 Nginx 部署文件#

新建一个文件,名字叫 nginx-deploy.yaml

# 1. 定义 Deployment(部署对象)
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment # 部署的名字
labels:
app: nginx # 给这个部署打个标签
spec:
replicas: 3 # 我要跑 3 个 Nginx 副本(容器实例)
selector:
matchLabels:
app: nginx # 这个部署要管理的 Pod 标签
template: # Pod 的模板(就像制作饼干的模具)
metadata:
labels:
app: nginx # Pod 自己的标签,必须和上面匹配
spec:
containers:
- name: nginx # 容器名字
image: nginx:latest # 使用官方 Nginx 镜像
ports:
- containerPort: 80 # 容器内部监听 80 端口
---
# 2. 定义 Service(服务暴露对象)
apiVersion: v1
kind: Service
metadata:
name: nginx-service # 服务的名字
spec:
type: NodePort # 暴露方式:通过宿主机的随机端口访问(适合小白测试)
selector:
app: nginx # 把流量转发给带有 app:nginx 标签的 Pod
ports:
- protocol: TCP
port: 80 # Service 自己占用的虚拟端口(ClusterIP 的端口)
targetPort: 80 # 转发到 Pod 内部的 80 端口
nodePort: 30080 # (可选)固定宿主机端口为 30080,不写则系统随机分配

3.2 执行部署命令#

Terminal window
# 应用这个配置文件(创建 Deployment 和 Service)
kubectl apply -f nginx-deploy.yaml

3.3 检查运行状态#

Terminal window
# 1. 看看 Pod 是否启动成功(3 个 Running 状态)
kubectl get pods
# 2. 看看 Service 是否分配了 IP 和端口
kubectl get svc nginx-service

执行 kubectl get svc 后,你会看到类似:

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service NodePort 10.105.xxx.xx <none> 80:30080/TCP 10s

记住最后的 30080(这就是宿主机上的访问端口)。

3.4 访问 Nginx#

Terminal window
curl http://172.22.160.154:30080

如果你在 Windows/Mac 本地浏览器访问:确保你的电脑能 ping 通 172.22.160.154,然后在浏览器输入 http://172.22.160.154:30080 就能看到经典的 “Welcome to nginx!” 页面。

4. Kubectl 命令的使用#

kubectl 是 Kubernetes 的命令行工具,也是你管理集群最核心的“瑞士军刀”

4.1 命令四要素#

所有 kubectl 命令都遵循一个基本格式:

Terminal window
kubectl [command] [TYPE] [NAME] [flags]
组成部分说明示例
command对资源执行的操作,如 create, get, describe, deleteget, describe
TYPE资源类型,如 pod, service, deployment不区分大小写,支持单数、复数或缩写(如 po 代表 pod)pod, svc, deploy
NAME资源的具体名称。区分大小写。如果省略,则操作针对该类型的所有资源my-nginx-pod
flags可选参数,例如指定命名空间 (-n) 或集群服务器地址 (--server)-n kube-system, --all-namespaces

注意:命令行指定的 flags 会覆盖默认值和环境变量。如果不确定某个命令怎么用,随时可以用 kubectl <command> --help 查看帮助。

4.2 基础命令#

命令作用示例
create从文件或标准输入创建资源kubectl create -f nginx.yaml
expose将 Deployment、Pod 等资源暴露为一个新的 Servicekubectl expose deploy nginx --port=80
run在集群上运行一个指定的镜像kubectl run nginx --image=nginx
set修改资源上的特定属性,如镜像版本kubectl set image deploy/nginx nginx=nginx:1.20
explain查看资源或字段的文档说明kubectl explain pods.spec.containers
get列出一个或多个资源的信息kubectl get pods -A (查看所有命名空间的 Pod)
edit直接在服务器上编辑资源的定义kubectl edit deploy nginx
delete删除资源kubectl delete -f nginx.yaml

4.3 部署命令#

命令作用示例
rollout管理资源的滚动更新(如查看状态、回滚)kubectl rollout status deploy/nginx
scale调整 Deployment、ReplicaSet 的副本数量kubectl scale deploy/nginx --replicas=5
autoscale为 Deployment 设置自动扩缩容策略kubectl autoscale deploy/nginx --min=2 --max=10

4.4 集群管理命令#

命令作用示例
certificate修改证书资源kubectl certificate approve my-csr
cluster-info显示集群的端点信息kubectl cluster-info
top显示节点或 Pod 的 CPU/内存资源使用情况kubectl top nodes
cordon将节点标记为不可调度(新 Pod 不会调度上去)kubectl cordon node-1
uncordon将节点标记为可调度kubectl uncordon node-1
drain排空节点上的 Pod,为维护做准备kubectl drain node-1 --ignore-daemonsets
taint更新节点上的污点kubectl taint nodes node-1 key=value:NoSchedule

4.5 故障排查和调试命令#

命令作用示例
describe显示一个或多个资源的详细信息(含事件)kubectl describe pod my-nginx-pod
logs打印 Pod 中容器的日志kubectl logs -f my-nginx-pod (持续输出)
attach附加到正在运行的容器kubectl attach my-nginx-pod -c my-container
exec在容器中执行命令kubectl exec -it my-nginx-pod -- /bin/bash
port-forward将本地端口转发到 Pod 的端口kubectl port-forward pod/my-nginx-pod 8080:80
proxy运行一个代理,以访问 Kubernetes API 服务器kubectl proxy
cp在容器和本地文件系统之间复制文件或目录kubectl cp /local/path my-pod:/remote/path
debug为工作负载或节点创建调试会话kubectl debug my-pod -it --image=busybox
events列出集群中的事件kubectl events --all-namespaces

4.6 高级命令#

命令作用示例
apply声明式地管理应用,通过文件定义资源状态(生产环境推荐kubectl apply -f nginx.yaml
patch部分更新资源的字段kubectl patch deploy nginx -p '{"spec":{"replicas":3}}'
replace用新的配置文件替换已有资源kubectl replace -f nginx.yaml
wait等待一个或多个资源达到特定状态kubectl wait --for=condition=ready pod/my-pod
kustomize从 Kustomization 文件构建资源kubectl kustomize ./kustomize/

4.7 其他常用命令#

命令作用示例
api-resources查看服务器上支持的 API 资源类型及其缩写kubectl api-resources
api-versions查看服务器支持的 API 版本kubectl api-versions
config修改 kubeconfig 文件(用于管理多个集群配置)kubectl config use-context my-cluster
version打印客户端和服务器的版本信息kubectl version
label更新资源上的标签kubectl label pods my-pod env=prod
annotate更新资源上的注解kubectl annotate pods my-pod description="my description"

4.8 其他#

  • 设置默认命名空间#

避免每次都要加 -n 参数。

Terminal window
kubectl config set-context --current --namespace=my-namespace
  • 使用简写和常用参数#

    • -A--all-namespaces 的简写。
    • -o wideget 命令时显示更多信息(如 Pod 的 IP 和所在节点)。
    • -o yaml/json:以 YAML 或 JSON 格式输出资源详情。
  • 查看资源使用情况#

Terminal window
# 查看节点资源使用
kubectl top nodes
# 查看 Pod 资源使用
kubectl top pods -A
  • 管理多个集群配置#

kubectl 默认读取 $HOME/.kube/config 文件。可以通过 KUBECONFIG 环境变量或 --kubeconfig 参数指定其他配置文件。

Terminal window
# 查看当前配置
kubectl config view
# 切换上下文(集群)
kubectl config use-context my-cluster-name
# 查看所有上下文
kubectl config get-contexts

5. 结尾#

这篇文章大量抄袭了 哦耶耶耶 学姐的课件,对学姐表示感谢

没了喵,谢谢欣赏

gopher
gopher

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

K8s 云原生技术 1
https://blog.tuf3i.cc/posts/k8s-learning-1/
作者
TuF3i
发布于
2026-06-20
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
TuF3i
一只区,什么也不想写
分类
标签
站点统计
文章
9
分类
7
标签
13
总字数
26,233
运行时长
0
最后活动
0 天前

目录