前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >K8S数据迁移方法

K8S数据迁移方法

原创
作者头像
Portworx
修改于 2019-11-29 10:10:58
修改于 2019-11-29 10:10:58
2.1K0
举报

场景介绍

在网络会议、双人视频通话等场景时,将手机横屏、竖屏放置场景下,实现本地和远端都可以看到正常的画面效果。

效果演示

当左边手机进行旋转时,即进行横屏推流,右边手机的小画面订阅到的远端流,动态调整view进行适配,避免出现黑边;

当两端手机都进行旋转时,两端都进行横屏推流,各自订阅的远端流画面进行动态调整view;

无论如何旋转手机,两端看到的画面都是正的。

(大画面:本地摄像头; 小画面:远端流)

实现逻辑

推流端

1)开启 SDK 重力感应,默认就是开启的,如果关闭了,请调用接口打开 SDK 重力感应

2)监听手机旋转角度

3)根据不同的旋转角度,设置视频编码参数,即横屏/竖屏编码

4)发送 SEI 消息,告知房间内其他用户,当前是横屏还是竖屏

5)根据不同的旋转角度,旋转自己订阅的远端流的画面

6)根据不同的旋转角度,来调整 activity 为横屏或竖屏

拉流端

1)收到远端用户的第一帧视频,根据宽高数据,调整渲染远端流的 view 宽高,避免小窗口出现黑边

2)当推流端旋转手机时,可以收到发送的 SEI 消息,根据传递过来的横屏或竖屏,调整渲染远端流的 view 宽高,避免出现黑边

代码逻辑

1)TRTC SDK 版本号

这里可以指定使用 9.5.11347 版本的 SDK,体验下效果。

SDK 发布日志历史:参考文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
com.tencent.liteav:LiteAVSDK_TRTC:9.5.11347

2)修改清单文件

android:configChanges 避免重新启动 activity

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<activity 
    android:name="com.tencent.trtc.videocall.VideoCallingActivity"
    android:configChanges="orientation|keyboard|layoutDirection|screenSize"
    android:screenOrientation="portrait"
    />

3)开启重力感应

setGSensorMode 设置重力感应接口,默认开启,默认值为 TRTCGSensorMode_UIAutoLayout

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mTRTCCloud.setGSensorMode(TRTCCloudDef.TRTC_GSENSOR_MODE_UIAUTOLAYOUT);

4)监听手机的旋转

当手机旋转时,如:90度、180度、270度时,需要将 activity 调整设置对应的 横屏或竖屏

使用 OrientationEventListener 实时监听手机的旋转角度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 获取到手机旋转的角度,取四个方向:0、90、180、270度
 * @param orientation 0、90、180、270度
 */
@Override
public void onOrientationChanged(int orientation) {
    // 手机平放,获取不到旋转角度
    if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) {
        return;
    }

    // 获取手机旋转角度 : 0
    if (orientation > 350 || orientation < 10) {
        // 在当前旋转角度下,仅调用一次,切换角度后再去调用
        if (!isCall(0)) {
            // 根据旋转的角度,调整推流编码、发送SEI、调整渲染的view、activity方向
            adjustVideoEnc(0);
        }
    // 获取手机旋转角度 : 90
    } else if (orientation > 80 &amp;&amp; orientation < 100) {
        // 在当前旋转角度下,仅调用一次,切换角度后再去调用
        if (!isCall(90)) {
            // 根据旋转的角度,调整推流编码、发送SEI、调整渲染的view、activity方向
            adjustVideoEnc(90);
        }
    // 获取手机旋转角度 : 180
    } else if (orientation > 170 &amp;&amp; orientation < 190) {
        // 在当前旋转角度下,仅调用一次,切换角度后再去调用
        if (!isCall(180)) {
            // 根据旋转的角度,调整推流编码、发送SEI、调整渲染的view、activity方向
            adjustVideoEnc(180);
        }
    // 获取手机旋转角度 : 270
    } else if (orientation > 260 &amp;&amp; orientation < 280) {
        // 在当前旋转角度下,仅调用一次,切换角度后再去调用
        if (!isCall(270)) {
            // 根据旋转的角度,调整推流编码、发送SEI、调整渲染的view、activity方向
            adjustVideoEnc(270);
        }
    }
}

手机的旋转角度事件,非常频繁,避免重复调用,需要控制下请求:

(这里仅是示例,根据实际需要进行调整逻辑!)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 在指定旋转角度,是否已经操作了,避免连续在同一个旋转角度操作多次
 * @param mOrientation 0、90、180、270度
 * @return true: 之前一次已经操作过了,不要再次操作了;  false:之前一次没操作过,你去操作吧
 */
public boolean isCall(int mOrientation) {
    Boolean flag = mRotationCall.get(mOrientation);
    if (flag == null) {
        flag = false;
    }

    switch (mOrientation) {
        case 0:
            mRotationCall.put(0, true);
            mRotationCall.put(90, false);
            mRotationCall.put(180, false);
            mRotationCall.put(270, false);
            break;
        case 90:
            mRotationCall.put(0, false);
            mRotationCall.put(90, true);
            mRotationCall.put(180, false);
            mRotationCall.put(270, false);
            break;
        case 180:
            mRotationCall.put(0, false);
            mRotationCall.put(90, false);
            mRotationCall.put(180, true);
            mRotationCall.put(270, false);
            break;
        case 270:
            mRotationCall.put(0, false);
            mRotationCall.put(90, false);
            mRotationCall.put(180, false);
            mRotationCall.put(270, true);
            break;
        default:
            break;
    }
    return flag;
}

5)根据不同的旋转角度,调整编码参数、发送SEI消息、旋转远端用户的画面、activity横竖屏

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 1)推到远端流的编码参数
 *    1.1)如果是竖屏,就设置竖屏的编码参数
 *    1.2)如果是横屏,就设置横屏的编码参数
 * 2)发送 SEI 消息
 *    1.1)如果当前是横屏推流,就告诉房间内其他人,我当前在推横屏
 *        1.1.1)房间内其他用户收到后,调整对应用户的 view 的宽高比,避免出现黑边
 *    1.2)如果当前是竖屏推流,就告诉房间内其他人,我当前在推竖屏
 *        1.1.1)房间内其他用户收到后,调整对应用户的 view 的宽高比,避免出现黑边
 * 3)旋转远端用户的画面
 *    3.1)我当前拉取到了其他人的流,我当前切换成 横屏/竖屏 ,需要旋转远端用户的画面,避免方向不一致
 * 4)设置当前 activity 横屏 或 竖屏
 * @param mOrientation 旋转的角度,如:0 90 180 270
 */
public void adjustVideoEnc(int mOrientation) {
    // 本地画面旋转角度设置 0
    TRTCCloudDef.TRTCRenderParams params = new TRTCCloudDef.TRTCRenderParams();
    params.rotation = TRTC_VIDEO_ROTATION_0;
    mTRTCCloud.setLocalRenderParams(params);

    switch (mOrientation) {
        case 0:
            Log.d(TAG, "旋转角度 0");
            // 1)设置推到远端的编码参数
            TRTCCloudDef.TRTCVideoEncParam param = new TRTCCloudDef.TRTCVideoEncParam();
            param.videoResolutionMode = TRTC_VIDEO_RESOLUTION_MODE_PORTRAIT; // 竖屏
            mTRTCCloud.setVideoEncoderParam(param);

            // 2)发送消息给房间内其它用户,说自己调整了横竖屏
            JSONObject buildInfoJson = new JSONObject();
            try {
                buildInfoJson.put("TRTC_VIDEO_RESOLUTION_MODE", "PORTRAIT");
            } catch (Exception e) {
            }
            mTRTCCloud.sendSEIMsg(buildInfoJson.toString().getBytes(), 1);

            // 3)旋转订阅的远端画面
            for (String uid : mRemoteUidList){
                TRTCCloudDef.TRTCRenderParams renderParams = new TRTCCloudDef.TRTCRenderParams();
                renderParams.rotation = TRTCCloudDef.TRTC_VIDEO_ROTATION_0;
                renderParams.fillMode = TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FIT;  // 默认值fill,这里手动指定fit
                mTRTCCloud.setRemoteRenderParams(uid, TRTC_VIDEO_STREAM_TYPE_BIG, renderParams);
            }

            // 4)设置 activity 竖屏
            VideoCallingActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            break;
        case 90:
            Log.d(TAG, "旋转角度 90");
            // 1)设置推到远端的编码参数
            param = new TRTCCloudDef.TRTCVideoEncParam();
            param.videoResolutionMode = TRTC_VIDEO_RESOLUTION_MODE_LANDSCAPE; // 横屏
            mTRTCCloud.setVideoEncoderParam(param);

            // 2)发送消息给房间内其它用户,说自己调整了横竖屏
            buildInfoJson = new JSONObject();
            try {
                buildInfoJson.put("TRTC_VIDEO_RESOLUTION_MODE", "LANDSCAPE");
            } catch (Exception e) {
            }
            mTRTCCloud.sendSEIMsg(buildInfoJson.toString().getBytes(), 1);

            // 3)旋转订阅的远端画面
            for (String uid : mRemoteUidList){
                TRTCCloudDef.TRTCRenderParams renderParams = new TRTCCloudDef.TRTCRenderParams();
                renderParams.rotation = TRTCCloudDef.TRTC_VIDEO_ROTATION_180;
                renderParams.fillMode = TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FIT;  // 默认值fill,这里手动指定fit
                mTRTCCloud.setRemoteRenderParams(uid, TRTC_VIDEO_STREAM_TYPE_BIG, renderParams);
            }

            // 4)设置 activity 横屏
            VideoCallingActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            break;
        case 180:
            Log.d(TAG, "旋转角度 180");
            // 1)设置推到远端的编码参数
            param = new TRTCCloudDef.TRTCVideoEncParam();
            param.videoResolutionMode = TRTC_VIDEO_RESOLUTION_MODE_PORTRAIT; // 竖屏
            mTRTCCloud.setVideoEncoderParam(param);

            // 2)发送消息给房间内其它用户,说自己调整了横竖屏
            buildInfoJson = new JSONObject();
            try {
                buildInfoJson.put("TRTC_VIDEO_RESOLUTION_MODE", "PORTRAIT");
            } catch (Exception e) {
            }
            mTRTCCloud.sendSEIMsg(buildInfoJson.toString().getBytes(), 1);

            // 3)旋转订阅的远端画面
            for (String uid : mRemoteUidList){
                TRTCCloudDef.TRTCRenderParams renderParams = new TRTCCloudDef.TRTCRenderParams();
                renderParams.rotation = TRTCCloudDef.TRTC_VIDEO_ROTATION_180;
                renderParams.fillMode = TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FIT;  // 默认值fill,这里手动指定fit
                mTRTCCloud.setRemoteRenderParams(uid, TRTC_VIDEO_STREAM_TYPE_BIG, renderParams);
            }

            // 4)设置 activity 竖屏
            VideoCallingActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            break;
        case 270:
            Log.d(TAG, "旋转角度 270");
            // 1)设置推到远端的编码参数
            param = new TRTCCloudDef.TRTCVideoEncParam();
            param.videoResolutionMode = TRTC_VIDEO_RESOLUTION_MODE_LANDSCAPE; // 横屏
            mTRTCCloud.setVideoEncoderParam(param);

            // 2)发送消息给房间内其它用户,说自己调整了横竖屏
            buildInfoJson = new JSONObject();
            try {
                buildInfoJson.put("TRTC_VIDEO_RESOLUTION_MODE", "LANDSCAPE");
            } catch (Exception e) {
            }
            mTRTCCloud.sendSEIMsg(buildInfoJson.toString().getBytes(), 1);

            // 3)旋转订阅的远端画面
            for (String uid : mRemoteUidList){
                TRTCCloudDef.TRTCRenderParams renderParams = new TRTCCloudDef.TRTCRenderParams();
                renderParams.rotation = TRTCCloudDef.TRTC_VIDEO_ROTATION_0;
                renderParams.fillMode = TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FIT;  // 默认值fill,这里手动指定fit
                mTRTCCloud.setRemoteRenderParams(uid, TRTC_VIDEO_STREAM_TYPE_BIG, renderParams);
            }

            // 4)设置 activity 横屏
            VideoCallingActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            break;
        default:
            break;
    }
}

6)收到SEI消息、首帧视频

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/***
 * 收到元旦用户告知,远端用户切换了横屏/竖屏,赶紧调整下 view 的窗口大小
 * @param userId 发送消息的用户
 * @param data 发送的数据
 */
@Override
public void onRecvSEIMsg(String userId, byte[] data) {
    // 解析数据
    Map<String, Object> objectMap = new Gson().fromJson(new String(data), Map.class);
    Object mode = objectMap.get("TRTC_VIDEO_RESOLUTION_MODE");
    if (mode instanceof String) {
        // 横屏
        if (mode.equals("LANDSCAPE")) {
            // 当前收到远端用户告知为横屏,调整该远端用户 view 的大小,以免出现黑边
            // 设置传入的宽高,仅表示 宽 > 高
            adjustRemoteViewResolutionMode(userId, 1, 0);
        // 竖屏
        } else if (mode.equals("PORTRAIT")) {
            // 当前收到远端用户告知为竖屏,调整该远端用户 view 的大小,以免出现黑边
            // 设置传入的宽高,仅表示 宽 < 高
            adjustRemoteViewResolutionMode(userId, 0, 1);
        }
    }
}

/***
 * 收到用户的第一帧视频画面
 * 如果 userId 为空值,代表 SDK 已经开始渲染自己本地的视频画面
 * 如果 userId 不为空,代表 SDK 已经开始渲染远端用户的视频画面
 * @param userId 哪个用户的视频首帧
 * @param streamType 流类型
 * @param width 宽
 * @param height 高
 */
@Override
public void onFirstVideoFrame(String userId, int streamType, int width, int height) {
    /**
     * 不为空,即为远端用户的,也仅仅调整远端用户的 view
     */
    if (userId != null) {
        // 根据首帧收到的宽高,来确定流的分辨率,以便调整 view 的宽高
        // 宽 > 高,说明要 view的 宽 > 高
        // 宽 < 高,说明要 view的 宽 < 高
        adjustRemoteViewResolutionMode(userId, width, height);
    }
}

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 调整远端 view 的大小
 * 当传入的 宽 > 高,说明是要横着展示远端的流,那么 view 的 宽 > 高 来设置
 *    1)如果 view 的 宽 > 高 , 就不做处理
 *    2)如果 view 的 宽 < 高 , 那就把 宽和高 对调下大小
 * 当传入的 宽 < 高,说明是要横着展示远端的流,那么 view 的 宽 < 高 来设置
 *    1)如果 view 的 宽 < 高 , 就不做处理
 *    2)如果 view 的 宽 > 高 , 那就把 宽和高 对调下大小
 * @param userId 对应的远端用户
 * @param width 宽度
 * @param height 高度
 */
private void adjustRemoteViewResolutionMode(String userId, int width, int height) {
    // 获取对应 userId 的下标
    int index = mRemoteUidList.indexOf(userId);
    // index 不等于 -1,说明存在该 userId
    if (index != -1) {
        // 根据 index 获取对应用户的 view
        TXCloudVideoView videoView = mRemoteViewList.get(index);
        // 获取该 userId 对应 view 的 LayoutParams
        ViewGroup.LayoutParams layoutParams = videoView.getLayoutParams();
        // 如果传入过来要求的 宽 > 高,即 横着
        if (width > height) {
            // 如果已经给它的 宽 < 高,那么就要调整他,使它的 宽 > 高,宽高对调即可
            if (layoutParams.width < layoutParams.height) {
                int tempWidth = layoutParams.width;
                layoutParams.width = layoutParams.height;
                layoutParams.height = tempWidth;
                videoView.setLayoutParams(layoutParams);
            }
        // 如果传入过来要求的 宽 < 高,即 竖着
        } else if (width < height) {
            // 如果已经给它的 宽 > 高,那么就要调整他,使它的 宽 < 高,宽高对调即可
            if (layoutParams.width > layoutParams.height) {
                int tempWidth = layoutParams.width;
                layoutParams.width = layoutParams.height;
                layoutParams.height = tempWidth;
                videoView.setLayoutParams(layoutParams);
            }
        }
    }
}

代码示例

当运行demo时,记得修改 GenerateTestUserSig 文件中的 SDKAPPID、SECRETKEY,才能正常运行起来。

文件:Debug\src\main\java\com\tencent\trtc\debug\GenerateTestUserSig.java

控制台上获取对应的应用信息
控制台上获取对应的应用信息

演示示例代码:如附件

TRTC-API-Example.zip

参考文档

视频画面旋转和缩放:https://cloud.tencent.com/document/product/647/32237

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Portworx演示:在K8S集群间迁移有状态的应用和数据
越来越多的企业选择Kubernetes作为基础架构,它能够帮助我们缩短软件项目上市时间、降低基础架构成本、并提高软件质量。由于Kubernetes比较新,因此IT团队都在学习如何在生产环境中,在Kubernetes上对应用程序进行运行和维护。本文将探讨,当在需要额外的计算能力时,将Kubernetes应用程序迁移至另一个新的集群。
Portworx
2019/11/14
2.5K0
如何跨不同版本K8S,为有状态工作负载做蓝绿部署
容器的生态正在爆发!不仅仅应用层在快速变化,还有用于管理应用程序的平台:Kubernetes,也在快速变化。这就为Ops团队带来了一个必须要解决的难题。IT团队如何才能保证一款应用程序能够在各种不同版本的Kubernetes上都能良好运行呢?
Portworx
2019/12/02
1.7K0
点击鼠标即可完成的K8S企业级备份: PX-Backup & PX-Autopilot
Portworx,容器存储与数据管理专业解决方案提供商,对其行业领先的容器原生存储解决方案Portworx Enterprise进行了更新,使其企业用户能够在Kubernetes上对关键应用程序进行扩展、备份和恢复。PX-Backup和PX-Autopilot均用于实现存储容量管理。Portworx通过PX-Backup进入企业级备份市场,使企业用户能够方便而安全地对其所有的Kubernetes应用备份进行云原生方式的管理。PX-Backup在容器领域内的独特性在于它支持使用单个命令进行单个Pod、多个Pod以及整个Kubernetes NameSpace的备份,即便企业使用的是Microsoft Azure、AWS或谷歌存储。
Portworx
2019/11/26
1.1K0
点击鼠标即可完成的K8S企业级备份: PX-Backup & PX-Autopilot
K8s:牛年养“牛”正当时
在传统的做事方式中,服务器被视为捧在手心的宠物。例如,邮件服务器挂了,那所有基于其上的应用都玩完了,CEO无法收到邮件,供应商与公司失去了联系,好像来到了世界末日。
科技云报道
2022/04/16
3120
K8s:牛年养“牛”正当时
Kubernetes 容灾解决方案的关键能力
我们面临着不断地需要实施和部署新的软件应用、发展新的商业模式、以及吸引新的客户。通过Kubernetes,我们可以采用云原生方式来进行软件的开发、部署和运维。
Portworx
2020/08/16
2.3K0
K8S数据保护工具比较
K8S数据保护工具比较:Cohesity、 Kasten、 OpenEBS、 Portworx、 Rancher Longhorn、 和Velero
Portworx
2020/04/23
1.4K0
K8s是什么
Kubernetes的名字来自希腊语,意思是“舵手” 或 “领航员”。K8s是将8个字母“ubernete”替换为“8”的缩写。
summerking
2022/09/19
5980
如何通过Openshift实现K8S容灾?
越来越多的K8S应用采用RedHat OpenShift进行部署,IT团队需要部署容灾功能,来防范系统崩溃导致业务受损。一部分行业通常有较强的监管要求,在出现大规模错误的时候必须有数据保护。例如HIPAA 监管要求中的CFR 164.308(7)(ii)(B),要求公司必须能够在出现系统错误的时候“恢复所有数据”。这种情况下对于Openshift上的关键应用来说,容灾是必须的。
Portworx
2020/05/30
1.6K0
【能力比对】K8S数据平台VS数据平台
🔥🔥 AllData大数据产品是可定义数据中台,以数据平台为底座,以数据中台为桥梁,以机器学习平台为中层框架,以大模型应用为上游产品,提供全链路数字化解决方案。
用户11518204
2025/05/07
1101
【能力比对】K8S数据平台VS数据平台
平台工程:克服数据管理挑战
Kubernetes 数据平台对于处理容器存储接口冲突以及跨任何云构建安全、可扩展的应用程序至关重要。
云云众生s
2024/10/18
1330
入门级容器技术解析:Docker和K8s的区别与关系
1.了解容器的由来,以及容器的概念。 2.了解Docker是什么及其作用。 3.了解K8s是什么及其作用。
Rossy Yan
2024/12/24
8560
入门级容器技术解析:Docker和K8s的区别与关系
【k8s连载系列】k8s介绍
k8s是Kubernetes的缩写,Google 于 2014 年开源了 Kubernetes 项目。
用户7798898
2022/11/16
2.4K0
【k8s连载系列】k8s介绍
具有 GPU 工作节点的托管 K8s 可加速 AI/ML 推理
拥有 GPU 工作节点对于提高 AI/ML 工作负载的效率至关重要。同时,采用托管的 Kubernetes 方式也会给 GPU 加速带来独特的好处。
云云众生s
2024/03/28
3480
具有 GPU 工作节点的托管 K8s 可加速 AI/ML 推理
大数据服务上k8s主要是为了什么?
今天我要和大家探讨一个备受关注的话题:为什么在大数据服务上使用 Kubernetes(简称 K8s)?Kubernetes 是一个用于自动化容器化应用程序部署、扩展和管理的开源平台,而大数据服务通常包括庞大的数据集和复杂的计算工作负载,这两者似乎并不直接相关。那么,为什么越来越多的组织选择在大数据领域使用 Kubernetes 呢?接下来,我们将深入探讨这个问题,并提供一些实际示例。
coderidea
2023/10/04
6360
大数据服务上k8s主要是为了什么?
Pure3.7亿美元收购Portworx,容器存储再成焦点
根据外电消息,Pure Storage宣布将以3.7亿美元收购数据服务平台Portworx。此举将让Pure Storage在容器存储相关领域得到补强。据悉,本次交易预计在本月底完成。
大数据在线
2020/09/27
6080
如何在两个OpenShift集群间迁移有状态应用
Portworx是一个支撑K8S有状态应用的持久存储和数据管理平台。通过Portworx,它为有状态应用提供了一个单一的数据管理层,从而用户可以在任何底层架构上运行类似数据库这样的有状态应用。
Portworx
2020/06/29
1.1K0
互联网十万个为什么之 什么是Kubernetes(K8s)?
Kubernetes(通常简称为K8s)是一款用于自动部署、扩缩和管理容器化应用程序的开源容器编排平台。Kubernetes已发展为现代企业实现敏捷开发、快速迭代、资源优化及灵活扩展的关键技术组件之一。它拥有庞大的开源社区和丰富的生态系统。围绕Kubernetes已经形成了众多工具、插件和解决方案,其使企业能够实现更高的资源利用率、更优的业务连续性和稳定性、更快的创新速度。
linus_lin
2024/09/06
1680
互联网十万个为什么之 什么是Kubernetes(K8s)?
k8s基础
Docker是一个开源的应用容器引擎,可以让开发者打包应用及依赖包到一个可移植的镜像中,发布到Linux/Windows机器上
爽朗地狮子
2022/11/10
5030
Kubernetes(K8S)是什么,有那些特性以及应用场景有那些?
Kubernetes 是一种开源容器管理工具,可自动执行容器部署、容器扩展、解缩放和容器负载均衡(也称为容器编排工具)。它是用Golang编写的,拥有庞大的社区,因为它最初由Google开发,后来捐赠给CNCF(云原生计算基金会)。Kubernetes 可以将“n”个容器分组到一个逻辑单元中,以便轻松管理和部署它们。它与所有云供应商(即公共云、混合云和本地云供应商)完美配合。
用户1418987
2023/10/16
3.8K0
Kubernetes(K8S)是什么,有那些特性以及应用场景有那些?
云上跑容器,如何降低存储成本
不少客户都在使用K8S来管理容器,并且通过Portworx来管理容器存储。虽然云原生的方式让我们获得了更大的自动化和灵活度,许多客户在容器下层的基础架构层的扩展性方面,仍然有一定的局限。K8S和Portworx能够自动化部署容器应用,但是这些应用所基于的基础架构还无法通过自动化的方式进行扩展。DevOps团队还经常被要求去做基础架构投资成本收益的财务分析,并增加财务管理手段来降低成本和让成本更具备可预测性。当基础架构被转移到公有云后,成本管理就成为更加重要的方面,不少用户在公有云上的成本甚至高于他们原有的本地部署架构的成本。Portworx新发布的PX-Autopilot能够对存储基础架构进行更加有效的运营管理,并且降低一半的存储成本。
Portworx
2020/02/03
3.4K1
相关推荐
Portworx演示:在K8S集群间迁移有状态的应用和数据
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档