# OPS NOTE **Repository Path**: ldwwjsd2307/ops-note ## Basic Information - **Project Name**: OPS NOTE - **Description**: 运维笔记 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-12-09 - **Last Updated**: 2023-12-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # k8s部署流程 购买云服务器 ![image-20231209103934133](C:\Users\Redmi pro14\AppData\Roaming\Typora\typora-user-images\image-20231209103934133.png) 使用公网IP登录mobaxterm ![image-20231209104009968](C:\Users\Redmi pro14\AppData\Roaming\Typora\typora-user-images\image-20231209104009968.png) ![image-20231209104120807](C:\Users\Redmi pro14\AppData\Roaming\Typora\typora-user-images\image-20231209104120807.png) 安装k8s安装辅助工具sealos 将sealos 文件放到虚拟机 的根目录 ![image-20231209104313221](C:\Users\Redmi pro14\AppData\Roaming\Typora\typora-user-images\image-20231209104313221.png) 安装sealos ``` [root@ecs-6d01 ~]# cd / [root@ecs-6d01 /]# cd sealos [root@ecs-6d01 sealos]# ls sealos_4.3.5_linux_amd64.tar.gz [root@ecs-6d01 sealos]# tar zvxf sealos_4.3.5_linux_amd64.tar.gz sealos sealos [root@ecs-6d01 sealos]# chmod +x sealos [root@ecs-6d01 sealos]# mv sealos /usr/bin/ [root@ecs-6d01 sealos]# sealos version SealosVersion: buildDate: "2023-10-09T10:07:15Z" compiler: gc gitCommit: 881c10cb gitVersion: 4.3.5 goVersion: go1.20.8 platform: linux/amd64 安装节点sealos [root@ecs-6d01 sealos]# sealos run labring/kubernetes:v1.25.0 labring/helm:v3.8.2 labring/calico:v3.24.1 --single ``` ### 部署 MySQL 1. MySQL服务启动 ``` [root@master sealos]# vim mysql.yaml apiVersion: apps/v1 #版本 kind: Deployment #创建资源的类型 metadata: #资源的元数据 name: mysql-dep #资源的名称,是元数据必填项 spec: #期望状态 replicas: 1 #创建的副本数量(pod数量),不填默认为1 selector: # matchLabels: app: mysql-pod template: #定义pod的模板 metadata: #pod的元数据 labels: #labels标签,必填一个 app: mysql-pod spec: #pod的期望状态 containers: #容器 - name: mysql #容器名称 image: mysql:5.7 #镜像 imagePullPolicy: IfNotPresent ports: #容器的端口 - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD value: "root" --- apiVersion: v1 #版本 kind: Service #创建资源的类型 metadata: #资源的元数据 name: mysql-svc #资源的名称,是元数据必填项 labels: #labels标签 app: mysql-svc spec: #期望状态 type: NodePort #服务类型 ports: #端口 - port: 3306 targetPort: 3306 #与containerPort一样 protocol: TCP nodePort: 30306 selector: app: mysql-pod [root@master sealos]# kubectl apply -f mysql.yaml [root@master sealos]# kubectl get pods NAME READY STATUS RESTARTS AGE mysql-dep-65669b7bc5-9hkql 1/1 Running 0 2m23s [root@master sealos]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 443/TCP 6m37s mysql-svc NodePort 10.96.0.194 3306:30306/TCP 27s ``` 2.mysql客户端工具连接, 导入所需要的库表,资料中的 vehicle.sql(或者使用备份还原) ![image-20231209105044838](C:\Users\Redmi pro14\AppData\Roaming\Typora\typora-user-images\image-20231209105044838.png) 将sql文件还原到数据库 ![image-20231209105532574](C:\Users\Redmi pro14\AppData\Roaming\Typora\typora-user-images\image-20231209105532574.png) ### 部署后端项目 #### 制作镜像,此过程不需要做,仅作复习(使用我们自己的虚拟机,之前使用过的docker机器即可) 2.使用资源文件形式,部署后端服务 ``` [root@localhost /]# vim vehicle.yaml apiVersion: apps/v1 #版本 kind: Deployment #创建资源的类型 metadata: #资源的元数据 name: vehicle-dep #资源的名称,是元数据必填项 spec: #期望状态 replicas: 1 #创建的副本数量(pod数量),不填默认为1 selector: # matchLabels: app: vehicle-pod template: #定义pod的模板 metadata: #pod的元数据 labels: #labels标签,必填一个 app: vehicle-pod spec: #pod的期望状态 containers: #容器 - name: vehicle #容器名称 image: registry.cn-hangzhou.aliyuncs.com/tedutest/vehicle:v1 #镜像 --- apiVersion: v1 #版本 kind: Service #创建资源的类型 metadata: #资源的元数据 name: vehicle-svc #资源的名称,是元数据必填项 labels: #labels标签 app: vehicle-svc spec: #期望状态 type: NodePort #服务类型 ports: #端口 - port: 8080 targetPort: 8080 #与containerPort一样 protocol: TCP nodePort: 30307 selector: app: vehicle-pod [root@master sealos]# kubectl apply -f vehicle.yaml [root@master /]# kubectl get pods NAME READY STATUS RESTARTS AGE mysql-dep-65669b7bc5-9hkql 1/1 Running 0 100m vehicle-dep-866c584986-m2xsc 1/1 Running 2 (3m8s ago) 10m [root@master /]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 443/TCP 104m mysql-svc NodePort 10.96.0.194 3306:30306/TCP 98m vehicle-svc NodePort 10.96.2.33 8080:30307/TCP 13m ``` 3.测试 ``` [root@master /]# curl --location '119.8.28.158:30307/dict/basic/info/save' --header 'Content-Type: application/json' --data '{"dictName":"tes1t","dictType":5}' {"code":200,"message":"success","data":null}[root@master /]# ``` ### 部署前端 1.使用资源文件形式,部署nginx ``` [root@master /]# vim nginx.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx-pod name: nginx-pod spec: replicas: 1 selector: # Deployment会匹配与这里设置的相同标签内容的pod matchLabels: app: nginx-pod # pod的模板描述 template: metadata: #定义pod的标签 labels: app: nginx-pod spec: containers: - image: nginx name: nginx-pod --- apiVersion: v1 #版本 kind: Service #创建资源的类型 metadata: #资源的元数据 name: nginx-svc #资源的名称,是元数据必填项 labels: #labels标签 app: nginx-svc spec: #期望状态 type: NodePort #服务类型 ports: #端口 - port: 80 targetPort: 80 #与containerPort一样 protocol: TCP nodePort: 30308 selector: app: nginx-pod [root@master /]# kubectl apply -f nginx.yaml [root@master /]# kubectl get pods NAME READY STATUS RESTARTS AGE mysql-dep-65669b7bc5-9hkql 1/1 Running 0 117m nginx-pod-f476446cf-rg2qk 1/1 Running 0 15s vehicle-dep-866c584986-m2xsc 1/1 Running 2 (20m ago) 27m [root@master /]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 443/TCP 121m mysql-svc NodePort 10.96.0.194 3306:30306/TCP 115m nginx-svc NodePort 10.96.1.44 80:30308/TCP 25s vehicle-svc NodePort 10.96.2.33 8080:30307/TCP 30m ``` 2.测试,浏览器访问地址:[http://119.8.28.128:30308/](https://gitee.com/link?target=http%3A%2F%2F120.46.47.139%3A30308%2F) ![image-20231209110459733](C:\Users\Redmi pro14\AppData\Roaming\Typora\typora-user-images\image-20231209110459733.png) 或者再命令行 ![image-20231209110539804](C:\Users\Redmi pro14\AppData\Roaming\Typora\typora-user-images\image-20231209110539804.png) 3.上传资料文件中的dist目录到根目录下,该代码就是前端所写的vue项目代码 ![image-20231209110839573](C:\Users\Redmi pro14\AppData\Roaming\Typora\typora-user-images\image-20231209110839573.png) 4.从宿主机把dist目录拷贝到nginx pod内部: kubectl cp <本地文件路径> <命名空间>/:<目标路径> ``` [root@master /]# kubectl cp /dist nginx-pod-f476446cf-rg2qk:/usr/share/nginx/html ``` 5.配置nginx的动静分离以及反向代理 ``` [root@master /]# cd / [root@master /]# vim nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root /usr/share/nginx/html/dist; index index.html index.htm; } location /api/ { proxy_pass http://vehicle-svc:8080/; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } [root@master /]# kubectl cp /nginx.conf nginx-pod-f476446cf-rg2qk:/etc/nginx/ [root@master /]# kubectl exec -it nginx-pod-f476446cf-rg2qk -- /bin/bash root@nginx-pod-f476446cf-rg2qk:/# cd /usr/share/nginx/html root@nginx-pod-f476446cf-rg2qk:/# chmod -R 777 dist/ root@nginx-pod-f476446cf-rg2qk:/# cd /usr/sbin/ root@nginx-pod-f476446cf-rg2qk:/# nginx -s reload ``` ![image-20231209111609202](C:\Users\Redmi pro14\AppData\Roaming\Typora\typora-user-images\image-20231209111609202.png) 6.访问:[http://119.8.28.158:30308/](https://gitee.com/link?target=http%3A%2F%2F120.46.47.139%3A30308%2F) ![image-20231209111521117](C:\Users\Redmi pro14\AppData\Roaming\Typora\typora-user-images\image-20231209111521117.png) # Nginx Ingress安装 ## 安装 Nginx Ingress 官网:[https://sealos.run/docs/self-hosting/lifecycle-management/quick-start/build-ingress-cluster-image](https://gitee.com/link?target=https%3A%2F%2Fsealos.run%2Fdocs%2Fself-hosting%2Flifecycle-management%2Fquick-start%2Fbuild-ingress-cluster-image) ``` [root@ecs-7c83 sealos]# sealos run docker.io/fanux/ingress-nginx:v1.2.0 [root@ecs-7c83 sealos]# kubectl get pod -A NAMESPACE NAME READY STATUS RESTARTS AGE calico-apiserver calico-apiserver-564c57c49f-ld299 1/1 Running 0 3m10s calico-apiserver calico-apiserver-564c57c49f-rhfdt 1/1 Running 0 3m10s calico-system calico-kube-controllers-85666c5b94-gxhkr 1/1 Running 0 3m44s calico-system calico-node-xts65 1/1 Running 0 3m44s calico-system calico-typha-69d5b7df59-m4lfh 1/1 Running 0 3m44s calico-system csi-node-driver-486lv 2/2 Running 0 3m21s ingress-nginx ingress-nginx-controller-6bc476f787-jpc45 1/1 Running 0 3m14s kube-system coredns-565d847f94-zj8hs 1/1 Running 0 3m49s kube-system coredns-565d847f94-zmmxt 1/1 Running 0 3m49s kube-system etcd-ecs-7c83 1/1 Running 0 4m2s kube-system kube-apiserver-ecs-7c83 1/1 Running 0 4m3s kube-system kube-controller-manager-ecs-7c83 1/1 Running 0 4m2s kube-system kube-proxy-2wxrz 1/1 Running 0 3m49s kube-system kube-scheduler-ecs-7c83 1/1 Running 0 4m3s tigera-operator tigera-operator-6675dc47f4-knzzs 1/1 Running 0 3m49s [root@ecs-8558 sealos]# kubectl get svc -A NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE calico-apiserver calico-api ClusterIP 10.96.1.7 443/TCP 49s calico-system calico-kube-controllers-metrics ClusterIP 10.96.1.80 9094/TCP 54s calico-system calico-typha ClusterIP 10.96.3.66 5473/TCP 83s default kubernetes ClusterIP 10.96.0.1 443/TCP 102s ingress-nginx ingress-nginx-controller LoadBalancer 10.96.0.210 80:31433/TCP,443:32104/TCP 46s ingress-nginx ingress-nginx-controller-admission ClusterIP 10.96.1.231 443/TCP 46s kube-system kube-dns ClusterIP 10.96.0.10 53/UDP,53/TCP,9153/TCP 101s ``` ``` # 修改ingress-nginx-controller type为 NodePort [root@ecs-8558 sealos]# kubectl edit svc -n ingress-nginx ingress-nginx-controller service/ingress-nginx-controller edited ``` ![image-20231209112318354](C:\Users\Redmi pro14\AppData\Roaming\Typora\typora-user-images\image-20231209112318354.png) ``` [root@ecs-8558 sealos]# kubectl get svc -A NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE calico-apiserver calico-api ClusterIP 10.96.1.7 443/TCP 2m37s calico-system calico-kube-controllers-metrics ClusterIP 10.96.1.80 9094/TCP 2m42s calico-system calico-typha ClusterIP 10.96.3.66 5473/TCP 3m11s default kubernetes ClusterIP 10.96.0.1 443/TCP 3m30s ingress-nginx ingress-nginx-controller NodePort 10.96.0.210 80:31405/TCP,443:31401/TCP 2m34s ingress-nginx ingress-nginx-controller-admission ClusterIP 10.96.1.231 443/TCP 2m34s kube-system kube-dns ClusterIP 10.96.0.10 53/UDP,53/TCP,9153/TCP 3m29s # ingress-nginx-controller 中 PORT 31405是http端口, 31401是https端口 ``` ![image-20231209112454185](C:\Users\Redmi pro14\AppData\Roaming\Typora\typora-user-images\image-20231209112454185.png) ## 配置 Ingress ### 域名访问实验 **是否有疑问老师的资料以及yaml怎么写,是怎么来的?** 1. 通过chatgtp或者百度都有 2. 最重要的是学会看官方文档: [https://kubernetes.github.io/ingress-nginx/user-guide/basic-usage/](https://gitee.com/link?target=https%3A%2F%2Fkubernetes.github.io%2Fingress-nginx%2Fuser-guide%2Fbasic-usage%2F) ``` [root@ecs-7c83 sealos]# vim ingress-rule.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-host-bar spec: ingressClassName: nginx rules: - host: "car.tedu.com" http: paths: - pathType: Prefix path: "/" backend: service: name: nginx-svc port: number: 80 # hello-server (service) 的端口是 8000 [root@ecs-7c83 sealos]# kubectl apply -f ingress-rule.yaml ingress.networking.k8s.io/ingress-host-bar created [root@ecs-7c83 sealos]# kubectl get ing NAME CLASS HOSTS ADDRESS PORTS AGE ingress-host-bar nginx car.tedu.com 10.96.2.78 80 30s ``` #### 配置本地hosts文件 ``` C:\Windows\System32\drivers\etc ``` ![image-20231209114507279](C:\Users\Redmi pro14\AppData\Roaming\Typora\typora-user-images\image-20231209114507279.png) ![image-20231209114551611](C:\Users\Redmi pro14\AppData\Roaming\Typora\typora-user-images\image-20231209114551611.png) ![image-20231209114716599](C:\Users\Redmi pro14\AppData\Roaming\Typora\typora-user-images\image-20231209114716599.png)