11.4.2 基于Serving实现source-to-URL部署

此示例利用kaniko构建模板,在Kubernetes集群上执行源到容器的构建。首先使用kubectl安装kaniko manifest,如下所示:


cat <<EOF | kubectl create -f -
apiVersion: build.knative.dev/v1alpha1
kind: BuildTemplate
metadata:
  name: kaniko
spec:
  parameters:
  - name: IMAGE
    description: The name of the image to push
  - name: DOCKERFILE
    description: Path to the Dockerfile to build.
    default: /Dockerfile

  steps:
  - name: build-and-push
    image: registry.cn-hangzhou.aliyuncs.com/kaniko-project/executor
    args:
    - --dockerfile=${DOCKERFILE}
    - --destination=${IMAGE}
EOF

kaniko不依赖于Docker守护程序以及在用户空间中执行Dockerf ile中的每个命令。在无法容易或安全地运行Docker守护程序的环境中,kaniko就可以帮助构建容器映像,例如在标准Kubernetes集群中。kaniko通常以镜像形式运行,如果无法访问官方镜像gcr.io/kaniko-project/executor可以切换使用如下地址:registry.cn-hangzhou.aliyuncs.com/kaniko-project/executor。

通过以下命令可确认kaniko构建模板是否创建成功:


kubectl get buildtemplate
NAME     AGE
kaniko   16s

接下来,Knative大至执行以下步骤:

1)从GitHub中获取指定版本的代码,并将其构建到容器镜像中。

2)将容器镜像推送到Docker Hub。

3)为此版本的应用程序创建一个新的不可变修订版本。

4)为应用创建路由、入口Ingress、服务和负载均衡。

5)自动缩放pod(包括伸缩至零弹性能力)。

步骤1:创建一个新Secret资源定义,用于存储Docker Hub凭据,将此文件另存为dockersecret.yaml,如下所示:


apiVersion: v1
kind: Secret
metadata:
  name: basic-user-pass
  annotations:
    build.knative.dev/docker-0: https://index.docker.io/v1/
type: kubernetes.io/basic-auth
data:
  # 使用'echo -n“username”| base64'生成此字符串
  username: BASE64_ENCODED_USERNAME
  # 使用'echo -n“密码”| base64'生成此字符串
  password: BASE64_ENCODED_PASSWORD

在macOS或Linux计算机上,使用以下命令生成Secret所需的base64编码值:


$ echo -n "username" | base64 -w 0
dXNlcm5hbWU=

$ echo -n "password" | base64 -w 0
cGFzc3dvcmQ=

注意

如果在macOS上收到“invalid option-w”错误,请尝试使用该base64-b 0命令。

步骤2:创建一个新ServiceAccount清单,用于将构建过程链接到Secret。将此文件另存为service-account.yaml,如下所示:


apiVersion: v1
kind: ServiceAccount
metadata:
  name: build-bot-source-to-url
secrets:
  - name: basic-user-pass

创建上述文件后,使用kubectl将它们应用于你的集群,如下所示:


$ kubectl apply --filename docker-secret.yaml
secret "basic-user-pass" created
$ kubectl apply --filename service-account.yaml
serviceaccount "build-bot" created

步骤3:创建一个服务清单,用于定义要部署的服务,包括源代码的位置以及要使用的构建模板。创建一个名为的service.yaml文件并复制以下定义,确保{DOCKER_USERNAME}使用你自己的Docker Hub用户名进行替换:


apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  name: sample-source-to-url
  namespace: default
spec:
  runLatest:
    configuration:
      build:
        apiVersion: build.knative.dev/v1alpha1
        kind: Build
        spec:
          serviceAccountName: build-bot-source-to-url
          source:
            git:
              url: https://github.com/osswangxining/docker-helloworld-go.git
              revision: master
          template:
            name: kaniko
            arguments:
              - name: IMAGE
                value: docker.io/{DOCKER_USERNAME}/sample-source-to-url:latest
              - name: DOCKERFILE
                value: /Dockerfile  
      revisionTemplate:
        spec:
          container:
            image: {DOCKER_USERNAME}/sample-source-to-url:latest
            imagePullPolicy: Always
            env:
              - name: SIMPLE_MSG
                value: "Hello from the sample app (source-to-url)!"

步骤4:执行以下命令可以创建Knative服务,并继续观察执行情况:


kubectl create -f service.yaml
kubectl get pods --watch

一旦看到部署pod切换到运行状态,就说明容器现已完成构建和部署!使用如下命令检查服务的状态,获取服务对象并检查其状态:


kubectl get ksvc  sample-source-to-url -oyaml

通过如下命令可以查找服务的URL:


kubectl get ksvc  sample-source-to-url --output=custom-columns=NAME:.metadata.name,DOMAIN:.status.domain
NAME                   DOMAIN
sample-source-to-url   sample-source-to-url.default.example.com

步骤5:使用以下命令获取集群的入口IP:


kubectl get svc knative-ingressgateway --namespace istio-system

查找服务的URL,如下所示:


kubectl get ksvc  sample-source-to-url --output=custom-columns=NAME:.metadata.name,DOMAIN:.status.domain
NAME                   DOMAIN
sample-source-to-url   sample-source-to-url.default.example.com

步骤6:现在,你可以向应用发出请求来查看结果。将{IP_ADDRESS}替换为你在上一步中获得的地址,如下所示:


curl -H "Host: sample-source-to-url.default.example.com" http://{IP_ADDRESS}
<h1>Hello from the sample app (source-to-url)!</h1>

步骤7:要从集群中删除示例应用程序,请删除服务记录。执行如下命令可以删除Knative服务:


kubectl delete ksvc sample-source-to-url