[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_ -‐'~´~~
`ー~´~~~~
この記事が気に入ったらサポートをしてみませんか?