簡單打造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
感謝各位
簡報網址
簡單打造GKE上的世界級節點
By Calvin Huang
簡單打造GKE上的世界級節點
- 881