簡單打造GKE上的世界級節點

Michael.K@CloudNativeForum

關於我

Michael.K

  • About My Job:
    • I.X Security (大宏數創意)
    • YSDT, Inc (遠時數位科技)
    • Hiiir, Inc (時間軸科技)
  • Conference
    • COSCUP
    • SITCON
    • DevFest

開始之前

早期的作法 - CDN

CDN 造成的問題

  • 頁面無法即時更新
  • 請求響應時間太長(no cache)

何謂「世界級」

你的節點遍佈全球

之前的Kubernetes

只有「區域」、「分區」

造成的問題

  • 區域性的災害問題
  • 服務多個地區不好規劃(resources)

sig-multicluster

  • federation-v1
  • federation-v2
  • cloud-registry
  • kubemci

Kubernetes Federation

簡稱 kubefed

一般叫做Federation v1

什麼是kubefed

  • 由多個群集串連而成
  • 區域災難的時候可以由其他地區備援
  • 高度可用性

kubefed component

  • federation-apiserver
  • federation-controller-manager
  • kubefed

將原本node的角色替換為cluster

安裝kubefed

go get -u github.com/kubernetes/federation/cmd/kubefed

設定驗證 (1/2)

kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=client

設定驗證 (2/2)

gcloud config set container/use_client_certificate True
export CLOUDSDK_CONTAINER_USE_CLIENT_CERTIFICATE=True

初始化kubefed plane

kubefed init k8s-fed \
   --host-cluster-context={cluster}\
   --dns-zone-name={domain} 

   --dns-provider=googlecloud-dns

加入節點

kubefed join cluster1 \
  --host-cluster-context={host}

建立namespace

kubectl create ns default

kubefed伴隨而來的問題 (1/2)

  • 技術上還不成熟
  • 網路成本過高
  • 支援程度問題
  • 資源間容易互相影響
  • 新版的GKE暫時可能無法使用

kubefed伴隨而來的問題 (2/2)

檢視kubefed帶來的缺陷

  • 資源由單一節點掌握(Federation Master)
  • 官方也不建議用Federation v1 (請等二代)

Federation主要是Stateless

換個思路

或許都是master會比較好

multi-cluster ingress

什麼是kubemci (1/2)

  • 可以將不同ingress的流量直接導到對應地區
  • 省下不同Cluster間的網路交換流量
  • 是Federated Ingress(v2) 候選的其中一環
  • 將會加入kubectl beta function
  • 彈性更多
  • 由golang編寫而成

什麼是kubemci (2/2)

  • more easier to use
  • more robust
  • no federation server required

安裝kubemci

go get -u github.com/GoogleCloudPlatform/k8s-multicluster-ingress/cmd/kubemci

kubemci create {multi-ingress name} \
    --ingress={ingress yaml} \
    --kubeconfig=$HOME/.kube/conf

建立kubemci

常見的雷

  • Service必須要指定nodePort
  • 必須要透過application-default登入

One More Thing

kubemci還是太繁瑣了

Kubernetes Federation Control

簡稱kubefctl

kubefctl

  • 更加k8s style
  • 完全乾淨的gcloud / kubectl / kubemci
  • 一秒鐘就上手
  • node.js command tool (yargs)
  • MIT License

安裝簡單

yarn global add kubefctl

另外安裝

  • gcloud
  • kubemci
  • kubectl

建立設定檔

kubefctl clusters create credential k8s \

  -c k8s-cluster1,asia-east1-a \

  -c k8s-cluster2,us-west1-a

As simple as possible

# zoneprinter-deployment.yml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: zoneprinter
  labels:
    app: zoneprinter
spec:
  selector:
    matchLabels:
      app: zoneprinter
  template:
    metadata:
      labels:
        app: zoneprinter
    spec:
      containers:
      - name: frontend
        image: gcr.io/google-samples/zone-printer:0.1
        ports:
          - containerPort: 80
# zoneprinter-service.yml
apiVersion: v1
kind: Service
metadata:
  name: zoneprinter
  labels:
    app: zoneprinter
spec:
  type: NodePort
  selector:
    app: zoneprinter
  ports:
  - name: http
    port: 80
    nodePort: 30061
# zoneprinter-ingress.yml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: zoneprinter
  annotations:
    kubernetes.io/ingress.class: gce-multi-cluster
    kubernetes.io/ingress.global-static-ip-name: test-ip-address
spec:
  backend:
    serviceName: zoneprinter
    servicePort: 80

kubefctl apply -f zoneprinter-deployment.yml

kubefctl apply -f zoneprinter-service.yml

kubefctl apply -f zoneprinter-ingress.yml

用法跟kubectl一模一樣

kubefctl的未解決問題

  • 管理資源跟kubectl重複
  • ACID transaction
  • 設定搬移問題(migrate setting)

歡迎PR / Star / Watch

感謝各位

簡報網址