一、认识 Kubernetes

Kubernetes(简称 K8s)是由 Google 开发并开源的容器编排平台,用于自动化 容器部署、扩容、网络与负载均衡
它是现代云原生架构的核心,是 DevOps 的中枢大脑。

一句话总结:Kubernetes 是“集群中的操作系统”,负责让你的容器自动化运行。

核心功能:

  • 自动部署与滚动升级

  • 自我修复与健康检测

  • 负载均衡与服务发现

  • 资源调度与弹性伸缩

  • 声明式配置与自动管理


二、Kubernetes 架构概览


+-------------------------------------------------------------+ | Master 控制平面 | |-------------------------------------------------------------| | API Server | Scheduler | Controller Manager | etcd 数据库 | +-------------------------------------------------------------+ | | v v +-------------------------------------------------------------+ | Node 工作节点 | |-------------------------------------------------------------| | Kubelet | Kube Proxy | Container Runtime (Docker/Containerd)| +-------------------------------------------------------------+

解释:

  • API Server:统一的集群控制入口

  • etcd:保存集群状态与配置

  • Scheduler:容器调度分配节点

  • Controller Manager:管理副本、故障恢复等

  • Kubelet:节点代理,执行容器操作

  • Kube Proxy:负责网络通信与负载均衡


三、安装 Kubernetes(使用 kubeadm)

1. 环境准备

每台主机需具备:

  • CPU ≥ 2 核

  • 内存 ≥ 2GB

  • 系统:Ubuntu 20.04+

关闭 swap:


sudo swapoff -a sudo sed -i '/swap/d' /etc/fstab


2. 安装依赖

sudo apt update sudo apt install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list sudo apt update sudo apt install -y kubelet kubeadm kubectl sudo systemctl enable kubelet


3. 初始化主节点

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

初始化完成后执行:


mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config


4. 安装网络插件(Flannel)

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml


5. 加入工作节点

在从节点执行 kubeadm join:


sudo kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

验证节点:


kubectl get nodes

输出:


NAME STATUS ROLES AGE VERSION master Ready control-plane 10m v1.29.0 worker1 Ready <none> 5m v1.29.0


四、Kubernetes 核心对象

对象 作用
Pod 最小部署单元,封装一个或多个容器
Deployment 管理 Pod 副本与滚动更新
Service 提供网络访问与负载均衡
Ingress 实现 HTTP 路由与域名访问
ConfigMap / Secret 配置与敏感信息管理
PersistentVolume (PV) 存储资源
Namespace 逻辑隔离环境

五、创建第一个 Pod

创建 nginx-pod.yaml


apiVersion: v1 kind: Pod metadata: name: nginx-pod spec: containers: - name: nginx image: nginx ports: - containerPort: 80

部署:


kubectl apply -f nginx-pod.yaml

查看:


kubectl get pods kubectl describe pod nginx-pod

参考案例:www.deggsu.cn


六、Deployment 部署应用

创建 nginx-deploy.yaml


apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deploy spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80

应用:


kubectl apply -f nginx-deploy.yaml

查看:


kubectl get deployments kubectl get pods -l app=nginx


七、Service 暴露端口

创建 nginx-svc.yaml


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

暴露端口:


kubectl apply -f nginx-svc.yaml kubectl get svc

访问:


http://<NodeIP>:<NodePort>


八、滚动更新与回滚

更新镜像:


kubectl set image deployment/nginx-deploy nginx=nginx:1.23

查看更新状态:


kubectl rollout status deployment/nginx-deploy

回滚:


kubectl rollout undo deployment/nginx-deploy


九、自动扩缩容

CPU 使用率达到 80% 自动扩容:


kubectl autoscale deployment nginx-deploy --min=2 --max=10 --cpu-percent=80

查看扩容状态:


kubectl get hpa


十、配置管理(ConfigMap 与 Secret)

ConfigMap 示例:


kubectl create configmap app-config --from-literal=MODE=production

Secret 示例:


kubectl create secret generic db-secret --from-literal=USER=admin --from-literal=PASS=123456

Pod 引用:


envFrom: - configMapRef: name: app-config - secretRef: name: db-secret


十一、持久化存储(PV 与 PVC)

定义 pv.yaml


apiVersion: v1 kind: PersistentVolume metadata: name: pv-data spec: capacity: storage: 2Gi accessModes: - ReadWriteOnce hostPath: path: /data/pv

定义 pvc.yaml


apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-data spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi

Pod 挂载:


volumes: - name: storage persistentVolumeClaim: claimName: pvc-data


十二、Ingress 控制器

安装 Ingress:


kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml

创建 ingress.yaml


apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-ingress spec: rules: - host: web.local http: paths: - path: / pathType: Prefix backend: service: name: nginx-service port: number: 80

访问:


http://web.local


十三、命名空间管理

创建:


kubectl create namespace dev

切换:


kubectl config set-context --current --namespace=dev

查看:


kubectl get ns


十四、监控与日志

查看日志:


kubectl logs <pod-name>

实时查看:


kubectl logs -f <pod-name>

资源监控:


kubectl top pod kubectl top node


十五、Helm 包管理

安装 Helm:


curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

添加仓库:


helm repo add bitnami https://charts.bitnami.com/bitnami

部署 Nginx:


helm install mynginx bitnami/nginx

查看:


helm list


十六、RBAC 权限控制

创建角色:


kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: dev name: dev-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list"]

绑定用户:


kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: read-pods namespace: dev subjects: - kind: User name: devuser roleRef: kind: Role name: dev-reader apiGroup: rbac.authorization.k8s.io


十七、部署 Dashboard

安装:


kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

访问:


kubectl proxy

打开:


http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/


十八、Kubernetes 与 CI/CD

Jenkinsfile 示例:


pipeline { agent any stages { stage('Build') { steps { sh 'docker build -t myapp:latest .' } } stage('Deploy') { steps { sh 'kubectl apply -f k8s/deployment.yaml' } } } }

实现持续集成与自动化部署。


十九、Kubernetes 高可用与扩展

  • 多主节点 + etcd 集群

  • 使用 MetalLBIngress 实现外部访问

  • 使用 HorizontalPodAutoscaler 自动扩缩容

  • 使用 StatefulSet 管理有状态应用(如数据库)


二十、完整实战项目:K8s 部署电商微服务系统

目录结构:

k8s/ ├── deployment/ │ ├── user-deploy.yaml │ ├── product-deploy.yaml │ ├── order-deploy.yaml │ └── gateway-deploy.yaml ├── service/ │ ├── user-svc.yaml │ ├── product-svc.yaml │ ├── order-svc.yaml │ └── gateway-svc.yaml └── ingress.yaml

gateway-deploy.yaml:

apiVersion: apps/v1 kind: Deployment metadata: name: gateway spec: replicas: 2 selector: matchLabels: app: gateway template: metadata: labels: app: gateway spec: containers: - name: gateway image: nginx ports: - containerPort: 80

ingress.yaml:

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: shop-ingress spec: rules: - host: shop.local http: paths: - path: / pathType: Prefix backend: service: name: gateway-svc port: number: 80

启动:


kubectl apply -f k8s/

访问:


http://shop.local

Kubernetes 将自动调度、负载均衡并监控所有微服务。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐