Kubernetes入门指南
Kubernetes入门指南
Kubernetes(通常简称为K8s)是一个开源的容器编排平台,用于自动化容器化应用程序的部署、扩展和管理。
Kubernetes基本概念
什么是Kubernetes?
Kubernetes是Google基于其内部系统Borg开发的开源容器编排平台,现在由Cloud Native Computing Foundation (CNCF) 维护。
主要功能:
- 容器编排
- 服务发现和负载均衡
- 存储编排
- 自动部署和回滚
- 自动装箱(资源调度)
- 自我修复
- 配置管理
- 水平扩展
Kubernetes架构
Kubernetes采用主从架构,由以下组件组成:
控制平面组件
kube-apiserver
- 公开Kubernetes API
- 所有操作的前端接口
etcd
- 一致且高可用的键值存储
- 存储所有集群数据
kube-scheduler
- 监视新创建的Pod,并将其分配到节点
kube-controller-manager
- 运行控制器进程
- 包括节点控制器、复制控制器、端点控制器等
cloud-controller-manager
- 与云提供商交互的控制器
节点组件
kubelet
- 确保容器在Pod中运行
- 管理Pod生命周期
kube-proxy
- 维护节点上的网络规则
- 允许从集群内部或外部与Pod通信
容器运行时
- 负责运行容器
- 如Docker、containerd、CRI-O等
Kubernetes对象
Kubernetes使用"对象"来表示系统状态:
基本对象
Pod
- Kubernetes中最小的可部署单元
- 包含一个或多个容器
- 共享网络和存储
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
Service
- 定义一组Pod的访问方式
- 提供稳定的网络端点
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: ClusterIP
Volume
- 提供持久化存储
- 多种存储后端支持
Namespace
- 提供资源隔离
- 将集群划分为虚拟子集群
控制器对象
Deployment
- 管理Pod的部署和更新
- 提供声明式更新
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
StatefulSet
- 管理有状态应用
- 提供稳定的网络标识和持久存储
DaemonSet
- 确保所有(或部分)节点运行Pod的副本
- 适用于节点监控、日志收集等
Job/CronJob
- 运行一次性或定期任务
Kubernetes网络
Kubernetes网络模型基于以下原则:
- 所有Pod可以不使用NAT互相通信
- 所有节点可以不使用NAT与所有Pod通信
- Pod内部的容器共享网络命名空间
网络解决方案
- Calico
- Flannel
- Cilium
- Weave Net
Kubernetes存储
存储类型
临时存储
- emptyDir:Pod被删除时,数据也会被删除
持久存储
- PersistentVolume (PV):集群中的存储资源
- PersistentVolumeClaim (PVC):存储请求
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: standard
StorageClass
- 定义动态配置的存储类型
Kubernetes安全
认证
- X.509 客户端证书
- 静态令牌文件
- OpenID Connect
- Webhook令牌认证
授权
- RBAC(基于角色的访问控制)
- ABAC(基于属性的访问控制)
- Node授权
- Webhook授权
RBAC示例
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: User
name: jane
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
Kubernetes资源管理
资源请求与限制
apiVersion: v1
kind: Pod
metadata:
name: resource-demo
spec:
containers:
- name: resource-demo-ctr
image: nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
命名空间资源配额
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-quota
namespace: development
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
Kubernetes部署策略
滚动更新
- 逐步替换旧版本Pod
- 默认的部署策略
蓝绿部署
- 同时维护两个版本
- 一次性切换流量
金丝雀部署
- 将少量流量路由到新版本
- 逐步增加流量比例
Kubernetes监控
监控方案
- Prometheus + Grafana
- Kubernetes Dashboard
- Datadog
- New Relic
日志收集
- EFK/ELK堆栈
- Loki + Grafana
- Fluentd + CloudWatch
常用kubectl命令
# 获取资源信息
kubectl get pods
kubectl get deployments
kubectl get services
# 查看详细信息
kubectl describe pod <pod-name>
# 创建资源
kubectl apply -f manifest.yaml
# 删除资源
kubectl delete -f manifest.yaml
kubectl delete pod <pod-name>
# 查看日志
kubectl logs <pod-name>
# 进入容器
kubectl exec -it <pod-name> -- /bin/bash
# 端口转发
kubectl port-forward <pod-name> 8080:80
Kubernetes最佳实践
-
使用命名空间组织资源
- 按团队、环境或应用划分
-
设置资源请求和限制
- 避免资源争用
- 提高集群稳定性
-
使用标签和注解
- 组织和识别资源
- 支持选择器查询
-
实施健康检查
- 存活探针
- 就绪探针
- 启动探针
-
配置管理
- 使用ConfigMap和Secret
- 避免硬编码配置
-
安全最佳实践
- 使用RBAC限制权限
- 定期更新和修补
- 使用网络策略限制流量
-
备份etcd数据
- 定期备份
- 测试恢复流程