在上一篇记录中,我已经学会了用Docker打包和运行单个容器。但随着应用规模的扩大,我需要统一管理多个服务。
Docker Compose可以管理单机上的多容器,但面对更大的需求,我需要一个更强大的容器编排平台也就是Kubernetes(简称K8s)
准备工作
Kubernetes简介
Kubernetes是一个生产级别的开源平台,它帮助你确保容器化应用在你想要的时间和地点运行
Docker解决了“如何打包”的问题,Kubernetes解决了如何管理成千上万个容器的问题。
核心概念
一个Kubernetes集群由Control Plane和Nodes组成
Control Plane负责全局决策(调度、响应事件等)
Nodes运行实际应用的机器,每个节点上都有容器运行时
关键组件:
Control Plane包含四个核心组件:
kube-apiserver 是集群的前端,所有操作都通过它处理
etcd 为集群的数据库,存储所有配置数据
kube-scheduler 负责把Pod分配到合适的节点上运行
kube-controller-manager 负责运行各种控制器
每个和Nodes上运行:
kubelet确保容器按预期运行
kube-proxy维护网络规则,实现服务通信(非必需)
容器运行时
核心抽象概念:
Pod是Kubernetes中最小的部署单元,一个Pod可以包含一个或多个紧密相关的容器。Deployment负责管理Pod的副本数、滚动更新和自我修复。Service则为Pod提供稳定的访问入口和负载均衡。
开始实践
本地环境搭建
使用Minikube
Minikube在本地运行单节点Kubernetes集群
启动集群(使用Docker驱动)
minikube start --driver=docker检查集群状态
minikube status使用Kind
Kind使用Docker容器作为节点运行Kubernetes,轻量且启动快,适合CI/CD测试场景。
kind create cluster --name my-cluster安装kubectl
kubectl是与Kubernetes集群交互的命令行工具,所有节点都需要安装。
在Linux上安装:(centos)
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOFyum install -y kubelet kubeadm kubectlsystemctl enable --now kubelet部署应用
创建Deployment
用YAML文件定义应用部署(示例为Nginx):
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-demo
spec:
replicas: 3 # 保持3个副本运行
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80应用配置:
kubectl apply -f nginx-deployment.yaml查看Pod状态
kubectl get pods暴露服务
创建Service让外部可以访问:(yaml)
# nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancerkubectl apply -f nginx-service.yaml获取访问地址
minikube service nginx-service滚动更新
修改镜像版本,Kubernetes会自动滚动更新:
kubectl set image deployment/nginx-demo nginx=nginx:1.25kubectl rollout status deployment/nginx-demo进阶功能
自动伸缩
Horizontal Pod Autoscaler(HPA)可根据CPU使用率自动调整副本数:
kubectl autoscale deployment nginx-demo --cpu-percent=50 --min=2 --max=10配置管理
ConfigMap存储非敏感配置,Secret存储敏感数据(密码、密钥等):
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DB_HOST: "mysql-service"
LOG_LEVEL: "info"
持久化存储
通过PersistentVolumeClaim(PVC)为Pod挂载持久化存储:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi生产环境注意事项 Q&A
Q:生产环境部署Kubernetes,控制平面节点需要几个?
A:至少3个,实现高可用。同时建议将etcd集群单独部署(与控制平面分离),避免控制平面负载影响etcd性能。
Q:如何保障集群安全?
A:两个关键措施:一是启用RBAC权限控制,限制不同用户的访问范围;二是定期轮换集群证书(默认1年有效期,需在过期前更新)。
Q:节点规格如何规划?
A:根据实际负载合理配置,通常控制平面节点配置需高于工作节点(建议4核8GB起步),工作节点根据业务需求弹性调整。
Q:etcd数据需要备份吗?
A:必须定期备份。etcd存储了集群所有配置和状态数据,丢失将导致集群无法恢复。
Q:不想自己管理控制平面怎么办?
A:使用云厂商托管Kubernetes服务:腾讯云TKE、阿里云ACK、AWS EKS等,免去运维控制平面的工作。
推荐的下一步学习计划与建议
Helm:Kubernetes的包管理器,管理复杂应用部署
【编程】Kubernetes 学习记录回顾与实践
https://enento.cloud/archives/K8sjilu
评论