【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:
- gpmall-padre
- gpmall-commons
- servicio de usuario
- servicio de compras
- servicio de pedidos
- servicio de pago
- servicio de mercado
- servicio de comentarios
- 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