توی این قسمت میریم به سراغ اینکه بررسی کنیم چطوری میتونیم یه اپلیکیشن رو روی کلاستر کوبرنتیزمون دیپلوی کنیم و بالا بیاریم:
یه پروژه خیلی خوبی که من معمولا تو سمپلهایی که موقع آموزش برای بچهها میزنم ازش استفاده میکنم پروژه voting-app هست.
apiVersion: v1
kind: Service
metadata:
labels:
app: db
name: db
spec:
type: ClusterIP
ports:
- name: "db-service"
port: 5432
targetPort: 5432
selector:
app: db
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: db-pvc
labels:
app: db
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: local-path
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: db
name: db
spec:
replicas: 1
selector:
matchLabels:
app: db
template:
metadata:
labels:
app: db
spec:
containers:
- image: postgres:15-alpine
name: postgres
env:
- name: POSTGRES_USER
value: postgres
- name: POSTGRES_PASSWORD
value: postgres
ports:
- containerPort: 5432
name: postgres
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: db-data
volumes:
- name: db-data
persistentVolumeClaim:
claimName: db-pvc
---
قسمت بعدی سرویسی هست که میخوایم این پاد پستگرس رو بندازیم پشتش و از طریق اون به بقیه پادهای سرویسمون دسترسی دیتابیس رو بدیم. منطقا این سرویس باید از نوع ClusterIP باشه چونکه برای دسترسیهای داخل کلاستر میخوایم ازش استفاده کنیم. در قسمت port پورت مربوط به سرویس رو تعریف میکنیم و در قسمت تارگتپورت هم پورت مربوط به اون پاد که داره روی اون پورت سرویس میده. اگه در مورد مفاهیم نتورکی هم دوست دارید بیشتر بدونید میتونید این بلاگ پست رو بخونید.
apiVersion: v1
kind: Service
metadata:
labels:
app: redis
name: redis
spec:
type: ClusterIP
ports:
- name: "redis-service"
port: 6379
targetPort: 6379
selector:
app: redis
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redis-pvc
labels:
app: redis
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: local-path
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: redis
name: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- image: redis:alpine
name: redis
ports:
- containerPort: 6379
name: redis
volumeMounts:
- mountPath: /data
name: redis-data
volumes:
- name: redis-data
persistentVolumeClaim:
claimName: redis-pvc
بعد از اینکه مانیفست دیتابیس رو به کلاستر اضافه کردیم میریم سراغ مانیفست سرویس redis، همونطور که میدونید فایل های مانیفست رو با دستور kubectl apply -f file-name.yml میتونیم به کلاستر اپلای کنیم و این ریسورسها رو اضافه کنیم. خب بریم مانیفست ردیس رو بررسی کنیم ابتدا از پایین یه deployment داریم که با رپلیکای یک، یک پاد ردیس رو از روی ایمیج redis:alpine میاره بالا که روی پورت ۶۳۷۹ سرویس میده و والیوم redis-data به اون مانت شده که از طریق pvc ساخته میشه. ریسورس بعدی همین pvc هست که مثل دیتابیس از استورج کلاس local-path با حجم یک گیگ اونو میسازیم و همچنین با دسترسی خواندن و نوشتن.
apiVersion: v1
kind: Secret
metadata:
name: registry-login
type: kubernetes.io/basic-auth
data:
username: a3ViZQ==
password: QW5JcXlpajFEWWw3cmU2WHRJaHY5R3JLYVBnMURYQXRNTTh1TkF1dQ==
# base64
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: worker
name: worker
spec:
replicas: 1
selector:
matchLabels:
app: worker
template:
metadata:
labels:
app: worker
spec:
imagePullSecrets:
- name: registry-login
containers:
- image: registry.mecan.ir/devops_certification/kubernetes/voting-app/worker:v0.1.0
name: worker
apiVersion: v1
kind: Service
metadata:
labels:
app: vote
name: vote
spec:
type: NodePort
ports:
- name: "vote-service"
port: 8080
targetPort: 80
nodePort: 31000
selector:
app: vote
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: vote
name: vote
spec:
replicas: 1
selector:
matchLabels:
app: vote
template:
metadata:
labels:
app: vote
spec:
imagePullSecrets:
- name: registry-login
containers:
- image: registry.mecan.ir/devops_certification/kubernetes/voting-app/vote:v0.1.0
name: vote
ports:
- containerPort: 80
name: vote
apiVersion: v1
kind: Service
metadata:
labels:
app: result
name: result
spec:
type: NodePort
ports:
- name: "result-service"
port: 8081
targetPort: 80
nodePort: 31001
selector:
app: result
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: result
name: result
spec:
replicas: 1
selector:
matchLabels:
app: result
template:
metadata:
labels:
app: result
spec:
imagePullSecrets:
- name: registry-login
containers:
- image: registry.mecan.ir/devops_certification/kubernetes/voting-app/result:v0.1.0
name: result
ports:
- containerPort: 80
name: result
خودکارش کن,مشکلاتت حل میشه در اینجا در مورد اتومیشن و اینکه انسیبل چیه و چه کمکی به ما میکنه صحبت کردم.
در مسیر دواپس اینبار اجزای اصلی انسیبل تو این پست اجزای انسیبل رو معرفی کردم و آنها را شرح دادم.
در مسیر دواپس به داکر رسیدیم (قسمت اول) تو این پست داکر رو شروع کردیم و اونو معرفی کردیم.
در مسیر دواپس اینبار: پشت داکر چه خبره؟ (قسمت دوم) توی این پست در مورد تکنولوژی هایی که داکر ازشون استفاده میکنه توضیح دادیم.
تست نوشتن و شروع مسیر CI/CD (قسمت اول) توی این پست انواع تست رو بررسی کردیم و با ابزارهای CI/CD آشنا شدیم و یه مقایسه بین گیتلب و جنکینز داشتیم.


