[GTG30] Introduce vgo
放上這次再 GTG (Golang Taipei Gathering 30)聚會的投影片,主要是介紹可能會放入 go 1.11 的新功能 vgo
放上這次再 GTG (Golang Taipei Gathering 30)聚會的投影片,主要是介紹可能會放入 go 1.11 的新功能 vgo

If you want to enable GPU resource in Kubernetes and want Kubelet to allocate it. You need config it as following ways:
feature-gates=Accelerators=truefeature-gates=DevicePlugins=trueUsing kubectl command kubectl get node YOUR_NODE_NAME -o json to export all node info as json format. You should see something like:
## If you use Kubernetes Accelerator after 1.7
"allocatable": {
"cpu": "32",
"memory": "263933300Ki",
"alpha.kubernetes.io/nvidia-gpu": "4",
"pods": "110"
},
Detail defined in k8s.io/api/core/v1/types.go
## If you use Kubernetes Device Plugin after 1.9
"allocatable": {
"cpu": "32",
"memory": "263933300Ki",
"nvidia.com/gpu": "4",
"pods": "110"
}, ## Reference:

在使用 Kubernetes 的時候,可以選擇透過 Job 的方式來跑一次性的工作.但是如果希望你的工作在特定時間內一定得結束來釋放資源, 就得透過這個方式.
最近在研究這個的時候,發現有些使用上的小技巧,紀錄一下.
If you want to force to terminate your kubernetes jobs if it exceed specific time. (e.g.: run a job no longer than 2 mins).
In this case you can use a watcher to monitor this Kubernetes jobs and terminate it if exceed specific time. Or you can refer K8S Doc:”Job Termination and Cleanup” use activeDeadlineSeconds to force terminare your jobs.
activeDeadlineSeconds:It is very easy to setup activeDeadlineSeconds in spec.
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
backoffLimit: 5
activeDeadlineSeconds: 100
template:
spec:
containers:
- name: myjob
image: busybox
command: ["sleep", "300"]
restartPolicy: Never
In this example, this job will be terminated after 100 seconds (if it works well :p )
activeDeadlineSeconds, you will need delete job before you run the same job again.activeDeadlineSecondsactiveDeadlineSeconds works again. (suggest add specific tag in postfix of job name)
由於之前”台北開放資料”中的流浪動物資料忽然無法連上,造成之前寫的 Line Bot: 台北流浪動物需要你” 無法正常運作. 只好去找找政府的資料,”動物認領養” 開放資料. (https://data.gov.tw/dataset/9842#r0)
修改好了,希望大家繼續愛用. 如果有過年需要人陪的,可以玩玩看,年後去領養可愛的小毛球家人.
簡單說明:

最近比較忙碌,都只能夜深人靜才能好好的來閱讀一些文章來充實自己.(公司牛人多到像牧場,只好不斷努力 lol )
OpenAI 最近有一篇技術文章,相當的值得一讀.就是他們分享他們如何管理超過 2500 個節點. 當然我們都知道,
Kubernetes 自從 1.6 之後就號稱可以乘載 5000 個節點以上,但是從 數十台到 2500 台的路上,難道不會遇到一些問題嗎? 這篇文章分享了他們遇到的問題,試著要解決與懷疑的地方,最後找到真正的問題.這篇文章適合所有 DevOp 好好的熟讀.
kubectl 有時候會發生 timeout. (p.s. `kubectl -v=6 可以顯示所有API 細節指令)kube-apiserver 服務器過分忙碌,試著增加 proxy 來做 replica 來幫忙 load balanceGKE 透過一台 32-core VM 就可以乘載 500台kube-apiserver 每秒需要從 etcd 上面讀取 500Mbetcd 小技巧: 透過 --etcd-servers-overrides 可以將 Kubernetes Event 的資料寫入作為切割,分不同機器處理.範例為 :--etcd-servers-overrides=/events#https://0.example.com:2381;https://1.example.com:2381;https://2.example.com:2381
cascading failurekubernetes-ec2-autoscaler 在全部的 etcd 都爆掉之後才回傳問題,並且關閉所有的 etcdetcd 硬碟爆滿,但是檢查 SSD 硬碟空間依舊有許多空間.etcd 啟動參數加上 --quota-backend-byteskubernetes-ec2-autoscaler logic 如果超過 50% 都出問題,預警性的關閉集群.## 各種服務的優化
除了遇到的問題解決外, OpenAI 也提供他們一些設定方式. 可以幫助你更順利的在大量集群上的運作.
一般來說,我們架設都是以一個 kube-master (主要的 Kubernetes 服務提供者,上面有 kube-apiserver, kube-scheduler 與 kube-control-manager ) 加上多個 slave . 但是要達到 HA 設定,要根據以下的方式:
kube-apiserver 要設置多個服務,並且透過參數 --apiserver-count 重啟並且設定.kubernetes-ec2-autoscaler 可以幫你自動關閉 idle 的資源,但是這跟 Kubernetes scheduler 的原則相反. 不過透過這些設定,可以幫助你盡量把資源集中.{
"kind" : "Policy",
"apiVersion" : "v1",
"predicates" : [
{"name" : "GeneralPredicates"},
{"name" : "MatchInterPodAffinity"},
{"name" : "NoDiskConflict"},
{"name" : "NoVolumeZoneConflict"},
{"name" : "PodToleratesNodeTaints"}
],
"priorities" : [
{"name" : "MostRequestedPriority", "weight" : 1},
{"name" : "InterPodAffinityPriority", "weight" : 2}
]
}
上面是個調整你 Kubernetes scheduler 的範例,這個範例會透過把 InterPodAffinityPriority 的權重調高,達到我們要的調整方向.更多的部分,可以參考原始範例.
不過要注意,目前 Kubernetes Scheduler Policy 並不支援動態切換,需要重起你的 kube-apiserver (issue: 41600)
參考文件: VF技術部落格: 深入kubernetes调度之原理分析 – 關於 Kubernetes Scheduler 相關介紹文件(中文)
OpenAI 有使用 KubeDNS: 一個 Kubernetes 內部使用的 DNS ,但是經過不久發現
問題徵兆:
嘗試解決問題方式:
解決方式:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- weight: 100
labelSelector:
matchExpressions:
- key: k8s-app
operator: In
values:
- kube-dns
topologyKey: kubernetes.io/hostname
kubelet 是否有其他選項可以讓你 image pullkubelet 加上選項 --serialize-image-pulls=false 來啟動 image pulling 來讓其他服務可以比較早 pull 參考:kubelet 啟動選項
overlay2 可以參考這篇 docker 教學文章補充: 特地下去把 source trace 了一下
// serializeImagePulls when enabled, tells the Kubelet to pull images one
// at a time. We recommend *not* changing the default value on nodes that
// run docker daemon with version < 1.9 or an Aufs storage backend.
// Issue #10959 has more details.
SerializeImagePulls *bool `json:"serializeImagePulls"`
此外,還可以透過以下方式來增加 pull 速度
kubelet 有個參數 --image-pull-progress-deadline 要提高到 30minsmax-concurrent-download 要調到 10 才能多線程下載OpenAI 節點間的網路流量,可以達到 10-15Gbit/s .但是由於 Flannel 所以導致流量會降到 ~2Gbit/s
解決方式就是將 Flannel 拿掉,使用實體網路.
hostNetwork: truednsPolicy: ClusterFirstWithHostNet這裡有一些警告需要詳細閱讀
kubectl 小技巧: kubectl -v=6 可以顯示所有API 細節指令kube-apiserver 小技巧: kube-apiserver 啟動指令 --audit-log-path 與 --audit-log-maxbackup 可以查看更詳細的內容etcd 小技巧: 透過 --etcd-servers-overrides 可以將 Kubernetes Event 的資料寫入作為切割,分不同機器處理