上個月底, 由於一些迷之原因我從扇貝跑路了

又過回了大學那會養生的日子,有空來搗鼓一些奇奇怪怪的東西。 最近在研究k3s,最終目標是將自己的一些項目遷移上去 這裡開始準備寫一系列的文章來記錄一下整個過程

什麼是k3s?

Lightweight Kubernetes. 5 less than k8s

先簡單解釋一下啥是k8s

k8s是容器編排系統

說的再直白一點:

k8s可以管理不同機子上的docker

現在各廠都在像容器化的方向發展

作為個人開發者當然也想用類似的工具

但k8s集群的部署要求太高了(因為要跑etcd)而不得不放棄

一個小型k8s集群master節點的推薦配置是 2c 8g !!

今年2月26日Rancher發布了k3s 那時我就知道,有戲了!

k3s其實是k8s的一個超輕量的髮型版 輕量到啥地步呢?

k3s打包後只有一個40mb大小的二進位包

運行k3s server只需要200m左右的ram

這樣看來一台1c1g的vps就能愉快的跑起來了

我還發現有國外老哥用k3s組了一個樹莓派集群

效果大概是這樣的:

先跑起來

由於k3s目前不支持mac

所以我找了一台1c1g的vultr家的vps來當master node 如果你也想要買一台來練練手 這裡有個推廣鏈接 註冊沖5刀可送50刀: 註冊地址
  • 可以通過官網的一鍵安裝腳本來安裝

curl -sfL https://get.k3s.io | sh -

這樣一個單節點的k3s服務就跑起來了

  • 在本機訪問k3s集群

安裝kubectl brew install kubectl

配置集群證書:

將vps上的 /etc/rancher/k3s/k3s.yaml 的內容

寫入本機的~/.kube/config文件

試一下: kubectl get node

可以看到這台節點已經成功跑起來了(ready)

再跑個應用

一般都會跑個helloworld之類的app來試一下效果

我覺得這樣太沒意思啦,我們來跑個能用的比如 v2ray

起一個namepace

kind: Namespace
apiVersion: v1
metadata:
name: playground
labels:
name: playground

拷貝以上文件為ns-playgroud.yml

在文件對應的目錄運行: kubectl apply -f ns-playground.yml

這樣我們就有一個名為playground的namespce了

運行 kubectl get ns 可以查看所有的namespace

起一個configmap 來存v2ray的配置文件

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

在文件對應的目錄運行: kubectl apply -f cm-v2ray.yml -n playground

這樣v2ray的配置文件就作為一種資源被存在k3s里了

起一個deployment來跑v2ray

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

並將其掛載到容器的/etc/v2ray目錄下

這樣v2ray跑起來的時候就能讀取到準備的配置了

拷貝以上文件為dp-v2ray.yml

在文件對應的目錄運行: kubectl apply -f dp-v2ray.yml -n playground playground

看一下服務有沒有跑起來: kubectl get pod -n playground

可以看到v2ray已經處於running狀態了

起一個service來暴露v2ray的服務

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

拷貝以上文件為svc-v2ray.yml

在文件對應的目錄運行: kubectl apply -f svc-v2ray.yml -n playground playground

這樣我們就將v2ray的服務暴露在節點的8002

所有從8002埠流量都會被轉發到v2ray的pod

看一下效果

查看訪問日誌 : kubectl logs -f podname -n playground

podname 可以通過之前的get pod 命令獲得

測個速度看看:

效果不錯,打完收工!

最後

這篇文章還是會發在爬蟲的專欄下

如果這篇文章反響好的話 我可能會再開一個伺服器/雲相關的專欄

哪位大佬給取個名字唄?

推薦閱讀:

相关文章