Kubernetes完全入门指南:从零到生产环境部署
Kubernetes完全入门指南:从零到生产环境
前言
本教程专为以下读者编写:
目标读者:
- 刚开始接触容器技术,希望系统学习Kubernetes的新手
- 有Linux运维经验,想转向云原生运维的工程师
- 需要在生产环境部署Kubernetes集群的运维人员
- 想考取CKA(Kubernetes管理员认证)的学习者
学完本教程后,你将能够: 1. 理解Kubernetes核心架构和组件 2. 使用kubectl命令管理集群资源 3. 编写和部署Pod、Deployment、Service等资源 4. 配置资源限制和健康检查 5. 搭建开发环境和生产集群
1. Kubernetes核心概念
1.1 什么是Kubernetes
Kubernetes(简称K8s)是Google开源的容器编排平台,已成为云原生应用部署和管理的行业标准。它提供了以下核心能力:
| 能力 | 说明 |
|---|---|
| 容器部署和调度 | 自动将容器部署到集群节点 |
| 自动扩缩容 | 根据负载自动调整容器数量 |
| 服务发现和负载均衡 | 自动服务注册和DNS负载均衡 |
| 配置和密钥管理 | 集中管理应用配置和敏感信息 |
| 存储编排 | 自动挂载存储卷 |
| 批量执行 | 支持批处理任务 |
| 自愈能力 | 自动重启失败的容器 |
1.2 Kubernetes架构
控制平面(Control Plane)组件:
| 组件 | 端口 | 功能 | 说明 |
|---|---|---|---|
| kube-apiserver | 6443 | API服务器 | 提供RESTful API,是集群的网关 |
| etcd | 2379-2380 | 分布式存储 | 存储集群所有配置数据 |
| kube-scheduler | - | 调度器 | 根据资源需求选择最优节点 |
| kube-controller-manager | - | 控制器 | 管理各种控制器确保状态一致 |
工作节点(Worker Nodes)组件:
| 组件 | 功能 | 说明 |
|---|---|---|
| kubelet | 节点代理 | 负责容器生命周期管理 |
| kube-proxy | 网络代理 | 实现服务网络和负载均衡 |
| container runtime | 容器执行 | Docker/containerd/containerd |
2. 安装Kubernetes集群
2.1 minikube(开发环境)
# 安装minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 启动集群(使用Docker驱动)
minikube start --driver=docker --cpus=4 --memory=8192
# 验证安装
minikube status
minikube kubectl -- get pods -A
minikube dashboard
2.2 kind(Docker中的Kubernetes)
# 安装kind
curl -LO https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
sudo install kind-linux-amd64 /usr/local/bin/kind
# 创建集群
kind create cluster --name my-cluster --config kind-config.yaml
# kind-config.yaml
cat > kind-config.yaml << 'EOF'
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 30080
hostPort: 30080
- role: worker
- role: worker
EOF
# 查看集群
kind get clusters
kubectl cluster-info
kubectl get nodes
2.3 kubeadm(生产环境)
# 所有节点安装kubeadm
apt-get update
apt-get install -y kubeadm kubelet kubectl
kubeadm version
# 主节点初始化
kubeadm init --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
# 配置kubectl
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 安装网络插件(Calico)
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
# 工作节点加入
kubeadm join :6443 --token --discovery-token-ca-cert-hash sha256:
3. kubectl命令详解
3.1 基础命令
# 集群信息
kubectl cluster-info # 集群信息
kubectl get nodes # 查看节点
kubectl get nodes -o wide # 详细输出
kubectl describe node # 节点详情
# Pod管理
kubectl get pods # 查看Pod
kubectl get pods -A # 所有命名空间
kubectl get pods -o wide # 详细输出
kubectl describe pod # Pod详情
kubectl logs # 查看日志
kubectl logs -f # 实时日志
kubectl exec -it -- /bin/bash # 进入Pod
# 应用配置
kubectl apply -f deployment.yaml # 应用配置
kubectl apply -f . # 应用目录下所有文件
kubectl delete -f deployment.yaml # 删除资源
kubectl delete pod # 删除Pod
3.2 资源操作命令
# 扩缩容
kubectl scale deployment --replicas=3
# 更新镜像
kubectl set image deployment/ nginx=nginx:1.26
# 回滚
kubectl rollout status deployment/
kubectl rollout undo deployment/
kubectl rollout undo deployment/ --to-revision=3
# 命名空间
kubectl create namespace dev
kubectl config set-context --current --namespace=dev
4. Pod详解
4.1 Pod完整示例
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
environment: production
spec:
# 初始化容器
initContainers:
- name: init-myservice
image: busybox:1.36
command: ['sh', '-c', 'echo Initializing...; sleep 10']
# 主容器
containers:
- name: nginx
image: nginx:1.25-alpine
ports:
- containerPort: 80
name: http
# 环境变量
env:
- name: NGINX_HOST
value: "localhost"
- name: ENV_TYPE
valueFrom:
configMapKeyRef:
name: app-config
key: environment
# 资源限制(重要!)
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "256Mi"
# 健康检查
livenessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 15
periodSeconds: 20
readinessProbe:
httpGet:
path: /ready
port: 80
initialDelaySeconds: 5
periodSeconds: 10
# 卷挂载
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d
# 数据卷
volumes:
- name: nginx-config
configMap:
name: nginx-config
restartPolicy: Always
terminationGracePeriodSeconds: 30
5. Deployment详解
5.1 Deployment完整示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
version: v1.0.0
spec:
replicas: 3
revisionHistoryLimit: 5
selector:
matchLabels:
app: nginx
# 滚动更新策略
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
# Pod模板
template:
metadata:
labels:
app: nginx
version: v1.0.0
spec:
containers:
- name: nginx
image: nginx:1.25-alpine
ports:
- containerPort: 80
# 资源限制
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "256Mi"
# 健康检查
livenessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 15
periodSeconds: 20
readinessProbe:
httpGet:
path: /ready
port: 80
initialDelaySeconds: 5
periodSeconds: 10
# 卷挂载
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d
volumes:
- name: nginx-config
configMap:
name: nginx-config
# 拓扑分布
topologySpreadConstraints:
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: nginx
6. Service详解
6.1 Service完整示例
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
# Service类型
# ClusterIP - 集群内部访问(默认)
# NodePort - 暴露到节点端口
# LoadBalancer - 云负载均衡器
type: ClusterIP
ports:
- name: http
protocol: TCP
port: 80 # Service端口
targetPort: 80 # Pod端口
selector:
app: nginx
7. 常见问题
7.1 Pod状态异常
# Pod一直Pending
kubectl get pod -o wide
# 可能原因:资源不足、节点不可用
# Pod CrashLoopBackOff
kubectl logs --previous
kubectl describe pod | grep -A 10 "State:"
7.2 Service无法访问
# Service无endpoint
kubectl get endpoints
# 测试Service连通性
kubectl run test --image=busybox:1.36 --rm -it --restart=Never -- wget -qO- http://:80
总结
核心要点: 1. Kubernetes架构分为控制平面和工作节点 2. Pod是最小部署单元,Deployment管理Pod副本 3. Service提供稳定的网络访问入口 4. 资源限制和健康检查是生产环境必备 5. kubectl是日常管理的主要工具
下一步学习:
- 学习Helm包管理器
- 掌握Ingress配置
- 配置监控和告警
- 学习网络策略和安全策略
- 官方文档:https://kubernetes.io/docs/home/
- kubectl参考:https://kubernetes.io/docs/reference/kubectl/
- 交互式教程:https://kubernetes.io/tutorials/kubernetes-basics/
参考资源:
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。







