之前已經把博客部署到docker中了,這次是要通過k8s部署。
k8s官方文檔使用的kubeadm
,配置需求比較高,我的破虛擬機達不到要求,於是試都沒試,而找到了這個輕量級的k3s。
cluster環境搭建
最開始是直接下載的release鏡像包,不過不好管理,后來使用了git倉庫的安裝腳本進行安裝。
注:
k3s安裝好后,應該是k8s本身的一些配置原因,我的80端口被莫名的轉發了,之前docker部署的博客也不能訪問,一直提示404 page not found
,原因不明。
博客配置
比起docker啟動時,指定配置選項,k8s通過yaml配置文件指定這些選項,對我來說,主要是文件系統的掛載。
k8s整個生態還是比較復雜的,我這里使用了比較簡單的形式。
Deployment
- 應用增加
app=myblog
的label,供后面service 引用 - 把數據文件、數據庫和日志目錄,通過hostPath掛載出來
- 這里沒有用localhost,因為hostPath不需要預先創建,比較簡單
- replicas 僅有一個
apiVersion: apps/v1
kind: Deployment
metadata:
name: myblog-deployment
labels:
app: myblog
spec:
replicas: 1
selector:
matchLabels:
app: myblog
template:
metadata:
labels:
app: myblog
spec:
containers:
- name: myblog
image: mosakashaka/blog:latest
volumeMounts:
- name: blog-data
mountPath: /app/wwwroot/data
- name: blog-db
mountPath: /data
- name: blog-log
mountPath: /app/Logs
volumes:
- name: blog-data
hostPath:
# directory location on host
path: /root/sync/BlogDatabase/blogdata
# this field is optional
type: Directory
- name: blog-db
hostPath:
# directory location on host
path: /root/sync/BlogDatabase/blogdb
# this field is optional
type: Directory
- name: blog-log
hostPath:
# directory location on host
path: /root/kube/bloglog
# this field is optional
type: Directory
Service
這里選擇通過Ingress來使能外界訪問,所以需要一個Service,map 80端口即可。
apiVersion: v1
kind: Service
metadata:
name: myblog-service
spec:
selector:
app: myblog
ports:
- protocol: TCP
port: 80
targetPort: 80
Ingress
通過NodePort或者LoadBalancer也可以達到這個目的,不過Ingress在有Ingress Controller
的情況下,似乎是我所了解的最簡單的方式。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: myblog-ingress
spec:
backend:
serviceName: myblog-service
servicePort: 80
啟動運行
將以上三個文件存儲為yaml格式放在一個目錄中,如blog
,在父目錄中執行
kubectl apply -f myblog
即可啟動。
遺留問題
- 80端口被k3s的哪個服務所占用/攔截?
- 其他方式的網絡配置