Kubernetes入门到实战

· 阅读约需14分钟

一、Kubernetes概述

Kubernetes(简称K8s)是Google开源的容器编排引擎,用于自动化部署、扩展和管理容器化应用。它已成为云原生时代的标准基础设施。

什么是Kubernetes:

  • 容器编排:自动化管理容器的生命周期
  • 服务发现:容器之间的网络通信和负载均衡
  • 自动扩缩容:根据负载自动调整实例数量
  • 自愈能力:自动重启失败的容器,替换和删除不健康的容器
  • 存储编排:自动挂载存储系统

K8s核心优势:

  1. 多云适配:支持公有云、私有云、混合云
  2. 高度可扩展:插件化架构,功能模块化
  3. 声明式API:描述期望状态而非执行步骤
  4. 社区活跃: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-deployment

3. Service(服务发现与负载均衡)

Service为一组Pod提供稳定的网络入口和负载均衡。

Service类型:

类型说明适用场景
ClusterIP集群内部访问内部服务通信
NodePort节点端口映射测试环境
LoadBalancer云服务商负载均衡生产环境
ExternalNameCNAME别名外部服务映射

Service定义示例:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: ClusterIP
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

4. ConfigMap & Secret

ConfigMap(配置管理):

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  app.properties: |
    database.host=mysql
    database.port=3306
  log_level: INFO

Secret(敏感信息):

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-node2

2. 安装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 docker

3. 安装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 kubelet

4. 初始化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/config

5. 安装网络插件(Calico)

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

# 验证节点状态
kubectl get nodes
# 所有节点状态应为Ready

6. 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-namespaces

Pod操作:

# 查看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"   # 512MB

2. 健康检查

livenessProbe:        # 存活检查
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 30
  periodSeconds: 10

readinessProbe:       # 就绪检查
  httpGet:
    path: /ready
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 5

3. 安全配置

  • 使用非root用户运行容器
  • 开启RBAC权限控制
  • 启用NetworkPolicy网络隔离
  • 镜像扫描漏洞检测
  • 定期升级K8s版本

4. 监控与日志

  • Prometheus + Grafana:指标监控
  • ELK/Loki:日志收集分析
  • Jaeger:分布式链路追踪
  • Alertmanager:告警通知

总结

Kubernetes学习路径:

  1. 基础概念:理解Pod、Deployment、Service等核心对象
  2. 集群搭建:动手搭建测试集群
  3. 应用部署:练习YAML编写和应用发布
  4. 运维实践:掌握故障排查和性能调优
  5. 生态集成:学习监控、日志、CI/CD等周边工具

K8s已成为云原生时代的必备技能,掌握它将大大提升你的技术竞争力!