Implementación distribuida del sistema de aplicaciones web gpmall basado en el clúster de kubernetes

【ilustrar】

gpmall es una plataforma de comercio electrónico de código abierto basada en SpringBoot+Dubbo. El Sr. Xu corrigió algunos errores en el proyecto y lo volvió a publicar en gitee para solucionar algunos problemas en la implementación del clúster de k8. Se recomienda descargar y aprender de su gitee, Los enlaces de descarga de código fuente y más introducciones de gpmall son: gpamll

El siguiente proceso de implementación tomó prestadas y firmó las notas de Youdao Cloud del Sr. Xu , e hizo optimización y refinamiento.

Dado que la nube privada interna restringe el acceso a la red externa, todas las imágenes utilizadas durante esta implementación provienen del almacén espejo interno de Harbor, y los detalles de la implementación en el clúster de kubernetes en la nube privada interna de Huawei se registran en detalle.

Para conocer el proceso de implementación manual de clústeres de kubernetes de alto rendimiento, consulte: Implementación de clústeres de kubernetes de alto rendimiento

Para conocer el proceso de implementación automática de clústeres de kubernetes de alto rendimiento, consulte: implementación automática ansible de k8s

1 compilación de proyectos

1.1 Preparación del entorno de compilación

gpmall se basa en la separación de front-end y front-end. El entorno de front-end necesita instalar el entorno de nodo. Para obtener el tutorial de instalación, consulte: Instalación de nodo .

El código de back-end requiere un entorno Idea y Maven, el proceso de configuración puede referirse a: Instalación de Idea , Instalación de Maven

1.2 Compilar el módulo

gpmall se basa en microservicios. Cada módulo debe compilarse por separado y el orden de compilación es particular. El orden de compilación de cada módulo es el siguiente:

  1. gpmall-padre
  2. gpmall-commons
  3. servicio de usuario
  4. servicio de compras
  5. servicio de pedidos
  6. servicio de pago
  7. servicio de mercado
  8. servicio de comentarios
  9. servicio de busqueda

Aquí, el primer módulo se toma como ejemplo para ilustrar cómo usar IDEA para compilar el módulo, y el proceso de compilación de otros módulos es el mismo.

1. Abra el módulo

2. Seleccione el módulo a compilar

 3. Después de abrir, haga doble clic en la instalación de Lifecycle en Maven a la derecha para compilar

 Si hay un proyecto raíz en algunos módulos, simplemente compile el proyecto raíz.

4. Una vez completada la compilación, habrá un paquete jar en el directorio del almacén. Este paquete jar se puede usar para una implementación posterior. Puede consultar la información de registro de la instalación para el directorio generado específico del paquete jar.  

 Compile cada módulo secuencialmente de acuerdo con el orden de compilación anterior y, finalmente, obtenga el siguiente paquete jar para la implementación posterior:

(1)usuario-proveedor-0.0.1-SNAPSHOT.jar

(2)gpmall-usuario-0.0.1-INSTANTÁNEA.jar

(3)proveedor-de-compras-0.0.1-SNAPSHOT.jar

(4)proveedor-pedido-0.0.1-INSTANTÁNEA.jar

(5)proveedor-de-comentarios-0.0.1-INSTANTÁNEA.jar

(6)proveedor-de-búsqueda-1.0-INSTANTÁNEA.jar

(7)gpmall-compras-0.0.1-INSTANTÁNEA.jar

Los siete paquetes jar anteriores deben cargarse en un host de Linux para crear imágenes de Docker para ellos Aquí tomamos el nodo del controlador ansible como ejemplo.

Transfiera los 7 paquetes jar anteriores al host de control ansible usando herramientas como xftp o sftp, y almacénelos en los 7 directorios correspondientes, como se muestra en la figura a continuación.

[zhangsan@controller ~]$ ls -ld /data/zhangsan/gpmall/gpmall-jar/*
drwxr-xr-x 2 root root 4096  3月 24 17:48 /data/zhangsan/gpmall/gpmall-jar/comment-provider
drwxr-xr-x 2 root root 4096  3月 24 17:48 /data/zhangsan/gpmall/gpmall-jar/gpmall-shopping
drwxr-xr-x 2 root root 4096  3月 24 17:48 /data/zhangsan/gpmall/gpmall-jar/gpmall-user
drwxr-xr-x 2 root root 4096  3月 24 17:48 /data/zhangsan/gpmall/gpmall-jar/order-provider
drwxr-xr-x 2 root root 4096  3月 24 17:49 /data/zhangsan/gpmall/gpmall-jar/search-provider
drwxr-xr-x 2 root root 4096  3月 24 17:49 /data/zhangsan/gpmall/gpmall-jar/shopping-provider
drwxr-xr-x 2 root root 4096  3月 24 17:49 /data/zhangsan/gpmall/gpmall-jar/user-provider

1.3 Hacer una imagen Docker

Aunque k8s ya no es compatible con docker desde la versión 1.24, la imagen creada con docker aún se puede usar en el clúster k8s, por lo que la imagen de docker todavía se crea una por una para los 7 paquetes jar compilados anteriormente.

1.3.1 Preparación del entorno

1. Instalar ventana acoplable

Se puede crear una imagen de Docker en cualquier host Linux. Aquí, se usa un host openEuler para construir una imagen de Docker. La operación en el nodo k8s-master01 se usa como ejemplo a continuación.

Dado que openEuler no tiene Docker instalado de forma predeterminada, puede ejecutar el siguiente comando para instalar Docker.

# 安装docker
[zhangsan@controller ~]$ sudo dnf -y install docker

# 新建和编辑/etc/docker/daemon.json 配置文件

2. Configurar el servicio docker

De forma predeterminada, la ventana acoplable extraerá las imágenes del almacén espejo oficial. Puede modificar el archivo de configuración para modificar la dirección del almacén espejo. Aquí, agréguele el almacén espejo privado, como se muestra a continuación.

[zhangsan@controller ~]$ sudo vim /etc/docker/daemon.json 

{
         "insecure-registries":["192.168.18.18:9999"]
}

3. Reinicie el servicio docker

# 重新docker服务
[zhangsan@controller ~]$ sudo systemctl restart docker.service 

1.3.2 Compilar Dockerfile

Se debe crear un Dockerfile para el paquete jar en el directorio donde se encuentra cada paquete jar. Lo siguiente toma el primer paquete jar (user-provider-0.0.1-SNAPSHOT.jar) como ejemplo, cree y edite Dockerfile en el directorio donde se encuentra el paquete jar, el contenido es el siguiente (se pueden modificar otros paquetes jar consultando las instrucciones que contiene):

[zhangsan@controller user-provider]$ sudo vim Dockerfile

FROM 192.168.18.18:9999/common/java:openjdk-8u111-alpine

#记得将下面的zhangsan更改成自己的目录
WORKDIR /data/zhangsan/gpmall

#下边记得根据模块更换对应的jar包
ADD user-provider-0.0.1-SNAPSHOT.jar $WORKDIR 

ENTRYPOINT ["java","-jar"]

#下边记得根据模块更换对应的jar包
CMD ["$WORKDIR/user-provider-0.0.1-SNAPSHOT.jar"]

1.3.3 Usando Dockerfile para construir una imagen espejo

Para no modificar el nombre de la imagen en yaml al implementar k8s más tarde, se recomienda usar directamente el nombre del módulo como nombre de la imagen, y la etiqueta se unifica como más reciente. Los nombres de las imágenes correspondientes a cada módulo se muestran en la siguiente tabla. :

Nombre del módulo

nombre de la imagen de la ventana acoplable

Observación

usuario-proveedor

usuario-proveedor:último

gpmall-usuario

gpmall-usuario:último

proveedor de compras

proveedor de compras: más reciente

gpmall-compras

gpmall-shopping:último

proveedor de pedidos

proveedor de pedidos: más reciente

proveedor de comentarios

proveedor de comentarios: más reciente

proveedor de búsqueda

proveedor de búsqueda: más reciente

gpmall-frente

gpmall-front:último

La parte delantera, la parte trasera genera una imagen de espejo por separado.

Ejecute el siguiente comando para crear un espejo: 

### 构建Docker镜像的命令格式为如下(注意最后的一个点不能省):
### docker build -t 镜像名:tag标签 .

[zhangsan@controller user-provider]$ sudo docker build -t user-provider:latest .
Sending build context to Docker daemon  62.39MB
Step 1/5 : FROM 192.168.18.18:9999/common/java:openjdk-8u111-alpine
openjdk-8u111-alpine: Pulling from common/java
53478ce18e19: Pull complete 
d1c225ed7c34: Pull complete 
887f300163b6: Pull complete 
Digest: sha256:f0506aad95c0e03473c0d22aaede25402584ecdab818f0aeee8ddc317f7145ed
Status: Downloaded newer image for 192.168.18.18:9999/common/java:openjdk-8u111-alpine
 ---> 3fd9dd82815c
Step 2/5 : WORKDIR /data/zhangsan/gpmall
 ---> Running in bb5239c3d849
Removing intermediate container bb5239c3d849
 ---> e791422cdb40
Step 3/5 : ADD user-provider-0.0.1-SNAPSHOT.jar /data/zhangsan/gpmall
 ---> 61ece5f0c8fe
Step 4/5 : ENTRYPOINT ["java","-jar"]
 ---> Running in 8e1a6a0d6f30
Removing intermediate container 8e1a6a0d6f30
 ---> beac96264c93
Step 5/5 : CMD ["/data/zhangsan/gpmall/user-provider-0.0.1-SNAPSHOT.jar"]
 ---> Running in a5993541334a
Removing intermediate container a5993541334a
 ---> 502d57ed4303
Successfully built 502d57ed4303
Successfully tagged user-provider:latest

1.3.4 Ver imagen

[zhangsan@controller user-provider]$ sudo docker images
REPOSITORY                       TAG                    IMAGE ID            CREATED             SIZE
user-provider                    latest                 502d57ed4303        24 seconds ago      207MB
192.168.18.18:9999/common/java   openjdk-8u111-alpine   3fd9dd82815c        6 years ago         145MB

Del mismo modo, cree imágenes correspondientes para otros paquetes jar uno por uno.

1.4 Crear una imagen de front-end

1.4.1 Instalación de dependencia

El código de front-end se encuentra en la carpeta gpmall-front, por lo que debe ejecutar el comando [npm install] en este directorio, como se muestra en la figura a continuación.

1.4.2 Liberación del paquete

Ejecute el comando [npm run build] para empaquetar y se generará una carpeta dist en el directorio después de la finalización, como se muestra en la figura a continuación.

Use herramientas como xftp o sftp para copiar la carpeta al host donde se creó anteriormente la imagen de Docker y configure el entorno de Docker en la máquina, como se muestra a continuación.

[zhangsan@controller ~]$ ls /data/zhangsan/gpmall/frontend/
dist

1.4.3 Configuración de servicios web

El proyecto gpmall se desarrolla por separado de los extremos frontal y posterior, y el extremo frontal debe implementarse de forma independiente. Aquí, Nginx se selecciona como el servidor web, y la carpeta dist generada arriba se agrega a la imagen de nginx y el proxy es configurado. Por lo tanto, el archivo de configuración nginx.conf de nginx debe prepararse primero. El contenido es el siguiente, guarde el archivo en el directorio donde se encuentra dist:

[zhangsan@controller ~]$ cd /data/zhangsan/gpmall/frontend/
[zhangsan@controller frontend]$ sudo vim nginx.conf 

worker_processes auto;
 
events {
    worker_connections  1024;
}
 
http {
    include       mime.types;
    default_type  application/octet-stream;
 
    sendfile        on;
    #tcp_nopush     on;
 
    keepalive_timeout  65;
 
 
    client_max_body_size   20m;
    server {
        listen       9999;
        server_name  localhost;
 
         location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
         }

        #这里是重点,需要将所有访问/user的请求转发到集群内部对应的服务端口上,不然前端数据无法展示        
         location /user {
             proxy_pass http://gpmall-user-svc:8082;
             proxy_redirect off;
             proxy_cookie_path / /user;
         }

         #这里是重点,需要将所有访问/shopping的请求转发到集群内部对应的服务端口上,不然前端数据无法展示
 
         location /shopping {
             proxy_pass http://gpmall-shopping-svc:8081;
             proxy_redirect off;
             proxy_cookie_path / /shopping;
         }

         error_page   500 502 503 504  /50x.html;
     
         location = /50x.html {
             root   html;
         }
    }
}

1.4.4 Compilar archivo Dock

En el directorio donde se encuentra el dist, cree un Dockerfile para crear la imagen de front-end. El contenido del archivo es el siguiente:

[zhangsan@controller frontend]$ sudo vim Dockerfile 

FROM 192.168.18.18:9999/common/nginx:latest
COPY dist/  /usr/share/nginx/html/
COPY nginx.conf /etc/nginx/nginx.conf

Finalmente, confirme que el directorio dist, el archivo de configuración nginx.conf y Dockerfile están en el mismo directorio.

1.4.5 Crear imagen de front-end

Use el Dockerfile para construir la imagen para el front-end.

[zhangsan@controller frontend]$ sudo docker build -t gpmall-front:latest .
Sending build context to Docker daemon  11.01MB
Step 1/3 : FROM 192.168.18.18:9999/common/nginx:latest
latest: Pulling from common/nginx
a2abf6c4d29d: Pull complete 
a9edb18cadd1: Pull complete 
589b7251471a: Pull complete 
186b1aaa4aa6: Pull complete 
b4df32aa5a72: Pull complete 
a0bcbecc962e: Pull complete 
Digest: sha256:ee89b00528ff4f02f2405e4ee221743ebc3f8e8dd0bfd5c4c20a2fa2aaa7ede3
Status: Downloaded newer image for 192.168.18.18:9999/common/nginx:latest
 ---> 605c77e624dd
Step 2/3 : COPY dist/  /usr/share/nginx/html/
 ---> 1b2bfaf186a0
Step 3/3 : COPY nginx.conf /etc/nginx/nginx.conf
 ---> a504c7bbf947
Successfully built a504c7bbf947
Successfully tagged gpmall-front:latest

1.4.6 Ver la imagen frontal

# 查看镜像
[zhangsan@controller frontend]$ sudo docker images
REPOSITORY                                    TAG                    IMAGE ID            CREATED             SIZE
gpmall-front                                  latest                 a504c7bbf947        2 minutes ago       152MB
192.168.18.18:9999/common/nginx               latest                 605c77e624dd        14 months ago       141MB

1.5 Subir la imagen al almacén privado de imágenes

Para facilitar la implementación posterior del proyecto, las imágenes construidas previamente deben cargarse en el almacén espejo. Debido a la limitación de la red interna, todas las imágenes se cargan aquí en el almacén espejo privado. Para el proceso de construcción del espejo privado almacén, consulte: Construcción de un almacén espejo Harbour

La dirección del almacén espejo privado de Harbor desplegado internamente esta vez es: http://192.168.18.18​​​​​​:9999/

Después de crear con éxito un almacén espejo privado, debe crear una cuenta de miembro, como administrador.

La carga de una imagen de Docker en un almacén espejo generalmente requiere las siguientes tres operaciones:

1.5.1 Iniciar sesión en el almacén espejo

Use la cuenta en el almacén espejo privado para iniciar sesión en el almacén espejo privado, el comando es el siguiente:

[zhangsan@controller ~]$ sudo docker login 192.168.18.18:9999
Username: admin
Password: 

1.5.2 Simetría de marcas

La sintaxis para marcar una imagen especular es:

docker tag 源镜像名:源标记 镜像仓库地址/项目名称/修改后的镜像名:修改后的标记

Un ejemplo es el siguiente, marcando la imagen del front-end:

sudo docker tag gpmall-front:latest 192.168.18.18:9999/gpmall/gpmall-front:latest

1.5.3 Subir imagen 

La sintaxis para subir una imagen es:

docker push 镜像仓库地址/项目名称/修改后的镜像名:修改后的标记

 El ejemplo es el siguiente, empujando la imagen frontal al proyecto gpmall en el almacén privado:

[zhangsan@controller frontend]$ sudo docker push 192.168.18.18:9999/gpmall/gpmall-front:latest
The push refers to repository [192.168.18.18:9999/gpmall/gpmall-front]
2e5e73a63813: Pushed 
75176abf2ccb: Pushed 
d874fd2bc83b: Mounted from common/nginx 
32ce5f6a5106: Mounted from common/nginx 
f1db227348d0: Mounted from common/nginx 
b8d6e692a25e: Mounted from common/nginx 
e379e8aedd4d: Mounted from common/nginx 
2edcec3590a4: Mounted from common/nginx 
latest: digest: sha256:fc5389e7c056d95c5d269932c191312034b1c34b7486325853edf5478bf8f1b8 size: 1988

De manera similar, inserte todas las imágenes creadas previamente en el repositorio de imágenes privadas para su uso posterior. La imagen insertada se muestra en la siguiente figura:

1.5.4 Eliminar imagen

Después de que todas las imágenes se hayan enviado con éxito, puede borrar estas imágenes de la ventana acoplable. El comando de ejemplo es el siguiente:

# 先停止正在运行的所有容器
[zhangsan@controller ~]$ sudo docker stop $(sudo docker ps -a -q)

# 删除所有容器
[zhangsan@controller ~]$ sudo docker rm $(sudo docker ps -a -q)

# 删除所有镜像
[zhangsan@controller ~]$ sudo docker rmi $(sudo docker images -a -q) --force

2 Implementar el entorno operativo

Las siguientes operaciones se completan en cualquier host k8s y las siguientes operaciones se completan en el nodo k8s-master01.

2.1 Crear un espacio de nombres

No es necesario crear un espacio de nombres, pero para distinguir otros entornos de implementación y facilitar la administración posterior, es mejor crear un espacio de nombres. Aquí se requiere crear un espacio de nombres llamado pinyin con su propio nombre, como zhangsan:

sudo kubectl create namespace zhangsan

Para omitir la opción de espacio de nombres al ejecutar el comando kubectl más tarde, puede cambiar el espacio de nombres predeterminado a su propio espacio de nombres:

sudo kubectl config set-context --current --namespace=zhangsan

# 若要改回,将上面的zhangsan改为default即可

2.2 Configurar el servicio NFS

Dado que debe usarse para compartir nfs durante el proceso de implementación, el servicio NFS debe configurarse primero.

Para la conveniencia del almacenamiento de archivos, se recomienda dividir el disco actual en otra área en k8s-master01, formatearlo y montarlo permanentemente en el directorio /data.

1. Cree un directorio compartido NFS

[zhangsan@k8s-master01 ~]$ sudo mkdir -p /data/zhangsan/gpmall/nfsdata

2. Configurar el servicio nfs

openEuler ha instalado nfs-tutils de forma predeterminada, puede ejecutar el comando de instalación para instalar o verificar si se ha instalado, y luego modificar el archivo de configuración principal de nfs para permitir que cualquier host (*) tenga permisos rw, sync y no_root_squash.

[zhangsan@k8s-master01 ~]$ sudo dnf -y install nfs-utils

[zhangsan@k8s-master01 ~]$ sudo vim /etc/exports

/data/zhangsan/gpmall/nfsdata  *(rw,sync,no_root_squash)

3. Reinicie el servicio y configúrelo para que se inicie automáticamente al arrancar

[zhangsan@k8s-master01 ~]$ sudo systemctl restart rpcbind.service 
[zhangsan@k8s-master01 ~]$ sudo systemctl restart nfs-server.service 
[zhangsan@k8s-master01 ~]$ sudo systemctl enable nfs-server.service
[zhangsan@k8s-master01 ~]$ sudo systemctl enable rpcbind.service

4. Verificación

Ejecute [showmount -e dirección IP del servidor NFS] en cualquier host Linux interno, como se muestra a continuación, si puede ver el directorio compartido del servidor NFS, significa que la configuración del servicio NFS está bien.

[root@k8s-master03 ~]# showmount -e 192.168.218.100
Export list for 192.168.218.100:
/data/zhangsan/gpmall/nfsdata *

2.3 Implementar software intermedio

gpmall utiliza el middleware Elasticsearch, zookeeper, kafka, MySQL, Rabbitmq y Redis, por lo que estos middleware básicos deben implementarse con anticipación.

2.3.1 Implementar Elasticsearch

Para facilitar la administración de archivos, se puede crear un directorio dedicado aquí para almacenar archivos yaml, y todos los archivos yaml durante implementaciones posteriores se almacenan en este directorio.

# 创建一个专门存放yaml文件的目录
[zhangsan@k8s-master01 ~]$ sudo mkdir -p /data/zhangsan/gpmall/yaml

# 切换到yaml目录
[zhangsan@k8s-master01 ~]$ cd /data/zhangsan/gpmall/yaml

1. Crear es volumen persistente pv

Elasticsearch necesita conservar los datos, por lo que es necesario crear un volumen persistente pv en K8, lo que requiere crear un directorio es para montar el pv en el directorio compartido de NFS y abrir los requisitos de acceso de este directorio.

[zhangsan@k8s-master01 yaml]$ sudo mkdir -p /data/zhangsan/gpmall/nfsdata/es

# 开放权限
[zhangsan@k8s-master01 yaml]$ sudo chmod 777 /data/zhangsan/gpmall/nfsdata/es

(1) Compile el archivo yaml para crear pv

# 编制es-pv.yaml文件
[zhangsan@k8s-master01 yaml]$ sudo vim es-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: es-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs
  nfs:
    path: /data/zhangsan/gpmall/nfsdata/es     
    server: 192.168.218.100     #此处的IP为上面目录所在主机的IP

(2) Crear objeto es-pv

# 创建
[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f es-pv.yaml
persistentvolume/es-pv created

# 查看
[zhangsan@k8s-master01 yaml]$ sudo kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
es-pv   1Gi        RWO            Retain           Bound    zhangsan/es-pvc   nfs                     10h

2. Crear pvc

Después de crear es-pv, también debe crear pvc para que el pod pueda obtener recursos de almacenamiento del pv especificado.

(1) Compile el archivo yaml para crear pvc y preste atención a la modificación del espacio de nombres.

[zhangsan@k8s-master01 yaml]$ sudo vim es-pvc.yaml 

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: es-pvc
  namespace: zhangsan
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs

(2) Crear es-pvc

# 创建
[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f es-pvc.yaml
persistentvolumeclaim/es-pvc created

# 查看
[zhangsan@k8s-master01 yaml]$ sudo kubectl get pvc
NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
es-pvc   Bound    es-pv    1Gi        RWO            nfs            10h

3. Crear es-Service

(1) Compile el archivo yaml para crear el servicio es, preste atención para modificar el espacio de nombres y nodePort .

De forma predeterminada, nodePort oscila entre 30000 y 32767.

Aquí se requiere especificar nodePort como 3XY, donde X e Y son números de dos dígitos, X es su ID de clase e Y son los dos últimos dígitos de su número de estudiante Por ejemplo, 31888 a continuación representa el valor especificado por estudiante No. 88 en la Clase 18.

[zhangsan@k8s-master01 yaml]$ sudo vim es-service.yaml 

apiVersion: v1
kind: Service
metadata:
  name: es-svc
  namespace: zhangsan
spec:
  type: NodePort
  ports:
  - name: kibana
    port: 5601
    targetPort: 5601
    nodePort: 31888
  - name: rest
    port: 9200
    targetPort: 9200
  - name: inter
    port: 9300
    targetPort: 9300
  selector:
    app: es

(2) Crear servicio es

# 创建
[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f es-service.yaml
service/es-svc created

#查看
[zhangsan@k8s-master01 yaml]$ sudo kubectl get svc
NAME     TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                                        AGE
es-svc   NodePort   10.108.214.56   <none>        5601:31888/TCP,9200:31532/TCP,9300:31548/TCP   10h

4. Cree una implementación que implemente el servicio Elasticsearch

(1) Compile el archivo yaml para la implementación, preste atención para modificar el espacio de nombres y la dirección del espejo .

[zhangsan@k8s-master01 yaml]$ sudo vim es-deployment.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: es
  namespace: zhangsan
spec:
  selector:
    matchLabels:
      app: es
  template:
    metadata:
      labels:
        app: es
    spec:
      containers:
      - image: 192.168.18.18:9999/common/elasticsearch:6.6.1
        name: es
        env:
        - name: cluster.name
          value: elasticsearch
        - name: bootstrap.memory_lock
          value: "false"
        - name: ES_JAVA_OPTS
          value: "-Xms512m -Xmx512m"
        ports:
        - containerPort: 9200
          name: rest
        - containerPort: 9300
          name: inter-node
        volumeMounts:
        - name: es-data
          mountPath: /usr/share/elasticsearch/data
      - image: 192.168.18.18:9999/common/kibana:6.6.1
        name: kibana
        env:
        - name: ELASTICSEARCH_HOSTS
          value: http://es-svc:9200
        ports:
        - containerPort: 5601
          name: kibana

      volumes:
        - name: es-data
          persistentVolumeClaim:
           claimName: es-pvc

(2) Crear una implementación

# 创建
[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f es-deployment.yaml
deployment.apps/es created

# 查看
[zhangsan@k8s-master01 yaml]$ sudo kubectl get deployment
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
es     1/1     1            1           10h

Nota: Si la columna LISTO muestra 0/1, significa que hay un problema. Puede ejecutar [sudo kubectl get pod] para ver el estado del pod. Si el estado del pod es anormal, puede ejecutar [sudo kubectl describe pod_name ] para ver la información de eventos del pod, o ejecutar [sudo kubectl logs -f pod/ pod_name ] para ver los mensajes de registro.

Si el pod que comienza con es genera un error, se mostrará el siguiente mensaje de error en el registro:

ERROR: [1] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[2023-06-05T07:43:42,415][INFO ][o.e.n.Node               ] [C1xLTO-] stopping ...
[2023-06-05T07:43:42,428][INFO ][o.e.n.Node               ] [C1xLTO-] stopped
[2023-06-05T07:43:42,429][INFO ][o.e.n.Node               ] [C1xLTO-] closing ...
[2023-06-05T07:43:42,446][INFO ][o.e.n.Node               ] [C1xLTO-] closed

 La solución es la siguiente:

En todos los nodos k8s, modifique el archivo /etc/sysctl.conf, agregue el contenido vm.max_map_count=262144 al final del archivo y luego reinicie cada nodo k8s.

vim /etc/sysctl.conf

……此处省略文件原有内容……
vm.max_map_count=262144

2.3.2 implementar zookeeper

1. Crear servicio de cuidador del zoológico

(1) Compile el archivo yaml para crear objetos de servicio de zookeeper y preste atención a la modificación del espacio de nombres .

[zhangsan@k8s-master01 yaml]$ sudo vim zk-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: zk-svc
  namespace: zhangsan
spec:
  ports:
  - name: zkport
    port: 2181
    targetPort: 2181
  selector:
    app: zk

(2) Crear y ver servicios de cuidadores de zoológicos

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f zk-service.yaml
service/zk-svc created

[zhangsan@k8s-master01 yaml]$ sudo kubectl get svc
NAME     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                        AGE
es-svc   NodePort    10.108.214.56   <none>        5601:31888/TCP,9200:31532/TCP,9300:31548/TCP   10h
zk-svc   ClusterIP   10.107.4.169    <none>        2181/TCP                                       11s

2. Implementar el servicio de cuidador del zoológico

(1) Compile el archivo yaml para implementar el servicio zookeeper y preste atención a la modificación del espacio de nombres y la dirección del espejo .

[zhangsan@k8s-master01 yaml]$ sudo vim zk-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: zk
  name: zk
  namespace: zhangsan
spec:
  replicas: 1
  selector:
    matchLabels:
      app: zk
  template:
    metadata:
      labels:
        app: zk
    spec:
      containers:
      - image: 192.168.18.18:9999/common/zookeeper:latest
        imagePullPolicy: IfNotPresent
        name: zk
        ports:
        - containerPort: 2181

(2) Crear y ver la implementación de zookeeper

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f zk-deployment.yaml
deployment.apps/zk created

[zhangsan@k8s-master01 yaml]$ sudo kubectl get deployment
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
es     1/1     1            1           116s
zk     1/1     1            1           4s

2.3.3 Departamento kafka

1. Crear servicio kafka

(1) Compile el archivo yaml para crear el servicio kafka y preste atención a la modificación del espacio de nombres .

[zhangsan@k8s-master01 yaml]$ sudo vim kafka-service.yaml 

apiVersion: v1
kind: Service
metadata:
  name: kafka-svc
  namespace: zhangsan
spec:
  ports:
  - name: kafkaport
    port: 9092
    targetPort: 9092
  selector:
    app: kafka

(2) Crear y ver el servicio kafka

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f kafka-service.yaml
service/kafka-svc created

# 查看服务
[zhangsan@k8s-master01 yaml]$ sudo kubectl get svc
NAME        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                                        AGE
es-svc      NodePort    10.96.114.80   <none>        5601:31888/TCP,9200:32530/TCP,9300:32421/TCP   8m39s
kafka-svc   ClusterIP   10.108.28.89   <none>        9092/TCP                                       9s
zk-svc      ClusterIP   10.107.4.169   <none>        2181/TCP                                       3h27m

2. Implementar el servicio kafka

(1) Cree un archivo yaml para implementar el servicio kafka y preste atención a la modificación del espacio de nombres y la dirección del espejo .

[zhangsan@k8s-master01 yaml]$ sudo vim kafka-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: kafka
  namespace: zhangsan
spec:
  selector:
    matchLabels:
      app: kafka
  template:
    metadata:
      labels:
        app: kafka
    spec:
      containers:
      - image: 192.168.18.18:9999/common/kafka:latest
        name: kafka
        env:
        - name: KAFKA_ADVERTISED_HOST_NAME
          value: kafka-svc
        - name: KAFKA_ADVERTISED_PORT
          value: "9092"
        - name: KAFKA_ZOOKEEPER_CONNECT
          value: zk-svc:2181
        ports:
          - containerPort: 9092

(2) Crear y ver la implementación del servicio kafka

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f kafka-deployment.yaml
deployment.apps/kafka created

# 查看
[zhangsan@k8s-master01 yaml]$ sudo kubectl get deployment | grep kafka
kafka   1/1     1            1           30s

2.3.4 Implementar MySQL

MySQL también necesita conservar los datos, por lo que también necesita recursos pv y también necesita crear un directorio de almacenamiento y abrir permisos.

# 创建目录
[zhangsan@k8s-master01 yaml]$ sudo mkdir /data/zhangsan/gpmall/nfsdata/mysql

[zhangsan@k8s-master01 yaml]$ sudo chmod 777 /data/zhangsan/gpmall/nfsdata/mysql/

1. Cree un pv de volumen persistente de MySQL

(1) Compile el archivo yaml para crear pv

# 创建yaml文件
[zhangsan@k8s-master01 yaml]$ sudo vim mysql-pv.yaml 

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs
  nfs:
    path: /data/zhangsan/gpmall/nfsdata/mysql 
    server: 192.168.218.100    #此处的IP为上面目录所在主机的IP地址

(2) Crear y ver mysql-pv

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f mysql-pv.yaml
persistentvolume/mysql-pv created

# 查看
[zhangsan@k8s-master01 yaml]$ sudo kubectl get pv/mysql-pv
NAME       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
mysql-pv   1Gi        RWO            Retain           Available           nfs                     32s

2. Crear pvc

(1) Compile el archivo yaml para crear pvc y preste atención a la modificación del espacio de nombres .

[zhangsan@k8s-master01 yaml]$ sudo vim mysql-pvc.yaml 

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
  namespace: zhangsan
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs

(2) Crear y ver mysql-pvc

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f mysql-pvc.yaml
persistentvolumeclaim/mysql-pvc created

[zhangsan@k8s-master01 yaml]$ sudo kubectl get pvc/mysql-pvc
NAME        STATUS   VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql-pvc   Bound    mysql-pv   1Gi        RWO            nfs            17s

3. Crear servicio MySQL

(1) Compile el archivo yaml que crea el servicio mysql y preste atención a la modificación del espacio de nombres .

[zhangsan@k8s-master01 yaml]$ sudo vim mysql-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysql-svc
  namespace: zhangsan
spec:
  type: NodePort
  ports:
  - port: 3306
    targetPort: 3306
    nodePort: 30306
  selector:
    app: mysql

(2) Crear y ver el servicio MySQL

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f mysql-svc.yaml
service/mysql-svc created

[zhangsan@k8s-master01 yaml]$ sudo kubectl get svc/mysql-svc
NAME        TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
mysql-svc   NodePort   10.96.70.204   <none>        3306:30306/TCP   24s

4. Implementar el servicio MySQL

(1) Compile el archivo yaml de implementación para implementar el servicio mysql, preste atención para modificar el espacio de nombres y la dirección del espejo .

[zhangsan@k8s-master01 yaml]$ sudo vim mysql-development.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  namespace: zhangsan
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: 192.168.18.18:9999/common/mysql:latest
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: root
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pvc

(2) Crear y ver la implementación del servicio mysql

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f mysql-development.yaml
deployment.apps/mysql created

# 查看
[zhangsan@k8s-master01 yaml]$ sudo kubectl get deployment/mysql
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
mysql   1/1     1            1           39s

2.3.5 Implementar Rabbitmq

1. Crear el servicio Rabbitmq

(1) Prepare el archivo yaml, preste atención para modificar el espacio de nombres y nodePort.

Se requiere que el nodePort sea 3X(Y+1), donde X es el ID de clase de dos dígitos e Y son los dos últimos dígitos del ID del estudiante. En el siguiente ejemplo, 31889 representa el valor del nodePort del estudiante No. 88 en la clase 18.

[zhangsan@k8s-master01 yaml]$ sudo vim rabbitmq-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: rabbitmq-svc
  namespace: zhangsan
spec:
  type: NodePort
  ports:
  - name: mangerport
    port: 15672
    targetPort: 15672
    nodePort: 31889
  - name: rabbitmqport
    port: 5672
    targetPort: 5672
  selector:
    app: rabbitmq

(2) Crear y ver el servicio Rabbitmq

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f rabbitmq-svc.yaml
service/rabbitmq-svc created

[zhangsan@k8s-master01 yaml]$ sudo kubectl get svc/rabbitmq-svc
NAME           TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                          AGE
rabbitmq-svc   NodePort   10.102.83.214   <none>        15672:31889/TCP,5672:32764/TCP   4s

 2. Implementar el servicio Rabbitmq

(1) Edite el archivo yaml , preste atención para modificar el espacio de nombres y la dirección del espejo.

[zhangsan@k8s-master01 yaml]$ sudo vim rabbitmq-deployment.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: rabbitmq
  name: rabbitmq
  namespace: zhangsan
spec:
  replicas: 1
  selector:
    matchLabels:
      app: rabbitmq
  template:
    metadata:
      labels:
        app: rabbitmq
    spec:
      containers:
      - image: 192.168.18.18:9999/common/rabbitmq:management
        imagePullPolicy: IfNotPresent
        name: rabbitmq
        ports:
        - containerPort: 5672
          name: rabbitmqport
        - containerPort: 15672
          name: managementport

(2) Crear y ver la implementación del servicio Rabbitmq

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f rabbitmq-deployment.yaml
deployment.apps/rabbitmq created

[zhangsan@k8s-master01 yaml]$ sudo kubectl get deployment/rabbitmq
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
rabbitmq   1/1     1            1           24s

3. Llena el hoyo

El código gpmall necesita usar la cola en rabbitmq, pero el código parece tener un error y la cola no se puede crear automáticamente en rabbitmq. Debe crear manualmente una cola en el contenedor ribbitmq. El proceso de operación específico es el siguiente:

(1) Ver e ingresar al pod

# 查看rabbitmq的pod名称
[zhangsan@k8s-master01 yaml]$ sudo kubectl get pod | grep rabbitmq
rabbitmq-77f54bdd4f-xndb4   1/1     Running   0             6m1s

# 进入pod内部
[zhangsan@k8s-master01 yaml]$ sudo kubectl exec -it rabbitmq-77f54bdd4f-xndb4 -- /bin/bash
root@rabbitmq-77f54bdd4f-xndb4:/#

(2) Declarar la cola dentro del pod

root@rabbitmq-77f54bdd4f-xndb4:/# rabbitmqadmin declare queue name=delay_queue  auto_delete=false durable=false  --username=guest  --password=guest
queue declared

(3) Comprobar si existe la cola

root@rabbitmq-77f54bdd4f-xndb4:/# rabbitmqctl list_queues
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name	messages
delay_queue	0

(4) salir de la vaina 

root@rabbitmq-77f54bdd4f-xndb4:/# exit

2.3.6 Implementar redis

1. Crear servicio redis

(1) Compile el archivo yaml para crear el servicio redis y preste atención a la modificación del espacio de nombres.

[zhangsan@k8s-master01 yaml]$ sudo vim redis-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: redis-svc
  namespace: zhangsan
spec:
  ports:
  - name: redisport
    port: 6379
    targetPort: 6379
  selector:
    app: redis

(2) Crear y ver el servicio redis

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f redis-svc.yaml
service/redis-svc created

[zhangsan@k8s-master01 yaml]$ sudo kubectl get svc redis-svc
NAME        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
redis-svc   ClusterIP   10.108.200.204   <none>        6379/TCP   14s

2. Implementar el servicio redis

(1) Compile el archivo yaml para implementar el servicio redis y preste atención a la modificación del espacio de nombres y la dirección del espejo.

[zhangsan@k8s-master01 yaml]$ sudo vim redis-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: redis
  name: redis
  namespace: zhangsan
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - image: 192.168.18.18:9999/common/redis:latest
        imagePullPolicy: IfNotPresent
        name: redis
        ports:
        - containerPort: 6379

(2) Implementar y ver la implementación del servicio redis

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f redis-deployment.yaml
deployment.apps/redis created

[zhangsan@k8s-master01 yaml]$ sudo kubectl get deployment/redis
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
redis   1/1     1            1           13s

3 Implementar módulos del sistema

Los módulos del sistema tienen ciertas dependencias y se recomienda implementarlos en el siguiente orden.

3.1 Implementación de módulos de usuario

3.3.1 Crear servicio usuario-proveedor

1. Compile el archivo yaml para crear el servicio de usuario-proveedor y preste atención a la modificación del espacio de nombres.

[zhangsan@k8s-master01 yaml]$ sudo vim user-provider-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: user-provider-svc
  namespace: zhangsan
spec:
  ports:
    - name: port
      port: 80
      targetPort: 80
  selector:
    app: user-provider

2. Crear y ver el servicio de usuario-proveedor

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f user-provider-svc.yaml
service/user-provider-svc created

[zhangsan@k8s-master01 yaml]$ sudo kubectl get svc/user-provider-svc
NAME                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
user-provider-svc   ClusterIP   10.109.120.197   <none>        80/TCP    19s

3.3.2 Implementación de servicios de proveedor de módulo de usuario

1. Compile el archivo yaml para implementar el servicio de usuario-proveedor y preste atención a la modificación del espacio de nombres y la dirección del espejo.

[zhangsan@k8s-master01 yaml]$ sudo vim user-provider-deployment.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: user-provider
  name: user-provider
  namespace: zhangsan
spec:
  replicas: 1
  selector:
    matchLabels:
      app: user-provider
  template:
    metadata:
      labels:
        app: user-provider
    spec:
      containers:
      - image: 192.168.18.18:9999/gpmall/user-provider:latest
        imagePullPolicy: IfNotPresent
        name: user-provider

2. Implementar y ver la implementación del servicio de usuario-proveedor

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f user-provider-deployment.yaml
deployment.apps/user-provider created

[zhangsan@k8s-master01 yaml]$ sudo kubectl get deployment/user-provider
NAME            READY   UP-TO-DATE   AVAILABLE   AGE
user-provider   1/1     1            1           21s

Nota: Si se encuentra que READY se muestra como 0/1, significa que hay un problema con la implementación. Puede ejecutar el comando [sudo kubectl get pod] para ver el estado del pod. Si el pod se está ejecutando anormalmente, puede ejecutar [sudo kubectl logs -f pod_name] para ver el registro . Si se encuentra que hay un problema con la imagen acoplable creada anteriormente, debe ejecutar [sudo crictl images] en cada nodo k8s para ver la imagen y ejecutar [sudo crictl rmi image ID] para eliminar la imagen problemática. Después de reconstruir y cargar la imagen de Docker, vuelva a implementar. 

3.2 Implementar el servicio de usuario de gpmall

3.2.1 Crear servicio de usuario gpmall

1. Compile el archivo yaml para crear el servicio gpmall-user y preste atención a la modificación del espacio de nombres.

[zhangsan@k8s-master01 yaml]$ sudo vim gpmall-user-svc.yaml 

apiVersion: v1
kind: Service
metadata:
  name: gpmall-user-svc
  namespace: zhangsan
spec:
  ports:
    - name: port
      port: 8082
      targetPort: 8082
  selector:
    app: gpmall-user

2. Crear y ver el servicio de usuario gpmall

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f gpmall-user-svc.yaml 
service/gpmall-user-svc created

[zhangsan@k8s-master01 yaml]$ sudo kubectl get svc gpmall-user-svc
NAME              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
gpmall-user-svc   ClusterIP   10.107.12.83   <none>        8082/TCP   17s

3.2.2 Implementar el servicio gpmall-user

1. Compile el archivo yaml para implementar el servicio gpmall-user , preste atención para modificar el espacio de nombres y la dirección del espejo.

[zhangsan@k8s-master01 yaml]$ sudo vim gpmall-user-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: gpmall-user
  name: gpmall-user
  namespace: zhangsan
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gpmall-user
  template:
    metadata:
      labels:
        app: gpmall-user
    spec:
      containers:
      - image: 192.168.18.18:9999/gpmall/gpmall-user:latest
        imagePullPolicy: IfNotPresent
        name: gpmall-user
        ports:
        - containerPort: 8082

2. Implementar y ver la implementación del servicio gpmall-user 

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f gpmall-user-deployment.yaml
deployment.apps/gpmall-user created

[zhangsan@k8s-master01 yaml]$ sudo kubectl get deployment gpmall-user
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
gpmall-user   1/1     1            1           22s

3.3 Implementar el módulo de búsqueda

3.3.1 Cree un archivo yaml para implementar el módulo del proveedor de búsqueda

Preste atención a la modificación del espacio de nombres y la dirección del espejo.

[zhangsan@k8s-master01 yaml]$ sudo vim search-provider-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: search-provider
  name: search-provider
  namespace: zhangsan
spec:
  replicas: 1
  selector:
    matchLabels:
      app: search-provider
  template:
    metadata:
      labels:
        app: search-provider
    spec:
      containers:
      - image: 192.168.18.18:9999/gpmall/search-provider:latest
        imagePullPolicy: IfNotPresent
        name: search-provider

3.3.2 Implementar y ver la implementación del módulo del proveedor de búsqueda 

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f search-provider-deployment.yaml
deployment.apps/search-provider created

[zhangsan@k8s-master01 yaml]$ sudo kubectl get deployment search-provider
NAME              READY   UP-TO-DATE   AVAILABLE   AGE
search-provider   1/1     1            1           27s

3.4 Implementar el módulo de pedidos

3.4.1 Compilar el archivo yaml para implementar el módulo de proveedor de pedidos

Preste atención a la modificación del espacio de nombres y la dirección del espejo.

[zhangsan@k8s-master01 yaml]$ sudo vim order-provider-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: order-provider
  name: order-provider
  namespace: zhangsan
spec:
  replicas: 1
  selector:
    matchLabels:
      app: order-provider
  template:
    metadata:
      labels:
        app: order-provider
    spec:
      containers:
      - image: 192.168.18.18:9999/gpmall/order-provider:latest
        imagePullPolicy: IfNotPresent
        name: order-provider

3.4.2 Implementar y ver el despliegue del módulo proveedor de pedidos

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f order-provider-deployment.yaml
deployment.apps/order-provider created

[zhangsan@k8s-master01 yaml]$ sudo kubectl get deployment order-provider
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
order-provider   1/1     1            1           97s

3.5 Implementar el módulo de compras

3.5.1 Implementar el módulo de proveedor de compras

1. Compile el archivo yaml del módulo del proveedor de compras , preste atención para modificar el espacio de nombres y la dirección espejo.

[zhangsan@k8s-master01 yaml]$ sudo vim shopping-provider-deployment.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: shopping-provider
  name: shopping-provider
  namespace: zhangsan
spec:
  replicas: 1
  selector:
    matchLabels:
      app: shopping-provider
  template:
    metadata:
      labels:
        app: shopping-provider
    spec:
      containers:
      - image: 192.168.18.18:9999/gpmall/shopping-provider:latest
        imagePullPolicy: IfNotPresent
        name: shopping-provider

2. Implementar y ver la implementación del módulo de proveedor de compras

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f shopping-provider-deployment.yaml
deployment.apps/shopping-provider created

[zhangsan@k8s-master01 yaml]$ sudo kubectl get deployment shopping-provider
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
shopping-provider   1/1     1            1           14s

3.5.2 Crear servicio de compras

1. Compile el archivo yaml para crear el servicio gpmall-shopping , preste atención a la modificación del espacio de nombres .

[zhangsan@k8s-master01 yaml]$ sudo vim gpmall-shopping-svc.yaml 

apiVersion: v1
kind: Service
metadata:
  name: user-provider-svc
  namespace: zhangsan
spec:
  ports:
    - name: port
      port: 80
      targetPort: 80
  selector:
    app: user-provider

2. Crear y ver el servicio de compras gpmall

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f gpmall-shopping-svc.yaml
service/gpmall-shopping-svc created

[zhangsan@k8s-master01 yaml]$ sudo kubectl get svc gpmall-shopping-svc
NAME                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
gpmall-shopping-svc   ClusterIP   10.105.229.200   <none>        8081/TCP   7m10s

3.5.3 Implementar el servicio gpmall-shopping

1. Compile el archivo yaml para implementar el servicio gpmall-shopping , preste atención para modificar el espacio de nombres y la dirección espejo.

[zhangsan@k8s-master01 yaml]$ sudo vim gpmall-shopping-deployment.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: gpmall-shopping
  name: gpmall-shopping
  namespace: zhangsan
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gpmall-shopping
  template:
    metadata:
      labels:
        app: gpmall-shopping
    spec:
      containers:
      - image: 192.168.18.18:9999/gpmall/gpmall-shopping:latest
        imagePullPolicy: IfNotPresent
        name: gpmall-shopping
        ports:
        - containerPort: 8081

2. Implementar y ver la implementación del servicio gpmall-shopping

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f gpmall-shopping-deployment.yaml
deployment.apps/gpmall-shopping created

[zhangsan@k8s-master01 yaml]$ sudo kubectl get deployment gpmall-shopping
NAME              READY   UP-TO-DATE   AVAILABLE   AGE
gpmall-shopping   1/1     1            1           18s

3.6 Implementar el módulo de comentarios

3.6.1 Compile e implemente el archivo yaml del proveedor de comentarios

Preste atención a la modificación del espacio de nombres y la dirección del espejo.

[zhangsan@k8s-master01 yaml]$ sudo vim comment-provider-deployment.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: comment-provider
  name: comment-provider
  namespace: zhangsan
spec:
  replicas: 1
  selector:
    matchLabels:
      app: comment-provider
  template:
    metadata:
      labels:
        app: comment-provider
    spec:
      containers:
      - image: 192.168.18.18:9999/gpmall/comment-provider
        imagePullPolicy: IfNotPresent
        name: comment-provider

3.6.2 Implementar y ver la implementación del módulo proveedor de comentarios

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f comment-provider-deployment.yaml
deployment.apps/comment-provider created

[zhangsan@k8s-master01 yaml]$ sudo kubectl get deployment comment-provider
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
comment-provider   1/1     1            1           65s

3.7 Implementar el módulo front-end

3.7.1 Crear un servicio front-end

1. Compile el archivo yaml para crear el servicio gpmall-frontend y preste atención a la modificación del espacio de nombres.

Aquí, se requiere que el nodePort se especifique como 3X(Y+2) , donde X es el ID de clase de dos dígitos e Y son los dos últimos dígitos del número de estudiante. Por ejemplo, 31890 a continuación es el valor establecido para estudiante N° 88 de la Clase 18.

[zhangsan@k8s-master01 yaml]$ sudo vim gpmall-frontend-svc.yaml 

apiVersion: v1
kind: Service
metadata:
  name: gpmall-frontend-svc
  namespace: zhangsan
spec:
  type: NodePort
  ports:
  - port: 9999
    targetPort: 9999
    nodePort: 31890
  selector:
    app: gpmall-frontend

 2. Crear y ver el servicio gpmall-frontend

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f gpmall-frontend-svc.yaml
service/gpmall-frontend-svc created

[zhangsan@k8s-master01 yaml]$ sudo kubectl get svc gpmall-frontend-svc
NAME                  TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
gpmall-frontend-svc   NodePort   10.99.154.113   <none>        9999:31890/TCP   15s

3.7.2 Desplegando el servicio gpmall-frontend

1. Compile el archivo yaml para implementar el servicio gpmall-frontend y preste atención a la modificación del espacio de nombres y la dirección del espejo.

[zhangsan@k8s-master01 yaml]$ sudo vim gpmall-frontend-deployment.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: gpmall-frontend
  namespace: zhangsan
spec:
  selector:
    matchLabels:
      app: gpmall-frontend
  template:
    metadata:
      labels:
        app: gpmall-frontend
    spec:
      containers:
      - image: 192.168.18.18:9999/gpmall/gpmall-front:latest
        imagePullPolicy: IfNotPresent
        name: gpmall-frontend
        ports:
        - containerPort: 9999

2. Implementar y ver la implementación del servicio gpmall-frontend

[zhangsan@k8s-master01 yaml]$ sudo kubectl create -f gpmall-frontend-deployment.yaml
deployment.apps/gpmall-frontend created

[zhangsan@k8s-master01 yaml]$ sudo kubectl get deployment gpmall-frontend
NAME              READY   UP-TO-DATE   AVAILABLE   AGE
gpmall-frontend   1/1     1            1           17s

3.8 Estado de confirmación

3.8.1 Confirmar el estado de todos los pods

Se requiere que el ESTADO de todos los pods sea En ejecución.

[zhangsan@k8s-master01 yaml]$ sudo kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP           NODE           NOMINATED NODE   READINESS GATES
comment-provider-59cb4fd467-84fbh   1/1     Running   0          15h   10.0.3.205   k8s-master01   <none>           <none>
es-bb896c98-6ggf4                   2/2     Running   0          23h   10.0.0.103   k8s-node02     <none>           <none>
gpmall-frontend-6486fb87f6-7gsxn    1/1     Running   0          15h   10.0.0.221   k8s-node02     <none>           <none>
gpmall-shopping-fc7d766b4-dzlgb     1/1     Running   0          15h   10.0.1.135   k8s-master02   <none>           <none>
gpmall-user-6ddcf889bb-5w58x        1/1     Running   0          20h   10.0.2.23    k8s-master03   <none>           <none>
kafka-7c6cdc8647-rx5tb              1/1     Running   0          22h   10.0.1.236   k8s-master02   <none>           <none>
mysql-8976b8bb4-2sfkq               1/1     Running   0          14h   10.0.3.131   k8s-master01   <none>           <none>
order-provider-74bbcd6dd4-f8k87     1/1     Running   0          16h   10.0.4.41    k8s-node01     <none>           <none>
rabbitmq-77f54bdd4f-xndb4           1/1     Running   0          21h   10.0.4.1     k8s-node01     <none>           <none>
redis-bc8ff7957-2xn8z               1/1     Running   0          20h   10.0.2.15    k8s-master03   <none>           <none>
search-provider-f549c8d9d-ng4dv     1/1     Running   0          15h   10.0.3.115   k8s-master01   <none>           <none>
shopping-provider-75b7cd5d6-6767x   1/1     Running   0          17h   10.0.1.55    k8s-master02   <none>           <none>
user-provider-7f6d7f8b85-hj5m5      1/1     Running   0          20h   10.0.4.115   k8s-node01     <none>           <none>
zk-84bfd67c77-llk5w                 1/1     Running   0          24h   10.0.1.18    k8s-master02   <none>           <none>

3.8.2 Estado de todos los servicios

[zhangsan@k8s-master01 yaml]$ sudo kubectl get svc
NAME                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                        AGE
es-svc                NodePort    10.96.114.80     <none>        5601:31888/TCP,9200:32530/TCP,9300:32421/TCP   7h22m
gpmall-frontend-svc   NodePort    10.99.154.113    <none>        9999:31890/TCP                                 4m23s
gpmall-shopping-svc   ClusterIP   10.98.89.99      <none>        8081/TCP                                       77m
gpmall-user-svc       ClusterIP   10.107.12.83     <none>        8082/TCP                                       4h48m
kafka-svc             ClusterIP   10.108.28.89     <none>        9092/TCP                                       7h13m
mysql-svc             NodePort    10.98.41.1       <none>        3306:30306/TCP                                 5h58m
rabbitmq-svc          NodePort    10.102.83.214    <none>        15672:31889/TCP,5672:32764/TCP                 5h37m
redis-svc             ClusterIP   10.108.200.204   <none>        6379/TCP                                       5h17m
user-provider-svc     ClusterIP   10.109.120.197   <none>        80/TCP                                         5h6m
zk-svc                ClusterIP   10.107.4.169     <none>        2181/TCP                                       10h

3.8.3 Estado de todas las implementaciones

Requiere que DISPONIBLE sea 1 para todas las implementaciones.

[zhangsan@k8s-master01 yaml]$ sudo kubectl get deployment
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
comment-provider    1/1     1            1           19m
es                  1/1     1            1           7h22m
gpmall-frontend     1/1     1            1           2m49s
gpmall-shopping     1/1     1            1           14m
gpmall-user         1/1     1            1           4h45m
kafka               1/1     1            1           7h8m
mysql               1/1     1            1           5h58m
order-provider      1/1     1            1           49m
rabbitmq            1/1     1            1           5h32m
redis               1/1     1            1           5h16m
search-provider     1/1     1            1           16m
shopping-provider   1/1     1            1           84m
user-provider       1/1     1            1           4h55m
zk                  1/1     1            1           8h

4 Visita de prueba

Hasta ahora, gpmall básicamente se ha implementado. Puede obtener el nodo en el que gpmall-frontend está implementado mediante el comando [kubectl get pod -o wide] y luego acceder a él a través de la dirección IP del nodo y el número de puerto correspondiente. El formato de la dirección es la dirección IP: 3X(Y+2). Para K8S, la dirección IP aquí suele ser líder o VIP que proporciona servicios externos.

4.1 Conectarse a la base de datos

Cuando se implementa por primera vez, la página abierta no puede mostrar información del producto, por lo que debe conectarse a la base de datos. Las operaciones específicas son las siguientes:

4.1.1 Crear una conexión MySQL

Use Navicat para crear una nueva conexión MySQL, como se muestra en la figura a continuación.

Complete la dirección IP del host o el nombre del host en la ventana abierta, generalmente la dirección IP del host donde se encuentra el pod mysql, que se puede ver a través del comando [kubectl get pod -o wide] Si hay varios nodos maestros en el clúster k8s, complete la dirección IP del nodo líder o el VIP que proporciona servicios externos.

El número de puerto es 30306 de forma predeterminada y también se puede ver mediante el comando [kubectl get svc] Como se muestra a continuación, el puerto 3306 dentro del pod se asigna a 30306 fuera.

[zhangsan@k8s-master01 yaml]$ sudo kubectl get svc | grep mysql
mysql-svc             NodePort    10.98.41.1       <none>        3306:30306/TCP                                 21h

 La cuenta/contraseña predeterminada es root/root.

4.1.2 Abrir una conexión

Haga doble clic en la conexión MySQL recién creada a la izquierda para abrir la conexión. Si aparece el error 2003 (2003 - Can't connect to MysQL server on "10.200.7.99' (10038)) como se muestra en la figura a continuación, puede ser la IP del host completada anteriormente La dirección es incorrecta, modifique la dirección del host en las "Propiedades de conexión" de la conexión e intente abrir la conexión nuevamente.

 Si aparece el error 1130 (1130 - Host '10.0.1232' no puede conectarse a este servidor MySOL) como se muestra en la figura a continuación, es posible que MysQL solo permita el acceso a través de localhost.

Se puede resolver con las siguientes operaciones.

(1) Ver el nombre del pod de mysql

[zhangsan@k8s-master01 yaml]$ sudo kubectl get pod | grep mysql
mysql-8976b8bb4-2sfkq               1/1     Running   0          14h

(2) Ingrese dentro del contenedor mysql pod

[zhangsan@k8s-master01 yaml]$ sudo kubectl exec -it mysql-8976b8bb4-2sfkq -- /bin/bash
root@mysql-8976b8bb4-2sfkq:/# 

(3) Inicie sesión en mysql dentro del contenedor, la cuenta/contraseña predeterminada es root/root

root@mysql-8976b8bb4-2sfkq:/# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10232
Server version: 8.0.27 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

(4) Ejecute las siguientes 3 declaraciones en el contenedor mysql

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> update user set host = '%' where user = 'root';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

(5) 若出现1251错误 (1251: el cliente no admite el protocolo de autenticación solicitado por el servidor, considere actualizar el cliente MySOl)。

Luego continúe ejecutando los siguientes comandos dentro del contenedor mysql.

mysql> alter user 'root'@'%' identified with mysql_native_password by 'root';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> exit;
Bye

4.1.3 Crear una nueva base de datos

Después de abrir con éxito la conexión, puede crear una nueva base de datos.Haga clic derecho en la conexión de la base de datos y seleccione [Nueva base de datos], como se muestra en la figura a continuación.

En la ventana que se abre, complete el nombre de la base de datos y configure el conjunto de caracteres y la intercalación como se muestra en la imagen a continuación.

4.1.4 Importar tabla de base de datos

El autor del proyecto gpmall ha proporcionado el script de la tabla de datos. El archivo gpmall.sql en el directorio db_script del código fuente es el archivo. Puede utilizar Navicat para importar este archivo. El funcionamiento es el siguiente:

Haga doble clic en la base de datos recién creada, luego haga clic con el botón derecho y seleccione [Ejecutar archivo SQL...], como se muestra en la siguiente figura.

En la ventana abierta, haga clic en el botón detrás de [Archivo] y seleccione el archivo gpmall.sql en el directorio del código fuente db_script. 

Haga clic en el botón [Iniciar] para iniciar la importación, y la interfaz después del éxito se muestra en la figura a continuación. 

Después de una importación exitosa, haga clic derecho en la tabla de la izquierda y seleccione [Actualizar] para ver la tabla de la base de datos.

4.2 Prueba de acceso

En circunstancias normales, actualice la página para ver la página que se muestra a continuación.

La cuenta de prueba predeterminada es prueba/prueba, que se puede iniciar sesión para experimentar.

Si aún no se puede mostrar la tienda, ejecute los siguientes comandos en secuencia para volver a implementar shopping-provider y gpmall-shopping.

# 先删除原先的部署
sudo kubectl delete -f shopping-provider-deployment.yaml 
sudo kubectl delete -f gpmall-shopping-deployment.yaml 

# 重新部署
sudo kubectl create -f shopping-provider-deployment.yaml 
sudo kubectl create -f gpmall-shopping-deployment.yaml

Supongo que te gusta

Origin blog.csdn.net/u013007181/article/details/129753135
Recomendado
Clasificación