Kubernetes入门到实战
一、Kubernetes概述
Kubernetes(简称K8s)是Google开源的容器编排引擎,用于自动化部署、扩展和管理容器化应用。它已成为云原生时代的标准基础设施。
什么是Kubernetes:
- 容器编排:自动化管理容器的生命周期
- 服务发现:容器之间的网络通信和负载均衡
- 自动扩缩容:根据负载自动调整实例数量
- 自愈能力:自动重启失败的容器,替换和删除不健康的容器
- 存储编排:自动挂载存储系统
K8s核心优势:
- 多云适配:支持公有云、私有云、混合云
- 高度可扩展:插件化架构,功能模块化
- 声明式API:描述期望状态而非执行步骤
- 社区活跃:CNCF毕业项目,生态完善
二、K8s核心架构
Master节点(控制平面):
kube-apiserver # API入口,所有组件的通信中枢
etcd # 分布式键值存储,保存集群状态
kube-scheduler # 调度Pod到合适的Node节点
kube-controller-manager # 控制器管理器,维护集群状态
cloud-controller-manager # 云服务商接口Worker节点(工作节点):
kubelet # 节点代理,管理Pod和容器
kube-proxy # 网络代理,实现Service网络
container runtime # 容器运行时(Docker/containerd)架构图示意:
┌─────────────────────────────────────────┐
│ Master Node │
│ ┌─────────┐ ┌──────┐ ┌──────────┐ │
│ │ API Svr │ │ etcd │ │Scheduler│ ... │
│ └─────────┘ └──────┘ └──────────┘ │
└───────────────────┬─────────────────────┘
│
┌───────────────────┼─────────────────────┐
│ Worker Node 1 │ Worker Node 2 │
│ ┌─────────────┐ │ ┌─────────────┐ │
│ │ kubelet │ │ │ kubelet │ │
│ │ kube-proxy │ │ │ kube-proxy │ │
│ │ Pods │ │ │ Pods │ │
│ └─────────────┘ │ └─────────────┘ │
└───────────────────┴─────────────────────┘三、核心资源对象详解
1. Pod(最小部署单元)
Pod是K8s中最小的部署单元,包含一个或多个紧密关联的容器。
Pod定义示例:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"Pod生命周期:
- Pending:已创建,等待调度
- Running:正常运行中
- Succeeded:成功完成并退出
- Failed:执行失败
- Unknown:状态未知
2. Deployment(无状态应用部署)
Deployment用于管理无状态应用,提供滚动更新、回滚等功能。
Deployment定义示例:
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.21
ports:
- containerPort: 80
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0常用Deployment操作:
# 创建Deployment
kubectl apply -f deployment.yaml
# 查看Deployment
kubectl get deployments
kubectl describe deployment nginx-deployment
# 扩容缩容
kubectl scale deployment nginx-deployment --replicas=5
# 滚动更新镜像
kubectl set image deployment/nginx-deployment nginx=nginx:1.22
# 查看更新状态
kubectl rollout status deployment/nginx-deployment
# 回滚到上一版本
kubectl rollout undo deployment/nginx-deployment3. Service(服务发现与负载均衡)
Service为一组Pod提供稳定的网络入口和负载均衡。
Service类型:
| 类型 | 说明 | 适用场景 |
|---|---|---|
| ClusterIP | 集群内部访问 | 内部服务通信 |
| NodePort | 节点端口映射 | 测试环境 |
| LoadBalancer | 云服务商负载均衡 | 生产环境 |
| ExternalName | CNAME别名 | 外部服务映射 |
Service定义示例:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: ClusterIP
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 804. ConfigMap & Secret
ConfigMap(配置管理):
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
app.properties: |
database.host=mysql
database.port=3306
log_level: INFOSecret(敏感信息):
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: YWRtaW4= # base64编码
password: cGFzc3dvcmQ= # base64编码四、K8s集群搭建实战
1. 环境准备
# 所有节点执行:关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 关闭Swap
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
# 设置主机名
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node22. 安装Docker/containerd
# 安装Docker
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
# 配置Docker
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"registry-mirrors": ["https://你的镜像加速器地址"]
}
EOF
systemctl enable docker
systemctl start docker3. 安装kubeadm、kubelet、kubectl
# 添加K8s源
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[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.23.6 kubeadm-1.23.6 kubectl-1.23.6
systemctl enable kubelet4. 初始化Master节点
# Master节点执行
kubeadm init \
--apiserver-advertise-address=192.168.1.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.6 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
# 配置kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config5. 安装网络插件(Calico)
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
# 验证节点状态
kubectl get nodes
# 所有节点状态应为Ready6. Node节点加入集群
# 在Master获取join命令
kubeadm token create --print-join-command
# 在Node节点执行(示例)
kubeadm join 192.168.1.100:6443 --token xxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxx五、常用运维命令
集群信息查看:
# 查看集群状态
kubectl cluster-info
# 查看节点
kubectl get nodes
kubectl describe node k8s-master
# 查看命名空间
kubectl get namespaces
# 查看所有资源
kubectl get all --all-namespacesPod操作:
# 查看Pod
kubectl get pods
kubectl get pods -o wide
kubectl get pods -n kube-system
# 查看Pod详情
kubectl describe pod nginx-pod
# 查看Pod日志
kubectl logs nginx-pod
kubectl logs -f nginx-pod # 实时日志
# 进入Pod容器
kubectl exec -it nginx-pod -- /bin/bash
# 删除Pod
kubectl delete pod nginx-pod资源管理:
# 应用配置文件
kubectl apply -f filename.yaml
# 删除资源
kubectl delete -f filename.yaml
# 导出YAML
kubectl get deployment nginx -o yaml > nginx.yaml
# 临时测试Pod
kubectl run test --image=busybox --rm -it -- /bin/sh六、生产环境最佳实践
1. 资源限制
resources:
requests: # 资源请求,调度依据
cpu: "100m" # 0.1核
memory: "128Mi" # 128MB
limits: # 资源上限
cpu: "500m" # 0.5核
memory: "512Mi" # 512MB2. 健康检查
livenessProbe: # 存活检查
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe: # 就绪检查
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 53. 安全配置
- 使用非root用户运行容器
- 开启RBAC权限控制
- 启用NetworkPolicy网络隔离
- 镜像扫描漏洞检测
- 定期升级K8s版本
4. 监控与日志
- Prometheus + Grafana:指标监控
- ELK/Loki:日志收集分析
- Jaeger:分布式链路追踪
- Alertmanager:告警通知
总结
Kubernetes学习路径:
- 基础概念:理解Pod、Deployment、Service等核心对象
- 集群搭建:动手搭建测试集群
- 应用部署:练习YAML编写和应用发布
- 运维实践:掌握故障排查和性能调优
- 生态集成:学习监控、日志、CI/CD等周边工具
K8s已成为云原生时代的必备技能,掌握它将大大提升你的技术竞争力!