前言
你是不是也这样?
- 看到kubectl get pods就头大?
- 面对YAML文件像在读天书?
- 一听到 “etcd”、“Ingress”、“Service Mesh” 就想关掉网页?
别慌——你不是一个人。
Kubernetes(K8s)被誉为“云原生时代的操作系统”,强大,却也以陡峭的学习曲线“劝退”了无数开发者和运维新人。官方文档密如丛林,概念抽象,术语满天飞,更别说本地搭建一个能跑的集群有多折腾。
但其实,K8s没你想的那么可怕。它只是需要一个正确的打开方式:从真实场景出发,用最直白的语言解释核心概念,配合一步步可操作的实验,让你在“做中学”,而不是在术语里溺水。这就是本教程诞生的原因。
我们不要“理论轰炸”,只要清晰路径 + 动手实践。从安装Minikube到部署第一个Pod,从理解Deployment到配置Ingress对外暴露服务,再到用Helm管理应用……每一步都有截图、命令、避坑提示,像朋友手把手教你一样。
无论你是:
- 想转型云原生的后端开发
- 刚接触容器的运维工程师
- 或只是好奇“K8s到底能干啥”的技术爱好者
只要你愿意动手敲几行命令,7 天,足够你从“完全不懂”走到“独立部署应用上线”。别再让Kubernetes成为简历上的“了解”项。这一次,我们一起把它变成你的实战技能。
准备好了吗?让我们从第一个kubectl命令开始,真正走进K8s的世界。

1.什么是Kubernetes?
Kubernetes(常缩写为K8s,读作 “kay-tayz” 或 “kube”)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。
想象你有一个用Docker打包的应用,现在要把它运行在多台服务器上,并且做到:
- 自动启动和停止容器
- 某个容器挂了?自动重启它!
- 流量暴增?自动加机器扩容!
- 平滑更新版本,不中断服务
- 统一管理网络、存储、配置、密钥
这些事手动做极其繁琐,而Kubernetes就是干这个的——它把一群机器抽象成一个“超级计算机”,你只需告诉它“我要运行什么”,它就负责搞定一切细节。
| 概念 | 作用 |
|---|---|
| Pod | 最小调度单位,一个或多个容器的组合(通常一个 Pod = 一个应用实例) |
| Deployment | 定义应用的期望状态(比如“始终运行 3 个副本”),K8s 自动维持 |
| Service | 为Pod提供稳定网络访问入口(即使Pod重启IP变了也能访问) |
| Ingress | 管理外部HTTP/HTTPS流量如何进入集群(类似反向代理) |
| Namespace | 集群内的“虚拟分区”,用于隔离不同项目或团队 |
| kubectl | 官方命令行工具,用来和Kubernetes集群交互 |
谁在用Kubernetes?
- 几乎所有主流云厂商:AWS EKS、Google GKE、Azure AKS
- 大型企业:Netflix、Spotify、华为、阿里、字节跳动
- 开源项目:Prometheus、Istio、Argo CD等都深度集成K8s
为什么它如此重要?
- 标准化:无论底层是物理机、虚拟机还是云,K8s提供统一接口
- 弹性伸缩:秒级扩缩容,应对流量高峰
- 高可用:自动故障恢复,保障服务不中断
- 生态强大:CNCF(云原生计算基金会)旗下有上千个兼容工具
如果你刚入门,别被术语吓退——从一个Pod开始,你也能驾驭这个强大的系统。
2.前置知识与环境准备
先掌握以下3个核心概念,避免后续操作迷茫:
- Pod:Kubernetes的最小部署单元,可包含一个或多个容器,这些容器共享网络和存储资源;
- Node:运行Pod的服务器(可以是物理机或虚拟机),分为Master节点(控制节点,负责集群管理)和Worker节点(工作节点,负责运行应用负载);
- Controller:控制器,用于管理Pod的生命周期。例如,Deployment是一种常见的Controller,能确保指定数量的Pod副本始终处于运行状态。
环境要求:
| 角色 | 配置建议 | 系统要求 |
|---|---|---|
| Master节点 | 2核2G以上,1台 | CentOS7,64位 |
| Worker节点 | 2核2G以上,至少1台(推荐2+台) | 同上 |
| 网络 | 所有节点互通,禁用防火墙/SELinux | – |
基础环境准备(Master和Worker都操作):
# 1. 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
# 2. 关闭SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
# 3. 关闭swap(K8s强制要求)
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
# 4. 配置主机名(Master节点示例,Worker节点改名称)
hostnamectl set-hostname k8s-master
# 5. 配置 hosts(可选,但推荐)
echo "192.168.42.140 k8s-master" >> /etc/hosts
# 6. 加载内核模块
cat > /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOFF
modprobe overlay && modprobe br_netfilter
# 7. 配置 sysctl 参数
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
EOF
sysctl --system
3.安装containerd(Master和Worker都操作)
安装依赖:
yum install -y yum-utils device-mapper-persistent-data lvm2
添加Docker/Containerd阿里云仓库:
cat > /etc/yum.repos.d/containerd.repo <<EOF
[containerd]
name=containerd
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
EOF
安装containerd:
yum install -y containerd.io
生成默认配置并启用 systemd cgroup:
containerd config default > /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
启动containerd:
systemctl enable --now containerd
验证CRI接口:
crictl --runtime-endpoint unix:///var/run/containerd/containerd.sock info
4.Master安装Kubernetes组件(kubeadm, kubelet, kubectl)
添加阿里云Kubernetes源:
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装指定版本:
yum install -y kubelet-1.27.1 kubeadm-1.27.1 kubectl-1.27.1 --disableexcludes=kubernetes
启动kubelet(此时会处于crash loop,正常,等join后才就绪):
systemctl enable --now kubelet
你可以通过kubectl version –client确认版本是否匹配Master。
5.Master配置kubectl
初始化Master节点:
# 忽略 CPU 检查(仅限测试!生产环境请用 ≥2 核)
kubeadm init \
--image-repository=registry.aliyuncs.com/google_containers \
--apiserver-advertise-address=192.168.42.140 \
--kubernetes-version=v1.27.1 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=NumCPU
配置kubectl(仅Master执行):
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
安装网络插件:
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
验证集群状态:
kubectl get nodes # 应显示 Ready
kubectl get pods -A # 所有 Pod Running
至此,单节点Kubernetes集群部署完成!
6.Worker安装Kubernetes组件(kubeadm, kubelet, kubectl)
以下是Worker节点手动安装Kubernetes并加入集群的详细步骤。
安装kubelet、kubeadm、kubectl(使用国内阿里云源):
添加Kubernetes阿里云镜像源:
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
装指定版本(建议与Master一致,例如 v1.27.1)
yum install -y kubelet-1.27.1 kubeadm-1.27.1 kubectl-1.27.1 --disableexcludes=kubernetes
启动kubelet(此时会处于crash loop,正常,等join后才就绪)
systemctl enable --now kubelet
你可以通过kubectl version –client确认版本是否匹配Master。
7.创建Kubernetes集群
在Master节点上运行以下命令获取join命令(如果还没记录):
kubeadm token create --print-join-command
在Worker节点上执行你获得的完整命令,例如:
kubeadm join 192.168.42.140:6443 \
--token yjw92m.egds6xteaxmzrxdd \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
再次查看kubelet的状态,发现他已经是启动状态:
systemctl status kubelet
8.验证(在Master节点执行)
回到Master节点,查看节点状态:
kubectl get nodes
稍等10~30秒,你应该看到新加入的Worker节点状态变为Ready:
如果状态是NotReady,通常是因为 Flannel 还没在该节点启动完成,请等待或检查kubectl get pods -n kube-flannel。
9.一键安装脚本
若有人喜欢一键脚本直接安装,别急立刻安排!
一键脚本说明:
我们将创建两个脚本:
- k8s-master-setup.sh:在Master节点运行
- k8s-worker-setup.sh:在Worker节点运行(需传入join命令)
所有操作基于containerd + kubeadm + Flannel,适配国内网络。
Master节点脚本(k8s-master-setup.sh):
#!/bin/bash
# k8s-master-setup.sh
# 适用于 CentOS 7 / RHEL 7
set -e
echo "=== [1/6] 禁用 SELinux 和防火墙 ==="
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
systemctl stop firewalld
systemctl disable firewalld
echo "=== [2/6] 配置 sysctl ==="
cat <<EOF > /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
cat <<EOF > /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
sysctl --system
echo "=== [3/6] 安装 containerd ==="
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y containerd.io
containerd config default > /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
systemctl enable --now containerd
echo "=== [4/6] 安装 kubeadm、kubelet、kubectl ==="
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable --now kubelet
echo "=== [5/6] 初始化 Kubernetes Master ==="
kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.27.1
echo "=== [6/6] 配置 kubectl 和安装 Flannel ==="
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# 使用国内镜像的 Flannel
kubectl apply -f https://raw.githubusercontent.com/cookeem/k8s-install/master/kube-flannel.yml
echo "✅ Master 节点部署完成!"
echo "请记录以下 join 命令(用于 Worker 节点):"
kubeadm token create --print-join-command
Worker节点脚本(k8s-worker-setup.sh):
#!/bin/bash
# k8s-worker-setup.sh
# 用法: ./k8s-worker-setup.sh "kubeadm join ..."
set -e
if [ $# -eq 0 ]; then
echo "❌ 请提供 kubeadm join 命令!"
echo "用法: $0 \"kubeadm join 192.168.x.x:6443 --token ... --discovery-token-ca-cert-hash ...\""
exit 1
fi
JOIN_CMD="$1"
echo "=== [1/5] 禁用 SELinux 和防火墙 ==="
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
systemctl stop firewalld
systemctl disable firewalld
echo "=== [2/5] 配置 sysctl ==="
cat <<EOF > /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
cat <<EOF > /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
sysctl --system
echo "=== [3/5] 安装 containerd ==="
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y containerd.io
containerd config default > /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
systemctl enable --now containerd
echo "=== [4/5] 安装 kubelet ==="
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable --now kubelet
echo "=== [5/5] 加入 Kubernetes 集群 ==="
$JOIN_CMD
echo "✅ Worker 节点已成功加入集群!"
10.Kubernetes的核心使用方法与常用操作
基本概念
| 概念 | 说明 |
|---|---|
| Pod | 最小调度单位,一个或多个容器的组合 |
| Deployment | 管理 Pod 副本数、滚动更新、回滚等 |
| Service | 为 Pod 提供稳定网络访问入口(ClusterIP / NodePort / LoadBalancer |
| Namespace | 资源隔离的逻辑分区(如 dev / prod) |
| kubectl | 官方命令行工具,用于与集群交互 |
10.1 常用kubectl命令
查看资源状态
# 查看所有节点
kubectl get nodes
# 查看所有命名空间
kubectl get namespaces
# 查看 default 命名空间中的 Pods
kubectl get pods
# 查看所有命名空间的 Pods
kubectl get pods -A
# 查看 Services
kubectl get svc
# 查看 Deployments
kubectl get deployments
查看详细信息
# 查看某个 Pod 的详细信息(含事件、IP、容器状态)
kubectl describe pod <pod-name>
# 查看某个节点详情
kubectl describe node <node-name>
查看日志
# 查看 Pod 日志
kubectl logs <pod-name>
# 实时跟踪日志
kubectl logs -f <pod-name>
# 如果 Pod 有多个容器,需指定容器名
kubectl logs <pod-name> -c <container-name>
进入容器(调试用)
kubectl exec -it <pod-name> -- /bin/sh
# 或
kubectl exec -it <pod-name> -- /bin/bash
10.2 部署一个应用
目标:
部署一个简单HTTP应用(echoserver)
通过NodePort从集群外部访问
全程使用kubectl命令,无需YAML文件(也可提供YAML)
方法 1:直接运行(适合测试)
创建Deployment:
kubectl create deployment echoserver \
--image=k8s.gcr.io/echoserver:1.10
暴露服务为NodePort:
kubectl expose deployment echoserver \
--port=8080 \
--target-port=8080 \
--type=NodePort
查看服务和Pod状态:
# 查看 Pod 是否 Running
kubectl get pods -l app=echoserver
# 查看 Service 和分配的 NodePort
kubectl get service echoserver
然后通过任意节点IP + 30298访问即可。
成功!你已部署并访问了K8s应用!
方法 2:使用YAML文件(推荐生产使用)
创建echoserver.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: echoserver
spec:
replicas: 1
selector:
matchLabels:
app: echoserver
template:
metadata:
labels:
app: echoserver
spec:
containers:
- name: echoserver
image: k8s.gcr.io/echoserver:1.10
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: echoserver
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
selector:
app: echoserver
部署:
kubectl apply -f echoserver.yaml
删除:
kubectl delete -f echoserver.yaml
在实际工作中,很多团队的Kubernetes集群都部署在内网环境(比如公司测试集群、本地开发机或家庭实验室),没有公网IP,外网根本访问不了里面跑的服务。这时候,如果想让客户临时看个演示、调试微信回调,或者从家里连公司的测试应用,就很麻烦。
用Cpolar就能轻松解决:只要在任意一个K8s节点上运行一条命令,把服务的NodePort端口(比如30298)映射出去,它就会给你一个像 https://your-app.cpolar.io 的公网链接——手机、同事电脑、第三方平台都能直接访问。不用改防火墙、不用申请公网 IP、也不用搭复杂代理,几分钟搞定,特别适合临时、安全可控的外网访问需求。
11.安装cpolar实现随时随地开发
11.1 什么是cpolar?
cpolar是一款安全高效的内网穿透工具,无需公网IP或复杂配置,只需一条命令,即可将本地服务器、Web服务或任意端口映射到公网,让你随时随地远程访问内网应用,特别适合开发调试、远程运维和应急部署等场景。
11.2 部署cpolar
cpolar 可以将你本地电脑中的服务(如 SSH、Web、数据库)映射到公网。即使你在家里或外出时,也可以通过公网地址连接回本地运行的开发环境。
❤️以下是安装cpolar步骤:
使用一键脚本安装命令:
sudo curl https://get.cpolar.sh | sh
安装完成后,执行下方命令查看cpolar服务状态:(如图所示即为正常启动)
sudo systemctl status cpolar
Cpolar安装和成功启动服务后,在浏览器上输入虚拟机主机IP加9200端口即:【http://ip:9200】访问Cpolar管理界面,使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可:
打开浏览器访问本地9200端口,使用cpolar账户密码登录即可,登录后即可对隧道进行管理。
12.配置公网地址
登录cpolar web UI管理界面后,点击左侧仪表盘的隧道管理——创建隧道:
- 隧道名称:可自定义,本例使用了:k8s,注意不要与已有的隧道名称重复
- 协议:http
- 本地地址:30298
- 域名类型:随机域名
- 地区:选择China Top
创建成功后,打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址,接下来就可以在其他电脑或者移动端设备(异地)上,使用地址访问。
访问成功。
13.保留固定公网地址
使用cpolar为其配置二级子域名(cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站),该地址为固定地址,不会随机变化。
点击左侧的预留,选择保留二级子域名,地区选择china Top,然后设置一个二级子域名名称,我使用的是k8s,大家可以自定义。填写备注信息,点击保留。
登录cpolar web UI管理界面,点击左侧仪表盘的隧道管理——隧道列表,找到所要配置的隧道,点击右侧的编辑。
修改隧道信息,将保留成功的二级子域名配置到隧道中
- 域名类型:选择二级子域名
- Sub Domain:填写保留成功的二级子域名
- 地区: China Top
点击更新
更新完成后,打开在线隧道列表,此时可以看到随机的公网地址已经发生变化,地址名称也变成了保留和固定的二级子域名名称。
最后,我们使用固定的公网地址在任意设备的浏览器中访问,可以看到成功访问的页面,这样一个永久不会变化的二级子域名公网网址即设置好了。
总结
现在,你可以:
- 把Cpolar链发送给同事:“看,我刚部署的服务!”
- 用微信扫码访问,调试OAuth回调
- 用Postman调用你的API接口
- 甚至写个前端页面,对接这个后端
Kubernetes不再是黑盒,而是一个你能掌控的发布平台。
很多人被劝退,不是因为K8s复杂,而是因为第一步就没跑通——镜像拉不下来、服务访问不了、报错看不懂。
但只要你:
- 选对镜像(避开拉取失败)
- 确保每个节点环境一致(Docker配置)
- 用Cpolar破解网络限制
你就能在10分钟内,从kubectl create到 “全球可访问”——这份成就感,就是继续深入学习的最大动力。
别等“准备好”才开始,先让一个Pod跑起来,世界就打开了。
感谢您对本篇文章的喜爱,有任何问题欢迎留言交流。cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站
































