K8s实战-1
目录
- 引言
- Kubernetes概述
- 2.1 什么是Kubernetes
- 2.2 Kubernetes的架构
- 环境准备
- 3.1 安装Minikube
- 3.2 使用kubectl
- 案例一:部署一个简单的Web应用
- 4.1 创建Docker镜像
- 4.2 编写K8s配置文件
- 4.3 部署应用
- 案例二:使用Helm管理K8s应用
- 5.1 Helm简介
- 5.2 安装Helm
- 5.3 部署应用
- 案例三:K8s中的服务发现与负载均衡
- 6.1 使用Service实现负载均衡
- 6.2 配置Ingress
- 案例四:持久化存储
- 7.1 使用PersistentVolume和PersistentVolumeClaim
- 7.2 数据库实例的持久化
- 总结
引言
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集群。安装步骤如下:
-
下载Minikube:
Copy Codecurl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube
-
启动Minikube:
Copy Codeminikube start
3.2 使用kubectl
kubectl
是与Kubernetes API进行交互的命令行工具。安装方法如下:
-
下载kubectl:
Copy Codecurl -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
-
验证安装:
Copy Codekubectl version --client
案例一:部署一个简单的Web应用
4.1 创建Docker镜像
首先,我们需要创建一个简单的Web应用并构建Docker镜像。
-
创建一个新的目录并进入:
bashCopy Codemkdir my-web-app cd my-web-app
-
创建一个简单的HTML文件:
htmlCopy Code<!-- index.html --> <html> <head> <title>My Web App</title> </head> <body> <h1>Hello, Kubernetes!</h1> </body> </html>
-
创建Dockerfile:
dockerfileCopy Code# Dockerfile FROM nginx:alpine COPY index.html /usr/share/nginx/html/index.html
-
构建Docker镜像:
bashCopy Codedocker build -t my-web-app .
4.2 编写K8s配置文件
接下来,我们需要为这个应用编写Kubernetes配置文件。
-
创建Deployment配置文件
deployment.yaml
:yamlCopy CodeapiVersion: 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
-
创建Service配置文件
service.yaml
:yamlCopy CodeapiVersion: 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集群中。
-
应用Deployment:
bashCopy Codekubectl apply -f deployment.yaml
-
应用Service:
bashCopy Codekubectl apply -f service.yaml
-
检查Pod状态:
bashCopy Codekubectl get pods
-
访问应用: 在浏览器中访问
http://<minikube_ip>:30001
,可以看到“Hello, Kubernetes!”的页面。
案例二:使用Helm管理K8s应用
5.1 Helm简介
Helm是Kubernetes的包管理工具,可以简化应用的部署和管理。
5.2 安装Helm
-
下载并安装Helm:
bashCopy Codecurl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
-
初始化Helm:
bashCopy Codehelm repo add stable https://charts.helm.sh/stable helm repo update
5.3 部署应用
使用Helm Chart快速部署一个示例应用。
-
安装一个Nginx应用:
bashCopy Codehelm install my-nginx stable/nginx
-
查看部署状态:
bashCopy Codekubectl get pods
-
访问Nginx应用: 使用相应的NodePort来访问应用。
案例三:K8s中的服务发现与负载均衡
6.1 使用Service实现负载均衡
Kubernetes的Service可以实现Pod的负载均衡。通过创建Service,我们可以将请求分发到多个Pod。
-
创建一个新的Web应用Deployment,并设置副本数为3:
yamlCopy CodeapiVersion: 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
-
创建Service:
yamlCopy CodeapiVersion: v1 kind: Service metadata: name: my-load-balanced-app-service spec: type: LoadBalancer ports: - port: 80 targetPort: 80 selector: app: my-load-balanced-app
-
部署:
bashCopy Codekubectl apply -f deployment.yaml kubectl apply -f service.yaml
6.2 配置Ingress
Ingress提供了HTTP和HTTPS路由到服务的能力。
-
安装Ingress Controller(如Nginx Ingress):
bashCopy Codekubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
-
创建Ingress资源:
yamlCopy CodeapiVersion: 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
-
访问Ingress: 修改hosts文件,将
myapp.local
指向Minikube的IP。
案例四:持久化存储
7.1 使用PersistentVolume和PersistentVolumeClaim
Kubernetes支持持久化存储,以确保Pod重启后数据不丢失。
-
创建PersistentVolume:
yamlCopy CodeapiVersion: v1 kind: PersistentVolume metadata: name: my-pv spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce hostPath: path: /mnt/data
-
创建PersistentVolumeClaim:
yamlCopy CodeapiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
-
在Deployment中使用PVC:
yamlCopy CodeapiVersion: 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的学习与实践中更加顺利!