wayne編譯支持k8s1.16+

語言: CN / TW / HK

GitHub: https://github.com/Qihoo360/wayne

文檔: 由於wayne 官方文檔鏈接已經失效了,我們可以通過這裏查看 wayne 文檔 , 除了這個地方,我們詢問之前開發者是還有一個地方存有官方文檔的。 https://github.com/Qihoo360/cloud-website 這個地方存有歷史官網文檔。

目錄

      • 使用dockerhub 上面最新的
  • 四、中途遇到的問題和一些思考
    • 登錄無效參數 Invalid Param
    • 版本未找到, 也就是tag 未指定。

一、wayne 構建原因

wayne 自己構建的原因: 由於1.8.5 和 1.8.6 是不支持 k8s 高一點的版本(1.16+)。 由於我們近期新項目使用了的k8s 版本是 1.20 我們在我們老的 wayne 版本上是不支持的.

1.1 、老版本報錯內容

具體現象就是: 點擊發布提示沒有找到對應的資源,後端報錯。

E1220 17:35:19.031666       1 reflector.go:126] pkg/mod/k8s.io/[email protected]+incompatible/tools/cache/reflector.go:94: Failed to list *v1beta1.DaemonSet: the server could not find the requested resource
E1220 17:35:19.031758       1 reflector.go:126] pkg/mod/k8s.io/[email protected]+incompatible/tools/cache/reflector.go:94: Failed to list *v1beta1.StatefulSet: the server could not find the requested resource
E1220 17:35:19.035617       1 reflector.go:126] pkg/mod/k8s.io/[email protected]+incompatible/tools/cache/reflector.go:94: Failed to list *v1beta1.Deployment: the server could not find the requested resource
E1220 17:35:19.073638       1 reflector.go:126] pkg/mod/k8s.io/[email protected]+incompatible/tools/cache/reflector.go:94: Failed to list *v1beta1.ReplicaSet: the server could not find the requested resource
E1220 17:35:19.073648       1 reflector.go:126] pkg/mod/k8s.io/[email protected]+incompatible/tools/cache/reflector.go:94: Failed to list *v1beta1.ReplicaSet: the server could not find the requested resource

1.2 、wayne 官方

支持1.16+ 代碼 issue: https://github.com/Qihoo360/wayne/pull/565, 也合併到master了,前後端都有更新, 但是目前看 wayne-frontend前端鏡像 是沒有更新的。 後端鏡像是有更新的,

二、構建步驟

目前我們的策略是, 前端鏡像自己構建,後端鏡像使用 dockerhub 上面的 latest。

2.1 、前端鏡像

構建需要環境:

  1. docker 需要安裝

    yum install -y yum-utils \
      device-mapper-persistent-data \
      lvm2
    # 阿里的源,國內使用較快
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    # 生成緩存
    yum makecache
    # 安裝最新穩定版本 Docker CE 
    yum install docker-ce docker-ce-cli containerd.io    
    systemctl start docker
  2. git 需要安裝

    yum install git -y
  3. 拉取代碼

    1. 拉取

      cd /opt && git clone https://github.com/Qihoo360/wayne.git
      cd wayne
      git submodule update --init --recursive  # 這個必須執行,首次執行會有輸出,如果沒有輸出的話,那麼從新拉取下,然後執行。
    2. 使用down zip 方式不要使用這個,這個存在一些問題。

  4. 我們看下 Makefile

    .PHONY: run-backend run-worker run-frontend syncdb release
    
    MAKEFLAGS += --warn-undefined-variables
    
    # Build variables
    REGISTRY_URI :=360cloud
    RELEASE_VERSION :=$(shell git describe --always --tags)
    UI_BUILD_VERSION :=v1.0.2
    SERVER_BUILD_VERSION :=v1.0.2
    
    update-version:
    	./hack/updateversion.sh
    
    # run module
    run-backend:
    	cd src/backend/ && go run main.go
    
    run-frontend:
    	cd src/frontend/ && npm start
    
    # dev
    syncdb:
    	go run src/backend/database/syncdb.go orm syncdb
    
    sqlall:
    	go run src/backend/database/syncdb.go orm sqlall > _dev/wayne.sql
    
    initdata:
    	go run src/backend/database/generatedata/main.go > _dev/wayne-data.sql
    
    swagger-openapi:
    	cd src/backend && swagger generate spec -o ./swagger/openapi.swagger.json
    
    ## server builder image
    build-server-image:
    	docker build --no-cache -t $(REGISTRY_URI)/wayne-server-builder:$(SERVER_BUILD_VERSION) -f hack/build/server/Dockerfile .
    
    ## ui builder image
    build-ui-image:
    	docker build --no-cache -t $(REGISTRY_URI)/wayne-ui-builder:$(UI_BUILD_VERSION) -f hack/build/ui/Dockerfile .
    
    # release, requiring Docker 17.05 or higher on the daemon and client
    build-backend-image:
    	@echo "version: $(RELEASE_VERSION)"
    	docker build --no-cache -t $(REGISTRY_URI)/wayne-backend:$(RELEASE_VERSION) .
    
    build-frontend-image:
    	@echo "version: $(RELEASE_VERSION)"
    	docker build --no-cache -t $(REGISTRY_URI)/wayne-frontend:$(RELEASE_VERSION) -f hack/build/frontend/Dockerfile .
    
    push-image:
    	docker tag $(REGISTRY_URI)/wayne-backend:$(RELEASE_VERSION) $(REGISTRY_URI)/wayne-backend:latest
    	docker push $(REGISTRY_URI)/wayne-backend:$(RELEASE_VERSION)
    	docker push $(REGISTRY_URI)/wayne-backend:latest
    	docker tag $(REGISTRY_URI)/wayne-frontend:$(RELEASE_VERSION) $(REGISTRY_URI)/wayne-frontend:latest
    	docker push $(REGISTRY_URI)/wayne-frontend:$(RELEASE_VERSION)
    	docker push $(REGISTRY_URI)/wayne-frontend:latest

    我們找到 build-frontend-image , 我們可以看到是使用了 ./hack/build/frontend/Dockerfile

    # requiring Docker 17.05 or higher on the daemon and client
    # see https://docs.docker.com/develop/develop-images/multistage-build/
    # BUILD COMMAND :
    # docker --build-arg RELEASE_VERSION=v1.0.0 -t infra/wayne:v1.0.0 .
    
    # build ui
    FROM 360cloud/wayne-ui-builder:v1.0.2 as frontend
    
    COPY src/frontend /workspace
    
    RUN cd /workspace && \
        npm run build:aot
    
    # build server
    FROM openresty/openresty:1.15.8.1-1-centos
    
    COPY --from=frontend /workspace/dist/ /usr/local/openresty/nginx/html/
    
    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
        sed -i '/index  index.html index.htm;/a\        try_files $uri $uri/ /index.html;' /etc/nginx/conf.d/default.conf
    
    CMD ["/usr/local/openresty/bin/openresty", "-g", "daemon off;"]

    看這個dockerfile ,我們會發現,這個鏡像的構建是通過將src 的源碼,然後 npm run build 進行構建,然後將構建好了包,然後拷貝到openresty 鏡像了。

    如果拉取鏡像慢的話,網上找下教程。

    配置 163 鏡像源

    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
    "registry-mirrors": ["http://hub-mirror.c.163.com"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
  5. 構建前端鏡像

    make  build-frontend-image

    如果遇到一些問題,可以看末尾。

  6. 給鏡像增加tag,上傳至 dockerhub

    docker pull djxslp/wayne-frontend:latest  # 這個是我已經構建好了的鏡像。是自己基於github 代碼的master 分支編譯的(2021.12.21 15:00)

2.1 、後端鏡像

使用dockerhub 上面最新的

360cloud/wayne-backend:latest

自己構建

Dockerfile 的內容

# requiring Docker 17.05 or higher on the daemon and client
# see https://docs.docker.com/develop/develop-images/multistage-build/
# BUILD COMMAND :
# docker --build-arg RELEASE_VERSION=v1.0.0 -t infra/wayne:v1.0.0 .

# build server
FROM 360cloud/wayne-server-builder:v1.0.2 as backend

COPY go.mod /go/src/github.com/Qihoo360/wayne
COPY go.sum /go/src/github.com/Qihoo360/wayne
COPY src/backend /go/src/github.com/Qihoo360/wayne/src/backend

RUN export GO111MODULE=on && \
    export GOPROXY=https://goproxy.io && \
    cd /go/src/github.com/Qihoo360/wayne/src/backend && \
    bee generate docs && \
    bee pack -o /_build

# build release image
FROM 360cloud/centos:7

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

COPY --from=backend /_build/backend.tar.gz /opt/wayne/

WORKDIR /opt/wayne/

RUN tar -xzvf backend.tar.gz

CMD ["./backend"

構建命令

make  build-backend-image

自己構建的

docker pull djxslp/wayne-backend:latest  # 是自己基於github 代碼的master 分支編譯的(2021.12.21 15:00),最終容器內的監聽端口是 8081, 需要注意下。

三、配置和數據庫導入

基於 docker-compose 部署, cd hack/docker-compose/

3.1 、前端配置

./conf/config.js

window.CONFIG = {
    URL: 'http://yourip:8080',
    RAVEN: false,
    RAVEN_DSN: 'RAVEN_DSN'
};

需要改的參數 URL : 值為需要為後端後面綁定的域名,示例: https://backend-wayne.baidu.com

3.2、後端配置

./conf/app.conf

必須需要修改的:數據庫配置,其他的可以根據情況進行配置。

## mysql
DBName = "wayne"
DBTns = "tcp(127.0.0.1:3306)"
DBUser = "wayne"
DBPasswd = "123456"
DBLoc = "Asia%2FShanghai"
DBConnTTL = 30

3.3 、數據庫導入

  1. 後端數據庫
    1. 手動導入, 我把一個剛安裝的數據庫導出了。 鏈接: https://djxblog.oss-cn-shenzhen.aliyuncs.com/picture/typora/wayne.sql
    2. 程序自動創建, 這個需要給到一個較高的權限,且 wayne 庫原本不存在,如果庫存在,則不會進行自動創建。

3.4、 啟動服務

  1. 安裝docker-compose

    curl -L https://github.com/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose
  2. 啟動服務

    cd  hack/docker-compose
    docker-compose up -d

四、中途遇到的問題和一些思考

登錄無效參數 Invalid Param

問題原因:

https://github.com/Qihoo360/wayne/pull/578

之前版本(1.8.5/1.8.6), 用户名和密碼都是在 URL 中的,也就是如圖所示,現在新的版本是改為JSON 了。

版本未找到, 也就是tag 未指定。

[root@ops-pinpoint-185 wayne]# make  build-frontend-image
fatal: Not a valid object name HEAD
version: 
docker build --no-cache -t 360cloud/wayne-frontend: -f hack/build/frontend/Dockerfile .
invalid argument "360cloud/wayne-frontend:" for "-t, --tag" flag: invalid reference format
See 'docker build --help'.

我們直接在 Makefile 裏面寫死版本。

RELEASE_VERSION :=v1.8.7.1