php-fpm, mariadb, nginx and laravel 하기 3
이전 장에서 만든것에 대해 최적화에 대해서 조금 설명드리겠습니다.
이전 장에서는 테스트용으로 pod.yaml을 만들었지만 실제 서비스에서는 Deployment 를 사용합니다.
따라서 먼저 만들어 둔 pod.yaml을 파일을 아래의 deployment.yaml 파일로 대처하겠습니다.
또한 emptyDir 대신 pvc를 이용한 영구적인 스토리지를 만들어 서비스에 안정성을 주었습니다.
- deployment.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: shared-files-pvc
spec:
accessModes:
- ReadWriteMany # 여러 Pod에서 동시에 읽고 쓸 수 있게
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-phpfpm-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx-phpfpm
template:
metadata:
labels:
app: nginx-phpfpm
spec:
volumes:
- name: shared-files
# emptyDir: {} : 이렇게 하면 파드가 삭제될때 함께 삭제됨
persistentVolumeClaim: # 따라서 pvc를 이용하여 처리함
claimName: shared-files-pvc
- name: nginx-config-volume
configMap:
name: nginx-config
containers:
- name: phpfpm82
image: php-8-2-fpm:1.0.0
imagePullPolicy: Never
volumeMounts:
- name: shared-files
mountPath: /usr/share/nginx/html
- name: nginx
image: nginx:1.27.5
volumeMounts:
- name: shared-files
mountPath: /usr/share/nginx/html
- name: nginx-config-volume
mountPath: /etc/nginx/conf.d
sftp 및 ssh 접속 추가
아래와 같이 하면 user 에 대한 모든 것을 처리할 수 있습니다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: shared-files-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
name: sftp-ssh-service
spec:
selector:
app: nginx-phpfpm
type: NodePort
ports:
- name: sftp
protocol: TCP
port: 22
targetPort: 22
nodePort: 30222
- name: ssh
protocol: TCP
port: 2222
targetPort: 2222
nodePort: 30223
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-phpfpm-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx-phpfpm
template:
metadata:
labels:
app: nginx-phpfpm
spec:
volumes:
- name: shared-files
persistentVolumeClaim:
claimName: shared-files-pvc
- name: nginx-config-volume
configMap:
name: nginx-config
initContainers:
- name: init-symlink
image: busybox
command: ['sh', '-c', 'rm -rf /home/user && ln -s /usr/share/nginx/html /home/user']
volumeMounts:
- name: shared-files
mountPath: /usr/share/nginx/html
containers:
- name: phpfpm82
image: php-8-2-fpm:1.0.0
imagePullPolicy: Never
volumeMounts:
- name: shared-files
mountPath: /usr/share/nginx/html
- name: nginx
image: nginx:1.27.5
volumeMounts:
- name: shared-files
mountPath: /usr/share/nginx/html
- name: nginx-config-volume
mountPath: /etc/nginx/conf.d
- name: sftp
image: atmoz/sftp:latest
ports:
- containerPort: 22
name: sftp
volumeMounts:
- name: shared-files
mountPath: /usr/share/nginx/html
- name: shared-files
mountPath: /home/user
args: ["user:password:1001"]
- name: ssh
image: linuxserver/openssh-server
env:
- name: PUID
value: "1001"
- name: PGID
value: "1001"
- name: TZ
value: "Asia/Seoul"
- name: PASSWORD_ACCESS
value: "true"
- name: USER_PASSWORD
value: "password"
- name: USER_NAME
value: "user"
ports:
- containerPort: 2222
name: ssh
volumeMounts:
- name: shared-files
mountPath: /usr/share/nginx/html
multiple user에 대한 sftp 및 ssh 접속
위와 같은 방식(linuxserver/openssh-server) 에서는 하면의 user 만 ssh 로 접근 가능합니다.
만약 웹호스팅 서비스를 계획중이거나 다양한 user에대한 권한 등을 제어하고 싶다면 Docker 파일을 만들어 사용하는 방식입니다.
- Dockerfile
FROM ubuntu:22.04
RUN apt update && \
apt install -y openssh-server && \
mkdir /var/run/sshd
RUN useradd -m -u 1001 user1 && echo "user1:password1" | chpasswd && \
useradd -m -u 1002 pondol && echo "pondol:password2" | chpasswd
RUN echo "Port 2222" >> /etc/ssh/sshd_config && \
echo "AllowUsers user1 pondol" >> /etc/ssh/sshd_config && \
echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config && \
echo "PermitRootLogin no" >> /etc/ssh/sshd_config
EXPOSE 2222
CMD ["/usr/sbin/sshd", "-D"]
docker build -t ssh-multiuser .