前言
通過operator-sdk我們可以簡單的創建自己k8s應用。
官方的文檔其實已經很詳細了。這篇文章主要記錄了,在根據官方文檔一步步做的過程當中完整的一個過程。相比官方的文檔會更加詳細一些。
前提條件
一臺CentOS,物理機,虛擬機都可以。
安裝docker
# yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
# yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# yum install docker-ce docker-ce-cli containerd.io
# systemctl start docker
# systemctl enable docker
安裝go和dep
安裝operator-sdk前提是go已經安裝好了,並且需要用到dep安裝依賴,所以我們需要先安裝go和dep。其中gopath是go的工作目錄,可以是任意目錄,在配置中做相應的修改就行了。
# curl -LO https://dl.google.com/go/go1.12.5.linux-amd64.tar.gz
# tar zxf go1.12.5.linux-amd64.tar.gz
# mv go /usr/local/
# mkdir ~/gopath
# vi /root/.bash_profile
GOPATH=/root/gopath
export GOPATH
GOROOT=/usr/local/go
export GOROOT
PATH=$PATH:$HOME/bin:$GOPATH/bin:$GOROOT/bin
# curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
安裝operator-sdk
# yum -y install git
# RELEASE_VERSION=v0.8.0
# curl -OJL https://github.com/operator-framework/operator-sdk/releases/download/${RELEASE_VERSION}/operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu
# chmod +x operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu && sudo cp operator-# sdk-${RELEASE_VERSION}-x86_64-linux-gnu /usr/local/bin/operator-sdk && rm operator-# sdk-${RELEASE_VERSION}-x86_64-linux-gnu
#
# mkdir -p $GOPATH/src/github.com/operator-framework
# cd $GOPATH/src/github.com/operator-framework
# git clone https://github.com/operator-framework/operator-sdk
# cd operator-sdk
# git checkout master
# make dep
# make install
創建app-operator
安裝kubectl
# curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
# chmod +x ./kubectl
# mv ./kubectl /usr/local/bin/kubectl
配置git
# git config --global user.email [email protected]
# git config --global user.name "xxx"
創建app-operator
# mkdir -p $GOPATH/src/github.com/example-inc/
# cd $GOPATH/src/github.com/example-inc/
# export GO111MODULE=on
# operator-sdk new app-operator
# cd app-operator
# operator-sdk add api --api-version=app.example.com/v1alpha1 --kind=AppService
# operator-sdk add controller --api-version=app.example.com/v1alpha1 --kind=AppService
# go mod vendor
# operator-sdk build <your own docker registry>:latest
# docker push <your own docker registry>:latest
# sed -i 's|REPLACE_IMAGE|<your own docker registry>|g' deploy/operator.yaml
配置~/.kube/config,之後創建app-operator
# kubectl create -f deploy/service_account.yaml
# kubectl create -f deploy/role.yaml
# kubectl create -f deploy/role_binding.yaml
# kubectl create -f deploy/crds/app_v1alpha1_appservice_crd.yaml
# kubectl create -f deploy/operator.yaml
# kubectl create -f deploy/crds/app_v1alpha1_appservice_cr.yaml
如何創建app-operator
到此爲止我都成功跑完了,但是發現app-operator無法啓動起來。
經過調查發現原因是在容器中沒有app-operator這個用戶。這個問題記錄在https://github.com/operator-framework/operator-sdk/issues/1494
臨時的解決辦法很簡單,就是在Dockerfile中把最後一行去掉,然後重新編docker image並上傳。之後重新更新一下app-operator,就可以看到app-operator工作啦。
# cat build/Dockerfile
FROM registry.access.redhat.com/ubi7/ubi-minimal:latest
ENV OPERATOR=/usr/local/bin/app-operator \
USER_UID=1001 \
USER_NAME=app-operator
COPY build/_output/bin/app-operator ${OPERATOR}
COPY build/bin /usr/local/bin
RUN /usr/local/bin/user_setup
ENTRYPOINT ["/usr/local/bin/entrypoint"]
# operator-sdk build <your own docker registry>:latest
# docker push <your own docker registry>:latest
# kubectl delete -f deploy/operator.yaml
# kubectl create -f deploy/operator.yaml
# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/app-operator-75d9c94849-47dxm 1/1 Running 0 6m54s
pod/example-appservice-pod 1/1 Running 0 5m59s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/app-operator ClusterIP 10.108.153.204 <none> 8383/TCP 6m50s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 65d
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deployment.apps/app-operator 1 1 1 1 6m56s
NAME DESIRED CURRENT READY AGE
replicaset.apps/app-operator-75d9c94849 1 1 1 6m56s