1. 首页 > Linux教程 > 正文

Linux教程FG458-Kubernetes实战案例一

内容简介:本文风哥教程参考Linux官方文档、Red Hat Enterprise Linux官方文档、Ansible Automation Platform官方文档、Docker官方文档、Kubernetes官方文档和Podman官方文档等内容,详细介绍了相关技术的配置和使用方法。

风哥提示:

本文档介绍Kubernetes部署Web应用的实战案例。

Part01-项目概述

1.1 项目架构

# 项目架构说明
[root@k8s-master ~]# cat > /root/fgedu-web-project.txt << 'EOF' FGEDU Web应用部署项目 ===================== 1. 项目组件 - Nginx: 前端Web服务器 - PHP-FPM: PHP应用服务 - MySQL: 数据库服务 - Redis: 缓存服务 2. 技术栈 - 容器运行时: containerd - 容器编排: Kubernetes - 服务发现: Service - 入口管理: Ingress - 配置管理: ConfigMap/Secret 3. 高可用设计 - 多副本部署 - Pod反亲和性 - 健康检查 - 滚动更新 4. 存储方案 - MySQL: PVC持久存储 - Redis: 内存存储 - Nginx: ConfigMap配置 EOF

Part02-创建命名空间和配置

2.1 基础资源配置

# 创建命名空间
[root@k8s-master ~]# kubectl create namespace fgedu-webapp
namespace/fgedu-webapp created

# 创建Secret
[root@k8s-master ~]# cat > fgedu-secret.yaml << 'EOF' apiVersion: v1 kind: Secret metadata: name: fgedu-app-secret namespace: fgedu-webapp type: Opaque stringData: DB_HOST: fgedu-mysql DB_NAME: fgedudb DB_USER: fgedu DB_PASSWORD: fgedu123 REDIS_HOST: fgedu-redis REDIS_PASSWORD: redis123 EOF [root@k8s-master ~]# kubectl apply -f fgedu-secret.yaml secret/fgedu-app-secret created # 创建ConfigMap [root@k8s-master ~]# cat > fgedu-configmap.yaml << 'EOF' apiVersion: v1 kind: ConfigMap metadata: name: fgedu-nginx-config namespace: fgedu-webapp data: nginx.conf: | worker_processes auto; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; sendfile on; 学习交流加群风哥微信: itpux-comkeepalive_timeout 65; upstream php-backend { server fgedu-php:9000; } server { listen 80; server_name 更多学习教程公众号风哥教程itpux_comfgedu.net.cn; root /var/www/html; indfrom PG视频:www.itpux.comex index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass php-backend; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } } --- apiVersion: v1 kind: ConfigMap metadata: name: fgedu-php-config namespace: fgedu-webapp data: php.ini: | [PHP] upload_max_filesize = 50M post_max_size = 50M memory_limit = 256M max_execution_time = 300 [Session] session.save_handler = redis session.save_path = "tcp://fgedu-redis:6379?auth=redis123" EOF [root@k8s-master ~]# kubectl apply -f fgedu-configmap.yaml configmap/fgedu-nginx-config created configmap/fgedu-php-config created

Part03-部署数据库服务

3.1 MySQL部署

# 创建MySQL PVC
[root@k8s-master ~]# cat > fgedu-mysql-pvc.yaml << 'EOF' apiVersion: v1 kind: PersistentVolumeClaim metadata: name: fgedu-mysql-pvc namespace: fgedu-webapp spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi storageClassName: fgedu-nfs-storage EOF [root@k8s-master ~]# kubectl apply -f fgedu-mysql-pvc.yaml persistentvolumeclaim/fgedu-mysql-pvc created # 部署MySQL [root@k8s-master ~]# cat > fgedu-mysql.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: fgedu-mysql namespace: fgedu-webapp spec: replicas: 1 selector: matchLabels: app: fgedu-mysql strategy: type: Recreate template: metadata: labels: app: fgedu-mysql spec: containers: - name: mysql image: mysql:8.0 ports: - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: fgedu-app-secret key: DB_PASSWORD - name: MYSQL_DATABASE valueFrom: secretKeyRef: name: fgedu-app-secret key: DB_NAME - name: MYSQL_USER valueFrom: secretKeyRef: name: fgedu-app-secret key: DB_USER - name: MYSQL_PASSWORD valueFrom: secretKeyRef: name: fgedu-app-secret key: DB_PASSWORD volumeMounts: - name: mysql-data mountPath: /var/lib/mysql resources: requests: cpu: 500m memory: 512Mi limits: cpu: 1000m memory: 1Gi livenessProbe: exec: command: - mysqladmin - ping - -h - localhost initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: exec: command: - mysql - -h - localhost - -u - root - -pfgedu123 - -e - SELECT 1 initialDelaySeconds: 5 periodSeconds: 5 volumes: - name: mysql-data persistentVolumeClaim: claimName: fgedu-mysql-pvc --- apiVersion: v1 kind: Service metadata: name: fgedu-mysql namespace: fgedu-webapp spec: ports: - port: 3306 targetPort: 3306 selector: app: fgedu-mysql EOF [root@k8s-master ~]# kubectl apply -f fgedu-mysql.yaml deployment.apps/fgedu-mysql created service/fgedu-mysql created # 查看MySQL状态 [root@k8s-master ~]# kubectl get pods -n fgedu-webapp -l app=fgedu-mysql NAME READY STATUS RESTARTS AGE fgedu-mysql-abc12-xyz789 1/1 Running 0 1m

Part04-部署应用服务

4.1 Redis部署

# 部署Redis
[root@k8s-master ~]# cat > fgedu-redis.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: fgedu-redis namespace: fgedu-webapp spec: replicas: 1 selector: matchLabels: app: fgedu-redis template: metadata: labels: app: fgedu-redis spec: containers: - name: redis image: redis:7 ports: - containerPort: 6379 command: - redis-server - --requirepass - redis123 resources: requests: cpu: 100m memory: 128Mi limits: cpu: 500m memory: 512Mi livenessProbe: exec: command: - redis-cli - -a - redis123 - ping initialDelaySeconds: 30 periodSeconds: 10 --- apiVersion: v1 kind: Service metadata: name: fgedu-redis namespace: fgedu-webapp spec: ports: - port: 6379 targetPort: 6379 selector: app: fgedu-redis EOF [root@k8s-master ~]# kubectl apply -f fgedu-redis.yaml deployment.apps/fgedu-redis created service/fgedu-redis created # 部署PHP应用 [root@k8s-master ~]# cat > fgedu-php.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: fgedu-php namespace: fgedu-webapp spec: replicas: 3 selector: matchLabels: app: fgedu-php template: metadata: labels: app: fgedu-php spec: affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - fgedu-php topologyKey: kubernetes.io/hostname containers: - name: php-fpm image: php:8.2-fpm ports: - containerPort: 9000 volumeMounts: - name: app-code mountPath: /var/www/html - name: php-config mountPath: /usr/local/etc/php/conf.d/custom.ini subPath: php.ini envFrom: - secretRef: name: fgedu-app-secret resources: requests: cpu: 200m memory: 256Mi limits: cpu: 500m memory: 512Mi readinessProbe: tcpSocket: port: 9000 initialDelaySeconds: 10 periodSeconds: 5 volumes: - name: app-code emptyDir: {} - name: php-config configMap: name: fgedu-php-config --- apiVersion: v1 kind: Service metadata: name: fgedu-php namespace: fgedu-webapp spec: ports: - port: 9000 targetPort: 9000 selector: app: fgedu-php EOF [root@k8s-master ~]# kubectl apply -f fgedu-php.yaml deployment.apps/fgedu-php created service/fgedu-php created # 部署Nginx [root@k8s-master ~]# cat > fgedu-nginx.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: fgedu-nginx namespace: fgedu-webapp spec: replicas: 3 selector: matchLabels: app: fgedu-nginx template: metadata: labels: app: fgedu-nginx spec: affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - fgedu-nginx topologyKey: kubernetes.io/hostname containers: - name: nginx image: nginx:1.25 ports: - containerPort: 80 volumeMounts: - name: nginx-config mountPath: /etc/nginx/nginx.conf subPath: nginx.conf - name: app-code mountPath: /var/www/html resources: requests: cpu: 100m memory: 128Mi limits: cpu: 500m memory: 256Mi readinessProbe: httpGet: path: / port: 80 initialDelaySeconds: 5 periodSeconds: 5 volumes: - name: nginx-config configMap: name: fgedu-nginx-config - name: app-code emptyDir: {} --- apiVersion: v1 kind: Service metadata: name: fgedu-nginx namespace: fgedu-webapp spec: ports: - port: 80 targetPort: 80 selector: app: fgedu-nginx --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: fgedu-webapp-ingress namespace: fgedu-webapp annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: nginx rules: - host: fgedu.net.cn http: paths: - path: / pathType: Prefix backend: service: name: fgedu-nginx port: number: 80 EOF [root@k8s-master ~]# kubectl apply -f fgedu-nginx.yaml deployment.apps/fgedu-nginx created service/fgedu-nginx created ingress.networking.k8s.io/fgedu-webapp-ingress created # 查看所有资源 [root@k8s-master ~]# kubectl get all -n fgedu-webapp NAME READY STATUS RESTARTS AGE pod/fgedu-mysql-abc12-xyz789 1/1 Running 0 5m pod/fgedu-redis-abc12-xyz789 1/1 Running 0 4m pod/fgedu-php-abc12-xyz789 1/1 Running 0 3m pod/fgedu-php-abc12-abc12 1/1 Running 0 3m pod/fgedu-php-abc12-def34 1/1 Running 0 3m pod/fgedu-nginx-abc12-xyz789 1/1 Running 0 2m pod/fgedu-nginx-abc12-abc12 1/1 Running 0 2m pod/fgedu-nginx-abc12-def34 1/1 Running 0 2m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/fgedu-mysql ClusterIP 10.96.100.100 3306/TCP 5m
service/fgedu-redis ClusterIP 10.96.101.100 6379/TCP 4m
service/fgedu-php ClusterIP 10.96.102.100 9000/TCP 3m
service/fgedu-nginx ClusterIP 10.96.103.100 80/TCP 2m

NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/fgedu-mysql 1/1 1 1 5m
deployment.apps/fgedu-redis 1/1 1 1 4m
deployment.apps/fgedu-php 3/3 3 3 3m
deployment.apps/fgedu-nginx 3/3 3 3 2m

风哥针对实战案例建议:

  • 使用ConfigMap管理配置
  • 使用Secret管理敏感信息
  • 配置健康检查保证可用性
  • 使用反亲和性分散部署
  • 配置资源限制防止资源争抢

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息