生成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部署完成!