iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 23
1
Kubernetes

在地端建置Angular+ASP.NET Core的DevOps環境系列 第 23

day23_k8s09_API Service,Serverless,istio安裝,DNS&Service Discovery

  • 分享至 

  • xImage
  •  

今天的記筆也是「沒頭沒尾」,索哩索哩
可以自行點「參考連結」OR GOOGLE 深入研究
如果有更好的連結歡迎留言補充喔

API Service只是提供連結@@~

參考
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版本

===

Serverless on Kubernetes

公有雲的privoder都有提供deploy function,例如:

  • Azure Functions
  • Google Cloud Functions
  • AWS Lambda

例如:AWS Lambda function

export.handler = function(event, context){
	context.succeed("Hello");
};

比起container,更能降低成本、簡化
最重要的,function不用一直on著,只有function在跑的時候才計費

除了公有雲,我們local建的cluster也可以用function喔

目前有名的專案有:

  • OpenFaas
  • Kubeless
  • Fission
  • OpenWhisk

我們來介紹其中一項,kubeless

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

kubeless的examples非常多,我們用nodejs來介紹

https://github.com/kubeless/kubeless/tree/master/examples/nodejs

看有哪些runtime可以用

$ 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
  • function可以定義在yaml檔
---
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'
        }
      }

也可以像一般的nodejs專案

  • package.json
{
    "name": "hellowithdeps",
    "version": "0.0.1",
    "dependencies": {
        "end-of-stream": "^1.4.1",
        "from2": "^2.3.0",
        "lodash": "^4.17.5"
    }
}
  • hellowithdeps.js
'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

===

Micro services

微服務愈來愈受歡迎,
可以把一個大的application拆成多個獨立服務
Load Balance
Kubernetes Cluster
Ingress Controller
App 1
App 2 - DB1
App 3 - DB2

通常k8s cluster有多個Nodes,每個Node有很多Pods,
在cluster裡面,就像小型的網路一樣,
Pods之間在交流時,可能沒有

  • 加密(encryption)
  • load balance
  • routing
  • 存取控制(access control)

所以要好好的管理,這裡介紹Istio,才1.0版而已,超新的 = =
istio主要作 服務流量 的治理,連接、保護、控制和觀測
Istio會參考最近的request的延遲時間,來改進流量的調配
以及Service Mesh管理的工具

  • Consul
    分散式、ha的資料中心,用於跨動態分散式的連結和配置application
  • Load Balance
  • Kubernetes Cluster
  • Ingress Controller

架構

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

目前Istio支援

  • Minikube
  • GKE,Google Container Engine
  • AWS,Amazon Web Services with Kops
  • Azure

除了Minikube,其他都雲端供應商
建議跑Minikube來玩Istio
安裝方式有2個

1、用minikube指令裝

  • On Kubernetes 1.10:
$ 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就到這裡了,沒頭沒尾,拍細拍細。

===

DNS & Service Discovery

這部分我也看不懂(可能網路底子太差吧),所以介由書本的理解補充一下Service Discovery

  • 參考書本「Kubernetes建置與執行」第7章服務探索
    (可以買來參考,雖然能參考的不多,至少理解不會錯得太誇張)

Service Discovery

(service命名、service的discovery)

在cluster中

  • 有哪些程序正在listening?
  • 這些service的address?
  • 有哪些service?
    DNS就是很經典的例子,提供(domain name 解析 ip 的服務)

Service Object

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的DNS

上面的每個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

cluster裡面有個KUBE-DNS

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,希望能幫助理解

這邊指的是 Kubernetes 裡面的 DNS,
主要功能:

  • service命名
  • service的discovery

DNS service透過deployment運行,名字就叫kube-dns

列出名為kube-dns的deployments

$ 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

上一篇
day22_k8s08_Auto Scaling,ReplicaSet,Daemon Set,Proxy,StatefulSet
下一篇
day24_k8s10_樹莓PI(網路設定),Dashboard,Resource Monitor,Cert Manage,External DNS(工具),Auditing
系列文
在地端建置Angular+ASP.NET Core的DevOps環境31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言