본문 바로가기

Study/Docker & Kubernetes

개인 공부용 Docker Desktop kubernetes 설정 모음

반응형

여러 오픈소스를 공부할 때 Docker Desktop for Windows에서 제공하는 kubernetes를 애용한다.

docker container만으로도 충분히 쓸만하지만 계속 container가 초기화되어 데이터가 유지되지 않거나 또는 매번 window 구동 시 container를 일일이 띄우는 게 귀찮거나 하는 잡다한 문제들이 있다.

환경 구성 설정을 관리하여 이런 문제들을 해결해 나갈 수 있지만 container가 많아질 수록 그 container를 계속 유지하는 게 귀찮아지게 된다.

이런 문제를 편하게 해결 할 수 있는 게 kubernetes인데 예전에는 minikube를 사용할 수 있었지만 그것도 설치하는 게 너무 귀찮고 복잡했다.

하지만 요즘은 Window Docker Desktop이 kubernetes를 지원하면서 간단하게 kubernetes를 사용할 수 있게 되었다.

관련하여 사용하는 Window Docker Desktop kubernetes 설정 yaml들을 모아두었다.

image에 따라 window directory 볼륨 연결을 사용할 수 없거나 시간이 지나면 지원이 안되기도 하지만 되도록 볼륨 연결을 통해 데이터는 유지하는 식으로 사용하고 있다.

사용 방법은 다음과 같다.

  • Docker Desktop 설정 -> Kubernetes에서 Enable Kubernetes를 활성화
  • Docker Desktop 설정 -> Resources -> FILE SHARING에서 공유할 폴더를 지정하고 아래의 설정들의 공유 폴더 위치를 적절히 수정
  • command 창에서 아래 파일의 위치에서 kubectl apply -f [각 yaml파일] 명령을 수행하여 kubernetes pod 생성

아래 예제 중 jenkins의 경우 jenkins 내에서 docker를 사용하기 위해 기존 jenkins image를 가져와 window docker와 연결하여 새로 image를 만드는 형태이다.

jenkins의 경우만 아래와 같이 docker image를 빌드하는 명령을 선행 수행한 후 해당 image로 kubernetes pod를  사용한다.

docker pull jenkins/jenkins:jdk11
docker build -f jenkins-Dockerfile --tag luversof/jenkins .
kubectl apply -f jenkins.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: elasticsearch-deployment
labels:
app: elasticsearch
spec:
replicas: 1
selector:
matchLabels:
app: elasticsearch
template:
metadata:
labels:
app: elasticsearch
spec:
containers:
- name: elasticsearch
image: elasticsearch:8.4.3
env:
- name: discovery.type
value: "single-node"
ports:
- containerPort: 9200
- containerPort: 9300
---
apiVersion: v1
kind: Service
metadata:
name: elasticsearch-service
spec:
selector:
app: elasticsearch
ports:
- protocol: TCP
name: kibana-port
port: 9200
targetPort: 9200
- protocol: TCP
name: kibana-port2
port: 9300
targetPort: 9300
type: LoadBalancer
FROM jenkins/jenkins:jdk11
MAINTAINER bluesky <luversof@hanmail.net>
USER root
RUN curl -fsSL https://get.docker.com -o get-docker.sh \
&& sh get-docker.sh
RUN usermod -aG docker jenkins
USER jenkins
docker pull jenkins/jenkins:jdk11
docker build -f jenkins-Dockerfile --tag luversof/jenkins .
kubectl delete pods -l app=jenkins
view raw jenkins.bat hosted with ❤ by GitHub
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins-deployment
labels:
app: jenkins
spec:
replicas: 1
selector:
matchLabels:
app: jenkins
template:
metadata:
labels:
app: jenkins
spec:
containers:
- name: jenkins
image: luversof/jenkins:latest
imagePullPolicy: Never
ports:
- containerPort: 8080
- containerPort: 50000
env:
- name: JAVA_OPTS
value: "-Duser.timezone=Asia/Seoul"
volumeMounts:
- name: jenkins-docker-sock
mountPath: /var/run/docker.sock
# - name: jenkins-docker
# mountPath: /root/.docker
- name: jenkins-home
mountPath: /var/jenkins_home
- name: jenkins-m2
mountPath: /root/.m2
# 절대 권장하지 않는 방식임
securityContext:
privileged: true
# allowPrivilegeEscalation: false
runAsUser: 0
volumes:
- name: jenkins-docker-sock
hostPath:
path: /var/run/docker.sock
# - name: jenkins-docker
# hostPath:
# path: /mnt/c/data/jenkins-docker
- name: jenkins-home
hostPath:
# path: /mnt/c/data/jenkins-home
path: /mnt/f/dev/data/jenkins-home
- name: jenkins-m2
hostPath:
# path: /mnt/c/data/jenkins-m2
path: /mnt/f/dev/data/jenkins-m2
# imagePullSecrets:
# - name: bluesky-secret
---
apiVersion: v1
kind: Service
metadata:
name: jenkins-service
spec:
selector:
app: jenkins
ports:
- protocol: TCP
name: jenkins-port
port: 8080
targetPort: 8080
- protocol: TCP
name: jenkins-slave-agent-port
port: 50000
targetPort: 50000
type: LoadBalancer
view raw jenkins.yaml hosted with ❤ by GitHub
# https://www.magalix.com/blog/kafka-on-kubernetes-and-deploying-best-practice
kind: Deployment
apiVersion: apps/v1
metadata:
name: zookeeper-deploy
spec:
replicas: 1
selector:
matchLabels:
app: zookeeper-1
template:
metadata:
labels:
app: zookeeper-1
spec:
containers:
- name: zoo1
image: digitalwonderland/zookeeper
ports:
- containerPort: 2181
env:
- name: ZOOKEEPER_ID
value: "1"
- name: ZOOKEEPER_SERVER_1
value: zoo1
---
apiVersion: v1
kind: Service
metadata:
name: zoo1
labels:
app: zookeeper-1
spec:
ports:
- name: client
port: 2181
protocol: TCP
- name: follower
port: 2888
protocol: TCP
- name: leader
port: 3888
protocol: TCP
selector:
app: zookeeper-1
---
apiVersion: v1
kind: Service
metadata:
name: kafka-service
labels:
name: kafka
spec:
ports:
- port: 9092
name: kafka-port
protocol: TCP
selector:
app: kafka
id: "0"
type: LoadBalancer
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: kafka-broker0
spec:
replicas: 1
selector:
matchLabels:
app: kafka
id: "0"
template:
metadata:
labels:
app: kafka
id: "0"
spec:
containers:
- name: kafka
image: wurstmeister/kafka
ports:
- containerPort: 9092
env:
- name: KAFKA_ADVERTISED_PORT
value: "9092"
- name: KAFKA_ADVERTISED_HOST_NAME
value: 127.0.0.1
- name: KAFKA_ZOOKEEPER_CONNECT
value: zoo1:2181
- name: KAFKA_BROKER_ID
value: "0"
- name: KAFKA_CREATE_TOPICS
value: admintome-test:1:1
view raw kafka.yaml hosted with ❤ by GitHub
apiVersion: apps/v1
kind: Deployment
metadata:
name: kibana-deployment
labels:
app: kibana
spec:
replicas: 1
selector:
matchLabels:
app: kibana
template:
metadata:
labels:
app: kibana
spec:
containers:
- name: kibana
image: kibana:8.4.3
ports:
- containerPort: 5601
---
apiVersion: v1
kind: Service
metadata:
name: kibana-service
spec:
selector:
app: kibana
ports:
- protocol: TCP
name: kibana-port
port: 5601
targetPort: 5601
type: LoadBalancer
view raw kibana.yaml hosted with ❤ by GitHub
apiVersion: apps/v1
kind: Deployment
metadata:
name: sonarqube-deployment
labels:
app: sonarqube
spec:
replicas: 1
selector:
matchLabels:
app: sonarqube
template:
metadata:
labels:
app: sonarqube
spec:
containers:
- name: sonarqube
image: sonarqube
ports:
- containerPort: 9000
env:
- name: SONAR_JDBC_URL
value: "jdbc:sqlserver://mssql-service;databaseName=sonarqube;encrypt=false"
- name: SONAR_JDBC_USERNAME
value: "sa"
- name: SONAR_JDBC_PASSWORD
value: "testPassword!"
volumeMounts:
- name: sonarqube-data
mountPath: /opt/sonarqube/data
- name: sonarqube-extensions
mountPath: /opt/sonarqube/extensions
- name: sonarqube-logs
mountPath: /opt/sonarqube/logs
volumes:
- name: sonarqube-data
hostPath:
path: /mnt/f/dev/data/sonarqube-data
- name: sonarqube-extensions
hostPath:
path: /mnt/f/dev/data/sonarqube-extensions
- name: sonarqube-logs
hostPath:
path: /mnt/f/dev/data/sonarqube-logs
---
apiVersion: v1
kind: Service
metadata:
name: sonarqube-service
spec:
selector:
app: sonarqube
ports:
- protocol: TCP
name: sonarqube-port
port: 9000
targetPort: 9000
type: LoadBalancer
view raw sonarqube.yaml hosted with ❤ by GitHub
apiVersion: apps/v1
kind: Deployment
metadata:
name: zeppelin-deployment
labels:
app: zeppelin
spec:
replicas: 1
selector:
matchLabels:
app: zeppelin
template:
metadata:
labels:
app: zeppelin
spec:
containers:
- name: zeppelin
image: apache/zeppelin:0.9.0
ports:
- containerPort: 8080
volumeMounts:
- name: zeppelin-notebook
mountPath: /opt/zeppelin/notebook
volumes:
- name: zeppelin-notebook
hostPath:
path: /mnt/f/dev/data/zeppelin-notebook
---
apiVersion: v1
kind: Service
metadata:
name: zeppelin-service
spec:
selector:
app: zeppelin
ports:
- protocol: TCP
port: 8085
targetPort: 8080
type: LoadBalancer
view raw zeppelin.yaml hosted with ❤ by GitHub

반응형