6-7-k8s实际应用-单pod运行WordPress

熊 1 阅读 容器

1. WordPress架构

kubernetes-applyation-WordPress-1

LNMP案例之基于Nginx+PHP实现WordPress博客站点,要求Nginx+PHP运行在同⼀个Pod的不同容器。nginx主要作用是接入站点请求,如果请求静态资源nginx就直接响应。如果请求的是一个动态php资源,就将对应请求转发给另一个php容器进行处理。在一个pod中运行多容器,网络名称空间是共享的,所以nginx可以将对应请求转发至127.0.0.1:9000这个端口来调用php来处理对应php请求。pod中如果有数据产生,pod通过pvc/pv将对应数据存储到远端存储上;客户端访问通过防火墙,负载均衡器将请求调度到后端node上处理,如果请求所在节点没有运行对应pod,那么对应node会根据路由来转发请求,最终会将请求转发给pod所在节点进行处理。

2. 镜像准备

2.1 准备php镜像

  • php镜像目录文件

    root@k8s-master01:/opt/k8s-data/dockerfile/cbear/wordpress/php# ll
    total 40
    drwxr-xr-x 2 root root  4096 Jun 20 09:22 ./
    drwxr-xr-x 3 root root  4096 Jun 20 09:11 ../
    -rw-r--r-- 1 root root   240 Jun 20 09:22 build-command.sh
    -rw-r--r-- 1 root root   382 Jun 20 09:21 Dockerfile
    -rwxr-xr-x 1 root root    69 Jun 20 09:20 run_php.sh*
    -rw-r--r-- 1 root root 19222 Jun 20 09:19 www.conf
    ​
  • 构建php镜像Dockerfile

    root@k8s-master01:/opt/k8s-data/dockerfile/cbear/wordpress/php# cat Dockerfile 
    #PHP Base Image
    FROM harbor.cbear.top/baseimages/centos:7.9.2009 
    ​
    RUN yum install -y  https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm && yum install  php56-php-fpm php56-php-mysql -y 
    ADD www.conf /opt/remi/php56/root/etc/php-fpm.d/www.conf
    #RUN useradd nginx -u 2019
    ADD run_php.sh /usr/local/bin/run_php.sh
    EXPOSE 9000
    ​
    CMD ["/usr/local/bin/run_php.sh"] 
    ​

  • 运行php脚本

    root@k8s-master01:/opt/k8s-data/dockerfile/cbear/wordpress/php# chmod +x run_php.sh 
    root@k8s-master01:/opt/k8s-data/dockerfile/cbear/wordpress/php# cat run_php.sh 
    #!/bin/bash
    /opt/remi/php56/root/usr/sbin/php-fpm
    tail -f /etc/hosts
    ​

  • 准备构建镜像脚本

    root@k8s-master01:/opt/k8s-data/dockerfile/cbear/wordpress/php# cat build-command.sh 
    #!/bin/bash
    TAG=$1
    nerdctl build -t harbor.cbear.top/cbear/wordpress-php-5.6:${TAG} .
    echo "镜像制作完成,即将上传至Harbor服务器"
    sleep 1
    nerdctl push harbor.cbear.top/cbear/wordpress-php-5.6:${TAG}
    echo "镜像上传完成"
    ​

  • 准备php配置文件www.conf

    root@k8s-master01:/opt/k8s-data/dockerfile/cbear/wordpress/php# cat run_php.sh
    ; Start a new pool named 'www'.
    ; the variable $pool can we used in any directive and will be replaced by the
    ; pool name ('www' here)
    [www]
    ​
    ; Per pool prefix
    ; It only applies on the following directives:
    ; - 'slowlog'
    ; - 'listen' (unixsocket)
    ; - 'chroot'
    ; - 'chdir'
    ; - 'php_values'
    ; - 'php_admin_values'
    ; When not set, the global prefix (or @php_fpm_prefix@) applies instead.
    ; Note: This directive can also be relative to the global prefix.
    ; Default Value: none
    ;prefix = /path/to/pools/$pool
    ​
    ; Unix user/group of processes
    ; Note: The user is mandatory. If the group is not set, the default user's group
    ;       will be used.
    ; RPM: apache user chosen to provide access to the same directories as httpd
    user = nginx
    ; RPM: Keep a group allowed to write in log dir.
    group = nginx
    ​
    ; The address on which to accept FastCGI requests.
    ; Valid syntaxes are:
    ;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 address on
    ;                            a specific port;
    ;   '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
    ;                            a specific port;
    ;   'port'                 - to listen on a TCP socket to all IPv4 addresses on a
    ;                            specific port;
    ;   '[::]:port'            - to listen on a TCP socket to all addresses
    ;                            (IPv6 and IPv4-mapped) on a specific port;
    ;   '/path/to/unix/socket' - to listen on a unix socket.
    ; Note: This value is mandatory.
    listen = 0.0.0.0:9000
    ​
    ; Set listen(2) backlog.
    ; Default Value: 65535
    ;listen.backlog = 65535
    ​
    ; Set permissions for unix socket, if one is used. In Linux, read/write
    ; permissions must be set in order to allow connections from a web server.
    ; Default Values: user and group are set as the running user
    ;                 mode is set to 0660
    ;listen.owner = nobody
    ;listen.group = nobody
    ;listen.mode = 0660
    ​
    ; When POSIX Access Control Lists are supported you can set them using
    ; these options, value is a comma separated list of user/group names.
    ; When set, listen.owner and listen.group are ignored
    ;listen.acl_users = apache
    ;listen.acl_groups =
    ​
    ; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect.
    ; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original
    ; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address
    ; must be separated by a comma. If this value is left blank, connections will be
    ; accepted from any ip address.
    ; Default Value: any
    ; listen.allowed_clients = 127.0.0.1
    ​
    ; Specify the nice(2) priority to apply to the pool processes (only if set)
    ; The value can vary from -19 (highest priority) to 20 (lower priority)
    ; Note: - It will only work if the FPM master process is launched as root
    ;       - The pool processes will inherit the master process priority
    ;         unless it specified otherwise
    ; Default Value: no set
    ; process.priority = -19
    ​
    ; Set the process dumpable flag (PR_SET_DUMPABLE prctl) even if the process user
    ; or group is differrent than the master process user. It allows to create process
    ; core dump and ptrace the process for the pool user.
    ; Default Value: no
    ; process.dumpable = yes
    ​
    ; Choose how the process manager will control the number of child processes.
    ; Possible Values:
    ;   static  - a fixed number (pm.max_children) of child processes;
    ;   dynamic - the number of child processes are set dynamically based on the
    ;             following directives. With this process management, there will be
    ;             always at least 1 children.
    ;             pm.max_children      - the maximum number of children that can
    ;                                    be alive at the same time.
    ;             pm.start_servers     - the number of children created on startup.
    ;             pm.min_spare_servers - the minimum number of children in 'idle'
    ;                                    state (waiting to process). If the number
    ;                                    of 'idle' processes is less than this
    ;                                    number then some children will be created.
    ;             pm.max_spare_servers - the maximum number of children in 'idle'
    ;                                    state (waiting to process). If the number
    ;                                    of 'idle' processes is greater than this
    ;                                    number then some children will be killed.
    ;  ondemand - no children are created at startup. Children will be forked when
    ;             new requests will connect. The following parameter are used:
    ;             pm.max_children           - the maximum number of children that
    ;                                         can be alive at the same time.
    ;             pm.process_idle_timeout   - The number of seconds after which
    ;                                         an idle process will be killed.
    ; Note: This value is mandatory.
    pm = dynamic
    ​
    ; The number of child processes to be created when pm is set to 'static' and the
    ; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'.
    ; This value sets the limit on the number of simultaneous requests that will be
    ; served. Equivalent to the ApacheMaxClients directive with mpm_prefork.
    ; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP
    ; CGI. The below defaults are based on a server without much resources. Don't
    ; forget to tweak pm.* to fit your needs.
    ; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand'
    ; Note: This value is mandatory.
    pm.max_children = 50
    ​
    ; The number of child processes created on startup.
    ; Note: Used only when pm is set to 'dynamic'
    ; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
    pm.start_servers = 5
    ​
    ; The desired minimum number of idle server processes.
    ; Note: Used only when pm is set to 'dynamic'
    ; Note: Mandatory when pm is set to 'dynamic'
    pm.min_spare_servers = 5
    ​
    ; The desired maximum number of idle server processes.
    ; Note: Used only when pm is set to 'dynamic'
    ; Note: Mandatory when pm is set to 'dynamic'
    pm.max_spare_servers = 35
     
    ; The number of seconds after which an idle process will be killed.
    ; Note: Used only when pm is set to 'ondemand'
    ; Default Value: 10s
    ;pm.process_idle_timeout = 10s;
    ​
    ; The number of requests each child process should execute before respawning.
    ; This can be useful to work around memory leaks in 3rd party libraries. For
    ; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS.
    ; Default Value: 0
    ;pm.max_requests = 500
    ​
    ; The URI to view the FPM status page. If this value is not set, no URI will be
    ; recognized as a status page. It shows the following informations:
    ;   pool                 - the name of the pool;
    ;   process manager      - static, dynamic or ondemand;
    ;   start time           - the date and time FPM has started;
    ;   start since          - number of seconds since FPM has started;
    ;   accepted conn        - the number of request accepted by the pool;
    ;   listen queue         - the number of request in the queue of pending
    ;                          connections (see backlog in listen(2));
    ;   max listen queue     - the maximum number of requests in the queue
    ;                          of pending connections since FPM has started;
    ;   listen queue len     - the size of the socket queue of pending connections;
    ;   idle processes       - the number of idle processes;
    ;   active processes     - the number of active processes;
    ;   total processes      - the number of idle + active processes;
    ;   max active processes - the maximum number of active processes since FPM
    ;                          has started;
    ;   max children reached - number of times, the process limit has been reached,
    ;                          when pm tries to start more children (works only for
    ;                          pm 'dynamic' and 'ondemand');
    ; Value are updated in real time.
    ; Example output:
    ;   pool:                 www
    ;   process manager:      static
    ;   start time:           01/Jul/2011:17:53:49 +0200
    ;   start since:          62636
    ;   accepted conn:        190460
    ;   listen queue:         0
    ;   max listen queue:     1
    ;   listen queue len:     42
    ;   idle processes:       4
    ;   active processes:     11
    ;   total processes:      15
    ;   max active processes: 12
    ;   max children reached: 0
    ;
    ; By default the status page output is formatted as text/plain. Passing either
    ; 'html', 'xml' or 'json' in the query string will return the corresponding
    ; output syntax. Example:
    ;   http://www.foo.bar/status
    ;   http://www.foo.bar/status?json
    ;   http://www.foo.bar/status?html
    ;   http://www.foo.bar/status?xml
    ;
    ; By default the status page only outputs short status. Passing 'full' in the
    ; query string will also return status for each pool process.
    ; Example:
    ;   http://www.foo.bar/status?full
    ;   http://www.foo.bar/status?json&full
    ;   http://www.foo.bar/status?html&full
    ;   http://www.foo.bar/status?xml&full
    ; The Full status returns for each process:
    ;   pid                  - the PID of the process;
    ;   state                - the state of the process (Idle, Running, ...);
    ;   start time           - the date and time the process has started;
    ;   start since          - the number of seconds since the process has started;
    ;   requests             - the number of requests the process has served;
    ;   request duration     - the duration in µs of the requests;
    ;   request method       - the request method (GET, POST, ...);
    ;   request URI          - the request URI with the query string;
    ;   content length       - the content length of the request (only with POST);
    ;   user                 - the user (PHP_AUTH_USER) (or '-' if not set);
    ;   script               - the main script called (or '-' if not set);
    ;   last request cpu     - the %cpu the last request consumed
    ;                          it's always 0 if the process is not in Idle state
    ;                          because CPU calculation is done when the request
    ;                          processing has terminated;
    ;   last request memory  - the max amount of memory the last request consumed
    ;                          it's always 0 if the process is not in Idle state
    ;                          because memory calculation is done when the request
    ;                          processing has terminated;
    ; If the process is in Idle state, then informations are related to the
    ; last request the process has served. Otherwise informations are related to
    ; the current request being served.
    ; Example output:
    ;   ************************
    ;   pid:                  31330
    ;   state:                Running
    ;   start time:           01/Jul/2011:17:53:49 +0200
    ;   start since:          63087
    ;   requests:             12808
    ;   request duration:     1250261
    ;   request method:       GET
    ;   request URI:          /test_mem.php?N=10000
    ;   content length:       0
    ;   user:                 -
    ;   script:               /home/fat/web/docs/php/test_mem.php
    ;   last request cpu:     0.00
    ;   last request memory:  0
    ;
    ; Note: There is a real-time FPM status monitoring sample web page available
    ;       It's available in: @EXPANDED_DATADIR@/fpm/status.html
    ;
    ; Note: The value must start with a leading slash (/). The value can be
    ;       anything, but it may not be a good idea to use the .php extension or it
    ;       may conflict with a real PHP file.
    ; Default Value: not set
    ;pm.status_path = /status
     
    ; The ping URI to call the monitoring page of FPM. If this value is not set, no
    ; URI will be recognized as a ping page. This could be used to test from outside
    ; that FPM is alive and responding, or to
    ; - create a graph of FPM availability (rrd or such);
    ; - remove a server from a group if it is not responding (load balancing);
    ; - trigger alerts for the operating team (24/7).
    ; Note: The value must start with a leading slash (/). The value can be
    ;       anything, but it may not be a good idea to use the .php extension or it
    ;       may conflict with a real PHP file.
    ; Default Value: not set
    ;ping.path = /ping
    ​
    ; This directive may be used to customize the response of a ping request. The
    ; response is formatted as text/plain with a 200 response code.
    ; Default Value: pong
    ;ping.response = pong
     
    ; The access log file
    ; Default: not set
    ;access.log = log/$pool.access.log
    ​
    ; The access log format.
    ; The following syntax is allowed
    ;  %%: the '%' character
    ;  %C: %CPU used by the request
    ;      it can accept the following format:
    ;      - %{user}C for user CPU only
    ;      - %{system}C for system CPU only
    ;      - %{total}C  for user + system CPU (default)
    ;  %d: time taken to serve the request
    ;      it can accept the following format:
    ;      - %{seconds}d (default)
    ;      - %{miliseconds}d
    ;      - %{mili}d
    ;      - %{microseconds}d
    ;      - %{micro}d
    ;  %e: an environment variable (same as $_ENV or $_SERVER)
    ;      it must be associated with embraces to specify the name of the env
    ;      variable. Some exemples:
    ;      - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e
    ;      - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e
    ;  %f: script filename
    ;  %l: content-length of the request (for POST request only)
    ;  %m: request method
    ;  %M: peak of memory allocated by PHP
    ;      it can accept the following format:
    ;      - %{bytes}M (default)
    ;      - %{kilobytes}M
    ;      - %{kilo}M
    ;      - %{megabytes}M
    ;      - %{mega}M
    ;  %n: pool name
    ;  %o: output header
    ;      it must be associated with embraces to specify the name of the header:
    ;      - %{Content-Type}o
    ;      - %{X-Powered-By}o
    ;      - %{Transfert-Encoding}o
    ;      - ....
    ;  %p: PID of the child that serviced the request
    ;  %P: PID of the parent of the child that serviced the request
    ;  %q: the query string
    ;  %Q: the '?' character if query string exists
    ;  %r: the request URI (without the query string, see %q and %Q)
    ;  %R: remote IP address
    ;  %s: status (response code)
    ;  %t: server time the request was received
    ;      it can accept a strftime(3) format:
    ;      %d/%b/%Y:%H:%M:%S %z (default)
    ;  %T: time the log has been written (the request has finished)
    ;      it can accept a strftime(3) format:
    ;      %d/%b/%Y:%H:%M:%S %z (default)
    ;  %u: remote user
    ;
    ; Default: "%R - %u %t \"%m %r\" %s"
    ;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
    ​
    ; The log file for slow requests
    ; Default Value: not set
    ; Note: slowlog is mandatory if request_slowlog_timeout is set
    slowlog = /opt/remi/php56/root/var/log/php-fpm/www-slow.log
    ​
    ; The timeout for serving a single request after which a PHP backtrace will be
    ; dumped to the 'slowlog' file. A value of '0s' means 'off'.
    ; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
    ; Default Value: 0
    ;request_slowlog_timeout = 0
    ​
    ; The timeout for serving a single request after which the worker process will
    ; be killed. This option should be used when the 'max_execution_time' ini option
    ; does not stop script execution for some reason. A value of '0' means 'off'.
    ; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
    ; Default Value: 0
    ;request_terminate_timeout = 0
     
    ; Set open file descriptor rlimit.
    ; Default Value: system defined value
    ;rlimit_files = 1024
     
    ; Set max core size rlimit.
    ; Possible Values: 'unlimited' or an integer greater or equal to 0
    ; Default Value: system defined value
    ;rlimit_core = 0
     
    ; Chroot to this directory at the start. This value must be defined as an
    ; absolute path. When this value is not set, chroot is not used.
    ; Note: you can prefix with '$prefix' to chroot to the pool prefix or one
    ; of its subdirectories. If the pool prefix is not set, the global prefix
    ; will be used instead.
    ; Note: chrooting is a great security feature and should be used whenever
    ;       possible. However, all PHP paths will be relative to the chroot
    ;       (error_log, sessions.save_path, ...).
    ; Default Value: not set
    ;chroot = 
     
    ; Chdir to this directory at the start.
    ; Note: relative path can be used.
    ; Default Value: current directory or / when chroot
    ;chdir = /var/www
     
    ; Redirect worker stdout and stderr into main error log. If not set, stdout and
    ; stderr will be redirected to /dev/null according to FastCGI specs.
    ; Note: on highloaded environement, this can cause some delay in the page
    ; process time (several ms).
    ; Default Value: no
    ;catch_workers_output = yes
     
    ; Clear environment in FPM workers
    ; Prevents arbitrary environment variables from reaching FPM worker processes
    ; by clearing the environment in workers before env vars specified in this
    ; pool configuration are added.
    ; Setting to "no" will make all environment variables available to PHP code
    ; via getenv(), $_ENV and $_SERVER.
    ; Default Value: yes
    ;clear_env = no
    ​
    ; Limits the extensions of the main script FPM will allow to parse. This can
    ; prevent configuration mistakes on the web server side. You should only limit
    ; FPM to .php extensions to prevent malicious users to use other extensions to
    ; exectute php code.
    ; Note: set an empty value to allow all extensions.
    ; Default Value: .php
    ;security.limit_extensions = .php .php3 .php4 .php5
    ​
    ; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from
    ; the current environment.
    ; Default Value: clean env
    ;env[HOSTNAME] = $HOSTNAME
    ;env[PATH] = /usr/local/bin:/usr/bin:/bin
    ;env[TMP] = /tmp
    ;env[TMPDIR] = /tmp
    ;env[TEMP] = /tmp
    ​
    ; Additional php.ini defines, specific to this pool of workers. These settings
    ; overwrite the values previously defined in the php.ini. The directives are the
    ; same as the PHP SAPI:
    ;   php_value/php_flag             - you can set classic ini defines which can
    ;                                    be overwritten from PHP call 'ini_set'. 
    ;   php_admin_value/php_admin_flag - these directives won't be overwritten by
    ;                                     PHP call 'ini_set'
    ; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no.
    ​
    ; Defining 'extension' will load the corresponding shared extension from
    ; extension_dir. Defining 'disable_functions' or 'disable_classes' will not
    ; overwrite previously defined php.ini values, but will append the new value
    ; instead.
    ​
    ; Note: path INI options can be relative and will be expanded with the prefix
    ; (pool, global or @prefix@)
    ​
    ; Default Value: nothing is defined by default except the values in php.ini and
    ;                specified at startup with the -d argument
    ;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
    ;php_flag[display_errors] = off
    php_admin_value[error_log] = /opt/remi/php56/root/var/log/php-fpm/www-error.log
    php_admin_flag[log_errors] = on
    ;php_admin_value[memory_limit] = 128M
    ​
    ; Set the following data paths to directories owned by the FPM process user.
    ;
    ; Do not change the ownership of existing system directories, if the process
    ; user does not have write permission, create dedicated directories for this
    ; purpose.
    ;
    ; See warning about choosing the location of these directories on your system
    ; at http://php.net/session.save-path
    php_value[session.save_handler] = files
    php_value[session.save_path]    = /opt/remi/php56/root/var/lib/php/session
    php_value[soap.wsdl_cache_dir]  = /opt/remi/php56/root/var/lib/php/wsdlcache
  • 构建对应php镜像

    root@k8s-master01:/opt/k8s-data/dockerfile/cbear/wordpress/php# bash build-command.sh v1

2.2 准备nginx基础镜像

  • nginx镜像目录文件

    root@k8s-master01:/opt/k8s-data/dockerfile/cbear/wordpress/nginx# ls
    build-command.sh  Dockerfile  nginx-1.26.1.tar.gz
    ​

  • 构建nginx-wordpress镜像Dockerfile

    root@k8s-master01:/opt/k8s-data/dockerfile/cbear/wordpress/nginx# cat Dockerfile 
    #Nginx Base Image
    FROM harbor.cbear.top/baseimages/centos:7.9.2009 
    ​
    RUN yum install -y vim wget tree  lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop
    ADD nginx-1.26.1.tar.gz /usr/local/src/
    RUN cd /usr/local/src/nginx-1.26.1 && ./configure --prefix=/apps/nginx  && make && make install && ln -sv  /apps/nginx/sbin/nginx /usr/sbin/nginx  &&rm -rf /usr/local/src/nginx-1.26.1.tar.gz
    ​

    该镜像主要做了安装编译环境,放nginx源码包进去编译nginx;

  • 镜像构建脚本

    root@k8s-master01:/opt/k8s-data/dockerfile/cbear/wordpress/nginx# cat build-command.sh 
    #!/bin/bash
    
    nerdctl build -t  harbor.cbear.top/pub-images/nginx-base-wordpress:v1.26.1  .
    nerdctl push harbor.cbear.top/pub-images/nginx-base-wordpress:v1.26.1
  • 构建对应nginx镜像

    root@k8s-master01:/opt/k8s-data/dockerfile/cbear/wordpress/nginx# bash build-command.sh 

2.3 wordpress镜像

  • wordpress镜像目录文件

    root@k8s-master01:/opt/k8s-data/dockerfile/cbear/wordpress/wordpress# ll
    total 24
    drwxr-xr-x 2 root root 4096 Jun 20 10:20 ./
    drwxr-xr-x 5 root root 4096 Jun 20 10:16 ../
    -rw-r--r-- 1 root root  237 Jun 20 10:17 build-command.sh
    -rw-r--r-- 1 root root  287 Jun 20 10:20 Dockerfile
    -rw-r--r-- 1 root root 3364 Jun 20 10:16 nginx.conf
    -rwxr-xr-x 1 root root  151 Jun 20 10:17 run_nginx.sh*
    
  • 镜像构建文件

    root@k8s-master01:~/k8s-data/dockerfile/web/magedu/wordpress/nginx# cat Dockerfile 
    FROM harbor.cbear.top/pub-images/nginx-base-wordpress:v1.26.1
    
    ADD nginx.conf /apps/nginx/conf/nginx.conf
    ADD run_nginx.sh /apps/nginx/sbin/run_nginx.sh
    RUN mkdir -pv /home/nginx/wordpress
    RUN chown nginx.nginx /home/nginx/wordpress/ -R
    
    EXPOSE 80 443
    
    CMD ["/apps/nginx/sbin/run_nginx.sh"] 
    
  • 镜像运行脚本

    root@k8s-master01:/opt/k8s-data/dockerfile/cbear/wordpress/wordpress# chmod +x run_nginx.sh 
    root@k8s-master01:/opt/k8s-data/dockerfile/cbear/wordpress/wordpress# cat run_nginx.sh 
    #!/bin/bash
    /apps/nginx/sbin/nginx
    tail -f /etc/hosts
    
  • 镜像构建脚本

    root@k8s-master01:~/k8s-data/dockerfile/web/magedu/wordpress/nginx# cat build-command.sh 
    #!/bin/bash
    TAG=$1
    nerdctl build -t harbor.cbear.top/cbear/wordpress-nginx:${TAG} .
    echo "镜像制作完成,即将上传至Harbor服务器"
    sleep 1
    nerdctl push  harbor.cbear.top/cbear/wordpress-nginx:${TAG}
    echo "镜像上传完成"
  • nginx,conf配置文件

    user  nginx nginx;
    worker_processes  auto;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    #daemon off;
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
        #access_log  logs/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        keepalive_timeout  65;
        client_max_body_size 10M;
        client_body_buffer_size 16k;
        client_body_temp_path  /apps/nginx/tmp   1 2 2;
        gzip  on;
    
    
        server {
            listen       80;
            server_name  localhost;
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
    
    
            location / {
                root    /home/nginx/wordpress;
                index   index.php index.html index.htm;
                #if ($http_user_agent ~ "ApacheBench|WebBench|TurnitinBot|Sogou web spider|Grid Service") {
                #    proxy_pass http://www.baidu.com;
                #    #return 403;
                #}
            }
    
            location ~ \.php$ {
                root           /home/nginx/wordpress;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                 include        fastcgi_params;
            }
    
    
            #error_page  404              /404.html;
    
            # redirect server error pages to the static page /50x.html
            #
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
            # proxy the PHP scripts to Apache listening on 127.0.0.1:80
            #
            #location ~ \.php$ {
            #    proxy_pass   http://127.0.0.1;
            #}
    
            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            #
            #location ~ \.php$ {
            #    root           html;
            #    fastcgi_pass   127.0.0.1:9000;
            #    fastcgi_index  index.php;
            #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            #    include        fastcgi_params;
            #}
    
            # deny access to .htaccess files, if Apache's document root
            # concurs with nginx's one
            #
            #location ~ /\.ht {
            #    deny  all;
            #}
        }
    
    
        # another virtual host using mix of IP-, name-, and port-based configuration
        #
        #server {
        #    listen       8000;
        #    listen       somename:8080;
        #    server_name  somename  alias  another.alias;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
    
        # HTTPS server
        #
        #server {
        #    listen       443 ssl;
        #    server_name  localhost;
    
        #    ssl_certificate      cert.pem;
        #    ssl_certificate_key  cert.key;
    
        #    ssl_session_cache    shared:SSL:1m;
        #    ssl_session_timeout  5m;
    
        #    ssl_ciphers  HIGH:!aNULL:!MD5;
        #    ssl_prefer_server_ciphers  on;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
    }

3. 运行WordPress站点

3.1 准备nfs存储目录

  • 在nfs服务器准备存放wordpress代码文件目录

    root@harbor:~# mkdir  /data/cbear/wordpress
  • 配置nfs并加载对应配置文件

    root@harbor:~# cat /etc/exports
    /data/cbear/wordpress/ *(rw,no_root_squash,no_subtree_check)
    
    root@harbor:~# exportfs -rv 
    exporting *:/data/cbear/wordpress

3.2 运行wordpress的配置清单

  • 准备对应配置清单

    kind: Deployment
    apiVersion: apps/v1
    metadata:
      labels:
        app: wordpress-app
      name: wordpress-app-deployment
      namespace: cbear
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: wordpress-app
      template:
        metadata:
          labels:
            app: wordpress-app
        spec:
          containers:
          - name: wordpress-app-nginx
            image: harbor.cbear.top/cbear/wordpress-nginx:v1
            imagePullPolicy: Always
            ports:
            - containerPort: 80
              protocol: TCP
              name: http
            - containerPort: 443
              protocol: TCP
              name: https
            volumeMounts:
            - name: wordpress
              mountPath: /home/nginx/wordpress
              readOnly: false
    
          - name: wordpress-app-php
            image: harbor.cbear.top/cbear/wordpress-php-5.6:v1 
            #imagePullPolicy: IfNotPresent
            imagePullPolicy: Always
            ports:
            - containerPort: 9000
              protocol: TCP
              name: http
            volumeMounts:
            - name: wordpress
              mountPath: /home/nginx/wordpress
              readOnly: false
    
          volumes:
          - name: wordpress
            nfs:
              server: 192.168.71.34
              path: /data/cbear/wordpress 
    
    
    ---
    kind: Service
    apiVersion: v1
    metadata:
      labels:
        app: wordpress-app
      name: wordpress-app-spec
      namespace: cbear
    spec:
      type: NodePort
      ports:
      - name: http
        port: 80
        protocol: TCP
        targetPort: 80
        nodePort: 30031
      - name: https
        port: 443
        protocol: TCP
        targetPort: 443
        nodePort: 30033
      selector:
        app: wordpress-app
  • 启用清单

    root@k8s-master01:/opt/k8s-data/yaml/cbear/wordpress# kubectl apply -f ./
    deployment.apps/wordpress-app-deployment created
    service/wordpress-app-spec created
  • 验证对应测试结果

    root@k8s-master01:/opt/k8s-data/yaml/cbear/wordpress# kubectl get pods -n cbear
    NAME                                        READY   STATUS    RESTARTS   AGE
    wordpress-app-deployment-74bdb78887-gzk5t   2/2     Running   0          42s
    root@k8s-master01:/opt/k8s-data/yaml/cbear/wordpress# kubectl get svc -n cbear
    NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
    
    wordpress-app-spec      NodePort    10.68.61.30     <none>        80:30031/TCP,443:30033/TCP   70s

3.3 验证

3.3.1 准备php测试页面

  • 准备后台访问的php页面

    root@harbor:/data/cbear/wordpress# cat test.php 
    <?php
    phpinfo();
    ?>
  • 访问php测试页面

    image-20240620185000362

4. 初始化WordPress站点

  • k8s中MySQL创建数据库

    root@k8s-master01:/opt/k8s-data/yaml/cbear/wordpress# kubectl exec -it mysql-0 -n cbear -- bash
    Defaulted container "mysql" out of: mysql, xtrabackup, init-mysql (init), clone-mysql (init)
    root@mysql-0:/# mysql
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 39823
    Server version: 5.7.36-log 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> CREATE DATABASE wordpress;
    Query OK, 1 row affected (0.03 sec)
    
    mysql> GRANT ALL PRIVILEGES ON wordpress.* TO "wordpress"@"%" IDENTIFIED BY "wordpress";
    Query OK, 0 rows affected, 1 warning (0.01 sec)
    
    mysql> show databases;
    +------------------------+
    | Database               |
    +------------------------+
    | information_schema     |
    | mydb                   |
    | mysql                  |
    | performance_schema     |
    | sys                    |
    | wordpress              |
    | xtrabackup_backupfiles |
    +------------------------+
    7 rows in set (0.01 sec)
  • 下载并解压对应wordpress

    root@harbor:~# tar -xf wordpress-5.6.10-zh_CN.tar.gz -C /data/cbear/
    root@harbor:/data/cbear/wordpress# ll
    total 228
    drwxr-xr-x  5 1006 1006  4096 Oct 18  2022 ./
    drwxr-xr-x 10 root root  4096 Jun 20 10:30 ../
    -rw-r--r--  1 1006 1006   405 Feb  6  2020 index.php
    -rw-r--r--  1 1006 1006 19915 Oct 18  2022 license.txt
    -rw-r--r--  1 1006 1006  7278 Oct 18  2022 readme.html
    -rw-r--r--  1 root root    20 Jun 20 10:47 test.php
    -rw-r--r--  1 1006 1006  7101 Jul 28  2020 wp-activate.php
    drwxr-xr-x  9 1006 1006  4096 Oct 18  2022 wp-admin/
    -rw-r--r--  1 1006 1006   351 Feb  6  2020 wp-blog-header.php
    -rw-r--r--  1 1006 1006  2328 Oct  8  2020 wp-comments-post.php
    -rw-r--r--  1 1006 1006  2913 Oct 18  2022 wp-config-sample.php
    drwxr-xr-x  5 1006 1006  4096 Oct 18  2022 wp-content/
    -rw-r--r--  1 1006 1006  3939 Jul 30  2020 wp-cron.php
    drwxr-xr-x 25 1006 1006 12288 Oct 18  2022 wp-includes/
    -rw-r--r--  1 1006 1006  2496 Feb  6  2020 wp-links-opml.php
    -rw-r--r--  1 1006 1006  3300 Feb  6  2020 wp-load.php
    -rw-r--r--  1 1006 1006 49831 Nov  9  2020 wp-login.php
    -rw-r--r--  1 1006 1006  8454 Oct 17  2022 wp-mail.php
    -rw-r--r--  1 1006 1006 20975 Nov 12  2020 wp-settings.php
    -rw-r--r--  1 1006 1006 31337 Sep 30  2020 wp-signup.php
    -rw-r--r--  1 1006 1006  4816 Oct 17  2022 wp-trackback.php
    -rw-r--r--  1 1006 1006  3236 Jun  8  2020 xmlrpc.php
  • 修改wordpress权限

    root@k8s-master01:/opt/k8s-data/yaml/cbear/wordpress# kubectl exec -it -n cbear wordpress-app-deployment-74bdb78887-gzk5t -- id nginx
    Defaulted container "wordpress-app-nginx" out of: wordpress-app-nginx, wordpress-app-php
    uid=2088(nginx) gid=2088(nginx) groups=2088(nginx)
    
    root@harbor:/data/cbear/wordpress# chown 2088.2088 /data/cbear/wordpress/ -R
    root@harbor:/data/cbear/wordpress# ll
    total 228
    drwxr-xr-x  5 2088 2088  4096 Oct 18  2022 ./
    drwxr-xr-x 10 root root  4096 Jun 20 10:30 ../
    -rw-r--r--  1 2088 2088   405 Feb  6  2020 index.php
    -rw-r--r--  1 2088 2088 19915 Oct 18  2022 license.txt
    -rw-r--r--  1 2088 2088  7278 Oct 18  2022 readme.html
    -rw-r--r--  1 2088 2088    20 Jun 20 10:47 test.php
    -rw-r--r--  1 2088 2088  7101 Jul 28  2020 wp-activate.php
    drwxr-xr-x  9 2088 2088  4096 Oct 18  2022 wp-admin/
    -rw-r--r--  1 2088 2088   351 Feb  6  2020 wp-blog-header.php
    -rw-r--r--  1 2088 2088  2328 Oct  8  2020 wp-comments-post.php
    -rw-r--r--  1 2088 2088  2913 Oct 18  2022 wp-config-sample.php
    drwxr-xr-x  5 2088 2088  4096 Oct 18  2022 wp-content/
    -rw-r--r--  1 2088 2088  3939 Jul 30  2020 wp-cron.php
    drwxr-xr-x 25 2088 2088 12288 Oct 18  2022 wp-includes/
    -rw-r--r--  1 2088 2088  2496 Feb  6  2020 wp-links-opml.php
    -rw-r--r--  1 2088 2088  3300 Feb  6  2020 wp-load.php
    -rw-r--r--  1 2088 2088 49831 Nov  9  2020 wp-login.php
    -rw-r--r--  1 2088 2088  8454 Oct 17  2022 wp-mail.php
    -rw-r--r--  1 2088 2088 20975 Nov 12  2020 wp-settings.php
    -rw-r--r--  1 2088 2088 31337 Sep 30  2020 wp-signup.php
    -rw-r--r--  1 2088 2088  4816 Oct 17  2022 wp-trackback.php
    -rw-r--r--  1 2088 2088  3236 Jun  8  2020 xmlrpc.php
  • 通过页面初始化。直接访问192.168.71.35:30031即可

    image-20240620191430421
    image-20240620192608152
    image-20240620192057155
    image-20240620192200051

    之后直接登录即可


参考链接

k8s实战案例之运行WordPress - Linux-1874 - 博客园 (cnblogs.com)