1. 程式人生 > 其它 >7.3 自定義映象-執行nginx與tomcat並結合PV/PVC/NFS以實現動靜分離示例

7.3 自定義映象-執行nginx與tomcat並結合PV/PVC/NFS以實現動靜分離示例

1、在NFS SERVER上為tomcat、nginx建立相關目錄

NFS SERVER的部署配置參考:https://www.cnblogs.com/yanql/p/15410308.html 1.3.1 部署NFS server

# tomcat
mkdir /data/k8s-data/tomcat/webapps/apps1 -p
echo 'tomcat index' > /data/k8s-data/tomcat/webapps/apps1/index.html

# nginx
mkdir /data/k8s-data/nginx/html
echo 'nginx html index' > /data/k8s-data/nginx/html/index.html

2、製作tomcat映象

2.1、準備tomcat優化配置檔案

# catalina.sh 增加記憶體優化引數
JAVA_OPTS="-Dfile.encoding=UTF-8-server -Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC"

# server.xml 開啟Nio2執行緒模式並設定最大最新連線數
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
            maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true" maxQueueSize="100"/>

<Connector executor="tomcatThreadPool"
           port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
           connectionTimeout="20000"
           redirectPort="8443" />

# tomcat-users.xml 在tomcat-users標籤增加如下內容,開啟tomcat頁面管理
<role rolename="manager"/>
<role rolename="manager-gui"/>
<role rolename="admin"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="FggOueSastmtlQzB" roles="admin-gui,admin,manager-gui,manager"/>

# 開啟tomcat頁面管理,還需要修改webapps/manager/META-INF/context.xml,將一下行註釋掉。
  <!--<Valve className="org.apache.catalina.valves.RemoteAddrValve"
  allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> -->

2.2、編寫tomcat映象Dockerfile

# 目錄中的檔案如下:
-rw-r--r-- 1 root root  10564666 8月  10 03:52 apache-tomcat-8.5.70.tar.gz
-rwxr-x--- 1 root root     25458 10月 20 09:31 catalina.sh*
-rw-r--r-- 1 root root      1057 10月 20 10:14 Dockerfile
-rw-r--r-- 1 root root   2054960 9月  10 19:58 glibc-2.29-r0.apk
-rw-r--r-- 1 root root 191757099 9月  10 19:23 jdk-8u192-linux-x64.tar.gz
-rw------- 1 root root      7647 10月 20 09:31 server.xml
-rw------- 1 root root      3024 10月 20 10:13 tomcat-users.xml
-rw-r--r-- 1 root root   1494714 10月 20 09:53 webapps.tgz

# Dockerfile
FROM 192.168.1.110/base/alpine:v20211010-1704
LABEL maintainer="yanql<[email protected]>"

ADD jdk-8u192-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.70.tar.gz /usr/local/
ADD webapps.tgz /opt/
COPY catalina.sh /usr/local/apache-tomcat-8.5.70/bin/catalina.sh
COPY glibc-2.29-r0.apk /
COPY server.xml /usr/local/apache-tomcat-8.5.70/conf/
COPY tomcat-users.xml /usr/local/apache-tomcat-8.5.70/conf/

RUN set -x \
    && addgroup -g 101 -S nginx \
    && adduser -S -D -H -u 101 -h /var/cache/nginx -s /sbin/nologin -G nginx -g nginx nginx \ 
    && chown -R nginx:nginx /opt/webapps /usr/local/apache-tomcat-8.5.70 \
    && sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories \
    && wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub \
    && apk add glibc-2.29-r0.apk \
    && rm -rf /usr/local/apache-tomcat-8.5.70/webapps

ENV JAVA_HOME /usr/local/jdk1.8.0_192
ENV PATH ${PATH}:${JAVA_HOME}/bin 

EXPOSE 8080

CMD ["/usr/local/apache-tomcat-8.5.70/bin/catalina.sh", "run"]

2.3 構建映象並長傳到本地harbor

# docker build -t 192.168.1.110/web/alpine-jdk-8u192-tomcat-8.5.70:v20211020-1014 .

# docker push 192.168.1.110/web/alpine-jdk-8u192-tomcat-8.5.70:v20211020-1014

3、部署tomcat服務

3.1、編寫tomcat ymal檔案

root@k8-deploy:~/k8s-yaml/web/tomcat# cat tomcat.yml 
apiVersion: v1
kind: Service
metadata:
  name: tomcat-svc
  namespace: yun 
spec:
  type: NodePort
  ports:
    - name: http
      port: 8080
      protocol: TCP
      targetPort: 8080
      nodePort: 38080
  selector:
    app: tomcat-app
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-deploy
  namespace: yun
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tomcat-app
  template:
    metadata:
      labels:
        app: tomcat-app
    spec:
      containers:
        - name: tomcat-ct
          image: 192.168.1.110/web/alpine-jdk-8u192-tomcat-8.5.70:v20211020-1014
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080
              protocol: TCP
              name: http-8080
          resources:
            limits:
              cpu: 2
              memory: 2Gi
            requests:
              cpu: 500m
              memory: 1Gi
          volumeMounts:
          - name: tomcat-webapps
            mountPath: "/opt/webapps"
      volumes:
        - name: tomcat-webapps
          nfs: 
            server: 192.168.2.10
            path: /data/k8s-data/tomcat/webapps

3.2 啟動並檢查tomcat服務

root@k8-deploy:~/k8s-yaml/web/tomcat# kubectl apply -f tomcat.yml
service/tomcat-svc created

root@k8-deploy:~/k8s-yaml/web/tomcat# kubectl get pod -n yun
NAME                             READY   STATUS    RESTARTS   AGE
tomcat-deploy-74564db6d6-tbh98   1/1     Running   0          15s

root@k8-deploy:~/k8s-yaml/web/tomcat# kubectl get svc -n yun          
NAME         TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
tomcat-svc   NodePort   10.0.106.99   <none>        8080:38080/TCP   2m17s  

# curl 192.168.2.18:38080/app1/index.html
tomcat index

# kubectl exec tomcat-deploy-74564db6d6-tbh98 -n yun -it -- sh
/ # df -h
Filesystem                Size      Used Available Use% Mounted on
...
192.168.2.10:/data/k8s-data/tomcat/webapps
                         97.9G     18.0G     74.9G  19% /opt/webapps
...

4、製作nginx映象

4.1、準備nginx配置檔案

# nginx.conf
root@k8-deploy:~/k8s-yaml/web/nginx/dockerfile# cat nginx.conf 
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  4096;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    client_max_body_size 200M;
    sendfile       on;
    keepalive_timeout 65;
    add_header Access-Control-Allow-Origin *;

    log_format main '$time_local|$remote_addr|$server_name|$request|'
                    '$status|$body_bytes_sent|$request_time|$bytes_sent|$request_length|'
                    '$upstream_response_time|$http_referer|$http_user_agent';
    access_log  /var/log/nginx/access.log  main;

    gzip on;
    gzip_min_length 100;
    gzip_buffers    16 8k;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_types       text/plain application/x-javascript text/css application/xml text/javascript application/javascript application/octet-stream;
    gzip_vary on;

    upstream tomcat_webserver {
        server tomcat_svc:8080;
    }

    include conf.d/*.conf;
}


# default.conf
cat default.conf
server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
   
    location /app1 {
        proxy_pass  http://tomcat_webserver;
        proxy_set_header    Host    $host;
        proxy_set_header    X-Real-IP                    $remote_addr;
        proxy_set_header    X-Forwarded-For              $proxy_add_x_forwarded_for;
        proxy_set_header    HTTP_X_FORWARDED_FOR      $remote_addr;
    }

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

4.2、編寫nginx映象Dockerfile

 vim Dockerfile 
FROM nginx:1.21.1
COPY nginx.conf /etc/nginx/
COPY default.conf /etc/nginx/conf.d/

4.3、構建nginx映象並上傳本地harbor

docker build -t 192.168.1.110/web/nginx:1.21.1-v3 .

docker push 192.168.1.110/web/nginx:1.21.1-v3

5、部署nginx服務

5.1、編寫nginx ymal檔案

root@k8-deploy:~/k8s-yaml/web/nginx/yaml# cat nginx.yml 
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  namespace: yun 
spec:
  type: NodePort
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 80
      nodePort: 30080
  selector:
    app: nginx-app
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
  namespace: yun
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-app
  template:
    metadata:
      labels:
        app: nginx-app
    spec:
      containers:
        - name: nginx-ct
          image: 192.168.1.110/web/nginx:1.21.1-v3
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
              protocol: TCP
              name: http
          resources:
            limits:
              cpu: 2
              memory: 2Gi
            requests:
              cpu: 500m
              memory: 1Gi
          volumeMounts:
          - name: nginx-html
            mountPath: "/usr/share/nginx/html"
      volumes:
        - name: nginx-html
          nfs: 
            server: 192.168.2.10
            path: /data/k8s-data/nginx/html

5.2 啟動並檢查nginx服務

# kubectl apply -f nginx.yml

# kubectl get pod -n yun
NAME                             READY   STATUS    RESTARTS   AGE
nginx-deploy-7b9475c5b-2kzg9     1/1     Running   0          6s
tomcat-deploy-74564db6d6-tbh98   1/1     Running   0          88m

# 進入nginx pod 檢視nfs掛載
# kubectl exec nginx-deploy-7b9475c5b-2kzg9 -n yun -it -- bash
root@nginx-deploy-7b9475c5b-2kzg9:/# df -h
Filesystem                              Size  Used Avail Use% Mounted on
...
192.168.2.10:/data/k8s-data/nginx/html   98G   18G   75G  20% /usr/share/nginx/html
...

# nginx index.html
# curl 192.168.2.17:30080
nginx html index

# 通過nginx代理的tomcat index.html
# curl 192.168.2.17:30080/app1/index.html
tomcat index