云原生技术教程二Pod及RS

举报
tea_year 发表于 2024/11/17 10:48:15 2024/11/17
【摘要】 本章重点 k8s 简介,作用及架构详解 pod详解 RC和RS(企业中使用的很少)具体内容3.1 k8s简介 Kubernetes这个单词来自于希腊语,含义是舵手或领航员。K8S是它的缩写,用“8”字替代了“ubernete”这8个字符。Kubernetes是 Google自己捣鼓了十多年的Borg系统为前身,基于谷歌15年生产环境经验的基础上开源的一个项目 K8S是2014年6月由Goog...

本章重点

k8s 简介,作用及架构详解

pod详解

RC和RS(企业中使用的很少)

具体内容


3.1 k8s简介

Kubernetes这个单词来自于希腊语,含义是舵手或领航员。K8S是它的缩写,用“8”字替代了“ubernete”这8个字符。

Kubernetes是 Google自己捣鼓了十多年的Borg系统为前身,基于谷歌15年生产环境经验的基础上开源的一个项目

K8S是2014年6月由Google公司正式公布出来并宣布开源的。同年7月,微软、Red Hat、IBM、Docker、CoreOS、Mesosphere(D2iQ)和Saltstack等公司,相继加入K8S。

之后的一年内,VMware、HP、Intel等公司,也陆续加入。

2015年7月,Google正式加入OpenStack基金会。与此同时,Kuberentes v1.0正式发布。


3.2 k8s作用

Kubernetes致力于提供跨主机集群的自动部署、扩展、高可用以及运行应用程序容器的平台。


1. 自动化应用部署和扩展: 它可以根据应用程序的需求自动调度容器,确保应用程序在集群中的不同节点上均衡地运行,并根据负载情况自动扩展或缩减应用程序的副本数量。


2. 服务发现和负载均衡:Kubernetes提供了内建的服务发现和负载均衡功能,可以自动为应用程序创建一个稳定的网络地址,并将请求分发到运行该应用程序的容器之间进行负载均衡。


3. 自动容器编排和管理:Kubernetes可以自动管理容器的生命周期,包括容器的创建、启动、停止和销毁。它可以监控容器的健康状况,并在容器发生故障时自动重启或重新调度容器,确保应用程序的高可用性和稳定性。


4. 资源管理和调度:Kubernetes可以对集群中的资源进行统一管理和调度,包括CPU、内存、存储和网络等资源。它可以根据应用程序的需求和集群的资源状况动态地调度容器,以最大化集群的利用率和性能

3.3 k8s 架构图详解

架构图:


loadbalancer :

负载均衡 使用keepalived+haproxy虚拟出一个VIP,让k8s的master实现了高可用。绑定master上的一个网卡,通过负载均衡器访问到APIServer。在公司可以使用F5类似的硬件负载均衡,如果公司使用公共云,可以使用SLB技术。




Master节点:

整个集群的控制中枢

主要负责调度工作,不建议跑任何应用程序(业务程序)。

Kube-APIServer:

集群的控制中枢,各个模块之间信息交互都需要经过Kube-APIServer,同时它也是集群管理、资源配置、整个集群安全机制的入口。

Controller-Manager:

集群的状态管理器,保证Pod或其他资源达到期望值,也是需要和APIServer进行通信,在需要的时候创建、更新或删除它所管理的资源。

Scheduler:

集群的调度中心,它会根据指定的一系列条件,选择一个或一批最佳的节点,然后部署我们的Pod。

Etcd数据库:

键值数据库,保存集群的信息,一般生产环境中建议部署三个以上节点(奇数个)。


master和etcd在企业中一般不会变动,最好开始就把资源给够,使用性能比较好的服务器,这样长时间不用变动(企业可以多年不动,node节点可以成百上千个)。



Node 工作节点:


node节点,也可以称为从节点(Worker节点、node节点、minion(奴才)节点), 部署应用程序 跑pod或者容器。在企业中可以动态添加或者缩减node节点(可以参考创建文档)。


Kubelet:

负责监听节点上Pod的状态,同时负责上报节点和节点上面Pod的状态,负责与Master节点通信,并管理节点上面的Pod。

Kube-proxy:

负责Pod之间的通信和负载均衡,将指定的流量分发到后端正确的机器上。

查看Kube-proxy工作模式:


netstat -lntp |grep kube-proxy

curl 127.0.0.1:10249/proxyMode


Ipvs:监听Master节点增加和删除service以及endpoint的消息,调用Netlink接口创建相应的IPVS规则。通过IPVS规则,将流量转发至相应的Pod上。

Iptables:监听Master节点增加和删除service以及endpoint的消息,对于每一个Service,他都会场景一个iptables规则,将service的clusterIP代理到后端对应的Pod。


  kubectl get pod    默认查询default空间下的pod没有

             kubectl get pod -n kube-system      查询系统空间下的pod

kubectl get pod -n kube-system  -owide    查询系统空间下的pod详情

其他组件

Calico:符合CNI(container network interface容器网络接口)标准的网络插件,给每个Pod生成一个唯一的IP地址,并且把每个节点当做一个路由器。


CoreDNS:用于Kubernetes集群内部Service的解析,可以让Pod把Service名称解析成IP地址,然后通过Service的IP地址进行连接到对应的应用上。

kubectl get svc -n kube-system  -owide

名称是固定的但是IP不一定,底层就使用CoreDNS把域名转换为IP

一般来说 xxx.xxx.xxx.1 是k8s服务用的  xxx.xxx.xxx.10 是dns用的

Docker:容器引擎,负责对容器的管理。

前面细讲过,不再说了

metrics: 采集节点和Pod的内存、磁盘、CPU和网络的使用率。

 kubectl top node 采集节点各种参数使用率

 kubectl top  pod -n kube-system 采集Pod各种参数使用率

Error from server (ServiceUnavailable): the server is currently unable to handle the request (get pods.metrics.k8s.io) 出现这种错误,多次执行


3.4 Pod

准备:

pod是namespace隔离的

查看所有命名空间

 kubectl  get  ns

 kubectl get namespace

前面查询pod 不指定空间就是默认的,默认空间没有pod

 kubectl get pod

kubectl get pod -n kube-system

kubectl是目前管理k8s集群的最强利器,所有对集群的控制和管理都可以通个kubectl进行.

概念:

Pod是Kubernetes中最小的单元,它由一个或多个容器组成,每个Pod还包含了一个Pause容器,Pause容器是Pod的父容器,主要负责僵尸进程的回收管理,通过Pause容器可以使同一个Pod里面的多个容器共享存储、网络、PID、IPC(进程间通信IPC (Inter Process Communication) )等。Pod 管理的镜像不一定都是docker的,还可以是containerd,CRI-O等只要遵循CRI(Container Runtime Interface,容器运行时接口)标准的容器。

通过docker ps 能看到Pause容器

编写使用Pod:



创建Pod 有3种方式:

1)通过yaml 推荐使用

 kubectl apply -f pod.yaml

2)通过json

单个对象: userInfo:{"uid":1001,"username":"zhangsan","age":18....}

对象列表: userList:[{"uid":1002,"username":"zhangsan1","age":19....},

{"uid":1003,"username":"zhangsan2","age":19....},

{"uid":1004,"username":"zhangsan3","age":19....}]

  kubectl apply -f pod.json

3)通过k8s命令(创建名为web-app的pod,image为nginx

kubectl create deployment web-app --image=nginx


create和apply命令的区别:

kubectl create命令,是先删除所有现有的东西,重新根据yaml文件生成新的。所以要求yaml文件中的配置必须是完整的

kubectl apply命令,根据配置文件里面列出来的内容,升级现有的。所以yaml文件的内容可以只写需要升级的属性


yaml 简单清晰,推荐使用


讲解:

apiVersion: v1 # 必选,API的版本号

kind: Pod       # 必选,类型Pod

metadata:       # 必选,元数据

  name: nginx   # 必选,符合RFC 1035规范的Pod名称

  namespace: default # 可选,Pod所在的命名空间,不指定默认为default,可以使用-n 指定namespace 

  labels:       # 可选,标签选择器,一般用于过滤和区分Pod

    app: nginx

    role: frontend # 可以写多个

  annotations:  # 可选,注释列表,可以写多个

    app: nginx

spec:   # 必选,用于定义容器的详细信息

  initContainers: # 初始化容器,在容器启动之前执行的一些初始化操作

  - command:

    - sh

    - -c

    - echo "I am InitContainer for init some configuration"

    image: busybox

    imagePullPolicy: IfNotPresent

    name: init-container

  containers:   # 必选,容器列表

  - name: nginx # 必选,符合RFC 1035规范的容器名称

    image: nginx:latest    # 必选,容器所用的镜像的地址

    imagePullPolicy: Always     # 可选,镜像拉取策略

    command: # 可选,容器启动执行的命令 daemon off;容器启动后必须有交互进程运行否则会自动退出

    - nginx 

    - -g

    - "daemon off;"

    workingDir: /usr/share/nginx/html       # 可选,容器的工作目录

    volumeMounts:   # 可选,存储卷配置,可以配置多个

    - name: webroot # 存储卷名称

      mountPath: /usr/share/nginx/html # 挂载目录

      readOnly: true        # 只读

    ports:  # 可选,容器需要暴露的端口号列表

    - name: http    # 端口名称

      containerPort: 80     # 端口号

      protocol: TCP # 端口协议,默认TCP

    env:    # 可选,环境变量配置列表

    - name: TZ      # 变量名

      value: Asia/Shanghai # 变量的值

    - name: LANG

      value: en_US.utf8

    resources:      # 可选,资源限制和资源请求限制

      limits:       # 最大限制设置

        cpu: 1000m

        memory: 1024Mi

      requests:     # 启动所需的资源

        cpu: 100m

        memory: 512Mi

#    startupProbe: # 可选,检测容器内进程是否完成启动。注意三种检查方式同时只能使用一种。

#      httpGet:      # httpGet检测方式,生产环境建议使用httpGet实现接口级健康检查,健康检查由应用程序提供。

#            path: /api/successStart # 检查路径

#            port: 80

    readinessProbe: # 可选,健康检查。注意三种检查方式同时只能使用一种。

      httpGet:      # httpGet检测方式,生产环境建议使用httpGet实现接口级健康检查,健康检查由应用程序提供。

            path: / # 检查路径

            port: 80        # 监控端口

    livenessProbe:  # 可选,健康检查

      #exec:        # 执行容器命令检测方式

            #command: 

            #- cat

            #- /health

    #httpGet:       # httpGet检测方式

    #   path: /_health # 检查路径

    #   port: 8080

    #   httpHeaders: # 检查的请求头

    #   - name: end-user

    #     value: Jason 

      tcpSocket:    # 端口检测方式

            port: 80

      initialDelaySeconds: 60       # 初始化时间

      timeoutSeconds: 2     # 超时时间

      periodSeconds: 5      # 检测间隔

      successThreshold: 1 # 检查成功为2次表示就绪

      failureThreshold: 2 # 检测失败1次表示未就绪

    lifecycle:

      postStart: # 容器创建完成后执行的指令, 可以是exec httpGet TCPSocket

        exec:

          command:

          - sh

          - -c

          - 'mkdir /data/ '

      preStop:

        httpGet:      

              path: /

              port: 80

      #  exec:

      #    command:

      #    - sh

      #    - -c

      #    - sleep 9

  restartPolicy: Always   # 可选,默认为Always

  #nodeSelector: # 可选,指定Node节点 容器很多时,必须选择节点,可以指定节点

  #      region: subnet7

  imagePullSecrets:     # 可选,拉取镜像使用的secret,可以配置多个

  - name: default-dockercfg-86258

  hostNetwork: false    # 可选,是否为主机模式,如是,会占用主机端口

  volumes:      # 共享存储卷列表

  - name: webroot # 名称,与上述对应

    emptyDir: {}    # 挂载目录

        #hostPath:              # 挂载本机目录

        #  path: /etc/hosts


 kubectl get pod -n kube-system --show-labels


imagePullPolicy:

Always 总是拉取镜像

IfNotPresent 本地有则使用本地镜像,不拉取

Never 只使用本地镜像,从不拉取,即使本地没有

如果省略imagePullPolicy,  策略为always 

restartPolicy:

Always:当容器终止退出后,总是重启容器,默认策略。

OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。

Never:当容器终止退出,从不重启容器。

nodeSelector:

kubectl get node --show-labels

region: subnet7 分别为上图的等号两边,就可以指定到这台主机上


实战:

apiVersion: v1 # 必选,API的版本号

kind: Pod       # 必选,类型Pod

metadata:       # 必选,元数据

  name: nginx   # 必选,符合RFC 1035规范的Pod名称

  # namespace: default # 可选,Pod所在的命名空间,不指定默认为default,可以使用-n 指定namespace 

  labels:       # 可选,标签选择器,一般用于过滤和区分Pod

    app: nginx

    role: frontend # 可以写多个

  annotations:  # 可选,注释列表,可以写多个

    app: nginx

spec:   # 必选,用于定义容器的详细信息

#  initContainers: # 初始化容器,在容器启动之前执行的一些初始化操作

#  - command:

#    - sh

#    - -c

#    - echo "I am InitContainer for init some configuration"

#    image: busybox

#    imagePullPolicy: IfNotPresent

#    name: init-container

  containers:   # 必选,容器列表

  - name: nginx # 必选,符合RFC 1035规范的容器名称

    image: nginx:1.18.0    # 必选,容器所用的镜像的地址

    imagePullPolicy: IfNotPresent     # 可选,镜像拉取策略, IfNotPresent: 如果宿主机有这个镜像,那就不需要拉取了. Always: 总是拉取, Never: 不管是否存储都不拉去

    command: # 可选,容器启动执行的命令 ENTRYPOINT, arg --> cmd

    - nginx 

    - -g

    - "daemon off;"

    workingDir: /usr/share/nginx/html       # 可选,容器的工作目录

#    volumeMounts:   # 可选,存储卷配置,可以配置多个

#    - name: webroot # 存储卷名称

#      mountPath: /usr/share/nginx/html # 挂载目录

#      readOnly: true        # 只读

    ports:  # 可选,容器需要暴露的端口号列表

    - name: http    # 端口名称

      containerPort: 80     # 端口号

      protocol: TCP # 端口协议,默认TCP

    env:    # 可选,环境变量配置列表

    - name: TZ      # 变量名

      value: Asia/Shanghai # 变量的值

    - name: LANG

      value: en_US.utf8

#    resources:      # 可选,资源限制和资源请求限制

#      limits:       # 最大限制设置

#        cpu: 1000m

#        memory: 1024Mi

#      requests:     # 启动所需的资源

#        cpu: 100m

#        memory: 512Mi

#    startupProbe: # 可选,检测容器内进程是否完成启动。注意三种检查方式同时只能使用一种。

#      httpGet:      # httpGet检测方式,生产环境建议使用httpGet实现接口级健康检查,健康检查由应用程序提供。

#            path: /api/successStart # 检查路径

#            port: 80

#    readinessProbe: # 可选,健康检查。注意三种检查方式同时只能使用一种。

#      httpGet:      # httpGet检测方式,生产环境建议使用httpGet实现接口级健康检查,健康检查由应用程序提供。

#            path: / # 检查路径

#            port: 80        # 监控端口

#    livenessProbe:  # 可选,健康检查

      #exec:        # 执行容器命令检测方式

            #command: 

            #- cat

            #- /health

    #httpGet:       # httpGet检测方式

    #   path: /_health # 检查路径

    #   port: 8080

    #   httpHeaders: # 检查的请求头

    #   - name: end-user

    #     value: Jason 

#      tcpSocket:    # 端口检测方式

#            port: 80

#      initialDelaySeconds: 60       # 初始化时间

#      timeoutSeconds: 2     # 超时时间

#      periodSeconds: 5      # 检测间隔

#      successThreshold: 1 # 检查成功为2次表示就绪

#      failureThreshold: 2 # 检测失败1次表示未就绪

#    lifecycle:

#      postStart: # 容器创建完成后执行的指令, 可以是exec httpGet TCPSocket

#        exec:

#          command:

#          - sh

#          - -c

#          - 'mkdir /data/ '

#      preStop:

#        httpGet:      

#              path: /

#              port: 80

      #  exec:

      #    command:

      #    - sh

      #    - -c

      #    - sleep 9

  restartPolicy: Always   # 可选,默认为Always,容器故障或者没有启动成功,那就自动该容器,Onfailure: 容器以不为0的状态终止,自动重启该容器, Never:无论何种状态,都不会重启

  #nodeSelector: # 可选,指定Node节点

  #      region: subnet7

#  imagePullSecrets:     # 可选,拉取镜像使用的secret,可以配置多个

#  - name: default-dockercfg-86258

#  hostNetwork: false    # 可选,是否为主机模式,如是,会占用主机端口

#  volumes:      # 共享存储卷列表

#  - name: webroot # 名称,与上述对应

#    emptyDir: {}    # 挂载目录

#        #hostPath:              # 挂载本机目录

#        #  path: /etc/hosts

#

创建:

默认创建到default下:

kubectl create -f  pod.yaml

也可以指定namespace:

kubectl create -f  pod.yaml -n kube-public

查看:

kubectl get pod

kubectl get pod  -n kube-public

删除:

kubectl delete pod  nginx

kubectl delete pod nginx  -n kube-public

 查看详情:

kubectl describe pods  nginx 

kubectl describe pods  nginx  -n kube-public


零宕机必备知识

探针:

StartupProbe:k8s1.16版本后新加的探测方式,用于判断容器内应用程序是否已经启动。如果配置了startupProbe,就会先禁止其他的探测,直到它成功为止,成功后将不再进行探测。以后的检测依靠后面两个。

LivenessProbe:用于探测容器是否运行,如果探测失败,kubelet会根据配置的重启策略进行相应的处理。若没有配置该探针,默认就是success。

ReadinessProbe:一般用于探测容器内的程序是否健康,它的返回值如果为success,那么久代表这个容器已经完成启动,并且程序已经是可以接受流量处理业务的状态。

Pod探针的检测方式

ExecAction:在容器内执行一个命令,如果返回值为0,则认为容器健康。

TCPSocketAction:通过TCP连接检查容器内的端口是否是通的,如果是通的就认为容器健康。

HTTPGetAction:通过应用程序暴露的API地址来检查程序是否是正常的,如果状态码为200~400之间,则认为容器健康。

探针参数配置:


#      initialDelaySeconds: 60       # 初始化时间

#      timeoutSeconds: 2     # 超时时间

#      periodSeconds: 5      # 检测间隔

#      successThreshold: 1 # 检查成功为1次表示就绪

#      failureThreshold: 2 # 检测失败2次表示未就绪

探针实战:

查看系统自带Pod的检测方式:

查看deploy名称:

kubectl get deploy -n kube-system

再根据名称 使用编辑资源文件功能看到配置:

kubectl edit deploy coredns  -n kube-system

查找 /liveness 和 /readiness

测试startupProbe

修改nginx的pod.yaml 开启探针功能:

查看nginx是否已经运行,如果运行先删除:

kubectl delete po nginx -n kube-public

再次创建启动Pod:

kubectl create -f pod.yaml  -n kube-public 

使用编辑资源文件功能看到配置:

kubectl  edit  po nginx -n kube-public

发现自动加上了默认配置

查看详情:

kubectl  describe  po nginx -n kube-public


90秒,再次查看运行,发现一直restart:

 kubectl delete po nginx -n kube-public


再次删除,修改配置,再次测试:

kubectl delete po nginx -n kube-public

再次启动,最终会运行起来。

测试使用:

查看详情:

kubectl get po nginx -n kube-public -owide

根据IP进行访问:

curl 172.171.14.209

可以看到响应页面(如果master01上不行,就找到运行的节点上运行)

登录容器,测试命令:

 kubectl exec -it   nginx -- bash

如果登录不成功,查询详情,找到节点,执行

docker ps 查看容器ID

docker exec -it 091c9f1717c2 bash 登录容器

执行相关命令,看是否支持,为下面做准备!

测试livenessProbe

修改配置

 vim pod.yaml

kubectl create -f pod.yaml  -n kube-public 

kubectl get po nginx -n kube-public

 

kubectl  describe  po nginx -n kube-public


修改可以执行的命令,修改正确,再次删除Pod,再次创建启动测试,成功

pod 退出流程

 kubectl create -f pod.yaml -n kube-public

kubectl get pod -n kube-public

kubectl delete pod nginx -n kube-public

另外一个窗口查看:

kubectl get pod -n kube-public


 再次创建,查看pod终止宽限期 默认30秒 目的是留出收尾工作或者收尾过程要做什么业务的时间

 kubectl get pod -n kube-public -o yaml 


使用metrics 测试:

查看pod

kubectl get pod -n kube-system -owide

查看服务

kubectl get svc -n kube-system

查看终端

kubectl get ep -n kube-system

删除pod

另一个窗口查询ep

kubectl get ep -n kube-system

可以看到IP被删除!

退出时同时执行3个流程:

pod变为Terminating Endpoint删除该Pod的IP 执行PreStop的指令


Prestop:先去请求eureka接口,把自己的IP地址和端口号,进行下线,eureka从注册表中删除该应用的IP地址。然后容器进行sleep 90;kill `pgrep java`

配置完成后,去当前Pod运行的node上对应的目录,查看日志文件的日志输出

3.5 RC和RS

知道RC和RS是啥就可以,不重要,企业中不会拿他们两个管理Pod

3.5.1 概述:

Replication Controller(复制控制器,RC)和ReplicaSet(复制集,RS)是两种简单部署Pod的方式。因为在生产环境中,主要使用更高级的Deployment等方式进行Pod的管理和部署,所以本节只对Replication Controller和Replica Set的部署方式进行简单介绍。

3.5.2 Replication Controller

Replication Controller(简称RC)可确保Pod副本数达到期望值,也就是RC定义的数量。换句话说,Replication Controller可确保一个Pod或一组同类Pod总是可用。

如果存在的Pod大于设定的值,则Replication Controller将终止额外的Pod。如果太小,Replication Controller将启动更多的Pod用于保证达到期望值。与手动创建Pod不同的是,用Replication Controller维护的Pod在失败、删除或终止时会自动替换。因此即使应用程序只需要一个Pod,也应该使用Replication Controller或其他方式管理。Replication Controller类似于进程管理程序,但是Replication Controller不是监视单个节点上的各个进程,而是监视多个节点上的多个Pod。


定义一个Replication Controller的示例如下。

apiVersion: v1

kind: ReplicationController

metadata:

  name: nginx

spec:

  replicas: 3

  selector:

    app: nginx

  template:

    metadata:

      name: nginx

      labels:

        app: nginx

    spec:

      containers:

      - name: nginx:1.18.0

        image: nginx

        ports:

        - containerPort: 80

编辑rc文件:

  vim  rc.yaml

创建rc:

kubectl create -f rc.yaml -n kube-public

查看rc:

kubectl get rc -n kube-public

查看pod:

kubectl get pod -n kube-public

随便删除一个pod:

kubectl delete pod nginx-z2wzd -n kube-public

发现删除成功后,依然会维持3个。

3.5.3 ReplicaSet

ReplicaSet是支持基于集合的标签选择器的下一代Replication Controller,它主要用作Deployment协调创建、删除和更新Pod,和Replication Controller唯一的区别是,ReplicaSet支持标签选择器。在实际应用中,虽然ReplicaSet可以单独使用,但是一般建议使用Deployment来自动管理ReplicaSet,除非自定义的Pod不需要更新或有其他编排等。

定义一个ReplicaSet的示例如下:

apiVersion: apps/v1

kind: ReplicaSet

metadata:

  name: frontend

  labels:

    app: guestbook

    tier: frontend

spec:

  # modify replicas according to your case

  replicas: 3

  selector:

    matchLabels:

      tier: frontend

    matchExpressions:

      - {key: tier, operator: In, values: [frontend]}

  template:

    metadata:

      labels:

        app: guestbook

        tier: frontend

    spec:

      containers:

      - name: php-redis

        image: gcr.io/google_samples/gb-frontend:v3

        resources:

          requests:

            cpu: 100m

            memory: 100Mi

        env:

        - name: GET_HOSTS_FROM

          value: dns

          # If your cluster config does not include a dns service, then to

          # instead access environment variables to find service host

          # info, comment out the 'value: dns' line above, and uncomment the

          # line below.

          # value: env

        ports:

        - containerPort: 80


Replication Controller和ReplicaSet的创建删除和Pod并无太大区别,Replication Controller目前几乎已经不在生产环境中使用,ReplicaSet也很少单独被使用,都是使用更高级的资源Deployment、DaemonSet、StatefulSet进行管理Pod。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。