OpenShift

800 阅读5分钟

写在前面

为方便阅读和理解文档内容, 请尽量先学习 docker 的基础知识、k8s各组件的功能和应用场景。

一、目录结构

[APP_NAME]/ ----------------------- 项目目录
├── deploy/ ----------------------- 部署文件目录
│   └── [env]/ -------------------- 环境目录
│       ├── Dockerfile ------------ Dockerfile文件
│       └── configmap/ ------------ 配置文件目录
│           └─ bootstrap.yml ------ 配置文件
├── src/ -------------------------- 源代码根目录
├── target/ ----------------------- maven打包 [APP_NAME].jar 目录
│   └── [APP_NAME].jar ------------ 应用 jar 包

以此目录结构讲解, APP_NAME 为应用名称

二、oc 安装和登陆

1.安装 oc

  • 下载链接:

  • 将下载好的 oc 可执行文件配置到环境变量方便命令执行(具体可以百度各系统环境变量配置的步骤):

    windows: 将oc添加到环境变量
    linux: 
        1.设置 oc 可执行的权限 chmod +x oc
        2.环境变量配置
          方式一: 将oc文件放置 /use/local/bin 目录下
          方式二: 配置 .profile 文件
    

2.平台访问

  • 命令行登陆

    oc login -u [用户名] -p [密码] --server=地址
    
  • 名称空间 name-spacce

    # 查看所有
    oc get projects
    
    # 查看当前
    oc project
    
    # 切换
    oc project [project_name]
    

三、部署环境搭建步骤

  • 打开命令行, 切换到 APP_NAME 目录(目录结构在文档开头列出来了)

    cd [APP_NAME]/deploy/[env]/
    
  • 创建应用

    oc new-app --name [APP_NAME] --binary --strategy=docker
    
  • 配置文件的挂载(结合项目实际使用场景, 是否需要)

    # 将configmap文件夹下的配置文件创建成一个configmap
    oc create configmap [ConfigMapName] --from-file ./configmap
    
    # 挂载配置到应用
    oc set volume dc/[APP_NAME] --add --mount-path=/deployments/config --configmap-name=[ConfigMapName]
    
  • 日志持久卷挂载

    # 命令(或者直接从控制台创建)
    oc apply -f ./log-pvc.yaml
    
    # 内容如下:
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: [pvc_name]
      namespace: [project_name]
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: [空间分配大小, 单位: Mi 或 Gi]
      storageClassName: [StorageClass名称]
      volumeMode: Filesystem
    
    # volume 挂载pvc
    oc set volume dc/[APP_NAME] --add --mount-path=/deployments/logs --claim-name=[pvc_name]
    
  • 暴露 service

    # 命令:
    oc expose dc/[APP_NAME] --port=[server端口] --target-port=[容器内服务的端口]
    # 例如:
    oc expose dc/integral-server --port=80 --target-port=8080
    
  • 暴露供k8s集群外访问的域名

    # 命令:
    oc expose svc/[SVC_NAME]
    # 例如:
    oc expose svc/integral-server
    

四、应用部署

1.测试

  • 打开命令行

    cd [APP_NAME]/deploy/[env]/
    
  • build上传应用(上传 -> build成镜像 -> 部署 -> 启动)

    # 将打包后的.jar文件复制到[APP_NAME]/deploy/[env]/目录
    cp ../../target/[APP_NAME].jar ./
    
    # 上传、build镜像、初始化容器、部署启动一体化操作
    oc start-build [APP_NAME] --from-dir ./
    
  • 查看 build

    # 查看 build 日志
    oc logs -f bc/[APP_NAME]
    
    # 查看 build 列表
    oc get build 或者 oc get build -w
    
    # 列表结果如下(Running: 正在运行; Complete: build成功):
    NAME            TYPE     FROM     STATUS     STARTED       DURATION
    app-name        Docker   Binary   Complete   5 hours ago   3m10s
    

2.UAT、生产

  • 创建应用(仅第一次需要)

    # 命令:
    oc new-app --name=[APP_NAME] --image=imagestream
    
    # imagestream 可以通过 oc get is 查看
    oc get is
    
  • 拉取 image (从镜像仓库拉取稳定的测试或者UAT环境镜像到生产)

    # 命令:
    oc import-image [APP_NAME:TAG] --from=[IMAGE REPOSITORY:latest] --confirm --reference-policy=local
    
    # 例如:
    oc import-image integral-server:1.0.0 --from=default-route-openshift-image-registry.caas.ccic-test.com.cn/baodai-bxmxapp-test/integral-server:latest --confirm --reference-policy=local
    

    "reference-policy" 必须是"local"(这样才会把测试的镜像拉到生产. 否则只是打了个标记, 还是会从test去拉镜像, 但是测试一不稳定, 二会定期清理镜像)

  • 将拉取到生产的 tag 打成 latest

    # 命令
    oc tag serverImageStream:tagVersion serverImageStream:latest --reference-policy=local
    
    # 例如:
    oc tag integral-server:1.0.0 integral-server:latest --reference-policy=local
    
  • 发布应用, triggers 为手动模式(manual)下, 生产镜像变更不会自动生效, 需要手动发布

    # 命令:
    oc rollout latest dc/<dc_name>
    
    # 例如:
    oc rollout latest dc/integral-server 
    oc rollout latest dc/nginx 
    
  • 查看 pod

    # 查看部署进度
    oc logs -f dc/[APP_NAME]
    
    # 查看 pod 列表
    oc get pod
    oc get pod -w
    oc get pod -o wide
    
    # 列表结果如下(NAME=[APP_NAME]-[version]-[随机字符串]):
    NAME                   READY   STATUS      RESTARTS   AGE
    [APP_NAME]-1-gcnjk     1/1     Running     0          4h33m(pod容器 node1)
    [APP_NAME]-1-jkdh9     1/1     Running     0          120m(pod容器 node2)
    

五、其他 oc 命令(具体可以参考 kubectl 命令, 并结合 oc --help )

  • triggers 策略(configmap、imagestream 发生改变时自动更新部署pod)

    # 手动模式
    oc set triggers dc/[APP_NAME] --manual
    # 自动
    oc set triggers dc/[APP_NAME] --auto
    
  • pod 扩缩容

    # DeploymentConfig 扩缩容
    oc scale --replicas=集群数 dc/[APP_NAME]
    # 举例
    oc scale --replicas=2 dc/gateway-server
    
    # StatefulSet 扩缩容
    oc scale --replicas=集群数 sts/[APP_NAME]
    # 举例
    oc scale --replicas=3 sts/nacos
    
  • 查看信息( PodDeploymentConfigServiceRouteBuildBuildConfigPersistentVolumeClaimsConfigMapImageStream )

    oc get pod | dc | svc 或者 service | route | build | bc | pvc | cm | is 或者 imagestream
    举例: oc get pod 或者 oc get pod -o wide
    
  • 查看组件 yaml 文件信息

    # 例子1(查看dc):
    oc get dc/gateway-server -o yaml
    
    # 例子2(查看svc):
    oc get svc/gateway-server -o yaml
    
    # 例子3(查看route:
    oc get route/gateway-server -o yaml
    
  • 查看详细信息

    oc describe pod | dc | svc 或者 service | route | build | bc | pvc | cm | is 或者 imagestream [name]
    举例: oc describe pod [pod_name]
    
  • 进入 pod

    oc exec -it [pod_name] /bin/bash
    
  • 查看 pod 日志

    oc logs -f [pod_name]
    
  • 文件导入/导出

    # 命令
    oc cp [pod]:{容积内文件路径} {本地电脑路径}
    
    # 例如:
    ## 导出容器内某个目录的所有文件到本地当前目录
    oc cp integral-server-uh49f:/deployments/logs/ ./
    
    ## 导出容器内某个指定文件到本地当前目录
    oc cp integral-server-uh49f:/deployments/logs/integral-server-uh49f/info.log ./
    
    ## 从本地将目录copy到容器
    oc cp ./bdproplatview nginx-1-8rm49:/opt/app-root/src
    
    ## 从本地将文件copy到容器
    oc cp ./index.html nginx-1-8rm49:/opt/app-root/src/bdproplatview/
    
  • apply 命令

    # apply 除了能添加 svc、route 之外还可以添加其他的k8s组件, *.yaml 文件中 kind 区分组件的类型
    oc apply -f [name].yaml
    

六、参数设置

  • 参数设置方式如下

    # 方式1: Dockerfile 中添加 ENV key=value
    # 方式2: 通过命令 oc set env dc/[APP_NAME] key=value .... (可设置多个)
    # 方式3: 进入平台 DeploymentConfig 添加 Environment -> env
    

    如果都有配置则优先级为: 方式1 < 方式2 < 方式3

  • 系统参数设置

    # 1.容器时区
        方式1: ENV TZ="Asia/Shanghai"
        方式2: oc set env dc/[APP_NAME] TZ=Asia/Shanghai
    # 2.语言设置
        方式1: ENV LANG="en_US.UTF-8"
        方式2: oc set env dc/[APP_NAME] LANG="en_US.UTF-8"