引言

Kubernetes(简称K8s)作为当今最流行的容器编排工具,已经成为云原生应用和微服务架构的核心。本文旨在为初学者提供一个一站式指南,从入门到实战,帮助您全面掌握K8s开发,解锁容器编排的奥秘。

一、K8s基础概念

1.1 什么是Kubernetes?

Kubernetes是一个开源的容器编排系统,用于自动化应用程序的部署、扩展和管理。它提供了平台即服务(PaaS)的简易性以及基础设施即服务(IaaS)的灵活性,并支持跨主机集群的服务发现和负载均衡。

1.2 关键概念

  • 集群 (Cluster):由多个节点组成的集合,用于运行应用程序。
  • 节点 (Nodes):集群中的单个工作单元,负责运行容器。
  • Pods:Kubernetes的基本部署单位,一个Pod可以包含一个或多个容器。
  • ReplicaSets:用于确保指定数量的Pod副本始终运行。
  • Deployments:一种更高级的Pod和ReplicaSet管理方式,提供声明式更新、回滚等特性。
  • Services:定义了如何访问Pods,提供负载均衡和发现功能。
  • Namespaces:用于隔离资源,例如多个项目或团队可以使用不同的命名空间。
  • ConfigMaps 和 Secrets:用于管理非代码配置数据,如密码、密钥等。
  • Volumes:用于存储数据,如持久化存储。

二、K8s架构

2.1 控制平面组件

  • API Server:Kubernetes集群的入口,负责接收和处理客户端请求。
  • etcd:键值存储数据库,用于存储集群配置数据。
  • Scheduler:负责将Pod调度到合适的节点上。
  • Controller Manager:负责维护集群状态,例如副本控制器、端点控制器等。

2.2 节点组件

  • kubelet:在每个节点上运行的代理,负责启动和监控Pod中的容器。
  • kube-proxy:负责网络通信和负载均衡。
  • 容器运行时 (Container Runtime):负责容器运行时环境,如Docker。

三、K8s操作

3.1 kubectl基础

kubectl是Kubernetes的命令行工具,用于与集群进行交互。

3.2 部署应用程序

  • 创建Deployment:使用Deployment创建和管理Pods。
  • 扩展应用程序:通过修改Deployment的副本数来扩展应用程序。

3.3 暴露服务

  • ClusterIP:在集群内部访问服务。
  • NodePort:通过节点的端口访问服务。

四、实战案例

4.1 部署Nginx服务

  1. 创建Nginx Pod:
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
  1. 创建Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
  1. 部署Service:
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP

4.2 部署MySQL服务

  1. 创建MySQL Pod:
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
spec:
  containers:
  - name: mysql
    image: mysql
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "rootpassword"
    ports:
    - containerPort: 3306
  1. 创建Deployment:

”`yaml apiVersion: apps/v1 kind: Deployment metadata: name: mysql-deployment spec: replicas: 1 selector:

matchLabels:
  app: mysql

template:

metadata:
  labels:
    app: mysql
spec:
  containers:
  - name: mysql
    image: mysql
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "rootpassword"
    ports:
    - container