[lv4]ft_services(2/6) phpmyadmin

<- 前(1/6)VM設定/metallb/nginx
-> 次(3/6): phpmyadmin リバースプロキシ+mysql連携

1. metallb+nginx
2. basecamp image作成
3. phpmyadmin ポートアクセス

4. nginxからphpmyadminにリバースプロキシ
5. mysqlのDB作成
6. pypmyadminとmysqlの連携
7. wordpress立ち上げ
8. nginxからwordpressにリダイレクト

Q. トラブルシュート。エラーが発生したらどうする

1. ポッドの情報取得
kubectl get po

2. サービスの情報取得
kubectl get svc

3. logsの取得
kubectl logs <pod名>

4. コンテナの中に入って確認
kubectl exec -it deploy/nginx -- sh  (nginx箇所を変更。Service.nameが適応)

5. shの手順を手打ちで再現

Q. docker run -it <container名> sh の注意点
A. docker run -itを一息で実施すると、
CMD[ tmp/start.sh ] が[ sh ]に置換されてしまうようです。
1. docker run -d <image名>
2. docker exec -it <container名> sh
と分割実施すれば、tmp/start.shまで実行されます。
(または ENTRYPOINT[ tmp/start.sh ] で回避できるかも)

2. basecampの実装
Q. basecamp?
A. [subject] phpmyadminにもnginxを宛がう指示があります。
全てのコンテナに、個別にnginxをインストールするのも時間を食うので、必要なものをインストールしたbase_imageを作成します。
以降、apk add および wget はすべてbasecampに記述します。

/srcs/basecamp/dockerfile

FROM alpine:3.13

RUN set -ex; \
	apk update; \
	apk add nginx openssl wget curl; \
	mkdir -p /run/nginx; \
# php-mysql (no such package): alpineに入らない
	apk add mysql mysql-client; \
	apk add php7-phar php7-fpm php7-common php7-session php7-iconv php7-json php7-gd php7-curl php7-xml php7-mysqli php7-imap php7-cgi fcgi php7-pdo php7-pdo_mysql php7-soap php7-xmlrpc php7-posix php7-mcrypt php7-gettext php7-ldap php7-ctype php7-dom
# php7-pharはwp-cliで必須

# .key:秘密鍵
# cirtificate signing request = 証明書署名要求 「証明書を発行してもらうために必要なもの」
# "/C=CountryName/ST=StateName/L=CityName/O=OrganizaitonName/OU=OrganizationalUnit/CN=DomainName"

RUN mkdir /etc/nginx/ssl
WORKDIR /etc/nginx/ssl/
RUN openssl req -newkey rsa:4096 -x509 -sha256 -days 3650 -nodes -out ft_service.crt -keyout ft_service.key \
	-subj "/C=JP/ST=Tokyo/L=hoge/O=fuga/OU=foo/CN=localhost"

# wordpress install
WORKDIR /tmp
RUN set -ex; \
	wget https://wordpress.org/latest.tar.gz; \
	tar -xvzf latest.tar.gz; \
	rm latest.tar.gz; \
	mv wordpress/ /var/www/

# phpmyadmin install
RUN set -ex; \
	wget https://files.phpmyadmin.net/phpMyAdmin/5.0.2/phpMyAdmin-5.0.2-all-languages.tar.gz; \
	tar -xvzf phpMyAdmin-5.0.2-all-languages.tar.gz; \
	rm phpMyAdmin-5.0.2-all-languages.tar.gz; \
	mv phpMyAdmin-5.0.2-all-languages phpmyadmin; \
	mv phpmyadmin/ /var/www

# wp-cli https://wp-cli.org/ja/
# wordpressのユーザ登録を、コマンドで行えるツール
RUN set -ex; \
	curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar; \
	chmod +x wp-cli.phar; \
	mv wp-cli.phar /usr/local/bin/wp

RUN	chmod -R 755 /tmp /etc

# cache clear
RUN rm -rf /var/cache/apk/*

WORKDIR /

/srcs/nginx/dockerfile リファクタリング

--------変更前---------
FROM alpine
--------変更後---------
FROM basecamp
----------------------

----------------削除-------------------------------------------
RUN set -ex; \
	apk update; \
	apk add nginx openssl; \
	mkdir -p /run/nginx

# .key:秘密鍵
# cirtificate signing request = 証明書署名要求 「証明書を発行してもらうために必要なもの」
# "/C=CountryName/ST=StateName/L=CityName/O=OrganizaitonName/OU=OrganizationalUnit/CN=DomainName"

RUN mkdir /etc/nginx/ssl
WORKDIR /etc/nginx/ssl/
RUN openssl req -newkey rsa:4096 -x509 -sha256 -days 3650 -nodes -out ft_service.crt -keyout ft_service.key \
	-subj "/C=JP/ST=Tokyo/L=hoge/O=fuga/OU=foo/CN=localhost"
--------------------------------------------------------------
# doc root
RUN mkdir -p app

COPY app /app
COPY default.conf /etc/nginx/conf.d/default.conf
COPY start.sh /tmp/start.sh

RUN	chmod -R 755 /app /tmp /etc
#access logへの書き込み権限を与えないと、環境変数が出力されない
RUN chown -R nginx:nginx /etc/nginx

WORKDIR /
# port
EXPOSE 80 443 22

----------------削除-------------------------------------------
# cache clear
RUN rm -rf /var/cache/apk/*
---------------------------------------------------------------
CMD [ "/tmp/start.sh" ]

3. phpmyadminの実装
Q. Docker-compose.yaml?
A. 検索上位にあがるDocker-composeはすべてスルーです。今回はkubernetesによる実装なので、まったくあてはまりません。

Q. ゴールは?
A1. 次の2パターンでアクセスができること
1. https://192.168.10.10:5000/ ポートで直接アクセス
2. https://192.168.10.10/phpmyadmin リバースプロキシを利用してアクセス
A2. ログインできること

まずA1ゴール1. を目指します。
/srcs/phpmyadmin/dockerfile 作成

FROM basecamp

COPY start.sh /tmp/start.sh

# doc root
COPY default.conf /etc/nginx/conf.d/default.conf
COPY config.inc.php /var/www/phpmyadmin
# for debug
COPY info.php /var/www/phpmyadmin

# php config (ps aux)
# 12 nobody    0:00 {php-fpm7} php-fpm: pool www
# -> nginx     0:00 {php-fpm7} php-fpm: pool www
COPY www.conf /etc/php7/php-fpm.d

# etcはサーバー系が全部入ってるから本当は755微妙
RUN	chmod -R 755 /var /etc /tmp

# tmpは書き込み権限が必要。phpmyadminにアクセスしたときに、tmpに書き込みがなされるため
# 権限がないとpermission denied発生
# w権限がないと、access.logも書き込めないかも
RUN	chmod -R 777 /tmp /var/log/nginx
# socketでfastCGIを受け付ける場合、/var/run/php7-fpm.sockを777に。
RUN chown -R nginx:nginx /etc/nginx

# port
EXPOSE 5000

CMD [ "/tmp/start.sh" ]

Q. chmod -R 777 /tmp?
A. phpmyadminへのアクセス処理の一環として、tmpファイルに何かしらのデータが書き込まれるようです。nginxユーザによる書き込みができるように調整します。

/srcs/phpmyadmin/default.conf

log_format debug_val_format '$remote_addr - $remote_user [$time_local] "$debug_val"';

server	{
		listen 5000 ssl default_server;
		listen [::]:5000 ssl default_server;

		ssl_certificate /etc/nginx/ssl/ft_service.crt;
		ssl_certificate_key /etc/nginx/ssl/ft_service.key;

		set $debug_val "uri:$uri host:$host request_uri:$request_uri document_root:$document_root fastcgi_script_name:$fastcgi_script_name";
		access_log /var/log/nginx/access.log debug_val_format;
		error_log  /var/log/nginx/error.log;
		
		root	/var/www/phpmyadmin;
		index	index.php;

		location ~ \.php$ {
			try_files $uri =404;
			fastcgi_pass 127.0.0.1:9000;
			# fastcgi(socket) https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc#%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E8%A8%AD%E5%AE%9A
			fastcgi_index index.php;
			include fastcgi_params;
			# fastcgi 順番 https://qiita.com/kotarella1110/items/f1ad0bb40b84567cea66
			fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		}
}

/srcs/phpmyadmin/config.inc.php

<?php

/**
* This is needed for cookie based authentication to encrypt password in
* cookie. Needs to be 32 chars long.
*/
$cfg['blowfish_secret'] = 'A69LP5aQpeNNESfUZnm6a8DH9nAHt5V5'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

/**
* Servers configuration
*/
$i = 1;

/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'cookie';
/* Server parameters */
$cfg['Servers'][$i]['host'] = 'mysql'; # 名前解決。mysql.yamlのserviceのname。podのIP(192.168.10.10)が入る。
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['AllowNoPassword'] = true;

/**
* phpMyAdmin configuration storage settings.
*/

/* User used to manipulate with storage */
// $cfg['Servers'][$i]['controlhost'] = '';
$cfg['Servers'][$i]['port'] = '3306';
$cfg['Servers'][$i]['controluser'] = 'user42'; #mysql start.shに依存
$cfg['Servers'][$i]['controlpass'] = 'user42';

/**
* Directories for saving/loading files from server
*/
$cfg['UploadDir'] = '';
$cfg['SaveDir'] = '';

Q. config.inc.php?
A. /var/www/phpmyadmin/config.sample.inc.phpがテンプレートです。内容とファイル名を変更して作成します。
config.inc.phpの作成とパスフレーズの設定

/srcs/phpmyadmin/www.conf

[www]

;user = nobody
;group = nobody

user = nginx
group = nginx

; port5000で受け付けてport9000で処理
listen = 127.0.0.1:9000
; socketで受け付ける場合 https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc#%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E8%A8%AD%E5%AE%9A
; listen = /var/run/php7-fpm.sock

pm = dynamic

pm.max_children = 5

pm.start_servers = 2

pm.min_spare_servers = 1

pm.max_spare_servers = 3

Q. www.conf?
A. /etc/php7/php-fpm.dにあります。user:group = nobody:nobodyが不気味なので(phpmyadminのコンテナ内でps auxコマンドで表示)、nginx.conf指定のuser:nginxを設定します。
A. listen必要。fastCGIで、キャッシュ処理のためのIP指定。

/srcs/phpmyadmin/start.sh

#!/bin/sh

nginx && php-fpm7
echo "phpmyadmin start"
tail -f /var/log/nginx/access.log

/srcs/phpmyadmin/phpmyadmin.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
 labels:
   app: phpmyadmin # このラベルは全部のpodにつけられる
 name: phpmyadmin  # deploymentの名前
spec:  # podの概要
 replicas: 1
 selector:
   matchLabels:
     app: phpmyadmin
 template: # podのtemplate
   metadata:
     labels:
       app: phpmyadmin
   spec:
     containers:
     - image: mypma
       imagePullPolicy: Never
       name: phpmyadmin
       ports:
       - containerPort: 5000

---
apiVersion: v1
kind: Service
metadata:
 name: phpmyadmin
------------------追記--------------------
 annotations:
   metallb.universe.tf/allow-shared-ip: "ft_services"
-----------------------------------------
spec:
 type: LoadBalancer
 selector:
   app: phpmyadmin
 ports:
   - name: phpmyadmin # portsは複数ある場合、ports内でユニークなnameが必須
     port: 5000

Q. annotations?
A. ちょっと後に記述します

/run.sh

------順に追記------
kubectl delete -f srcs/phpmyadmin/phpmyadmin.yaml

docker build -t basecamp srcs/basecamp/.
docker build -t mynginx srcs/nginx/.
docker build -t mypma srcs/phpmyadmin/.

kubectl apply -f srcs/phpmyadmin/phpmyadmin.yaml

➜ kubectl get svc
nginx-metallb LoadBalancer .. <pending>
phpmyadmin LoadBalancer .. 192.168.10.10
※podはランダムに起動するので、<pending>が逆になることもあります。

Q. EXTERNAL-IPが割り振られない
A. LoadBalancerは、kind:ServiceごとにIPを振り出します。
ですが、metallb-config.yamlにてaddressesの範囲を1つしか指定していないため、振り出されませんでした。
[subject] 外部との接続はsingleIPの実装と規定があります。
この縛りがなければ、ServiceごとにIPを振り出しても運用できたのですが…。
Q. どう実装するの
A. metalLBには、IPを共有して振り出せるオプションが存在します。

/srcs/nginx/nginx.yaml 追記

apiVersion: v1
kind: Service
metadata:
 name: nginx-metallb
--------------追記-----------------------
 annotations:
   metallb.universe.tf/allow-shared-ip: "ft_services"
-----------------------------------------
spec:
...

Q. annotations?
A. metallb.universe.tf allow-shared-ip名が共通であれば、共通のIPが振り出されます。

/run.sh
➜ kubectl get svc
nginx-metallb LoadBalancer .. 192.168.10.10
phpmyadmin LoadBalancer .. 192.168.10.10

https://192.168.10.10:5000 にアクセスします。




niceboat
            _
        ノ |_   ll__l---||_
      rj「l__`ー'  ヽlーj  L---┐
      |―┴┴―`ーrュ-‐< ̄.ィj .__jl
      |[][][][][][] i """ _..,,rr=''´ l
      l ̄ ̄ ̄ ̄/7-‐'´     /
   f  jL-、 _-‐'      -‐´~~
   ヽ |  ̄  _j_ -‐'~´~~
     `ー~´~~~~

-> 次(3/6): phpmyadmin リバースプロキシ+mysql連携

この記事が気に入ったらサポートをしてみませんか?