上個月底, 由於一些迷之原因我從扇貝跑路了 又過回了大學那會養生的日子,有空來搗鼓一些奇奇怪怪的東西。 最近在研究k3s,最終目標是將自己的一些項目遷移上去 這裡開始準備寫一系列的文章來記錄一下整個過程
上個月底, 由於一些迷之原因我從扇貝跑路了
Lightweight Kubernetes. 5 less than k8s
先簡單解釋一下啥是k8s
k8s是容器編排系統 說的再直白一點: k8s可以管理不同機子上的docker
k8s是容器編排系統
說的再直白一點:
現在各廠都在像容器化的方向發展
作為個人開發者當然也想用類似的工具
但k8s集群的部署要求太高了(因為要跑etcd)而不得不放棄
一個小型k8s集群master節點的推薦配置是 2c 8g !!
今年2月26日Rancher發布了k3s 那時我就知道,有戲了!
k3s其實是k8s的一個超輕量的髮型版 輕量到啥地步呢?
k3s打包後只有一個40mb大小的二進位包
運行k3s server只需要200m左右的ram
這樣看來一台1c1g的vps就能愉快的跑起來了
1c1g的vps
我還發現有國外老哥用k3s組了一個樹莓派集群
效果大概是這樣的:
由於k3s目前不支持mac 所以我找了一台1c1g的vultr家的vps來當master node 如果你也想要買一台來練練手 這裡有個推廣鏈接 註冊沖5刀可送50刀: 註冊地址
由於k3s目前不支持mac
curl -sfL https://get.k3s.io | sh -
這樣一個單節點的k3s服務就跑起來了
安裝kubectl :brew install kubectl
brew install kubectl
配置集群證書:
將vps上的 /etc/rancher/k3s/k3s.yaml 的內容
/etc/rancher/k3s/k3s.yaml
寫入本機的~/.kube/config文件
~/.kube/config
試一下: kubectl get node
kubectl get node
可以看到這台節點已經成功跑起來了(ready)
一般都會跑個helloworld之類的app來試一下效果
helloworld
我覺得這樣太沒意思啦,我們來跑個能用的比如 v2ray
v2ray
kind: Namespace apiVersion: v1 metadata: name: playground labels: name: playground
拷貝以上文件為ns-playgroud.yml
ns-playgroud.yml
在文件對應的目錄運行: kubectl apply -f ns-playground.yml
kubectl apply -f ns-playground.yml
這樣我們就有一個名為playground的namespce了
playground
運行 kubectl get ns 可以查看所有的namespace
kubectl get ns
configmap
apiVersion: v1 kind: ConfigMap metadata: name: v2ray-config-file namespace: playground labels: k8s-app: v2ray data: config.json: |- { "stats": {}, "api": { "tag": "api", "services": [ "StatsService" ] }, "policy": { "levels": { "0": { "statsUserUplink": true, "statsUserDownlink": true } }, "system": { "statsInboundUplink": true, "statsInboundDownlink": true } }, "log": { "access": "/dev/stdout", "error": "/dev/stderr", "loglevel": "info" }, "inbound": { "port": 8002, "tag": "statin", "protocol": "vmess", "settings": { "clients": [ { "id": "11111111-2222-3333-4444-555555555555", "level": 1, "alterId": 16, "email": "[email protected]" } ] } }, "inboundDetour": [ { "listen": "127.0.0.1", "port": 6000, "protocol": "dokodemo-door", "settings": { "address": "127.0.0.1" }, "tag": "api" } ], "outbound": { "protocol": "freedom", "settings": {} }, "routing": { "strategy": "rules", "settings": { "rules": [ { "inboundTag": [ "api" ], "outboundTag": "api", "type": "field" } ] } } }
拷貝以上文件為cm-v2ray.yml
cm-v2ray.yml
在文件對應的目錄運行: kubectl apply -f cm-v2ray.yml -n playground
kubectl apply -f cm-v2ray.yml -n playground
這樣v2ray的配置文件就作為一種資源被存在k3s里了
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: v2ray-vu namespace: playground spec: replicas: 1 selector: matchLabels: app: v2ray-vu strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: labels: app: v2ray-vu spec: containers: - name: app image: v2ray/official imagePullPolicy: IfNotPresent ports: - containerPort: 8002 resources: limits: cpu: 200m memory: 200Mi requests: cpu: 100m memory: 100Mi volumeMounts: - name: v2ray-config-file mountPath: "/etc/v2ray" readOnly: true volumes: - name: v2ray-config-file configMap: name: v2ray-config-file
這裡用了我們剛創建的configmap :v2ray-config-file
v2ray-config-file
並將其掛載到容器的/etc/v2ray目錄下
/etc/v2ray
這樣v2ray跑起來的時候就能讀取到準備的配置了
拷貝以上文件為dp-v2ray.yml
dp-v2ray.yml
在文件對應的目錄運行: kubectl apply -f dp-v2ray.yml -n playground playground
kubectl apply -f dp-v2ray.yml -n playground playground
看一下服務有沒有跑起來: kubectl get pod -n playground
kubectl get pod -n playground
可以看到v2ray已經處於running狀態了
running
kind: Service apiVersion: v1 metadata: name: v2ray-vu namespace: playground spec: selector: app: v2ray-vu ports: - port: 8002 targetPort: 8002 externalIPs: - xx.xx.xx.xx
注意配置里的externalIPs 需要替換成你自己vps的ip
externalIPs
拷貝以上文件為svc-v2ray.yml
svc-v2ray.yml
在文件對應的目錄運行: kubectl apply -f svc-v2ray.yml -n playground playground
kubectl apply -f svc-v2ray.yml -n playground playground
這樣我們就將v2ray的服務暴露在節點的8002埠
所有從8002埠流量都會被轉發到v2ray的pod里
查看訪問日誌 : kubectl logs -f podname -n playground
kubectl logs -f podname -n playground
podname 可以通過之前的get pod 命令獲得
get pod
測個速度看看:
效果不錯,打完收工!
這篇文章還是會發在爬蟲的專欄下
如果這篇文章反響好的話 我可能會再開一個伺服器/雲相關的專欄
伺服器/雲
哪位大佬給取個名字唄?
推薦閱讀: