Knative Serving

Install serving

kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.18.0/serving-crds.yaml
kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.18.0/serving-core.yaml
kubectl apply -f https://github.com/knative/net-kourier/releases/download/knative-v1.18.0/kourier.yaml

kubectl patch configmap/config-network \
  --namespace knative-serving \
  --type merge \
  --patch '{"data":{"ingress-class":"kourier.ingress.networking.knative.dev"}}'

Verify:

$ kubectl get pods -n knative-serving
NAME                                      READY   STATUS    RESTARTS   AGE
activator-cbf5b6b55-wbmf2                 1/1     Running   0          3m7s
autoscaler-c5d454c88-5zncq                1/1     Running   0          3m7s
controller-84f96b7676-p26gh               1/1     Running   0          3m7s
net-kourier-controller-5bf7f49cc8-5dc9r   1/1     Running   0          2m44s
webhook-75d4fb6db5-cmvjl                  1/1     Running   0          3m7s

verify kourier:

$ kubectl --namespace kourier-system get service kourier
NAME      TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
kourier   LoadBalancer   10.106.110.17   <pending>     80:30288/TCP,443:32450/TCP   3m53s

Configure DNS

kubectl patch configmap/config-domain \
  --namespace knative-serving \
  --type merge \
  --patch '{"data":{"api.quillgen.com":""}}'

Install eventing

kubectl apply -f https://github.com/knative/eventing/releases/download/knative-v1.18.0/eventing-crds.yaml
kubectl apply -f https://github.com/knative/eventing/releases/download/knative-v1.18.0/eventing-core.yaml
$ kubectl get pods -n knative-eventing
NAME                                   READY   STATUS    RESTARTS   AGE
eventing-controller-674c57ddb7-wrt4h   1/1     Running   0          9m25s
eventing-webhook-6d86554d4d-v5r5t      1/1     Running   0          9m25s
job-sink-5fdf4b8c5c-gjlts              1/1     Running   0          9m25s

CLI

wget https://github.com/knative/client/releases/download/knative-v1.18.0/kn-linux-amd64
wget https://github.com/knative/func/releases/download/knative-v1.18.1/func_linux_amd64

sudo install kn-linux-amd64 /usr/local/bin/kn
sudo install func_linux_amd64 /usr/local/bin/func

Test hello world

$ func create -l node helloworld
$ cd helloworld
$ func build
A registry for function images is required. For example, 'docker.io/tigerteam'.
? Registry for function images: docker.io/yai42
Note: building a function the first time will take longer than subsequent builds
Building function image
Still building
Still building
🙌 Function built: index.docker.io/yai42/helloworld:latest

// https://hub.docker.com/repository/docker/yai42/helloworld

$ func deploy
function up-to-date. Force rebuild with --build
Please provide credentials for image repository 'index.docker.io/yai42/helloworld'.
? Username: yai42
? Password: ************************************
Credentials will not be saved.

..

trouble shotting:

$ kubectl get ksvc helloworld
NAME         URL                                          LATESTCREATED      LATESTREADY        READY     REASON
helloworld   http://helloworld.default.api.quillgen.com   helloworld-00001   helloworld-00001   Unknown   IngressNotConfigured

must set ingress to kourier:

kubectl get configmap/config-network -n knative-serving -o yaml | grep ingress

Install metallb if external ip not configured, or change it to NodePort:

$ kubectl --namespace kourier-system get service kouriervice kourier
NAME      TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
kourier   LoadBalancer   10.106.110.17   172.20.0.0    80:30288/TCP,443:32450/TCP   118m

Expected:

$ kubectl --namespace kourier-system get service kouriervice kourier
NAME      TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
kourier   LoadBalancer   10.106.110.17   172.20.0.0    80:30288/TCP,443:32450/TCP   118m

$ kubectl get ksvc helloworld
NAME         URL                                          LATESTCREATED      LATESTREADY        READY   REASON
helloworld   http://helloworld.default.api.quillgen.com   helloworld-00001   helloworld-00001   True

$ func list
NAME        NAMESPACE  RUNTIME  URL                                         READY
helloworld  default             http://helloworld.default.api.quillgen.com  True

$ curl -H "Host: helloworld.default.api.quillgen.com" http://172.20.0.0
{"query":{}}