2024年的第一週就讓我驚嚇~去年才PO文說到Okteto可以免費託管k8s服務,結果不到半年,就公告此免費服務只提供到2024/1/15。挖哩勒,接受到通知後能把服務移出只有短短的兩週。以下分享一下後來是移轉到哪一家k8s的託管服務商,並使用心得。

其實去年在使用Okteto就感覺怕怕的,沒想到來的那麼快,💰那麼快就燒完了。當初我就覺得它的SaaS服務怎麼藏得那麼深。並且服務限縮越來越大。其實心裡早就盤算這天會到來,只是讓我驚嚇的。是我收到公告到我能移出服務只有兩週,只好趕快尋找一家合適的服務商搬遷摟。


我想大家應該都聽過三大雲服務商(GCP, Azure, AWS)
但老子就是窮,用不起這些大型雲端服務商。 於是就往這三家間小服務做選擇:Digital Ocean, Linode, Vultr。
不拖泥帶水,直接說後來我選的是Vultr,簡單的說一下後來為什麼選擇Vultr

  • 價錢方面:它可選更便宜node (5$/node),因為不是選VM,若以後資源不夠再多買幾個node就好了。
  • 機房位子:它可選擇的機房有日本。
  • 使用者介面:因為以前就使用過,雖介面陽春,但簡潔易懂。

其實本來想說藉這機會用用看Digital Ocean,但最後是因為官網價錢說明的不是很清楚,且要重新註冊…Vultr之前2016年就買過他們家VM服務,2020推出了k8s託管服務,想說再給他們一次機會,再加上時間壓力。於是,就馬上儲值試用看看。搬過去之前,我要再三提醒。請勿務必瞭解k8s的使用喔。因為它跟Okteto差異是非常大的喔。以下先說明一下前置作業。

Prework 1:
下載KubeConfig:
Products > Kubernetes > 點選你的cluster > Download Configuration

Prework 2:
匯入至你的.kube目錄並export:

mv vke-xxx-xxx-xxx.yaml ~/.kube/configs
export KUBECONFIG=~/.kube/config$(find ~/.kube/configs -type f 2>/dev/null | xargs -I % echo -n ":%")
kubectl get nodes //測試看看可以不可看到nodes

以上大致完成前置作業。接下來就是搬移的主要步驟了。


STEP 1:
安裝nginx ingress

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install ingress-nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --create-namespace

STEP 2:
安裝cert manager

helm repo add jetstack https://charts.jetstack.io
helm install \                                                                                                                                  ─╯
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --version v1.13.3 \
  --set installCRDs=true

STEP 3:
部署服務
將你的服務打包成Container,並部署至k8s。以下用nginx為範例。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world
  namespace: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello-world
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
        - name: hello-world
          image: nginx:1.14.2
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: hello-world
  namespace: test
spec:
  ports:
    - name: http
      port: 80
      targetPort: 80
  selector:
    app: hello-world
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-hello-world
  namespace: test
spec:
  ingressClassName: nginx
  rules:
    - host: test.shawnyin.com
      http:
        paths:
          - pathType: Prefix
            path: "/"
            backend:
              service:
                name: hello-world
                port:
                  number: 80

這邊你可以看到我們使用了Ingress來露出服務給外部使用,當你這樣使用服務商會自動幫你建置一個外部的Load Balancer,並長出一個對外IP。記得這服務是另為收費的喔,一個instance一個月是$10。後續的domain就是用這IP來對映。

kubectl get svc -n ingress-nginx 
NAME                                 TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.100.43.213   XXX.XXX.XXX.XXX   80:31583/TCP,443:30099/TCP   4d17h

以上那個EXTERNAL-IP就是對外IP,請把它記下來。

SETP 4:
設定Domain 這時候請到你的域名服務商去設定對應的IP,我這邊是使用CloudFlare託管DNS。新增一個A Record,Name就是你的subdomain name,Content就是你的IP位址。設定大致如下圖:
(CloudFlare設定重點,記得使用DNS only,如果用Proxy模式Vultr還需要設定防火牆)
設定完後你可以用Domain name去打打看,看能不能連到nginx首頁。如果有出現下圖那就恭喜你成功了!

SETP 5:
設定SSL
這邊使用Cert manager + CloudFlare,可以參考官網文件說明,在此簡單說明。先去CloudFlare新增一組API Token。權限設置如下圖:
在k8s cluster中新增一個Secret來存放剛剛新增的token。

kubectl create secret generic cloudflare-api-token-secret --from-literal=api-token=XXXX -n cert-manager

設定Cert manager的ClusterIssuer和Certificate

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-dns01
  namespace: cert-manager
spec:
  acme:
    privateKeySecretRef:
      name: letsencrypt-dns01
    server: https://acme-v02.api.letsencrypt.org/directory
    solvers:
      - dns01:
          cloudflare:
            email: [email protected]
            apiTokenSecretRef:
              key: api-token
              name: cloudflare-api-token-secret
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: wildcard-todoit-tech
  namespace: cert-manager
spec:
  dnsNames:
    - "*.shawnyin.com"
  issuerRef:
    kind: ClusterIssuer
    name: letsencrypt-dns01
  secretName: wildcard-letsencrypt-tls

改一下之前部署的ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-hello-world
  namespace: test
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-dns01
spec:
  ingressClassName: nginx
  tls:
    - hosts:
        - test.shawnyin.com
      secretName: test-letsencrypt-tls
  rules:
    - host: test.shawnyin.com
      http:
        paths:
          - pathType: Prefix
            path: "/"
            backend:
              service:
                name: hello-world
                port:
                  number: 80

測試一下SSL是否Vaild

kubectl get certificate -w -A

等待一下。如果Ready是TRUE那就表示SSL憑證簽署成功。你可以在連到nginx的首頁,就會發現已經有https摟~

我想先說到這裡,其實還又很多眉眉角角(打包服務上傳至Private Container Registry等等…),以後有機會再跟大家分享,這邊總結一下使用心得:

先說優點:

  • 簡單易用,基本上只要熟悉k8s就沒問題
  • 費用算是便宜

最後說說缺點:

  • 服務商名字不會念,難以記憶…是在搞人嗎?
  • Node的使用率不明確,用k9s不能監控,只能進到vm裡面去看,有可能被糊弄
  • 許多官方文件說明不清,並且破圖一堆…
  • 老客戶盡然沒有任何優惠(拜託使用者黏性要顧啊)

小小總結,以後真的有機會還是想試試Digital Ocean

若是我的分享對你有幫助,你也想試用看看Vultr,可以使用我的推薦連結試用,新用戶還有許多優惠喔~