"카타코더 k8s - Getting Started with Kubeless"의 두 판 사이의 차이

(새 문서: ==개요== ;카타코더 Kubernetes - ;카타코더 Kubernetes - {{카타코더|Kubernetes|2}} ==== <source lang='console'> </source> <source lang='console'> </source>)
 
 
1번째 줄: 1번째 줄:
==개요==
==개요==
;카타코더 Kubernetes -  
;카타코더 Kubernetes - Getting Started with Kubeless
;카타코더 Kubernetes -
{{카타코더|Kubernetes|2}}
{{카타코더|Kubernetes|2}}


====
==Install Kubeless==
<source lang='console'>
<source lang='console'>
master:~$ kubectl create ns kubeless
namespace/kubeless created
</source>
</source>
<source lang='console'>
<source lang='console'>
master:~$ curl -L https://github.com/kubeless/kubeless/releases/download/v1.0.0-alpha.8/kubeless-v1.0.0-alpha.8.yaml
</source>
<source lang='yaml'>
---
apiVersion: v1
data:
  builder-image: kubeless/function-image-builder:v1.0.0-alpha.8
  builder-image-secret: ""
  deployment: '{}'
  enable-build-step: "false"
  function-registry-tls-verify: "true"
  ingress-enabled: "false"
  provision-image: kubeless/unzip@sha256:f162c062973cca05459834de6ed14c039d45df8cdb76097f50b028a1621b3697
  provision-image-secret: ""
  runtime-images: |-
    [
      {
        "ID": "python",
        "compiled": false,
        "versions": [
          {
            "name": "python27",
            "version": "2.7",
            "runtimeImage": "kubeless/python@sha256:07cfb0f3d8b6db045dc317d35d15634d7be5e436944c276bf37b1c630b03add8",
            "initImage": "python:2.7"
          },
          {
            "name": "python34",
            "version": "3.4",
            "runtimeImage": "kubeless/python@sha256:f19640c547a3f91dbbfb18c15b5e624029b4065c1baf2892144e07c36f0a7c8f",
            "initImage": "python:3.4"
          },
          {
            "name": "python36",
            "version": "3.6",
            "runtimeImage": "kubeless/python@sha256:0c9f8f727d42625a4e25230cfe612df7488b65f283e7972f84108d87e7443d72",
            "initImage": "python:3.6"
          }
        ],
        "depName": "requirements.txt",
        "fileNameSuffix": ".py"
      },
      {
        "ID": "nodejs",
        "compiled": false,
        "versions": [
          {
            "name": "node6",
            "version": "6",
            "runtimeImage": "kubeless/nodejs@sha256:f2a338c62d010687137c0880d1b68bea926f71a7111251a4622db8ae8c036898",
            "initImage": "node:6.10"
          },
          {
            "name": "node8",
            "version": "8",
            "runtimeImage": "kubeless/nodejs@sha256:3b5180a9e0bdce043f0f455758561cf4ad62406fcc80140c2393a2c3a1ff88ac",
            "initImage": "node:8"
          }
        ],
        "depName": "package.json",
        "fileNameSuffix": ".js"
      },
      {
        "ID": "nodejs_distroless",
        "compiled": false,
        "versions": [
          {
            "name": "node8",
            "version": "8",
            "runtimeImage": "henrike42/kubeless/runtimes/nodejs/distroless:0.0.2",
            "initImage": "node:8"
          }
        ],
        "depName": "package.json",
        "fileNameSuffix": ".js"
      },
      {
        "ID": "ruby",
        "compiled": false,
        "versions": [
          {
            "name": "ruby24",
            "version": "2.4",
            "runtimeImage": "kubeless/ruby@sha256:01665f1a32fe4fab4195af048627857aa7b100e392ae7f3e25a44bd296d6f105",
            "initImage": "bitnami/ruby:2.4"
          }
        ],
        "depName": "Gemfile",
        "fileNameSuffix": ".rb"
      },
      {
        "ID": "php",
        "compiled": false,
        "versions": [
          {
            "name": "php72",
            "version": "7.2",
            "runtimeImage": "kubeless/php@sha256:9b86066b2640bedcd88acb27f43dfaa2b338f0d74d9d91131ea781402f7ec8ec",
            "initImage": "composer:1.6"
          }
        ],
        "depName": "composer.json",
        "fileNameSuffix": ".php"
      },
      {
        "ID": "go",
        "compiled": true,
        "versions": [
          {
            "name": "go1.10",
            "version": "1.10",
            "runtimeImage": "kubeless/go@sha256:e2fd49f09b6ff8c9bac6f1592b3119ea74237c47e2955a003983e08524cb3ae5",
            "initImage": "kubeless/go-init@sha256:983b3f06452321a2299588966817e724d1a9c24be76cf1b12c14843efcdff502"
          }
        ],
        "depName": "Gopkg.toml",
        "fileNameSuffix": ".go"
      },
      {
        "ID": "dotnetcore",
        "compiled": true,
        "versions": [
          {
            "name": "dotnetcore2.0",
            "version": "2.0",
            "runtimeImage": "allantargino/kubeless-dotnetcore@sha256:1699b07d9fc0276ddfecc2f823f272d96fd58bbab82d7e67f2fd4982a95aeadc",
            "initImage": "allantargino/aspnetcore-build@sha256:0d60f845ff6c9c019362a68b87b3920f3eb2d32f847f2d75e4d190cc0ce1d81c"
          }
        ],
        "depName": "project.csproj",
        "fileNameSuffix": ".cs"
      },
      {
        "ID": "java",
        "compiled": true,
        "versions": [
          {
            "name": "java1.8",
            "version": "1.8",
            "runtimeImage": "kubeless/java@sha256:debf9502545f4c0e955eb60fabb45748c5d98ed9365c4a508c07f38fc7fefaac",
            "initImage": "kubeless/java-init@sha256:7e5e4376d3ab76c336d4830c9ed1b7f9407415feca49b8c2bf013e279256878f"
          }
        ],
        "depName": "pom.xml",
        "fileNameSuffix": ".java"
      },
      {
        "ID": "ballerina",
        "compiled": true,
        "versions": [
          {
              "name": "ballerina0.981.0",
              "version": "0.981.0",
              "runtimeImage": "ballerina/kubeless-ballerina@sha256:a025841010cfdf8136396efef31d4155283770d331ded6a9003e6e55f02db2e5",
              "initImage": "ballerina/kubeless-ballerina-init@sha256:a04ca9d289c62397d0b493876f6a9ff4cc425563a47aa7e037c3b850b8ceb3e8"
          }
        ],
        "depName": "",
        "fileNameSuffix": ".bal"
      },
      {
        "ID": "jvm",
        "compiled": true,
        "versions": [
          {
            "name": "jvm1.8",
            "version": "1.8",
            "runtimeImage": "caraboides/jvm@sha256:2870c4f48df4feb2ee7478a152b44840d781d4b1380ad3fa44b3c7ff314faded",
            "initImage": "caraboides/jvm-init@sha256:e57dbf3f56570a196d68bce1c0695102b2dbe3ae2ca6d1c704476a7a11542f1d"
          }
        ],
        "depName": "",
        "fileNameSuffix": ".jar"
      }
    ]
  service-type: ClusterIP
kind: ConfigMap
metadata:
  name: kubeless-config
  namespace: kubeless
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  labels:
    kubeless: controller
  name: kubeless-controller-manager
  namespace: kubeless
spec:
  selector:
    matchLabels:
      kubeless: controller
  template:
    metadata:
      labels:
        kubeless: controller
    spec:
      containers:
      - env:
        - name: KUBELESS_INGRESS_ENABLED
          valueFrom:
            configMapKeyRef:
              key: ingress-enabled
              name: kubeless-config
        - name: KUBELESS_SERVICE_TYPE
          valueFrom:
            configMapKeyRef:
              key: service-type
              name: kubeless-config
        - name: KUBELESS_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: KUBELESS_CONFIG
          value: kubeless-config
        image: kubeless/function-controller:v1.0.0-alpha.8
        imagePullPolicy: IfNotPresent
        name: kubeless-function-controller
      - env:
        - name: KUBELESS_INGRESS_ENABLED
          valueFrom:
            configMapKeyRef:
              key: ingress-enabled
              name: kubeless-config
        - name: KUBELESS_SERVICE_TYPE
          valueFrom:
            configMapKeyRef:
              key: service-type
              name: kubeless-config
        - name: KUBELESS_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: KUBELESS_CONFIG
          value: kubeless-config
        image: bitnami/http-trigger-controller:v1.0.0-alpha.9
        imagePullPolicy: IfNotPresent
        name: http-trigger-controller
      - env:
        - name: KUBELESS_INGRESS_ENABLED
          valueFrom:
            configMapKeyRef:
              key: ingress-enabled
              name: kubeless-config
        - name: KUBELESS_SERVICE_TYPE
          valueFrom:
            configMapKeyRef:
              key: service-type
              name: kubeless-config
        - name: KUBELESS_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: KUBELESS_CONFIG
          value: kubeless-config
        image: bitnami/cronjob-trigger-controller:v1.0.0-alpha.9
        imagePullPolicy: IfNotPresent
        name: cronjob-trigger-controller
      serviceAccountName: controller-acct
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: controller-acct
  namespace: kubeless
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: kubeless-controller-deployer
rules:
- apiGroups:
  - ""
  resources:
  - services
  - configmaps
  verbs:
  - create
  - get
  - delete
  - list
  - update
  - patch
- apiGroups:
  - apps
  - extensions
  resources:
  - deployments
  verbs:
  - create
  - get
  - delete
  - list
  - update
  - patch
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - list
  - delete
- apiGroups:
  - ""
  resourceNames:
  - kubeless-registry-credentials
  resources:
  - secrets
  verbs:
  - get
- apiGroups:
  - kubeless.io
  resources:
  - functions
  - httptriggers
  - cronjobtriggers
  verbs:
  - get
  - list
  - watch
  - update
  - delete
- apiGroups:
  - batch
  resources:
  - cronjobs
  - jobs
  verbs:
  - create
  - get
  - delete
  - deletecollection
  - list
  - update
  - patch
- apiGroups:
  - autoscaling
  resources:
  - horizontalpodautoscalers
  verbs:
  - create
  - get
  - delete
  - list
  - update
  - patch
- apiGroups:
  - apiextensions.k8s.io
  resources:
  - customresourcedefinitions
  verbs:
  - get
  - list
- apiGroups:
  - monitoring.coreos.com
  resources:
  - alertmanagers
  - prometheuses
  - servicemonitors
  verbs:
  - '*'
- apiGroups:
  - extensions
  resources:
  - ingresses
  verbs:
  - create
  - get
  - list
  - update
  - delete
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: kubeless-controller-deployer
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kubeless-controller-deployer
subjects:
- kind: ServiceAccount
  name: controller-acct
  namespace: kubeless
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: functions.kubeless.io
spec:
  group: kubeless.io
  names:
    kind: Function
    plural: functions
    singular: function
  scope: Namespaced
  version: v1beta1
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: httptriggers.kubeless.io
spec:
  group: kubeless.io
  names:
    kind: HTTPTrigger
    plural: httptriggers
    singular: httptrigger
  scope: Namespaced
  version: v1beta1
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: cronjobtriggers.kubeless.io
spec:
  group: kubeless.io
  names:
    kind: CronJobTrigger
    plural: cronjobtriggers
    singular: cronjobtrigger
  scope: Namespaced
  version: v1beta1
</source>
<source lang='console'>
master:~$ kubectl create -f https://github.com/kubeless/kubeless/releases/download/v1.0.0-alpha.8/kubeless-v1.0.0-alpha.8.yaml
configmap/kubeless-config created
deployment.apps/kubeless-controller-manager created
serviceaccount/controller-acct created
clusterrole.rbac.authorization.k8s.io/kubeless-controller-deployer created
clusterrolebinding.rbac.authorization.k8s.io/kubeless-controller-deployer created
customresourcedefinition.apiextensions.k8s.io/functions.kubeless.io created
customresourcedefinition.apiextensions.k8s.io/httptriggers.kubeless.io created
customresourcedefinition.apiextensions.k8s.io/cronjobtriggers.kubeless.io created
</source>
<source lang='console'>
master:~$ kubectl get pods -n kubeless
NAME                                          READY    STATUS    RESTARTS  AGE
kubeless-controller-manager-66868fb689-wjm5n  3/3      Running  0          17s
</source>
==Deploy a Python Function==
<source lang='console'>
master:~$ cat toy.py
</source>
<source lang='python'>
def handler(event, context):
  print event
  return event['data']
</source>
<source lang='console'>
master:~$ kubeless function deploy toy --runtime python2.7 --handler toy.handler --from-file toy.py
INFO[0000] Deploying function...
INFO[0000] Function toy submitted for deployment
INFO[0000] Check the deployment status executing 'kubeless function ls toy'
</source>
<source lang='console'>
master:~$ kubeless function ls
NAME    NAMESPACE      HANDLER        RUNTIME        DEPENDENCIES    STATUS
toy    default        toy.handler    python2.7                      1/1 READY
</source>
<source lang='console'>
master:~$ kubectl get pods
NAME                  READY    STATUS    RESTARTS  AGE
toy-86c8d54bd5-mr4w7  1/1      Running  0          1m
</source>
==Call The Function==
<source lang='console'>
master:~$ kubeless function call toy --data '{"hello":"world"}'
{"hello": "world"}
</source>
<source lang='console'>
master:~$ kubectl proxy --port 8080 &
[1] 18608
Starting to serve on 127.0.0.1:8080
master:~$
</source>
<source lang='console'>
master:~$ curl --data '{"hello":"world"}' localhost:8080/api/v1/namespaces/default/services/toy:8080/proxy/ --header "Content-Type:application/json"
{"hello": "world"}
</source>
==View The Logs, Describe and Update a Function==
<source lang='console'>
master:~$ kubeless function logs toy
Bottle v0.12.13 server starting up (using CherryPyServer())...
Listening on http://0.0.0.0:8080/
Hit Ctrl-C to quit.
10.32.0.1 - - [23/Mar/2019:20:02:31 +0000] "GET /healthz HTTP/1.1" 200 2 "" "kube-probe/1.11" 0/233
10.32.0.1 - - [23/Mar/2019:20:03:01 +0000] "GET /healthz HTTP/1.1" 200 2 "" "kube-probe/1.11" 0/95
10.32.0.1 - - [23/Mar/2019:20:03:31 +0000] "GET /healthz HTTP/1.1" 200 2 "" "kube-probe/1.11" 0/83
10.32.0.1 - - [23/Mar/2019:20:04:01 +0000] "GET /healthz HTTP/1.1" 200 2 "" "kube-probe/1.11" 0/101
{'event-time': '2019-03-23 20:04:26.729398873 +0000 UTC', 'extensions': {'request': <LocalRequest: POST http://172.17.0.9:6443/>}, 'event-type': 'application/json', 'event-namespace': 'cli.kubeless.io', 'data': {u'hello': u'world'}, 'event-id': 'JEdr0xrt8aadtiM'}
10.32.0.1 - - [23/Mar/2019:20:04:26 +0000] "POST / HTTP/1.1" 200 18 "" "kubeless/v1.8.0+$Format:%h$ (linux/amd64) kubernetes/$Format" 0/12049
10.32.0.1 - - [23/Mar/2019:20:04:31 +0000] "GET /healthz HTTP/1.1" 200 2 "" "kube-probe/1.11" 0/100
10.32.0.1 - - [23/Mar/2019:20:05:01 +0000] "GET /healthz HTTP/1.1" 200 2 "" "kube-probe/1.11" 0/78
{'event-time': None, 'extensions': {'request': <LocalRequest: POST http://localhost:8080/>}, 'event-type': None, 'event-namespace': None, 'data': {u'hello': u'world'}, 'event-id': None}
10.32.0.1 - - [23/Mar/2019:20:05:04 +0000] "POST / HTTP/1.1" 200 18 "" "curl/7.47.0" 0/8543
</source>
<source lang='console'>
master:~$ kubeless function describe toy
Name:          toy
Namespace:      default
Handler:        toy.handler
Runtime:        python2.7
Label:          {"created-by":"kubeless","function":"toy"}
Envvar:        null
Memory:        0
Dependencies:
</source>
<source lang='console'>
master:~$ cat toy-update.py
</source>
<source lang='python'>
def handler(event, context):
  print "katacoda rocks"
  return {"katacoda":"rocks"}
</source>
<source lang='console'>
master:~$ kubeless function update toy --from-file toy-update.py
INFO[0000] Redeploying function...
INFO[0000] Function toy submitted for deployment
INFO[0000] Check the deployment status executing 'kubeless function ls toy'
</source>
<source lang='console'>
master:~$ kubeless function call toy --data '{"hello":"world"}'
{"katacoda": "rocks"}
</source>
==Create a Node Function==
<source lang='console'>
master:~$ cat hello.js
</source>
<source lang='javascript'>
module.exports = {
  handler: (event, context) => {
    console.log(event);
    return event.data;
  },
};
</source>
<source lang='console'>
master:~$ kubeless function deploy hello --runtime nodejs6 --handler hello.handler --from-file hello.js
INFO[0000] Deploying function...
INFO[0000] Function hello submitted for deployment
INFO[0000] Check the deployment status executing 'kubeless function ls hello'
</source>
<source lang='console'>
master:~$ kubeless function ls
NAME    NAMESPACE      HANDLER        RUNTIME        DEPENDENCIES    STATUS
hello  default        hello.handler  nodejs6                        1/1 READY
toy    default        toy.handler    python2.7                      1/1 READY
</source>
<source lang='console'>
master:~$ kubeless function call hello --data '{"kubeless":"rocks"}'
{"kubeless":"rocks"}
</source>
==Delete Function==
<source lang='console'>
master:~$ kubeless function delete toy
master:~$ kubeless function delete hello
master:~$ kubectl get deployments,services
NAME                TYPE        CLUSTER-IP  EXTERNAL-IP  PORT(S)  AGE
service/kubernetes  ClusterIP  10.96.0.1    <none>        443/TCP  7m
</source>
</source>

2019년 3월 24일 (일) 05:08 기준 최신판

1 개요[ | ]

카타코더 Kubernetes - Getting Started with Kubeless
카타코더 Kubernetes
# 🔗 제목
카타코더 Kubernetes/2 e
🡵 카타코더 k8s - Use Kubernetes To Manage Secrets And Passwords
🡵 카타코더 k8s - Deploy Docker Compose Files with Kompose
🡵 카타코더 k8s - Deploying from source onto Kubernetes
🡵 카타코더 k8s - Backup and Restore with Heptio Ark
🡵 카타코더 k8s - Helm Package Manager
🡵 카타코더 k8s - Installing Weave Scope on Kubernetes
🡵 카타코더 k8s - Getting Started with Kubeless

2 Install Kubeless[ | ]

master:~$ kubectl create ns kubeless
namespace/kubeless created
master:~$ curl -L https://github.com/kubeless/kubeless/releases/download/v1.0.0-alpha.8/kubeless-v1.0.0-alpha.8.yaml
---
apiVersion: v1
data:
  builder-image: kubeless/function-image-builder:v1.0.0-alpha.8
  builder-image-secret: ""
  deployment: '{}'
  enable-build-step: "false"
  function-registry-tls-verify: "true"
  ingress-enabled: "false"
  provision-image: kubeless/unzip@sha256:f162c062973cca05459834de6ed14c039d45df8cdb76097f50b028a1621b3697
  provision-image-secret: ""
  runtime-images: |-
    [
      {
        "ID": "python",
        "compiled": false,
        "versions": [
          {
            "name": "python27",
            "version": "2.7",
            "runtimeImage": "kubeless/python@sha256:07cfb0f3d8b6db045dc317d35d15634d7be5e436944c276bf37b1c630b03add8",
            "initImage": "python:2.7"
          },
          {
            "name": "python34",
            "version": "3.4",
            "runtimeImage": "kubeless/python@sha256:f19640c547a3f91dbbfb18c15b5e624029b4065c1baf2892144e07c36f0a7c8f",
            "initImage": "python:3.4"
          },
          {
            "name": "python36",
            "version": "3.6",
            "runtimeImage": "kubeless/python@sha256:0c9f8f727d42625a4e25230cfe612df7488b65f283e7972f84108d87e7443d72",
            "initImage": "python:3.6"
          }
        ],
        "depName": "requirements.txt",
        "fileNameSuffix": ".py"
      },
      {
        "ID": "nodejs",
        "compiled": false,
        "versions": [
          {
            "name": "node6",
            "version": "6",
            "runtimeImage": "kubeless/nodejs@sha256:f2a338c62d010687137c0880d1b68bea926f71a7111251a4622db8ae8c036898",
            "initImage": "node:6.10"
          },
          {
            "name": "node8",
            "version": "8",
            "runtimeImage": "kubeless/nodejs@sha256:3b5180a9e0bdce043f0f455758561cf4ad62406fcc80140c2393a2c3a1ff88ac",
            "initImage": "node:8"
          }
        ],
        "depName": "package.json",
        "fileNameSuffix": ".js"
      },
      {
        "ID": "nodejs_distroless",
        "compiled": false,
        "versions": [
          {
            "name": "node8",
            "version": "8",
            "runtimeImage": "henrike42/kubeless/runtimes/nodejs/distroless:0.0.2",
            "initImage": "node:8"
          }
        ],
        "depName": "package.json",
        "fileNameSuffix": ".js"
      },
      {
        "ID": "ruby",
        "compiled": false,
        "versions": [
          {
            "name": "ruby24",
            "version": "2.4",
            "runtimeImage": "kubeless/ruby@sha256:01665f1a32fe4fab4195af048627857aa7b100e392ae7f3e25a44bd296d6f105",
            "initImage": "bitnami/ruby:2.4"
          }
        ],
        "depName": "Gemfile",
        "fileNameSuffix": ".rb"
      },
      {
        "ID": "php",
        "compiled": false,
        "versions": [
          {
            "name": "php72",
            "version": "7.2",
            "runtimeImage": "kubeless/php@sha256:9b86066b2640bedcd88acb27f43dfaa2b338f0d74d9d91131ea781402f7ec8ec",
            "initImage": "composer:1.6"
          }
        ],
        "depName": "composer.json",
        "fileNameSuffix": ".php"
      },
      {
        "ID": "go",
        "compiled": true,
        "versions": [
          {
            "name": "go1.10",
            "version": "1.10",
            "runtimeImage": "kubeless/go@sha256:e2fd49f09b6ff8c9bac6f1592b3119ea74237c47e2955a003983e08524cb3ae5",
            "initImage": "kubeless/go-init@sha256:983b3f06452321a2299588966817e724d1a9c24be76cf1b12c14843efcdff502"
          }
        ],
        "depName": "Gopkg.toml",
        "fileNameSuffix": ".go"
      },
      {
        "ID": "dotnetcore",
        "compiled": true,
        "versions": [
          {
            "name": "dotnetcore2.0",
            "version": "2.0",
            "runtimeImage": "allantargino/kubeless-dotnetcore@sha256:1699b07d9fc0276ddfecc2f823f272d96fd58bbab82d7e67f2fd4982a95aeadc",
            "initImage": "allantargino/aspnetcore-build@sha256:0d60f845ff6c9c019362a68b87b3920f3eb2d32f847f2d75e4d190cc0ce1d81c"
          }
        ],
        "depName": "project.csproj",
        "fileNameSuffix": ".cs"
      },
      {
        "ID": "java",
        "compiled": true,
        "versions": [
          {
            "name": "java1.8",
            "version": "1.8",
            "runtimeImage": "kubeless/java@sha256:debf9502545f4c0e955eb60fabb45748c5d98ed9365c4a508c07f38fc7fefaac",
            "initImage": "kubeless/java-init@sha256:7e5e4376d3ab76c336d4830c9ed1b7f9407415feca49b8c2bf013e279256878f"
          }
        ],
        "depName": "pom.xml",
        "fileNameSuffix": ".java"
      },
      {
         "ID": "ballerina",
         "compiled": true,
         "versions": [
           {
              "name": "ballerina0.981.0",
              "version": "0.981.0",
              "runtimeImage": "ballerina/kubeless-ballerina@sha256:a025841010cfdf8136396efef31d4155283770d331ded6a9003e6e55f02db2e5",
              "initImage": "ballerina/kubeless-ballerina-init@sha256:a04ca9d289c62397d0b493876f6a9ff4cc425563a47aa7e037c3b850b8ceb3e8"
           }
         ],
         "depName": "",
         "fileNameSuffix": ".bal"
      },
      {
        "ID": "jvm",
        "compiled": true,
        "versions": [
          {
            "name": "jvm1.8",
            "version": "1.8",
            "runtimeImage": "caraboides/jvm@sha256:2870c4f48df4feb2ee7478a152b44840d781d4b1380ad3fa44b3c7ff314faded",
            "initImage": "caraboides/jvm-init@sha256:e57dbf3f56570a196d68bce1c0695102b2dbe3ae2ca6d1c704476a7a11542f1d"
          }
        ],
        "depName": "",
        "fileNameSuffix": ".jar"
      }
    ]
  service-type: ClusterIP
kind: ConfigMap
metadata:
  name: kubeless-config
  namespace: kubeless
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  labels:
    kubeless: controller
  name: kubeless-controller-manager
  namespace: kubeless
spec:
  selector:
    matchLabels:
      kubeless: controller
  template:
    metadata:
      labels:
        kubeless: controller
    spec:
      containers:
      - env:
        - name: KUBELESS_INGRESS_ENABLED
          valueFrom:
            configMapKeyRef:
              key: ingress-enabled
              name: kubeless-config
        - name: KUBELESS_SERVICE_TYPE
          valueFrom:
            configMapKeyRef:
              key: service-type
              name: kubeless-config
        - name: KUBELESS_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: KUBELESS_CONFIG
          value: kubeless-config
        image: kubeless/function-controller:v1.0.0-alpha.8
        imagePullPolicy: IfNotPresent
        name: kubeless-function-controller
      - env:
        - name: KUBELESS_INGRESS_ENABLED
          valueFrom:
            configMapKeyRef:
              key: ingress-enabled
              name: kubeless-config
        - name: KUBELESS_SERVICE_TYPE
          valueFrom:
            configMapKeyRef:
              key: service-type
              name: kubeless-config
        - name: KUBELESS_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: KUBELESS_CONFIG
          value: kubeless-config
        image: bitnami/http-trigger-controller:v1.0.0-alpha.9
        imagePullPolicy: IfNotPresent
        name: http-trigger-controller
      - env:
        - name: KUBELESS_INGRESS_ENABLED
          valueFrom:
            configMapKeyRef:
              key: ingress-enabled
              name: kubeless-config
        - name: KUBELESS_SERVICE_TYPE
          valueFrom:
            configMapKeyRef:
              key: service-type
              name: kubeless-config
        - name: KUBELESS_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: KUBELESS_CONFIG
          value: kubeless-config
        image: bitnami/cronjob-trigger-controller:v1.0.0-alpha.9
        imagePullPolicy: IfNotPresent
        name: cronjob-trigger-controller
      serviceAccountName: controller-acct
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: controller-acct
  namespace: kubeless
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: kubeless-controller-deployer
rules:
- apiGroups:
  - ""
  resources:
  - services
  - configmaps
  verbs:
  - create
  - get
  - delete
  - list
  - update
  - patch
- apiGroups:
  - apps
  - extensions
  resources:
  - deployments
  verbs:
  - create
  - get
  - delete
  - list
  - update
  - patch
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - list
  - delete
- apiGroups:
  - ""
  resourceNames:
  - kubeless-registry-credentials
  resources:
  - secrets
  verbs:
  - get
- apiGroups:
  - kubeless.io
  resources:
  - functions
  - httptriggers
  - cronjobtriggers
  verbs:
  - get
  - list
  - watch
  - update
  - delete
- apiGroups:
  - batch
  resources:
  - cronjobs
  - jobs
  verbs:
  - create
  - get
  - delete
  - deletecollection
  - list
  - update
  - patch
- apiGroups:
  - autoscaling
  resources:
  - horizontalpodautoscalers
  verbs:
  - create
  - get
  - delete
  - list
  - update
  - patch
- apiGroups:
  - apiextensions.k8s.io
  resources:
  - customresourcedefinitions
  verbs:
  - get
  - list
- apiGroups:
  - monitoring.coreos.com
  resources:
  - alertmanagers
  - prometheuses
  - servicemonitors
  verbs:
  - '*'
- apiGroups:
  - extensions
  resources:
  - ingresses
  verbs:
  - create
  - get
  - list
  - update
  - delete
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: kubeless-controller-deployer
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kubeless-controller-deployer
subjects:
- kind: ServiceAccount
  name: controller-acct
  namespace: kubeless
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: functions.kubeless.io
spec:
  group: kubeless.io
  names:
    kind: Function
    plural: functions
    singular: function
  scope: Namespaced
  version: v1beta1
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: httptriggers.kubeless.io
spec:
  group: kubeless.io
  names:
    kind: HTTPTrigger
    plural: httptriggers
    singular: httptrigger
  scope: Namespaced
  version: v1beta1
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: cronjobtriggers.kubeless.io
spec:
  group: kubeless.io
  names:
    kind: CronJobTrigger
    plural: cronjobtriggers
    singular: cronjobtrigger
  scope: Namespaced
  version: v1beta1
master:~$ kubectl create -f https://github.com/kubeless/kubeless/releases/download/v1.0.0-alpha.8/kubeless-v1.0.0-alpha.8.yaml
configmap/kubeless-config created
deployment.apps/kubeless-controller-manager created
serviceaccount/controller-acct created
clusterrole.rbac.authorization.k8s.io/kubeless-controller-deployer created
clusterrolebinding.rbac.authorization.k8s.io/kubeless-controller-deployer created
customresourcedefinition.apiextensions.k8s.io/functions.kubeless.io created
customresourcedefinition.apiextensions.k8s.io/httptriggers.kubeless.io created
customresourcedefinition.apiextensions.k8s.io/cronjobtriggers.kubeless.io created
master:~$ kubectl get pods -n kubeless
NAME                                           READY     STATUS    RESTARTS   AGE
kubeless-controller-manager-66868fb689-wjm5n   3/3       Running   0          17s

3 Deploy a Python Function[ | ]

master:~$ cat toy.py
def handler(event, context):
   print event
   return event['data']
master:~$ kubeless function deploy toy --runtime python2.7 --handler toy.handler --from-file toy.py
INFO[0000] Deploying function...
INFO[0000] Function toy submitted for deployment
INFO[0000] Check the deployment status executing 'kubeless function ls toy'
master:~$ kubeless function ls
NAME    NAMESPACE       HANDLER         RUNTIME         DEPENDENCIES    STATUS
toy     default         toy.handler     python2.7                       1/1 READY
master:~$ kubectl get pods
NAME                   READY     STATUS    RESTARTS   AGE
toy-86c8d54bd5-mr4w7   1/1       Running   0          1m

4 Call The Function[ | ]

master:~$ kubeless function call toy --data '{"hello":"world"}'
{"hello": "world"}
master:~$ kubectl proxy --port 8080 &
[1] 18608
Starting to serve on 127.0.0.1:8080
master:~$
master:~$ curl --data '{"hello":"world"}' localhost:8080/api/v1/namespaces/default/services/toy:8080/proxy/ --header "Content-Type:application/json"
{"hello": "world"}

5 View The Logs, Describe and Update a Function[ | ]

master:~$ kubeless function logs toy
Bottle v0.12.13 server starting up (using CherryPyServer())...
Listening on http://0.0.0.0:8080/
Hit Ctrl-C to quit.

10.32.0.1 - - [23/Mar/2019:20:02:31 +0000] "GET /healthz HTTP/1.1" 200 2 "" "kube-probe/1.11" 0/233
10.32.0.1 - - [23/Mar/2019:20:03:01 +0000] "GET /healthz HTTP/1.1" 200 2 "" "kube-probe/1.11" 0/95
10.32.0.1 - - [23/Mar/2019:20:03:31 +0000] "GET /healthz HTTP/1.1" 200 2 "" "kube-probe/1.11" 0/83
10.32.0.1 - - [23/Mar/2019:20:04:01 +0000] "GET /healthz HTTP/1.1" 200 2 "" "kube-probe/1.11" 0/101
{'event-time': '2019-03-23 20:04:26.729398873 +0000 UTC', 'extensions': {'request': <LocalRequest: POST http://172.17.0.9:6443/>}, 'event-type': 'application/json', 'event-namespace': 'cli.kubeless.io', 'data': {u'hello': u'world'}, 'event-id': 'JEdr0xrt8aadtiM'}
10.32.0.1 - - [23/Mar/2019:20:04:26 +0000] "POST / HTTP/1.1" 200 18 "" "kubeless/v1.8.0+$Format:%h$ (linux/amd64) kubernetes/$Format" 0/12049
10.32.0.1 - - [23/Mar/2019:20:04:31 +0000] "GET /healthz HTTP/1.1" 200 2 "" "kube-probe/1.11" 0/100
10.32.0.1 - - [23/Mar/2019:20:05:01 +0000] "GET /healthz HTTP/1.1" 200 2 "" "kube-probe/1.11" 0/78
{'event-time': None, 'extensions': {'request': <LocalRequest: POST http://localhost:8080/>}, 'event-type': None, 'event-namespace': None, 'data': {u'hello': u'world'}, 'event-id': None}
10.32.0.1 - - [23/Mar/2019:20:05:04 +0000] "POST / HTTP/1.1" 200 18 "" "curl/7.47.0" 0/8543
master:~$ kubeless function describe toy
Name:           toy
Namespace:      default
Handler:        toy.handler
Runtime:        python2.7
Label:          {"created-by":"kubeless","function":"toy"}
Envvar:         null
Memory:         0
Dependencies:
master:~$ cat toy-update.py
def handler(event, context):
   print "katacoda rocks"
   return {"katacoda":"rocks"}
master:~$ kubeless function update toy --from-file toy-update.py
INFO[0000] Redeploying function...
INFO[0000] Function toy submitted for deployment
INFO[0000] Check the deployment status executing 'kubeless function ls toy'
master:~$ kubeless function call toy --data '{"hello":"world"}'
{"katacoda": "rocks"}

6 Create a Node Function[ | ]

master:~$ cat hello.js
module.exports = {
  handler: (event, context) => {
    console.log(event);
    return event.data;
  },
};
master:~$ kubeless function deploy hello --runtime nodejs6 --handler hello.handler --from-file hello.js
INFO[0000] Deploying function...
INFO[0000] Function hello submitted for deployment
INFO[0000] Check the deployment status executing 'kubeless function ls hello'
master:~$ kubeless function ls
NAME    NAMESPACE       HANDLER         RUNTIME         DEPENDENCIES    STATUS
hello   default         hello.handler   nodejs6                         1/1 READY
toy     default         toy.handler     python2.7                       1/1 READY
master:~$ kubeless function call hello --data '{"kubeless":"rocks"}'
{"kubeless":"rocks"}

7 Delete Function[ | ]

master:~$ kubeless function delete toy
master:~$ kubeless function delete hello
master:~$ kubectl get deployments,services
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   7m
문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}