今天的記筆也是「沒頭沒尾」,索哩索哩
可以自行點「參考連結」OR GOOGLE 深入研究
如果有更好的連結歡迎留言補充喔
參考
https://jimmysong.io/kubernetes-handbook/concepts/apiservice.html
https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#resources
$ kubectl get apiservice v1alpha1.custom-metrics.metrics.k8s.io -o yaml
$ kubectl get apiservice
$ kubectl api-versions # 目前cluster支援的api版本
公有雲的privoder都有提供deploy function,例如:
例如:AWS Lambda function
export.handler = function(event, context){
context.succeed("Hello");
};
比起container,更能降低成本、簡化
最重要的,function不用一直on著,只有function在跑的時候才計費
除了公有雲,我們local建的cluster也可以用function喔
Kubeless支援GKE跟minikube
https://github.com/kubeless/kubeless
註:這些專案都很新,所以建議再觀察一陣子,等成熟再用到正式環境
# 下載最新的kubeless
$ export RELEASE=$(curl -s https://api.github.com/repos/kubeless/kubeless/releases/latest | grep tag_name | cut -d '"' -f 4)
# 建namespace
$ kubectl create ns kubeless
# deploy kubeless
$ kubectl create -f https://github.com/kubeless/kubeless/releases/download/$RELEASE/kubeless-$RELEASE.yaml
# 看有沒有跑起來
$ kubectl get pods -n kubeless
NAME READY STATUS RESTARTS AGE
kubeless-controller-manager-567dcb6c48-ssx8x 1/1 Running 0 1h
$ kubectl get deployment -n kubeless
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubeless-controller-manager 1 1 1 1 1h
$ kubectl get customresourcedefinition
NAME AGE
cronjobtriggers.kubeless.io 1h
functions.kubeless.io 1h
httptriggers.kubeless.io 1h
https://github.com/kubeless/kubeless/tree/master/examples/nodejs
$ kubeless get-server-config
INFO[0000] Current Server Config:
INFO[0000] Supported Runtimes are: python2.7, python3.4, python3.6, nodejs6, nodejs8, ruby2.4, php7.2, go1.10, dotnetcore2.0, java1.8, ballerina0.981.0
---
apiVersion: kubeless.io/v1beta1
kind: Function
metadata:
name: hello
spec:
handler: handler.hello
runtime: nodejs6
function: |
module.exports = {
hello: function(event, context) {
return 'Hello World'
}
}
{
"name": "hellowithdeps",
"version": "0.0.1",
"dependencies": {
"end-of-stream": "^1.4.1",
"from2": "^2.3.0",
"lodash": "^4.17.5"
}
}
'use strict';
const _ = require('lodash');
module.exports = {
handler: (event, context) => {
_.assign(event.data, {date: new Date().toTimeString()})
return JSON.stringify(event.data);
},
};
$ kubeless function deploy myfunction --runtime nodejs6 \
--dependencies examples/nodejs/package.json \
--handler test.myfunction \
--from-file examples/nodejs/hellowithdeps.js
# 列出有哪些function
$ kubeless function ls
# call function
$ kubeless function call myfunction --data 'some data'
# 使用apiserver proxy URL來call function
$ kubectl proxy -p 8080 & curl -L --data '{"Another": "Echo"}' \
--header "Content-Type:application/json" \
localhost:8080/api/v1/namespaces/default/services/myfunction :http-function-port/proxy/
# 刪掉funtion
$ kubeless function delete myfunction
微服務愈來愈受歡迎,
可以把一個大的application拆成多個獨立服務
Load Balance
Kubernetes Cluster
Ingress Controller
App 1
App 2 - DB1
App 3 - DB2
通常k8s cluster有多個Nodes,每個Node有很多Pods,
在cluster裡面,就像小型的網路一樣,
Pods之間在交流時,可能沒有
所以要好好的管理,這裡介紹Istio,才1.0版而已,超新的 = =
istio主要作 服務流量 的治理,連接、保護、控制和觀測
Istio會參考最近的request的延遲時間,來改進流量的調配
以及Service Mesh管理的工具
Management Interface (istio-ingress)
Pod { App 1 + (Sidecar - Envoy proxy) }
Pod { App 2 - DB1 + (Sidecar - Envoy proxy) }
Pod { App 3 - DB2 + (Sidecar - Envoy proxy) }
目前Istio支援
除了Minikube,其他都雲端供應商
建議跑Minikube來玩Istio
安裝方式有2個
1、用minikube指令裝
$ minikube start --memory=8192 --cpus=4 --kubernetes-version=v1.10.0 \
--extra-config=controller-manager.cluster-signing-cert-file="/var/lib/localkube/certs/ca.crt" \
--extra-config=controller-manager.cluster-signing-key-file="/var/lib/localkube/certs/ca.key" \
--vm-driver=`your_vm_driver_choice` # virtualbox、vmwarefusion
2、用Helm裝
這個就略過啦
請自行參考:https://istio.io/docs/setup/kubernetes/helm-install/
Micro services就到這裡了,沒頭沒尾,拍細拍細。
這部分我也看不懂(可能網路底子太差吧),所以介由書本的理解補充一下Service Discovery
在cluster中
Service Discovery 是以 Service Object 為基礎
所以跟kubernetes的其他object一樣,你建完object,可以用kubectl get (object類型)來列出它們
$ kubectl get services -o wide
我們就取用書的範例,
# 建立 Deployment
$ kubectl run alpaca-prod \
--image=gcr.io/kuar-demo/kuard-amd64:1 \
--replicas=1 \
--port=8080
--labels="app=alpaca,env=prod" # 下label很重要喔
# 建立 Service Object
$ kubectl expose deployment alpaca-prod
# 例出 service object list
$ kubectl get service -o wide
# 會含下列資訊:
# NAME CLUSTER-IP(virtual IP) PORT(S) SELECTOR
補充:
cluster會自動建立一個service object:
kubernetes:協助application跟API溝通
kubernetes 10.x.x.1 443/TCP <none> # 沒selector
# 依label找出pod name,並放到變數 $ALPACA_POD
$ ALPACA_POD=$(kubectl get pods -l app=alpaca \ # -l 代表 label selector
-o jsonpath='{.items[0].metadata.name}') # 輸出pod name
# port forward到pod
$ kubectl port-forward $ALPACA_POD 48858:8080
上面的每個service object有的cluster-ip(virtual ip)有其對應的DNS
從 DNS Resolver 觀察規則:
service name .default .svc .cluster.local.
namespaceobject type cluster的domain
.default :預設的namespace就是default
.cluster.local. :預設的cluster domain,在真實事世中,每個cluster應該有自己的domain
kubernetes 內建 DNS service,而且是自動跑起來的
在cluster裡的每個service都有DNS name
..svc.cluster.local
Application 1:
POD1
SERVICE:APP1
IP:10.0.0.1
CONTAINER
$ HOST APP1-SERVICE.DEFAULT
APP1-SERVICE.DEFAULT HAS ADDRESS 10.0.0.1
APP1-SERVICE.DEFAULT.SVC.CLUSTER.LOCAL HAS ADDRESS 10.0.0.1
KUBE-DNS
SERVICE: KUBE-DNS
IP:10.0.0.10
DNS-SERVER
$ kubectl run -it busybox --image=BUSYBOX --restart=never bash
$ cat /etc/resolve.conf
search default.svc.cluster.local.svc.local cluster.local lan
nameserver 10.0.0.10
$ kubectl run -i --tty busybox --image=busybox --restart=Never -- sh
$ nslookup APP1-service
Server: 10.0.0.10
Address 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.local
Name: APP1-service
Address 1: 10.0.0.1 APP1-service.default.svc.cluster.local # default 是預設的NAMESPACE
# 如果故意刪掉pod,再重跑,會重新分配ip
# kubectl delete pod busybox
$ kubectl run -i --tty busybox --image=busybox --restart=Never -- sh
$ nslookup APP1-service
Server: 10.0.0.10
Address 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.local
Name: APP1-service
Address 1: 10.0.0.231 APP1-service.default.svc.cluster.local # ip重新分配
再補充 Kubernetes DNS,希望能幫助理解
這邊指的是 Kubernetes 裡面的 DNS,
主要功能:
DNS service透過deployment運行,名字就叫kube-dns
$ kubectl get deployments --namespace=kube-system kube-dns
NAME
kube-dns ...略
# 列出名為kube-dns的services
$ kubectl get service --namespace=kube-system kube-dns
NAME CLUSTER-IP EXTERNAL-IP PORT(s) AGE
kube-dns 10.96.0.10 <none> 53/UDP,53/TCP
# 在這個cluster裡的container
# 10.96.0.10會寫入container的/etc/resolv.conf