第 213 章:Kubernetes 入门
学习目标
- 理解 K8s 架构
- 掌握 Pod / Deployment / Service
- 学会 kubectl 命令
- 部署第一个应用
一、Kubernetes 简介
K8s 是容器编排的事实标准,自动化部署、扩缩、运维容器化应用。
二、核心概念
2.1 架构组件
Master(控制平面):
kube-apiserver:API 入口etcd:集群存储kube-scheduler:调度 Podkube-controller-manager:控制器
Node(工作节点):
kubelet:节点 Agentkube-proxy:网络代理- 容器运行时(containerd / Docker)
2.2 工作负载
| 资源 | 说明 |
|---|---|
| Pod | 最小调度单元(可含多容器) |
| Deployment | 无状态应用 |
| StatefulSet | 有状态应用 |
| DaemonSet | 节点级守护 |
| Job / CronJob | 一次性 / 定时任务 |
2.3 网络 / 配置
| 资源 | 说明 |
|---|---|
| Service | 服务发现 + 负载均衡 |
| Ingress | HTTP 路由 |
| ConfigMap | 配置 |
| Secret | 敏感数据 |
| PersistentVolume | 存储卷 |
三、本地集群
3.1 minikube
bash
# 安装
brew install minikube
minikube start
# 状态
minikube status
kubectl get nodes3.2 kind
bash
brew install kind
kind create cluster3.3 Docker Desktop
启用 K8s 设置即可。
四、kubectl 命令
4.1 集群信息
bash
kubectl cluster-info
kubectl get nodes
kubectl version4.2 资源操作
bash
# 查询
kubectl get pods
kubectl get deployments
kubectl get svc
kubectl get all
# 详细
kubectl describe pod mypod
# 日志
kubectl logs mypod
kubectl logs -f mypod # 跟踪
kubectl logs mypod -c container1 # 多容器
# 进入
kubectl exec -it mypod -- bash
# 端口转发
kubectl port-forward mypod 8080:3000
# 资源使用
kubectl top node
kubectl top pod4.3 创建
bash
# 从文件
kubectl apply -f deployment.yaml
# 临时跑
kubectl run nginx --image=nginx --port=80
# 暴露
kubectl expose deployment nginx --port=80 --type=NodePort4.4 删除
bash
kubectl delete pod mypod
kubectl delete -f deployment.yaml
kubectl delete deployment myapp4.5 上下文
bash
kubectl config get-contexts
kubectl config use-context minikube五、YAML 基础
yaml
apiVersion: v1 # 版本
kind: Pod # 资源类型
metadata:
name: mypod
labels:
app: myapp
spec: # 规格
containers:
- name: app
image: nginx:1.25
ports:
- containerPort: 80
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi六、Pod
yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
labels:
app: myapp
spec:
containers:
- name: app
image: myapp:1.0
ports:
- containerPort: 3000
env:
- name: DB_HOST
value: db
volumeMounts:
- name: data
mountPath: /app/data
volumes:
- name: data
emptyDir: {}七、Deployment
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3 # 副本数
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: app
image: myapp:1.0
ports:
- containerPort: 3000
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
readinessProbe: # 就绪探针
httpGet:
path: /health
port: 3000
initialDelaySeconds: 10
periodSeconds: 5
livenessProbe: # 存活探针
httpGet:
path: /health
port: 3000
initialDelaySeconds: 30
periodSeconds: 10bash
kubectl apply -f deployment.yaml
kubectl get deployment
kubectl scale deployment myapp --replicas=5八、Service
yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
spec:
type: ClusterIP # 默认,集群内
selector:
app: myapp
ports:
- port: 80
targetPort: 30008.1 Service 类型
| 类型 | 说明 |
|---|---|
ClusterIP | 集群内(默认) |
NodePort | 节点端口(30000-32767) |
LoadBalancer | 云厂商 LB |
ExternalName | CNAME |
8.2 NodePort 示例
yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-nodeport
spec:
type: NodePort
selector:
app: myapp
ports:
- port: 80
targetPort: 3000
nodePort: 30080九、Ingress
bash
# 启用(以 minikube 为例)
minikube addons enable ingressyaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp-svc
port:
number: 80十、ConfigMap & Secret
10.1 ConfigMap
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
LOG_LEVEL: info
PORT: "3000"
config.yaml: |
key: value
nested:
a: 1使用:
yaml
env:
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: LOG_LEVEL
volumeMounts:
- name: config
mountPath: /app/config.yaml
subPath: config.yaml
volumes:
- name: config
configMap:
name: app-config10.2 Secret
bash
kubectl create secret generic db-pass --from-literal=password=secret123yaml
apiVersion: v1
kind: Secret
metadata:
name: db-pass
type: Opaque
stringData:
password: secret123使用:
yaml
env:
- name: DB_PASS
valueFrom:
secretKeyRef:
name: db-pass
key: password十一、namespace
bash
kubectl create namespace dev
kubectl get pods -n dev
# 切换
kubectl config set-context --current --namespace=devyaml
metadata:
namespace: dev十二、调试技巧
bash
# 排错四件套
kubectl get pod mypod -o yaml
kubectl describe pod mypod
kubectl logs mypod
kubectl exec -it mypod -- bash
# 事件
kubectl get events --sort-by=.metadata.creationTimestamp
# 资源使用
kubectl top pod mypod
# 调试镜像
kubectl run debug --image=alpine --rm -it --restart=Never -- sh十三、本章小结
| 资源 | 用途 |
|---|---|
| Pod | 容器组 |
| Deployment | 无状态副本 |
| Service | 服务发现 |
| Ingress | HTTP 路由 |
| ConfigMap | 配置 |
| Secret | 密钥 |
动手练习
- 用 minikube 启动本地集群
- 部署 nginx Deployment
- 暴露 NodePort 服务
- 配置 ConfigMap 注入环境变量
推荐阅读
下一章:第 214 章:K8s 进阶与 Helm →