K8s实战-1

目录

  1. 引言
  2. Kubernetes概述
    • 2.1 什么是Kubernetes
    • 2.2 Kubernetes的架构
  3. 环境准备
    • 3.1 安装Minikube
    • 3.2 使用kubectl
  4. 案例一:部署一个简单的Web应用
    • 4.1 创建Docker镜像
    • 4.2 编写K8s配置文件
    • 4.3 部署应用
  5. 案例二:使用Helm管理K8s应用
    • 5.1 Helm简介
    • 5.2 安装Helm
    • 5.3 部署应用
  6. 案例三:K8s中的服务发现与负载均衡
    • 6.1 使用Service实现负载均衡
    • 6.2 配置Ingress
  7. 案例四:持久化存储
    • 7.1 使用PersistentVolume和PersistentVolumeClaim
    • 7.2 数据库实例的持久化
  8. 总结

引言

Kubernetes(K8s)作为一个强大的容器编排平台,正在迅速成为云原生应用的标准。它支持自动化部署、扩展以及管理容器化应用。本篇文章将通过几个具体的实践案例,帮助读者深入了解Kubernetes的使用。

Kubernetes概述

2.1 什么是Kubernetes

Kubernetes是一个开源的平台,用于自动化部署、扩展和管理容器化应用。它最初由Google设计,现在由Cloud Native Computing Foundation(CNCF)维护。

2.2 Kubernetes的架构

Kubernetes的架构主要由以下组件组成:

  • Master节点:负责集群的管理和控制。
  • Node节点:运行容器化应用的工作节点。
  • Pod:Kubernetes中最小的可部署单元,可以包含一个或多个容器。
  • Service:定义了一组Pod的访问策略。
  • Volume:用于持久化数据存储。

环境准备

3.1 安装Minikube

Minikube是一个工具,可以在本地快速创建Kubernetes集群。安装步骤如下:

  1. 下载Minikube:

    Copy Code
    curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube
  2. 启动Minikube:

    Copy Code
    minikube start

3.2 使用kubectl

kubectl是与Kubernetes API进行交互的命令行工具。安装方法如下:

  1. 下载kubectl:

    Copy Code
    curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl" chmod +x ./kubectl sudo mv ./kubectl /usr/local/bin/kubectl
  2. 验证安装:

    Copy Code
    kubectl version --client

案例一:部署一个简单的Web应用

4.1 创建Docker镜像

首先,我们需要创建一个简单的Web应用并构建Docker镜像。

  1. 创建一个新的目录并进入:

    bashCopy Code
    mkdir my-web-app cd my-web-app
  2. 创建一个简单的HTML文件:

    htmlCopy Code
    <!-- index.html --> <html> <head> <title>My Web App</title> </head> <body> <h1>Hello, Kubernetes!</h1> </body> </html>
  3. 创建Dockerfile:

    dockerfileCopy Code
    # Dockerfile FROM nginx:alpine COPY index.html /usr/share/nginx/html/index.html
  4. 构建Docker镜像:

    bashCopy Code
    docker build -t my-web-app .

4.2 编写K8s配置文件

接下来,我们需要为这个应用编写Kubernetes配置文件。

  1. 创建Deployment配置文件 deployment.yaml

    yamlCopy Code
    apiVersion: apps/v1 kind: Deployment metadata: name: my-web-app spec: replicas: 2 selector: matchLabels: app: my-web-app template: metadata: labels: app: my-web-app spec: containers: - name: my-web-app image: my-web-app ports: - containerPort: 80
  2. 创建Service配置文件 service.yaml

    yamlCopy Code
    apiVersion: v1 kind: Service metadata: name: my-web-app-service spec: type: NodePort ports: - port: 80 targetPort: 80 nodePort: 30001 selector: app: my-web-app

4.3 部署应用

使用kubectl命令将应用部署到Kubernetes集群中。

  1. 应用Deployment:

    bashCopy Code
    kubectl apply -f deployment.yaml
  2. 应用Service:

    bashCopy Code
    kubectl apply -f service.yaml
  3. 检查Pod状态:

    bashCopy Code
    kubectl get pods
  4. 访问应用: 在浏览器中访问 http://<minikube_ip>:30001,可以看到“Hello, Kubernetes!”的页面。

案例二:使用Helm管理K8s应用

5.1 Helm简介

Helm是Kubernetes的包管理工具,可以简化应用的部署和管理。

5.2 安装Helm

  1. 下载并安装Helm:

    bashCopy Code
    curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
  2. 初始化Helm:

    bashCopy Code
    helm repo add stable https://charts.helm.sh/stable helm repo update

5.3 部署应用

使用Helm Chart快速部署一个示例应用。

  1. 安装一个Nginx应用:

    bashCopy Code
    helm install my-nginx stable/nginx
  2. 查看部署状态:

    bashCopy Code
    kubectl get pods
  3. 访问Nginx应用: 使用相应的NodePort来访问应用。

案例三:K8s中的服务发现与负载均衡

6.1 使用Service实现负载均衡

Kubernetes的Service可以实现Pod的负载均衡。通过创建Service,我们可以将请求分发到多个Pod。

  1. 创建一个新的Web应用Deployment,并设置副本数为3:

    yamlCopy Code
    apiVersion: apps/v1 kind: Deployment metadata: name: my-load-balanced-app spec: replicas: 3 selector: matchLabels: app: my-load-balanced-app template: metadata: labels: app: my-load-balanced-app spec: containers: - name: my-load-balanced-app image: my-web-app ports: - containerPort: 80
  2. 创建Service:

    yamlCopy Code
    apiVersion: v1 kind: Service metadata: name: my-load-balanced-app-service spec: type: LoadBalancer ports: - port: 80 targetPort: 80 selector: app: my-load-balanced-app
  3. 部署:

    bashCopy Code
    kubectl apply -f deployment.yaml kubectl apply -f service.yaml

6.2 配置Ingress

Ingress提供了HTTP和HTTPS路由到服务的能力。

  1. 安装Ingress Controller(如Nginx Ingress):

    bashCopy Code
    kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
  2. 创建Ingress资源:

    yamlCopy Code
    apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress spec: rules: - host: myapp.local http: paths: - path: / pathType: Prefix backend: service: name: my-load-balanced-app-service port: number: 80
  3. 访问Ingress: 修改hosts文件,将myapp.local指向Minikube的IP。

案例四:持久化存储

7.1 使用PersistentVolume和PersistentVolumeClaim

Kubernetes支持持久化存储,以确保Pod重启后数据不丢失。

  1. 创建PersistentVolume:

    yamlCopy Code
    apiVersion: v1 kind: PersistentVolume metadata: name: my-pv spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce hostPath: path: /mnt/data
  2. 创建PersistentVolumeClaim:

    yamlCopy Code
    apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
  3. 在Deployment中使用PVC:

    yamlCopy Code
    apiVersion: apps/v1 kind: Deployment metadata: name: my-database spec: replicas: 1 selector: matchLabels: app: my-database template: metadata: labels: app: my-database spec: containers: - name: my-database image: mysql:5.7 env: - name: MYSQL_ROOT_PASSWORD value: password ports: - containerPort: 3306 volumeMounts: - mountPath: /var/lib/mysql name: mysql-storage volumes: - name: mysql-storage persistentVolumeClaim: claimName: my-pvc

7.2 数据库实例的持久化

通过上述步骤,我们可以确保数据库实例的数据在Pod重启后仍然存在。

总结

本文通过多个案例详细介绍了Kubernetes的基本使用,包括应用部署、服务发现、负载均衡和持久化存储等方面。通过实际操作,读者可以更好地理解Kubernetes的强大功能,为以后的云原生应用打下基础。

希望这本《K8s实战-1》能帮助你在Kubernetes的学习与实践中更加顺利!