9. Kubernetes与Docker入门

Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了强大的功能,包括服务发现、负载均衡、自动化部署、容器编排以及高可用性等,使得应用的管理变得更加高效和可靠。本文将全面介绍 Kubernetes 的基础概念、Docker 与 Kubernetes 的关系、Kubernetes 的基本概念,并通过 Minikube 实践学习 Kubernetes,最后通过一个完整的示例来加深理解。

1. 什么是 Kubernetes

Kubernetes 是由 Google 提出的一个开源项目,旨在解决容器化应用的管理和调度问题。它的主要功能包括:

  • 自动化部署:通过定义 YAML 文件,自动化管理容器的部署过程。
  • 负载均衡:自动分配请求到不同的容器实例,保证服务的高可用性和负载均衡。
  • 服务发现:在集群内自动发现和连接服务。
  • 自动伸缩:根据负载情况自动调整容器的数量,保证应用的稳定性和性能。
  • 滚动更新:支持无缝升级和回滚应用,保证应用的连续性和安全性。
  • 自愈能力:自动检测和修复失败的容器实例,保证应用的健康状态。

2. Docker 与 Kubernetes 的关系

Docker 是一个容器化平台,提供了构建、打包和运行容器的功能。而 Kubernetes 是一个容器编排工具,负责管理和调度 Docker 容器。两者的关系可以总结如下:

  • 容器化与编排:Docker 负责容器的创建和运行,Kubernetes 负责容器的管理和编排。
  • 生态互补:Docker 提供容器技术,Kubernetes 提供容器编排技术,两者结合,形成一个完整的容器化解决方案。

Docker 的角色

  • 构建容器镜像:使用 Dockerfile 构建应用的镜像。
  • 运行容器实例:通过 Docker 引擎运行容器实例。

Kubernetes 的角色

  • 管理容器:提供容器的部署、调度、扩展和管理功能。
  • 服务编排:定义和管理多容器应用的服务、网络和存储。

3. Kubernetes 基本概念

在深入实践之前,先了解一些 Kubernetes 的基础概念:

Pod(Pod)

Pod 是 Kubernetes 中最小的部署单元,一个 Pod 中可以包含一个或多个容器。Pod 中的容器共享同一个网络命名空间和存储卷,便于容器之间的通信和数据共享。

Deployment(部署)

Deployment 是 Kubernetes 中用于管理应用的控制器,负责声明应用的期望状态,如副本数、镜像版本等。Deployment 会确保所管理的 Pods 的状态与声明一致。

Service(服务)

Service 是 Kubernetes 中用于暴露应用的网络接口,负责将流量分发到集群中的 Pods。常见的类型包括 ClusterIP、NodePort、LoadBalancer 和 ExternalName。

Namespace(命名空间)

Namespace 用于将集群中的资源划分为不同的命名空间,便于管理和隔离不同的应用和环境。

ConfigMap 和 Secret

  • ConfigMap:用于存储非机密的配置信息,供容器在运行时读取。
  • Secret:用于存储敏感信息,如密码、密钥等,提供加密存储和访问控制。

Volume(卷)

Volume 提供了持久化存储的机制,可以将数据在容器重启和升级过程中保持不丢失。常见的卷类型包括 emptyDir、hostPath、nfs、awsElasticBlockStore 等。

4. 使用 Minikube 学习 Kubernetes

Minikube 是一个轻量级的 Kubernetes 集群环境,适合在本地开发和测试 Kubernetes 应用。下面是如何安装和使用 Minikube 的步骤:

安装 Minikube

在不同操作系统上安装 Minikube:

  • macOS

    brew install minikube
    
  • Windows

    choco install minikube
    
  • Linux

    curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 \
        && chmod +x minikube
    sudo mv minikube /usr/local/bin/
    

启动 Minikube 集群

启动 Minikube 集群:

minikube start

验证集群状态

查看 Minikube 集群的状态:

kubectl cluster-info

输出示例:

Kubernetes master is running at http://192.168.99.100:8443

使用 kubectl 操作集群

kubectl 是 Kubernetes 的命令行工具,用于与 Kubernetes 集群进行交互。确保 kubectl 已经配置好连接到 Minikube 集群。

kubectl get nodes

输出示例:

NAME       STATUS   ROLES    AGE   VERSION
minikube   Ready    master   13m   v1.21.0

5. 一个完整的例子

我们将通过一个完整的示例,演示如何在 Kubernetes 上部署一个简单的 Web 应用,并连接一个数据库服务。以下是步骤和相关代码注释。

1. 创建 Deployment 和 Service

我们将使用一个简单的 Nginx 应用和一个 MySQL 数据库。

nginx-deployment.yaml
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:latest
        ports:
        - containerPort: 80
mysql-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:5.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "password"
        ports:
        - containerPort: 3306
nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  ports:
  - port: 3306
    targetPort: 3306
  selector:
    app: mysql

2. 应用配置到 Kubernetes

使用 kubectl 将配置应用到集群:

kubectl apply -f nginx-deployment.yaml
kubectl apply -f mysql-deployment.yaml
kubectl apply -f nginx-service.yaml
kubectl apply -f mysql-service.yaml

3. 验证部署状态

查看 Deployment 状态:

kubectl get deployments

输出示例:

NAME             READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   2/2     2            2           10m
mysql-deployment   1/1     1            1           10m

查看 Service 状态:

kubectl get services

输出示例:

NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
nginx-service   NodePort    10.96.0.1       <none>        80:30001/TCP     10m
mysql-service   ClusterIP   10.96.4.2       <none>        3306/TCP         10m

4. 访问 Web 应用

可以通过 NodePort 的方式访问 Nginx 服务:

minikube service nginx-service

这将自动打开浏览器,访问 Nginx 服务的 80 端口。

5. 连接数据库

使用 Kubernetes 的配置文件,连接 MySQL 数据库服务。示例 mysql-connection.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
data:
  MYSQL_ROOT_PASSWORD: "password"
---
apiVersion: v1
kind: Pod
metadata:
  name: mysql-client
spec:
  containers:
  - name: mysql-client
    image: mysql:5.7
    command: ["sleep"]
    args: ["infinity"]
    env:
    - name: MYSQL_ROOT_PASSWORD


      valueFrom:
        configMapKeyRef:
          name: mysql-config
          key: MYSQL_ROOT_PASSWORD

通过以上步骤,我们成功创建了一个包含 Nginx 和 MySQL 服务的 Kubernetes 集群,并实现了应用的部署和访问。希望通过这个示例,你能够更好地理解和使用 Kubernetes 进行 Docker 容器的编排。 Kubernetes还有好多功能,如 Horizontal Pod Autoscaling(水平自动伸缩)、StatefulSet(有状态服务管理)、Helm(包管理器)等,读者可以自行探索学习。

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值