此示例利用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