开发手册-从零构建operator(三)容器化部署

生成controller镜像

接下来我们把生成的执行文件打成docker镜像。

make docker-build IMG=registry.inspur.com/znbase-controller
或者
docker build -t registry.inspur.com/znbase-controller

如果能看到如下信息,说明镜像生成成功了

make docker-build
/home/chensj/code/znbase-operator/bin/controller-gen "crd:trivialVersions=true,preserveUnknownFields=false" rbac:roleName=manager-role webhook paths="./..." output:crd:artifacts:config=config/crd/bases
...
docker build -t controller:latest .
Sending build context to Docker daemon  299.2MB
Step 1/14 : FROM golang:1.16 as builder
 ---> f69b4d4a2ed1
...
Step 14/14 : ENTRYPOINT ["/manager"]
 ---> Using cache
 ---> 98ddb375f1c1
Successfully built 98ddb375f1c1
Successfully tagged registry.inspur.com/znbase-controller:latest

从日志上可知,docker-build分成编译和构建镜像两部分,首先使用golang:1.xx镜像编译工程,然后在基于镜像gcr.io/distroless/static:noroot构建工程镜像。
需要注意是golang镜像没有设置代理,需要在dockerfile中手动设置一下golang代理,如下:

COPY go.sum go.sum
+RUN go env -w GOPROXY=https://goproxy.cn,direct

查看镜像

执行命令docker images,可以看到如下信息:

$ docker images

REPOSITORY                                 TAG       IMAGE ID       CREATED        SIZE
registry.inspur.com/znbase-controller      latest    98ddb375f1c1   2 days ago     45.6MB
golang                                     1.16      f69b4d4a2ed1   2 weeks ago    862MB
gcr.io/distroless/static                   nonroot   ab737430e80b   51 years ago   1.82MB
...

其中:

  • 镜像registry.inspur.com/znbase-controller:latest,是我们需要的controller镜像文件,
  • 镜像golang:1.16,是编译基础镜像
  • 镜像gcr.io/distroless/static:nonroot,是google提供的基础镜像,由于的墙的存在有可能无法下载该镜像。可以通过手动下载或在dockfile中替换其他linux基础镜像,比如registry.access.redhat.com/ubi8/ubi-minimal:latest

发布controller镜像

自动发布

为了能将controller部署到kubernetes集群,我们需要执行如下命令,将上面生成的镜像部署到仓库中。

make docker-push IMG=registry.inspur.com/znbase-controller

其中registry.inspur.com代表我们自己搭建镜像仓库的域名,需要注意的是本地必须有上传该仓库的权限。

手动发布

由于我们没有搭建镜像仓库,所以这里我们手动将controller的镜像加载到各个kubernetes服务器上。
执行如下命令,保存镜像文件

docker save registry.inspur.com/znbase-controller:latest | gzip > znbase-controller.tar.gz

如下所示,znbase-controller.tar.gz就是我们保存到本地的镜像文件。

~/tmp$ ll -h
总用量 18M
drwxrwxr-x  2 xxx xxx 4.0K 8月   2 09:21 ./
drwxr-xr-x 26 xxx xxx 4.0K 8月   2 08:57 ../
-rw-rw-r--  1 xxx xxx  18M 8月   2 09:21 znbase-controller.tar.gz

手动上传镜像文件到各个kubernetes服务

~/tmp$ scp znbase-controller.tar.gz root@192.168.56.131:/tmp
root@192.168.56.131's password: 
znbase-controller.tar.gz 
...

在kubernetes各个服务器上手动加载镜像

~/tmp$ ssh root@192.168.56.131 docker load -i /tmp/znbase-controller.tar.gz
root@192.168.56.131's password: 
Loaded image: registry.inspur.com/znbase-controller:latest
...

部署

认证容器

默认情况下,部署的pod包含两个容器,除了我们的controller以外,还注入了一个metric认证容器gcr.io/kubebuilder/kube-rbac-proxy
为了简化问题,我们暂时先去掉该容器。

修改config/default/kustomization.yaml文件,注释掉proxy patch,如下:

patchesStrategicMerge:
# Protect the /metrics endpoint by putting it behind auth.
# If you want your controller-manager to expose the /metrics
# endpoint w/o any authn/z, please comment the following line.
-- manager_auth_proxy_patch.yaml
+#- manager_auth_proxy_patch.yaml

修改拉取镜像方式

默认情况下,脚手架生成的部署yaml文件不指定镜像拉取方式。当镜像标签为lastest时,kubernetes采用的策略是Always,所以我们需要简单的修改一下,否则将有可能导致无法拉取镜像。修改config/manager/manager.yaml文件,添加镜像拉取方式如下:

image: controller:latest
+imagePullPolicy: IfNotPresent

部署

make deploy IMG=registry.inspur.com/znbase-controller

如看到如下信息,说明部署成功

$ make deploy IMG=registry.inspur.com/znbase-controller

/home/chensj/code/znbase-operator/bin/controller-gen "crd:trivialVersions=true,preserveUnknownFields=false" rbac:roleName=manager-role webhook paths="./..." output:crd:artifacts:config=config/crd/bases
cd config/manager && /home/chensj/code/znbase-operator/bin/kustomize edit set image controller=registry.inspur.com/znbase-controller
/home/chensj/code/znbase-operator/bin/kustomize build config/default | kubectl apply -f -
namespace/znbase-operator-system created
customresourcedefinition.apiextensions.k8s.io/znbaseclusters.znbase.inspur.com created
serviceaccount/znbase-operator-controller-manager created
role.rbac.authorization.k8s.io/znbase-operator-leader-election-role created
clusterrole.rbac.authorization.k8s.io/znbase-operator-manager-role created
clusterrole.rbac.authorization.k8s.io/znbase-operator-metrics-reader created
clusterrole.rbac.authorization.k8s.io/znbase-operator-proxy-role created
rolebinding.rbac.authorization.k8s.io/znbase-operator-leader-election-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/znbase-operator-manager-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/znbase-operator-proxy-rolebinding created
configmap/znbase-operator-manager-config created
service/znbase-operator-controller-manager-metrics-service created
deployment.apps/znbase-operator-controller-manager created

查看状态

查看controller pod状态,通过如下命令,可以看到pod已正常运行。

kubectl get pod  -n znbase-operator-system
NAME                                                  READY   STATUS    RESTARTS   AGE
znbase-operator-controller-manager-5d7bddb495-z64fg   1/1     Running   0          12m

至此我们第一个operator部署完成!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值