728x90
Init Container
정의
- 일반적인 파드 내에서 애플리케이션이 시작되기 전에 실행되는 특수한 컨테이너이며, 필요한 초기 설정이나 종속성을 준비하는 데 사용된다.
- 애플리케이션과 독립적인 컨테이너이며, 초기화 컨테이너 작업이 완료된 후 메인 컨테이너로 실행된다.
예시
1. 초기화 실행 시, 특정 폴더에 대해서 권한 설정
mount 후 /opt/sonarqube
라는 폴더에 대해서 모든 권한을 허용하는 예시
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: poc
name: deployment-sonarqube
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: sonarqube
template:
metadata:
labels:
app.kubernetes.io/name: sonarqube
spec:
initContainers:
- name: sonarqube-init
image: "busybox"
command: ["/bin/sh", "-c"]
args:
- |
chmod -R 777 /opt/sonarqube
volumeMounts:
- name: sonarqube-data
mountPath: /opt/sonarqube/data
- name: sonarqube-extensions
mountPath: /opt/sonarqube/extensions
containers:
- image: sonarqube:latest
name: sonarqube
imagePullPolicy: Always
ports:
- containerPort: 9000
volumeMounts:
- name: sonarqube-data
mountPath: /opt/sonarqube/data
- name: sonarqube-extensions
mountPath: /opt/sonarqube/extensions
- name: sonarscanner
image: sonarscanner:latest
imagePullPolicy: Always
ports:
- containerPort: 8000
command: ["/bin/sh", "-c", "uvicorn main:app --host 0.0.0.0 --port 8000 & while true; do sleep 3600; done"]
volumeMounts:
- name: sonarscanner-data
mountPath: /usr/src
volumes:
- name: sonarqube-data
persistentVolumeClaim:
claimName: sonarqube-data-pvc
- name: sonarqube-extensions
persistentVolumeClaim:
claimName: sonarqube-extensions-pvc
- name: sonarscanner-data
persistentVolumeClaim:
claimName: sonarscanner-data-pvc
2. 실행문구를 남기는 예시
apiVersion: v1
kind: Pod
metadata:
name: init-container-example
spec:
initContainers:
- name: init-myservice
image: busybox
command: ['sh', '-c', 'echo "Initializing..." > /etc/config/init.txt']
volumeMounts:
- name: config-volume
mountPath: /etc/config
containers:
- name: main-app
image: myapp:latest
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
emptyDir: {}
멀티 컨테이너 패턴
정의
하나의 파드 내에서 여러 개의 컨테이너를 실행하는 패턴이다. 하나의 파드는 여러 개의 컨테이너를 가질 수 있으며, 이 컨테이너들은 동일한 네트워크와 스토리지를 공유한다.
- 사실 패턴 이름이 따로 있지만, 거의 유사해보인다. 굳이 디테일하게 나누는 느낌 ? 결국 동일한 파드 안에 있어서 노출할 것만 노출하고 업무 별로 분리한 것으로 생각함.
- 일반적으로 사이드카 패턴으로 많이 부르는 것 같아 해당 예시로 추가한다.
예시
fastapi를 두고 로그 수집을 위해 promtail 을 사이드카 컨테이너로 배치
- fastapi는 외부로 노출시키지만 promtail은 외부로 노출시키지 않고 로그 수집에만 집중하도록 구조를 만든 예시이다.
1.deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-cicd-api
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: cicd-api
template:
metadata:
labels:
app.kubernetes.io/name: cicd-api
spec:
containers:
- name: cicd-api
image: "fastapi:latest"
imagePullPolicy: Always
ports:
- containerPort: 8000
env:
- name: ENVIRONMENT
value: dev
- name: PYTHONUNBUFFERED
value: "1"
- name: AWS_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
name: aws-credentials
key: AWS_ACCESS_KEY_ID
- name: AWS_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
name: aws-credentials
key: AWS_SECRET_ACCESS_KEY
- name: AWS_REGION
valueFrom:
secretKeyRef:
name: aws-credentials
key: AWS_REGION
command: ["uvicorn"]
args: ["main:app", "--host", "0.0.0.0", "--port", "8000"]
volumeMounts:
- name: logs
mountPath: /app/logs
- name: promtail
image: grafana/promtail:latest
args:
- "-config.file=/etc/promtail/promtail-config.yaml"
volumeMounts:
- name: logs
mountPath: /app/logs
- name: promtail-config-cicd-api-dev
mountPath: /etc/promtail
volumes:
- name: logs
hostPath:
path: /home/asdfg0237/log/fastapi-logs
type: DirectoryOrCreate
- name: promtail-config-cicd-api-dev
configMap:
name: promtail-config-cicd-api-dev
- service
apiVersion: v1
kind: Service
metadata:
namespace: poc
name: cicd-api-service
spec:
type: NodePort
ports:
- port: 8000
targetPort: 8000
protocol: TCP
selector:
app.kubernetes.io/name: cicd-api
728x90
'Engineering > K8S' 카테고리의 다른 글
ResourceQuota 와 LimitRange (0) | 2024.12.23 |
---|---|
RBAC (0) | 2024.12.23 |
application Probe (0) | 2024.12.20 |
Control Plane 컴포넌트와 Node 컴포넌트 (+ taint, toleration, affinity, anti-affinity) (1) | 2024.12.19 |
Volume (0) | 2024.12.13 |