
暂无个人介绍
暂时未有相关通用技术能力~
阿里云技能认证
详细说明
kubernetes1.5版本deployment部署的apiVersion为extensions/v1beta1 ,yml脚本如下:apiVersion: extensions/v1beta1kind: Deploymentmetadata: name: test-service-deploy labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 1.6.0版本中的apiVersion写法为apps/v1beta1 apiVersion: apps/v1beta1kind: Deploymentmetadata: name: test-service-deploy labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 目前官网的apiVersion:为apps/v1,yml脚本如下: apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 apiVersion内容不对会导致创建时报错,无法正常创建。
centos7.4最小化安装(CentOS-7-x86_64-DVD-1804.iso)最小化安装,设置IP划分磁盘 /boot 512M,swap8000M,其他/ 设置yum源 mkdir /dev/mnt mount /dev/cdrom /dev/mnt vi /etc/yum.repos.d/server.repo [server]name=centosbaseurl=file:///dev/mnt/gpgcheck=0enabled=1 安装远程连接方式直接运行如下命令安装GUI: yum -y groupinstall "Server with GUI" 设置图形模式为默认模式启动 systemctl set-default graphical 重启后,即可登录图形化界面 reboot oracle数据库基本设置 vi /etc/hosts 192.168.75.200 oracle hostnamectl set-hostname oracle vim /etc/selinux/config SELINUX=enforcing SELINUX=disabled重新启动reboot安装依赖的yum包 yum -y install binutils compat-libcap1 compat-libstdc++-33 gcc gcc-c++ glibc glibc-devel ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel libXi libXtst make sysstat unixODBC unixODBC-devel 没有可用软件包 compat-libstdc++-33。安装oracle-database-preinstall拷贝compat-libstdc++-33-3.2.3-47.3.x86_64.rpm到服务器 scp compat-libstdc++-33-3.2.3-47.3.x86_64.rpmoot@192.168.75.188:/root/ 安装 rpm -ivh compat-libstdc++-33-3.2.3-47.3.x86_64.rpm 安装准备包 rpm -ivh oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm 安装oracle数据库安装数据库包 rpm -ivh oracle-database-ee-19c-1.0-1.x86_64.rpm 修改sid以及是否开启cdbvi /etc/init.d/oracledb_ORCLCDB-19cexport ORACLE_SID=orclexport CREATE_AS_CDB=false创建新配置文件 cp /etc/sysconfig/oracledb_ORCLCDB-19c.conf /etc/sysconfig/oracledb_orcl-19c.conf 创建实例 /etc/init.d/oracledb_ORCLCDB-19c configure Configuring Oracle Database orcl.准备执行数据库操作已完成 10%复制数据库文件已完成 40%正在创建并启动 Oracle 实例已完成 42%已完成 46%已完成 50%已完成 54%已完成 60%正在进行数据库创建已完成 66%已完成 70%执行配置后操作已完成 100%数据库创建完成。有关详细信息, 请查看以下位置的日志文件: /opt/oracle/cfgtoollogs/dbca/orcl。数据库信息:全局数据库名:orcl系统标识符 (SID):orcl有关详细信息, 请参阅日志文件 "/opt/oracle/cfgtoollogs/dbca/orcl/orcl.log"。 Database configuration completed successfully. The passwords were auto generated, you must change them by connecting to the database using 'sqlplus / as sysdba' as the oracle user. 已经自动创建oracle用户和dba、oinstall组[root@localhost ~]#passwd oracle(回车输入密码oracle) 切换oracle用户 su - oracle vi .bash_profile export ORACLE_SID=orclexport ORACLE_BASE=/opt/oracleexport ORACLE_HOME=/opt/oracle/product/19c/dbhome_1export ORACLE_UNQNAME=orclexport TNS_ADMIN=$ORACLE_HOME/network/adminexport ORACLE_TERM=xtermexport PATH=.:$PATH:$HOME/bin:$ORACLE_HOME/binexport LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/libexport CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlibexport THREADS_FLAG=nativeexport LANG=en_USexport NLS_LANG=american_america.AL32UTF8export NLS_DATE_FORMAT='yyyy/mm/dd hh24:mi:ss'if [ $USER = "oracle" ]||[ $USER = "grid" ]; thenif [ $SHELL = "/bin/ksh" ]; thenulimit -p 16384ulimit -n 65536elseulimit -u 16384 -n 65536fiumask 022fi 设置生效source ~/.bash_profile env |grep ora查看配置的环境变量是否正确。 [oracle@oracle opt]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Tue Dec 8 16:01:42 2020Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. Connected to:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - ProductionVersion 19.3.0.0.0 SQL> select name, decode(cdb, 'YES', 'Multitenant Option enabled', 'Regular 12c Database: ') "Multitenant Option" , open_mode, con_id from v$database; NAME Multitenant Option OPEN_MODE CON_ID--------- -------------------------- -------------------- ----------ORCL Regular 12c Database: READ WRITE 0修改sys密码为oracleSQL> alter user sys identified by oracle; User altered. 注意事项:1、通过rpm方式安装的数据库默认会在/opt目录2、实例创建完毕之后sys密码是随机生成的,需要手动修改sys密码
3.1. 了解 OpenShift Container Platform control planecontrol plane 由 master 机器组成,负责管理 OpenShift Container Platform 集群。control plane 机器管理计算机器(也被称为 worker)上的工作负载。集群本身通过Cluster Version Operator、Machine Config Operator 和一组单独 Operator 的操作来管理对机器的所有升级。3.1.1. OpenShift Container Platform 中的机器角色OpenShift Container Platform 为主机分配不同的角色。这些角色定义机器在集群内的功能。集群包含标准 master 和 worker 角色类型的定义。注意集群还包含 bootstrap 角色的定义。由于 bootstrap 机器仅在集群安装期间使用,因此其功能在集群安装文档中阐述。3.1.1.1. 集群 worker在 Kubernetes 集群中,worker 节点是运行和管理 Kubernetes 用户请求的实际工作负载的地方。worker 节点公告其容量,而作为 master 服务一部分的调度程序决定在哪些节点上启动容器和 Pod。重要服务在每个 worker 节点上运行,包括 CRI-O(即容器引擎)、Kubelet(接受并履行运行和停止容器工作负载请求的服务),以及服务代理(管理 worker 之间 Pod 的通信)。在 OpenShift Container Platform 中,MachineSets 控制 worker 机器。具有 worker 角色的机器驱动计算工作负载,这些负载由自动扩展它们的特定机器池管控。因为 OpenShift Container Platform 具有支持多种机器类型的能力,因此 worker 机器被归类为计算 (compute)机器。在此版本中,术语“worker 机器”和“计算机器”可互换使用,因为计算机器的唯一默认类型就是 worker 机器。在未来的 OpenShift Container Platform 版本中,默认情况下可能会使用不同类型的计算机器,如基础架构机器。3.1.1.2. 集群 master在 Kubernetes 集群中,master 节点运行控制 Kubernetes 集群所需的服务。在 OpenShift Container Platform 中,master 机器是 control plane。它们不仅仅包含用于管理 OpenShift Container Platform 集群的 Kubernetes 服务。因为所有具有 control plane 角色的机器都是 master 机器,所以 master 和 control plane 是可以互换的术语。master 机器不会被分成一个 MachineSet,而是由一系列独立的机器 API 资源定义。 附加控件应用到 master 机器,以防止您删除所有 master 机器并破坏集群。注意使用三个 master 节点虽然理论上可以使用任意数量的 master 节点,但由于 master 静态 Pod 和 etcd 静态 Pod 在相同的主机上工作,所以这个数量会受 etcd 仲裁的限制。master 上属于 Kubernetes 类别的服务包括 API 服务器、etcd、Controller Manager Server 和 HAProxy 服务。表 3.1. 在 control plane 上运行的 Kubernetes 服务组件 描述API Server Kubernetes API 服务器验证并配置 Pod、服务和复制控制器的数据。它还为集群的共享状态提供一个焦点。etcd etcd 存储持久 master 状态,其他组件则监视 etcd 的更改,以使其自身进入指定状态。Controller Manager Server Controller Manager Server 监视 etcd 中对象的更改,如复制、命名空间和服务帐户控制器对象,然后使用 API 强制执行指定的状态。多个这样的过程会创建在某个时间点上有一个活跃群首的集群。master 机器上的某些服务作为 systemd 服务运行,其他服务则作为静态 Pod 运行。systemd 服务适合需要始终在特定系统启动后不久出现的服务。对于 master 机器,这包括允许远程登录的 sshd。它还包括以下服务:• CRI-O 容器引擎 (crio),用于运行和管理容器。OpenShift Container Platform 4.4 使用 CRI-O,而不是 Docker Container Engine。• Kubelet (kubelet),从 master 服务接受管理机器上容器的请求。CRI-O 和 Kubelet 必须作为 systemd 服务直接在主机上运行,因为它们必须先运行,然后您才能运行其他容器。3.1.2. OpenShift Container Platform 中的 Operator在 OpenShift Container Platform 中,Operator 是在 control plane 上打包、部署和管理服务的首选方法。它们还为用户运行的应用程序提供了便利。Operator 与 Kubernetes API 和 CLI 工具(如 kubectl 和 oc 命令)集成。它们提供了各种方式,以监视应用程序、执行健康检查、管理无线更新,以及确保应用程序保持在指定的状态。因为 CRI-O 和 Kubelet 在每个节点上运行,所以几乎所有其他集群功能都可以通过使用 Operator 在 control plane 上进行管理。Operator 是 OpenShift Container Platform 4.4 中最重要的组件。使用 Operator 添加到 control plane 的组件包括重要的网络服务和凭证服务。在 OpenShift Container Platform 集群中管理其他 Operator 的 Operator 是 Cluster Version Operator。OpenShift Container Platform 4.4 使用不同类型的 Operator 来执行集群操作,并在集群上运行各种服务供您的应用程序使用。3.1.2.1. OpenShift Container Platform 中的平台 Operator在 OpenShift Container Platform 4.4 中,所有集群功能都划分到一系列平台 Operator 中。平台 Operator 管理集群功能的特定方面,如集群范围的应用程序日志记录、Kubernetes control plane 管理或机器置备系统。每个 Operator 都为您提供确定集群功能的简单 API。Operator 将管理组件生命周期的细节隐藏起来。Operator 可以管理一个组件或数十个组件,但最终目标始终是通过自动化常见操作来减轻运维负担。Operator 还提供了更为精细的配置体验。若要配置各个组件,您可以修改 Operator 公开的 API,而不必修改全局配置文件。3.1.2.2. 由 OLM 管理的 OperatorCluster Operator Lifecycle Management (OLM) 组件管理可在应用程序中使用的 Operator。它不管理组成 OpenShift Container Platform 的 Operator。OLM 是一个将 Kubernetes 原生应用程序作为 Operator 进行管理的框架。它不管理 Kubernetes 清单,而是管理 Kubernetes Operator。OLM 管理两种 Operator,即 Red Hat Operator 和经认证的 Operator。一些 Red Hat Operator 用来提供集群功能,如调度程序和问题检测器。其他 Operator 则可供您自助管理并在应用程序中使用,例如 etcd。OpenShift Container Platform 还提供由社区构建和维护并经过认证的 Operator 。这些经过认证的 Operator 为传统应用程序提供 API 层,因此您可以通过 Kubernetes 构造来管理应用程序。3.1.2.3. 关于 OpenShift Container Platform 更新服务OpenShift Container Platform 更新服务是一种托管服务,为 OpenShift Container Platform 和 Red Hat Enterprise Linux CoreOS (RHCOS) 提供无线更新 (over-the air update)。它提供了一个组件 Operator 图,其中包含各个顶点及连接它们的边。图中的边显示可以安全更新的版本,顶点是更新有效负载,用于指定托管集群组件的预期状态。集群中的 Cluster Version Operator (CVO) 会检查 OpenShift Container Platform 更新服务,并根据当前组件版本和图中的信息决定有效的更新和更新路径。当您请求更新时,OpenShift Container Platform CVO 使用该更新的发行镜像来升级您的集群。发行工件 (artifact) 作为容器镜像托管在 Quay 中。为了使 OpenShift Container Platform 更新服务仅提供兼容的更新,提供了一个版本验证管道来驱动自动化。每个发行工件都会被验证是否与支持的云平台和系统架构以及其他组件包兼容。在管道确认有适用的版本后,OpenShift Container Platform 更新服务会通知您可以进行更新。重要因为更新服务会显示所有有效的更新,所以不能强制更新到一个更新服务没有显示的版本。对于连续更新模式,会运行两个控制器。一个控制器不断更新有效负载清单,将它们应用于集群,并输出受控 Operator 部署的状态(可用、正在进行升级或失败)。第二个控制器轮询 OpenShift Container Platform 更新服务以确定更新是否可用。重要不支持将集群还原到以前的版本或执行回滚。仅支持升级到较新版本。在升级过程中,Machine Config Operator (MCO) 会将新配置应用到集群机器。它将机器配置池中由 maxUnavailable 字段指定数量的节点保护起来,并将其标记为不可用。在默认情况下,这个值被设置为 1。然后,它会应用新配置并重启机器。如果您将 Red Hat Enterprise Linux (RHEL) 机器用作 worker,MCO 不会在这些机器上更新 kubelet,因为您必须首先在这些机器上更新 OpenShift API。因为新版本的规格被应用到旧的 kubelet,所以 RHEL 机器无法返回 Ready 状态。在机器可用前,您无法完成更新。但是,通过设置不可用节点的最大数量可以确保当不可用机器的数量没有超过这个值时,正常的集群操作仍然可以继续进行。3.1.2.4. 了解 Machine Config OperatorOpenShift Container Platform 4.4 集成了操作系统和集群管理。由于集群管理自己的更新,包括集群节点上 Red Hat Enterprise Linux CoreOS (RHCOS) 的更新,因此 OpenShift Container Platform 提供了可靠的生命周期管理体验,能够简化节点升级的编配。OpenShift Container Platform 使用三个 DaemonSet 和控制器来简化节点管理。这些 DaemonSet 通过使用标准的 Kubernetes 式构造来编配操作系统更新和主机配置更改。它们包括:• machine-config-controller,协调从 control plane 进行的机器升级。它监控所有集群节点并编配其配置更新。• machine-config-daemon DaemonSet,在集群中的每个节点上运行,并按照 MachineConfigController 的指示将机器更新为 MachineConfig 定义的配置。 当节点看到更改时,它将排空其 Pod,应用更新并重启。这些更改以 Ignition 配置文件的形式出现,这些文件应用指定的机器配置并控制 kubelet 配置。更新本身在容器中交付。此过程是成功管理 OpenShift Container Platform 和 RHCOS 更新的关键。• machine-config-server DaemonSet,在 master 节点加入集群时为其提供 Ignition 配置文件。机器配置是 Ignition 配置的子集。machine-config-daemon 读取机器配置,以查看是否需要进行 OSTree 更新,或者是否必须应用一系列 systemd kubelet 文件更改、配置更改,或者对操作系统或 OpenShift Container Platform 配置的其他更改。执行节点管理操作时,您可以创建或修改 KubeletConfig Custom Resource (CR)。
2.1. OpenShift Container Platform 安装概述OpenShift Container Platform 安装程序为您提供了灵活性。您可以使用安装程序将集群部署到由安装程序置备并由集群维护的基础架构中,也可以将集群部署到您自己准备和维护的基础架构中。这两种基本类型的 OpenShift Container Platform 集群通常称为安装程序置备的基础架构集群和用户置备的基础架构集群。两种类型的集群都具有以下特征:• 默认提供无单点故障的高可用性基础架构• 管理员可以控制要应用的更新内容和更新的时间两种类型的集群都使用同一个安装程序来部署。安装程序生成的主要资产是用于 Bootstrap、master 和 worker 机器的 Ignition 配置文件。有了这三个配置和配置得当的基础架构,就能启动 OpenShift Container Platform 集群。OpenShift Container Platform 安装程序使用一组目标和依赖项来管理集群安装。安装程序具有一组必须实现的目标,并且每个目标都有一组依赖项。因为每个目标仅关注其自己的依赖项,所以安装程序可以采取措施来并行实现多个目标。最终目标是正常运行的集群。通过满足依赖项而不是运行命令,安装程序能够识别和使用现有的组件,而不必运行命令来再次创建它们。下图显示了安装目标和依赖项的子集:图 2.1. OpenShift Container Platform 安装目标和依赖项 在安装后,每一个集群机器都将使用 Red Hat Enterprise Linux CoreOS (RHCOS) 作为操作系统。RHCOS 是 Red Hat Enterprise Linux (RHEL) 的不可变容器主机版本,具有默认启用 SELinux 的 RHEL 内核。它包括作为 Kubernetes 节点代理的 kubelet,以及为 Kubernetes 优化的 CRI-O 容器运行时。OpenShift Container Platform 4.4 集群中的每一 control plane 机器都必须使用 RHCOS,其中包括一个关键的首次启动置备工具,称为 Ignition。这一工具让集群能够配置机器。操作系统更新作为嵌入在容器镜像中的 Atomic OSTree 存储库交付,该镜像由 Operator 在整个集群中推广。实际的操作系统更改通过使用 rpm-ostree 在每台机器上作为原子操作原位进行。通过结合使用这些技术,OpenShift Container Platform 可以像管理集群上的任何其他应用程序一样管理操作系统,通过原位升级使整个平台保持最新状态。这些原位更新可以减轻运维团队的负担。如果将 RHCOS 用作所有集群机器的操作系统,则集群将管理其组件和机器的所有方面,包括操作系统在内。因此,只有安装程序和 Machine Config Operator 才能更改机器。安装程序使用 Ignition 配置文件设置每台机器的确切状态,安装后则由 Machine Config Operator 完成对机器的更多更改,例如应用新证书或密钥等。2.1.1. 适用的平台在 OpenShift Container Platform 4.4 中,您可以在以下平台上安装使用安装程序置备的基础架构集群:• Amazon Web Services (AWS)• Google Cloud Platform (GCP)• Microsoft Azure• Red Hat OpenStack Platform 版本 13 和 16o 最新的 OpenShift Container Platform 版本支持最新的 RHOSP 长生命版本和中间版本。如需完整的 RHOSP 发行版本兼容性信息,请参阅 RHOSP 上的 OpenShift Container Platform 支持列表。• Red Hat Virtualization (RHV)对于所有这些集群,包括用来运行安装过程的计算机在内的所有机器都必须可直接访问互联网,以便为平台容器拉取镜像并向红帽提供 telemetry 数据。在 OpenShift Container Platform 4.4 中,您可以在以下平台上安装使用用户置备的基础架构集群:• AWS• Azure• GCP• RHOSP• VMware vSphere• 裸机在用户置备的基础架构上安装,每台机器都可拥有完整的互联网访问能力,您可以将集群放置在代理后面,也可以执行受限网络安装。在受限网络安装中,您可以下载安装集群所需的镜像(image),将它们放在镜像 registry(mirror registry)中,然后使用那些数据安装集群。虽然您需要访问互联网来为平台容器拉取镜像,但在 vSphere 或裸机基础架构上进行受限网络安装,您的集群机器不需要直接访问互联网。OpenShift Container Platform 4.x Tested Integrations 页面中提供了有关针对不同平台进行集成测试的详细信息。2.1.2. 安装过程当安装 OpenShift Container Platform 集群时,从 Red Hat OpenShift Cluster Manager 站点上的相应的 Infrastructure Provider 页面下载安装程序。此网站管理以下内容:• 帐户的 REST API• registry 令牌,这是用于获取所需组件的 pull secret• 集群注册,它将集群身份信息与您的红帽帐户相关联,以方便收集使用情况指标在 OpenShift Container Platform 4.4 中,安装程序是对一组资产执行一系列文件转换的 Go 二进制文件。与安装程序交互的方式因您的安装类型而异。• 对于具有安装程序置备的基础架构集群,您可以将基础架构启动和置备委派给安装程序,而不是亲自执行。安装程序将创建支持集群所需的所有网络、机器和操作系统。• 如果亲自为集群置备和管理基础架构,则必须提供所有集群基础架构和资源,包括 Bootstrap 机器、网络、负载均衡、存储和独立的集群机器。您无法使用安装程序置备的基础架构集群所提供的高级机器管理和扩展功能。安装期间使用三组文件:名为 install-config.yaml 的安装配置文件、Kubernetes 清单,以及您的机器类型适用的 Ignition 配置文件。重要安装期间可以修改控制基础 RHCOS 操作系统的 Kubernetes 和 Ignition 配置文件。但是,没有可用的验证机制来确认您对这些对象所做修改是适当的。如果修改了这些对象,集群可能会无法运行。由于存在这种风险,修改 Kubernetes 和 Ignition 配置文件不受支持,除非您遵循记录的流程或在红帽支持指示下操作。安装配置文件转换为 Kubernetes 清单,然后清单嵌套到 Ignition 配置文件中。安装程序使用这些 Ignition 配置文件来创建集群。运行安装程序时,所有配置文件会被修剪,因此请务必备份需要再次使用的所有配置文件。重要安装之后,您无法修改在安装过程中设置的参数,但可以修改一些集群属性。采用安装程序置备的基础架构的安装过程默认安装类型为使用安装程序置备的基础架构。默认情况下,安装程序充当安装向导,提示您输入它无法自行确定的值,并为其余参数提供合理的默认值。您还可以自定义安装过程来支持高级基础架构场景。安装程序将为集群置备底层基础架构。您可以安装标准集群或自定义集群。对于标准集群,您要提供安装集群所需的最低限度详细信息。对于自定义集群,您可以指定有关平台的更多详细信息,如 control plane 使用的机器数量、集群部署的虚拟机的类型,或 Kubernetes 服务网络的 CIDR 范围。若有可能,可以使用此功能来避免置备和维护集群基础架构。在所有其他环境中,可以使用安装程序来生成置备集群基础架构所需的资产。对于安装程序置备的基础架构的集群,OpenShift Container Platform 可以管理集群的所有方面,包括操作系统本身。每台机器在启动时使用的配置引用其加入的集群中托管的资源。此配置允许集群在应用更新时自行管理。采用用户置备的基础架构的安装过程您还可以在自己提供的基础架构上安装 OpenShift Container Platform。您可以使用安装程序来生成置备集群基础架构所需的资产,再创建集群基础架构,然后将集群部署到您提供的基础架构中。如果不使用安装程序置备的基础架构,您必须自己管理和维护集群资源,包括:• 组成集群的 control plane 和计算机器• 负载均衡器• 集群网络,包括 DNS 记录和所需的子网• 集群基础架构和应用程序的存储如果您的集群使用用户置备的基础架构,则可以选择将 RHEL worker 机器添加到集群中。安装过程详细信息由于在置备时集群中的每台机器都需要集群的相关信息,因此 OpenShift Container Platform 在初始配置期间会使用临时 Bootstrap 机器将所需的信息提供给持久 control plane。通过使用描述如何创建集群的 Ignition 配置文件进行启动。Bootstrap 机器将创建组成 control plane 的 master 机器。然后,control plane 机器创建计算(compute)机器。下图说明了这一过程:图 2.2. 创建 Bootstrap、master 和 worker 机器 集群机器初始化后,Bootstrap 机器将被销毁。所有集群都使用 Bootstrap 过程来初始化集群,但若您自己置备集群的基础架构,则必须手动完成许多步骤。重要安装程序生成的 Ignition 配置文件中所含的证书会在 24 小时后过期。您必须完成集群安装,并使集群以非降级状态运行 24 小时,以确保完成第一次证书轮转。bootstrapp 集群涉及以下步骤: bootstrap 机器启动并开始托管 master 机器启动所需的远程资源。(如果自己配置基础架构,则需要人工干预) master 机器从 bootstrap 机器获取远程资源并完成启动。(如果自己配置基础架构,则需要人工干预) master 机器使用 bootstrap 机器来组成 etcd 集群。 bootstrap 机器使用新的 etcd 集群启动临时 Kubernetes control plane。 临时 control plane 将生产环境的 control plane 调度到 master 机器。 临时 control plane 关机,并将控制权交给生产环境 control plane。 bootstrap 机器将 OpenShift Container Platform 组件注入生产环境 control plane。 安装程序关闭 bootstrap 机器。(如果自己配置基础架构,则需要人工干预) control plane 设置 worker 节点。 control plane 以一组 Operator 的形式安装其他服务。完成此 bootstrap 过程后,将生成一个全面运作的 OpenShift Container Platform 集群。然后,集群下载并配置日常运作所需的其余组件,包括在受支持的环境中创建 worker 机器。 安装过程详细信息安装范围OpenShift Container Platform 安装程序的作用范围特意设计得比较狭窄。它旨在简化操作并确保成功。安装完成后,您可以完成更多的配置任务。2.2. 关于 OPENSHIFT CONTAINER PLATFORM 更新服务OpenShift Container Platform 更新服务是一种托管服务,为 OpenShift Container Platform 和 Red Hat Enterprise Linux CoreOS (RHCOS) 提供无线更新 (over-the air update)。它提供了一个组件 Operator 图,其中包含各个顶点及连接它们的边。图中的边显示可以安全更新的版本,顶点是更新有效负载,用于指定托管集群组件的预期状态。集群中的 Cluster Version Operator (CVO) 会检查 OpenShift Container Platform 更新服务,并根据当前组件版本和图中的信息决定有效的更新和更新路径。当您请求更新时,OpenShift Container Platform CVO 使用该更新的发行镜像来升级您的集群。发行工件 (artifact) 作为容器镜像托管在 Quay 中。为了使 OpenShift Container Platform 更新服务仅提供兼容的更新,提供了一个版本验证管道来驱动自动化。每个发行工件都会被验证是否与支持的云平台和系统架构以及其他组件包兼容。在管道确认有适用的版本后,OpenShift Container Platform 更新服务会通知您可以进行更新。重要因为更新服务会显示所有有效的更新,所以不能强制更新到一个更新服务没有显示的版本。对于连续更新模式,会运行两个控制器。一个控制器不断更新有效负载清单,将它们应用于集群,并输出受控 Operator 部署的状态(可用、正在进行升级或失败)。第二个控制器轮询 OpenShift Container Platform 更新服务以确定更新是否可用。重要不支持将集群还原到以前的版本或执行回滚。仅支持升级到较新版本。在升级过程中,Machine Config Operator (MCO) 会将新配置应用到集群机器。它将机器配置池中由 maxUnavailable 字段指定数量的节点保护起来,并将其标记为不可用。在默认情况下,这个值被设置为 1。然后,它会应用新配置并重启机器。如果您将 Red Hat Enterprise Linux (RHEL) 机器用作 worker,MCO 不会在这些机器上更新 kubelet,因为您必须首先在这些机器上更新 OpenShift API。因为新版本的规格被应用到旧的 kubelet,所以 RHEL 机器无法返回 Ready 状态。在机器可用前,您无法完成更新。但是,通过设置不可用节点的最大数量可以确保当不可用机器的数量没有超过这个值时,正常的集群操作仍然可以继续进行。2.3. 支持非受管 OPERATOR 的策略Operator 的 管理状态 决定了一个 Operator 是否按设计积极管理集群中其相关组件的资源。如果 Operator 设置为 非受管(unmanaged) 状态,它不会响应配置更改,也不会收到更新。虽然它可以在非生产环境集群或调试过程中使用,但处于非受管状态的 Operator 不被正式支持,集群管理员需要完全掌控各个组件的配置和升级。可使用以下方法将 Operator 设置为非受管状态:• 独立 Operator 配置独立 Operator 的配置中具有 managementState 参数。这可以通过不同的方法来访问,具体取决于 Operator。例如,Cluster Logging Operator 通过修改它管理的自定义资源 (CR) 来达到此目的,而 Samples Operator 使用了集群范围配置资源。将 managementState 参数更改为 Unmanaged 意味着 Operator 不会主动管理它的资源,也不会执行与相关组件相关的操作。一些 Operator 可能不支持此管理状态,因为它可能会损坏集群,需要手动恢复。• 警告将独立 Operator 更改为非受管状态会导致不支持该特定组件和功能。报告的问题必须在 受管(Managed) 状态中可以重复出现才能继续获得支持。• Cluster Version Operator (CVO) 覆盖可将 spec.overrides 参数添加到 CVO 配置中,以便管理员提供对组件的 CVO 行为覆盖的列表。将一个组件的 spec.overrides[].unmanaged 参数设置为 true 会阻止集群升级并在设置 CVO 覆盖后提醒管理员:Disabling ownership via cluster version overrides prevents upgrades. Please remove overrides before continuing.警告设置 CVO 覆盖会使整个集群处于不受支持状态。在删除所有覆盖后,必须可以重现报告的问题方可获得支持。
1.1. OpenShift Container Platform 简介OpenShift Container Platform 是用于开发和运行容器化应用程序的平台。它旨在允许支持的应用程序和数据中心从少量机器和应用程序扩展到为数百万客户端服务的数千台机器。OpenShift Container Platform 以 Kubernetes 为基础,为大规模电信、流视频、游戏、银行和其他应用提供引擎技术,您可以将容器化应用程序从单一云扩展到内部和多云环境。1.1.1. 关于 KubernetesKubernetes 是一个开源容器编配引擎,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes 的一般概念比较简单:• 从一个或多个 worker 节点开始,以运行容器工作负载。• 从一个或多个 master 节点管理这些工作负载的部署。• 将容器嵌套在称为 Pod 的部署单元中。使用 Pod 可以为容器提供额外的元数据,并可在单个部署实体中对多个容器进行分组。• 创建特殊种类的资产。例如,服务由一组 Pod 及定义了访问方式的策略来表示。此策略可使容器连接到所需的服务,即便容器没有用于服务的特定 IP 地址。复制控制器(replication controller)是另一种特殊资产,用于指示一次需要运行多少个 Pod 副本。您可以使用此功能来自动扩展应用程序,以适应其当前的需求。短短数年,Kubernetes 已在大量的云和本地环境中被采用。借助开源开发模型,拥护和可以通过为组件(如网络、存储和身份验证)实施不同的技术来扩展 Kubernetes 的功能。1.1.2. 容器化应用程序的好处1.1.2.1. 操作系统的好处容器使用不含内核的小型专用 Linux 操作系统。它们的文件系统、网络、cgroups、进程表和命名空间与主机 Linux 系统分开,但容器可以在必要时与主机无缝集成。容器以 Linux 为基础,因此可以利用快速创新的开源开发模型带来的所有优势。因为每个容器都使用专用的操作系统,所以您能够在同一主机上部署需要冲突软件依赖项的不同应用程序。每个容器都带有各自的依赖软件,并且管理自己的接口,如网络和文件系统,因此应用程序无需争用这些资产。1.1.2.2. 部署和扩展优势如果您在应用程序的主要版本之间进行滚动升级,则可以持续改进应用程序,既不会造成停机,又能仍然保持与当前版本的兼容性。您还可以与现有版本一起部署和测试应用程序的新版本。在部署了当前版本的同时,还部署应用程序的新版本。容器通过测试后,只要部署更多新容器并删除旧容器便可。 由于应用程序的所有软件依赖项都在容器本身内解决,因此数据中心的每台主机上都能使用通用操作系统。您无需逐一为应用主机配置特定的操作系统。当数据中心需要更多容量时,您可以部署另一个通用主机系统。同样,扩展容器化应用程序也很简单。OpenShift Container Platform 提供了一种简单的、标准方式的容器化服务扩展功能。例如,如果将应用程序构建为一组微服务,而非大型的单体式应用程序,您可以分别扩展各个微服务来满足需求。有了这一能力,您可以只扩展需要的服务,而不是整个应用程序,从而在使用最少资源的前提下满足应用程序需求。1.1.3. OpenShift Container Platform 概述OpenShift Container Platform 为 Kubernetes 带来企业级增强,具体包括以下所列:• 混合云部署。您可以将 OpenShift Container Platform 集群部署到各种公有云平台或数据中心中。• 集成了红帽技术。OpenShift Container Platform 中的主要组件源自 Red Hat Enterprise Linux 和相关的红帽技术。OpenShift Container Platform 得益于红帽企业级优质软件的严格测试和认证计划。• 开源开发模型。开发以开放方式完成,源代码可从公共软件存储库中获得。这种开放协作促进了快速创新和开发。虽然 Kubernetes 擅长管理应用程序,但它并未指定或管理平台级要求或部署过程。强大而灵活的平台管理工具和流程是 OpenShift Container Platform 4.4 具备的重要优势。1.1.3.1. 定制操作系统OpenShift Container Platform 使用 Red Hat Enterprise Linux CoreOS (RHCOS),这是一款面向容器的操作系统,结合了 CoreOS 和 Red Hat Atomic Host 操作系统的一些最佳特性和功能。RHCOS 是专门为从 OpenShift Container Platform 运行容器化应用程序而设计的,能够与新工具配合,提供快速安装、基于 Operator 的管理和简化的升级。RHCOS 包括:• Ignition,OpenShift Container Platform 将其用作首次启动系统配置来进行机器的初次上线和配置。• CRI-O,Kubernetes 的原生容器运行时实现,可与操作系统紧密集成来提供高效和优化的 Kubernetes 体验。CRI-O,提供用于运行、停止和重启容器的工具。它完全取代了 OpenShift Container Platform 3 中使用的 Docker Container Engine。• Kubelet,Kubernetes 的主要节点代理,负责启动和监视容器。在 OpenShift Container Platform 4.4 中,所有 control plane 都需要使用 RHCOS。但 compute(计算)机器(也被称为 worker )可以使用 Red Hat Enterprise Linux (RHEL) 做为操作系统。如果选择使用 RHEL worker,与将 RHCOS 用于所有集群机器相比,您必须执行更多的系统维护。1.1.3.2. 简化的安装和更新流程使用 OpenShift Container Platform 4.4 时,如果您拥有具有正确权限的帐户,通过运行单个命令并提供几个值,就能在支持的云中部署生产集群。如果使用支持的平台,您还可以自定义云安装或在数据中心中安装集群。1.1.3.3. 其他主要功能Operator 既是 OpenShift Container Platform 4.4 代码库的基本单元,又是部署供应用程序使用的应用程序和软件组件的便捷方式。在 OpenShift Container Platform 中,Operator 可充当平台的基础,不再需要手动升级操作系统和 control plane 应用程序。OpenShift Container Platform Operator(如 Cluster Version Operator 和 Machine Config Operator)允许对这些关键组件进行简化的集群范围内管理。Operator Lifecycle Manager (OLM) 和 OperatorHub 提供了相应的工具,可用于存储 Operator 并将其分发给开发和部署应用程序的人员。Red Hat Quay Container Registry 是一个 Quay.io 容器 registry,为 OpenShift Container Platform 集群提供大多数容器镜像和 Operator。Quay.io 是 Red Hat Quay 的一个公共 registry 版本,可存储数百万镜像和标签。OpenShift Container Platform 中的其他 Kubernetes 增强功能包括软件定义网络 (SDN)、身份验证、日志聚合、监视和路由方面的改进。OpenShift Container Platform 还提供功能齐全的 web 控制台和自定义 OpenShift CLI (oc) 界面。1.1.3.4. OpenShift Container Platform 生命周期下图显示了 OpenShift Container Platform 的基本生命周期:• 创建 OpenShift Container Platform 集群• 管理集群• 开发和部署应用程序• 扩展应用程序• 图 1.1. OpenShift Container Platform 高级概述• 1.1.4. OpenShift Container Platform 对互联网和 Telemetry 的访问在 OpenShift Container Platform 4.4 中,您需要访问互联网来安装集群。默认运行的 Telemetry 服务提供有关集群健康状况和成功更新的指标,这也需要访问互联网。如果您的集群连接到互联网,Telemetry 会自动运行,而且集群会注册到 Red Hat OpenShift Cluster Manager(OCM)。确认 Red Hat OpenShift Cluster Manager 清单正确后,可以由 Telemetry 自动维护,也可以使用 OCM 手动维护,使用订阅监控 来跟踪帐户或多集群级别的 OpenShift Container Platform 订阅。您必须具有以下互联网访问权限:• 访问 Red Hat OpenShift Cluster Manager 页面,以下载安装程序并执行订阅管理。如果集群可以访问互联网,并且没有禁用 Telemetry,该服务会自动授权您的集群。• 访问 Quay.io,以获取安装集群所需的软件包。• 获取执行集群更新所需的软件包。重要如果您的集群无法直接访问互联网,则可以在置备的某些类基础架构上执行受限网络安装。在此过程中,您要下载所需的内容,并使用它在镜像 registry(mirror registry) 中填充安装集群并生成安装程序所需的软件包。对于某些安装类型,集群要安装到的环境不需要访问互联网。在更新集群之前,您要更新镜像 registry(mirror registry) 的内容。
数据集成产品介绍 数据集成(Data Integration) 数据集成是阿里集团对外提供的稳定高效、弹性伸缩的数据集成平台,为阿里云大数据计算引擎(包括MaxCompute、AnalyticDB、OSS)提供离线(批量)数据进出通道。有别于传统的客户端点对点同步运行工具,数据集成本身以公有云服务为基本设计目标,集群化、服务化、多租户、水平扩张等功能都是其基本实现要求。通过DataWorks应用数据集成的入口离线(批量)的数据通道主要通过定义数据来源和去向的数据源和数据集,提供一套抽象化的数据抽取插件(称之为Reader),数据写入插件(称之为Writer),并基于此框架设计一套简化版的中间数据传输格式,从而达到任意结构化、半结构化数据源之间数据传输的目的。逻辑结构如下:来源数据源->Reader数据抽取插件->Channel传输通道->Writer数据写入插件->目标数据源数据集成支持的数据源 数据同步 数据同步广义是指为保持两端数据一致性而进行的数据传输过程。一般来说,数据集成的数据同步是为保证源宿两端数据逻辑的一致性,将数据源端移动到数据目的端,并伴随一定的数据转换或者清洗的过程。在数据集成的功能边界中,数据同步定义为云上各种存储产品之间进行的数据转移过程。数据同步类型:离线数据同步和流式数据同步同步三要素:数据源、数据转换过程(optional)、数据目的端 数据同步作业 作业(JOB)是数据集成进行数据批量同步的基本业务单元,数据集成的Job面向表级别数据同步。描述了一个数据同步作业完成一次数据同步任务所需要的信息,包括E(Extract)、T(Transform)、L(Load)等用户描述信息,也包括作业的运行信息。作业模型:数据集成本身不保存作业信息;用户提交每一次作业都生成一个job对象,并为其分配唯一的Job ID;多次提交生成多个Job ID,运行一次即是一个独立的Job。调度模型:作业速率信息,实际速率受网络环境、数据库配置等影响;单并发同步作业,作业并发数*单并发的传输速率=作业传输总速率。约束限制:目前需要提前在目的端数据源进行建表操作;按照原宿两端Column的映射情况进行传输,而非Column名称或者类型进行;同步过程存在字段类型饮式转换规则,常见如整型、浮点型转为字符串类型。数据同步的权限与安全:用户角色系统隔离数据源鉴权 DataX DataX是一个异构数据源离线同步工具,用于实现包括关系型数据库(MySQL、oracle等)、HDFS、Hive、ODPS、Hbase、FTP等各种异构数据源之间稳定高效的数据同步功能,其设计理念为将复杂的网络的异构数据源同步链路变成星型数据链路,DataX作为中间传输载体负责连接各种数据源。 同步任务配置流程 利用数据集成同步数据 配置数据源 配置数据源步骤:1、选择新增数据源类型;2、配置数据源相关属性:如数据源名称、连接信息、登录名以及密码(不同的数据源配置的属性信息不同);3、测试连通性,目的是验证输入的数据源是否正确;4、确定,完成配置 创建同步任务 步骤:1、新建同步任务(节点)2、选择来源3、选择目标4、字段映射5、通道控制6、预览保存 运行同步任务 直接运行:指运行在默认的资源组上,而且可以在当前窗口下方直接看到运行日志(日志不保存,消失后不可见)调度运行:配置调度任务一般在第二天生产实例节点到设置调度时间就会开始运行任务补数据运行:一般是运行失败同步任务,补数据重新运行昨天的同步任务数据测试节点运行:测试节点选择当天以前的实例节点运行,同步任务立刻运行并查看日志 同步中的脏数据和容错 数据同步通常会对接源端和目标端的数据存储,需要根据来源和目标两端数据源的具体信息适配和转换相应的数据内容。在传输过程中,可能存在由于两端元数据不匹配或者本身的业务数据传输失败的情况,数据集成自动识别脏数据并提供容错机制。脏数据可能产生的原因:数据类型转换出错,如String[""]不能转为long;数据超出定义范围(Out of range value),如源端设置的是smallint(5),目标端是int(11) unsigned,因为smallint(5)范围有负数,unsigned不允许有负数,所以产生脏数据。存储表情符emoj,数据表配置成了可以存储的emoj的,同步时报脏数据。空字段引起脏数据 数据同步过程中的常见配置 配置白名单 为保证数据库的安全稳定,在开始使用某些数据库实例前,需要将访问数据库的IP地址或者IP段加到目标实例的白名单或安全组中,否则无权限访问数据。说明:常见的数据源如RDS、Mongodb、Redis等,需要在其控制台对目标数据的IP进行开放。一般添加白名单有以下两种情况:同步任务运行在自定义资源组上,要给自定义资源组机器授权,将自定义机器内/外网IP添加数据源的白名单列表。同步任务运行默认资源组上,要给默认的机器授权,一般根据dataworks的region来选定对应的白名单地址。数据集成连接RDS同步数据需要使数据库标准协议连接数据库。RDS默认允许所有IP连接,但如果在RDS指定来IP白名单,则需要添加数据集成执行节点IP白名单。配置安全组:通道控制参数DMU配置 通道控制参数并发配置 并发:可视为数据同步任务内,从源并行读取或并行写入数据存储端的最大线程数;向导模式通过界面化配置并发数,指定任务所使用的并行度;脚本模式通过代码设置。并发配置的越大,则所需要的系统资源(DMU)越多,在网络状况和读写端数据源能力满足的情况下,同步速度可以呈线性增长。DMU和并发有联动关系:当DMU配置为10时,最高并发数不可超过10;配置高并发,需要考虑读写端数据源的能力,并发过高可能会对源端数据库造成性能影响;脚本模式中,并发值虽然可以设置较高,但单任务所分配数据移动单元DMU会有控制。数据集成同步任务默认不限速,任务将在所配置的并发数、DMU数的限制上以最高能达到的速度进行同步。另一方面,由于速度过高可能对数据库造成过大的压力从而影响生产,如设置限速,建议最高速度上限不应超过30MB/s。通道控制错误记录数配置数据源切分键配置数据字段映射配置
DataWorks介绍 DataWorks(数据工厂,原大数据库开发套件)是阿里云数加重要的PaaS平台产品,它提供全面托管的工作流服务,一站式开发管理界面,帮助企业专注于数据价值的挖掘和探索。它是一套基于MaxCompute(原ODPS)的DW解决方案,他集成了阿里多年的DW实施经验,提供数据集成、处理、分析和管理功能,并为代码开发、调试、发布、运维、监控和管理提供了一个高效、安全的离线数据开发环境。 全面托管的调度 强大的调度能力,千万级别的任务调度;支持按照时间、依赖关系的任务触发机制;支持每日任务按照DAG关系准确、准时运行;支持分钟、小时、天、周和月多种调度周期配置;完全托管的服务,无需关心调度服务器资源问题;租户之间提供隔离,保证不同租户之间的任务不会互相影响。 支持多种任务类型 支持数据同步、SHELL、MaxCompute SQL、MaxCompute MR等多种任务类型,通过任务之间的相互依赖完成复杂的数据分析处理。 可视化开发 提供可视化的代码开发、工作流设计器页面,无需搭配任何开发工具,简单的拖拽和开发就可以完成复杂的数据分析任务。只要有浏览器、有网络,便可随时随地进行开发工作。 监控告警 运维中心提供可视化的任务监控管理工具,支持以DAG图的形式展示任务运行时的全局情况;可方便地配置短信、邮件报警,任务发生错误可及时通知相关人员,保证业务正常运行。 DataWorks产品特点 基于MaxCompute:一套基于Max Compute(原ODPS)的数据开发、数据管理工具。清晰可见的血缘:基于统一的元数据服务提供数据资源管理视图、可视化的数据血缘分析、清晰展现数据表的输入与输出,方便追溯其处理过程。一站式数据开发:提供数据同步、数据加工、一键发布、调度引擎等一站式大数据开发服务。可视化开发界面:面向数据开发者、数据运维人员,项目管理者提供了可视化的开发界面。 产品优势 1、专业解决数据同步、开发与运维问题。全面提升大数据加工的效率,降低成本。2、易用屏蔽云端复杂性,轻松完成云端数据同步。灵活撰写数据处理代码,极简任务管理。3、大数据处理能力与MaxCompute(原ODPS)完美融合,释放其处理能力。实现数据价值的深度挖掘与业务的数据化运营。 DataWorks基本概念 组织与项目空间 组织 组织是大数据平台特有概念,一个公司开通大数据平台服务就创建一个组织,一个组织内创建多个项目空间。组织之间互相隔离,一个账号只能所属一个组织。元数据按组织隔离,只能查看本组织下的表元数据。 项目空间(project) 项目空间时数据开发中最基本的组织对象,类似于传统数据库的database。数据开发的项目空间,是进行多组织隔离和访问控制的主要边界,也是用户管理表(table)、资源(resource)、自定义函数(UDF)、作业(job)、节点(node)、工作流(workflow)、权限等的基本单元。 任务(task) 任务是指定义对数据执行的操作。每个任务使用0或0个以上的数据表(数据集)作为输入,生成一个或多个数据表(数据集)作为输出。如:使用数据同步节点任务,将数据从RDS复制到MaxCompute。使用MaxCompute SQL节点任务运行MaxCompute SQL来进行数据的转换。使用工作流任务,通过内部几个不同的SQL内部节点完成一系列的数据转换。 工作流(WorkFlow) 工作流是一个DAG图(有向无环图),其描述了作业中多个节点之间的逻辑(依赖关系)和规则(运行越是)。 节点(Node) 节点属于工作流的字对象,也称为任务,是数据开发数据处理和分析过程的最基本单元,每个任务对应DAG图中的一个节点,其可以是一个SQL Query、命令和MapReduce程序。 依赖关系(Dependency) 依赖关系是描述两个或多个节点/工作流之间的语义连接关系,其中上游节点/工作流的运行状态可以影响下游节点/工作流的运行状态,反正则不成立。 实例(Instance) 在调度系统中的任务经过调度系统、手动触发运行后会生成一个实例,实例代表了某个任务在某时某刻执行的一个快照,实例中会有任务的运行时间、运行状态、运行日志等信息。 资源(Resource) 资源是数据开发的特有概念,用户可以上传本地自定义的JAR或文件作为资源,在节点运行时调用,如,在数据开发中运行MapReduce程序,需要将MapReduce生成的JAR包上传到平台后,通过节点调用所上传的资源来运行此MapReduce程序。 函数(Function) MaxCompute提供了Java的编程接口来开发用户自定义函数。在大数据平台数据开发套件中指出Java UDF。说明:资源与函数都是MaxCompute的概念,在DataWorks中,可以通过界面管理资源、函数。如果通过MaxCompute的其他方式进行资源、函数管理,则无法在DataWorks中进行相关的查询。 DataWorks功能框架 DataWorks是底层基于MaxCompute(原ODPS)的集成开发环境,包括数据开发、数据管理、数据分析、数据挖掘和管理控制台。其中数据分析和数据挖掘属于阿里云大数据开发平台高级组件。 大数据开发平台功能模块 组织管理 管理dataworks的项目空间。管理dataworks的调度资源。管理组织成员、权限、角色等 项目管理 配置项目属性,包括基本属性、数据源、计算引擎以及流程控制。管理项目成员 数据开发 开发任务、脚本、配置调度管理资源、函数等。 数据管理 找数据、权限管理数据表管理 运维中心 任务管理,包括查看、编辑、运行任务的运维和监控,包括运行日志、调度和恢复以及监控报警 DataWorks角色隔离 组织管理员 指组织的管理者,可新建计算引擎、新建项目空间、新建调度资源、添加组织成员、为组织成员赋予项目管理员角色、配置数据类目等。即阿里云云账号的角色,此角色不能赋予其他账号。 项目管理员 指项目空间的管理者,可对该项目空间的基本属性、数据源、当前项目空间计算引擎配置和项目成员等进行管理,并为项目成员赋予项目管理员、开发、运维、部署、访客角色。对应maxcompute的数据权限为project/table/fuction/resource/instance/job/volume/offlinemodel/package的所有权限,对应maxcompute的role_project_admin角色 开发 开发角色的用户能够创建工作流、脚本文件、资源和UDF,新建/删除表,同时可以创建发布包,但不能执行发布操作。maxcompute的数据权限为project/fuction/resource/instance/job/volume/offlinemodel/package/table的所有权限,对应maxcompute的role_project_dev角色 运维 运维角色的用户由项目管理员分配运维权限;拥有发布及线上运维的操作权限,没有数据开发的操作权限。maxcompute的数据权限为project/fuction/resource/instance/job/offlinemodel的所有权限,拥有volume/package的read权限和table的read/describe权限。maxcompute角色为role_project_pe. 部署 部署角色与运维角色相似,但是它没有线上运维的操作权限。默认无maxcompute的数据权限,对应maxcompute的role_project_deploy角色 访客 访客角色的用户只具备查看权限,没有权限进行编辑工作流和代码等操作。默认无maxcompute数据权限,maxcompute的角色为role_project_guest. 安全员 安全管理员仅在数据保护伞中用到,用于敏感规则配置,数据风险审计等。默认无maxcompute数据权限,maxcompute的角色role_project_security.
用户与角色 多租户安全体系: 1、用户认证 MaxCompute账号体系MaxCompute支持云账号和RAM账号两种账号体系云账号:默认情况下,MaxCompute项目仅能识别阿里云账号系统;申请阿里云账号-实名认证-创建运行密钥accesskeysaccesskey由两部分组成:accesskeyid和accesskeysecret组成,accesskeyid 用于检索Accesskey,Accesskey用于计算消息签名查看账号系统命令:list accountproviders; RAM账号:RAM(resource access management)是阿里云为客户提供的用户身份管理与资源访问控制服务,通过RAM服务,主账号可以创建、管理用户账号(RAM账号),控制这些用户账号对主账号名下资源具有的操作权限。从归属关系上看,云账户与RAM用户是一种主子关系。从权限角度看,云账户与RAM用户是一种root与user的关系(类比Linux系统)。MaxCompute仅能识别RAM的账号体系,不能识别RAM的权限体系;添加RAM账号系统命令:add accountprovider ram; 用户认证:用户认证检查请求request发送者的真实身份:正确验证消息发送方的真实身份,正确验证接收到的消息在途中是否被篡改。云账号认证使用消息签名机制,可以保证消息在传输过程中的完整性integrity和真实性authenticity,目前采用的消息签名算法是HMAC-SHA1LVS负载均衡发送accessid MD5签名-HTTP Server发送accessid MD5签名-云账号服务器返回accountid-HTTP Server项目空间用户管理:1、Alice创建一个名为wonderland的项目,自动成为owner;没有Alice授权,其他任何人都无法访问wonderland;2、Alice要授权Bob允许他访问wonderland的一些对象:首先bob要有一个合法的云账号,然后Alice要把bob的云账号加到项目中,最后赋一些对象的权限给bob。3、alice要禁止Bob访问项目,则直接将他的云账号从项目中移除即可,前提是bob没有被赋予任何角色。4、bob虽然被移除了项目,但他之前被赋予的权限仍然保留在项目中。下次一旦他被Alice加入到同一个项目,原有的权限将会被自动激活。角色管理:角色(role)是一组访问权限的集合。相比owner,admin角色不能将admin角色赋给别的用户,不能设定项目空间的安全配置,不能修改项目空间的鉴权模型。角色的限制:admin角色的权限不能被修改;没被使用的角色才可以被删除。 2、项目空间的用户与授权管理 授权三要素:主体subject、客体object、操作action授权两方法:ACL基于对象的授权;Policy基于策略的授权。ACL授权客体包括project、table、function、resource、instance。说明:project类型对象的createtable操作、table类型的select、alter、update、drop操作需要与project对象的create instance操作权限配合使用;当跨项目操作如在项目A里select项目B的table,则需要有项目A的createinstace和项目B的tableselect权限。ACL授权:基本语法:grant on 权限查看:A:表示allow,即允许访问。D:表示deny,即拒绝访问。C:表示with Condition,即为带条件的授权,只出现在policy授权体系中。G:表示with grant option,即可以对object进行授权查看指定用户权限:show grants;查看当前用户自己的访问权限show grants for ;查看指定用户的访问权限,仅由projectowner和admin才能执行权限。查看指定角色权限:describe role;查看指定角色的访问权限角色指派项目空间的安全配置:鉴权模型配置 用户管理和授权 基于标签的安全管理 基于标签的安全控制 labelsecurity基本操作 LabelSecurity注意事项 应用场景 应用场景2 跨项目空间的资源分享 Package package是一种跨项目空间共享数据及资源的机制,主要用于解决跨项目空间的用户授权问题。创建者(资源提供方)+使用者(资源使用者)=Package机制Package创建者 Package使用者 例子: 项目空间的数据保护 防止数据流出: 项目空间的保护机制 设置ProjectProtection规则:数据只能流入,不能流出set ProjectProtection=true;设置后,触犯了ProjectProtection规则的数据流出会被禁止。默认时,ProjectProtection不会被设置,需要手工开启。 项目空间保护下的合规数据流出 资源分享和数据保护
MapReduce编程模型 MR基础 最大优点是充分利用了闲置资源,多任务并行,快速得到答案。拆分-处理-合并 MR框架介绍 MR处理流程 MapReduce(最早由Google提出)是一种分布式数据处理模型;核心过程主要分成2个阶段:Map阶段和Reduce阶段;首先执行Map阶段,再执行Reduce阶段。Map和Reduce阶段的处理逻辑由用户自定义实现,即实现分布式计算。 MR模型的适用场景 搜索:网页爬取、倒排索引,PageRankWeb访问日志分析:分析和挖掘用户在web上的访问、购物行为特征,实现个性化推荐;分析用户访问行为。文本统计分析:例如小说的WordCount,词频TFIDF分析;学术论文、专利文献的饮用分析和统计;维基百科数据分析等。海量数据挖掘:非结构数据、时空数据、图像数据的挖掘。机器学习:监督学习、无监督学习、分类算法如决策树、SVM等。自然语言处理:基于大数据的训练和预测;基于语料库构建单词同现矩阵,频繁项数据挖掘、重复文档检测等。广告推荐:用户点击(CTR)和购买行为(CVR)预测 MR框架 用户视角看原理 用户视角谈实现 扩展MR MR开发使用流程 1、阿里云官网下载插件、配置开发环境 2、新建java项目,完成MR开发 增加mapper 增加Reducer 增加MR Driver 添加处理逻辑 3、本地测试准备本地测试数据 本地测试 本地测试结果检查 4、导出成jar包,并作为资源上传到ODPS的项目空间 add jar wcMR.jar -f; MR打包成jar包 5、使用jar命令调用MR(命令示例如下) jar -resources wcMR.jar -classpath wcMR.jar -classpath wcMR.jar example.wcDriver wc_in wc_out; 6、检查运行结果7、开发发布完成。发布 例子:WordCount MR的开发说明:1、支持MaxCompute内置类型的bigint,double,string,datetime及Boolean类型,不支持自定义类型。2、接受多表输入,且输入表的schema可以不同。在map函数中,可以获取当前record对应的table信息。3、输入可以为空,不支持视图(View)作为输入。4、Reduce接受多路输出,可以输出到不同表,或者同一张表的不同分区。不同输出的schema可以不同。不同输出间通过label进行区分,默认输出不必加lable,目前不接受没有输出的情况。 MR编程模型-SDK核心接口 MaxCompute MR执行流程 核心接口 MapperBase:映射操作 JobConf:MR任务配置信息 MR使用注意事项 Graph编程模型 Graph概述 Graph的数据结构 Graph的处理流程 Graph的处理伪代码 Graph SDK介绍 Graph的Aggregator机制 Graph的作业运行 Graph开发使用流程 Dijkstra算法 配置java—+eclapse等跟mapreduce步骤都类似 JAVA沙箱限制
UDF简介 UDF(user defined scalar function) 用户自定义标量函数用于对传递给它的一个或者多个参数值进行处理和计算并返回一个单一的值。函数输入和输出是一对一的返回一个确定类型的标量值可以在where过滤条件中select myudf_low(name) FROM t_test;select * from t_test where myudf_lower(name)='odps';select * from t_test where myudf_lower(myudf_lower(name))='odps'; UDTF(user defined table valued function) 用户自定义表值函数:解决一次函数调用输出多行多列数据场景;唯一能返回多个字段的用户自定义函数;不支持在同一个select字句中与group by,distribute by/sort by联用。函数输入和输出是一对多的同一个select字句不允许有其他表达式不能嵌套使用select myudf_vertical(name,score) as (name,score) from t_udtf; UDAF(user defined aggregation function) 用户自定义聚合函数:将多条输入记录聚合成一条输出值后输出。输入与输出是多对一关系可以与SQL中的group by语句联用select AggrAvg(score) from t_udaf;select name,AggrAvg(score) from t_udtf group by name; Java UDF支持的数据类型 UDF实现逻辑 UDF实现逻辑 UDTF实现逻辑 UDAF实现逻辑 实现UDF需要继承com.aliyun.odps.udf.Aggregator类需要实现setup,newBuffer,iterate,terminate,merge,close等接口用户实现自定义的writable buffer UDAF实现平均值 UDF开发流程 JavaUDF的开发流程 配置Java+eclipse的环境新建项目新增UDF类添加逻辑处理准备本地测试数据编译调试导出Jar包发布
SQL基础知识 MaxCompute没有事务概念、主键、索引,不支持update和delete操作 MaxCompute SQL是什么? MaxCompute SQL是个数据处理工具Query解析后,计算和存储交由底层的飞天实现MaxCompute SQL采用的类似于SQL的语法,可以看作是标准SQL的子集,但不能因此简单地把MaxCompute等价成一个数据库MaxCompute SQL每个作业的准备,提交阶段要话费较长时间,实时性不高。目前MaxCompute SQL长度有限制,单条不超过2M。 MaxCompute中的数据组织 Project项目空间: MaxCompute的所有对象都隶属于项目空间 项目时maxcompute计量计费及安全控制的基本单元 Table表: 所有的数据都存储在表里 支持表分区,支持依赖于表的视图 Partition分区: 上传时,手工创建分区并保证质量,需指定分区。 使用insert数据时支持动态分区 MaxCompute SQL的约束 不支持事务 不支持主/外键 不支持索引 不支持Update/Delete MaxCompute SQL的适用场景 MaxCompute SQL适用于海量数据(GB、TB、EB级别),离线批量计算的场合。 不适合直接对接需要每秒处理几千至数万笔事物的前台业务系统,因为不支持事物,响应时间会比较长 Maxcompute SQL的每个作业的准备,提交等阶段都要花费较长时间,因此实时性不高。 MaxCompute SQL的关键字 MaxCompute将SQL语句的关键字作为保留字。在对表、列或是分区命名时如果使用关键字,需给关键字价"符合进行转意,否则会报错。保留字不区分大小写。常见如下:% & && 等。 MaxCompute SQL的类型转换 显示转换:指用cast将一种数据类型的值转换为另一种类型的值的行为。隐式转换:是指依据上下文使用环境及类型转换规则自动进行的类型转换。 MaxCompute SQL的运算符 关系:< >算术:+ -位:&逻辑:and or not SQL Task介绍 MaxCompute SQL作业提交后,形成任务task,执行时形成任务实例instance,其执行过程自动调用Mapreduce。通过logview监控执行过程。 Mapreduce MapReduce是面向大数据并行处理的计算模型、框架和平台,它隐含了以下三层含义:1)MapReduce是一个基于集群的高性能并行计算平台。它允许用市场上普通的商用服务器构成一个包含数十、数百至数千个节点的分布和并行计算集群。2)MapReduce是一个并行计算与运行软件框架。它提供了一个庞大但设计精良的并行计算软件框架,能自动完成计算任务的并行化处理,自动划分计算数据和计算任务,在集群节点上自动分配和执行任务以及收集计算结果,将数据分布存储、数据通信、容错处理等并行计算涉及到的很多系统底层的复杂细节交由系统负责处理,大大减少了软件开发人员的负担。3)MapReduce是一个并行程序设计模型与方法。它借助于函数式程序设计语言Lisp的设计思想,提供了一种简便的并行程序设计方法,用Map和Reduce两个函数编程实现基本的并行计算任务,提供了抽象的操作和并行编程接口,以方便地完成大规模数据的编程和计算处理。MaxCompute SQL的主要功能1、支持各类运算符2、通过DDL语句对表、分区以及视图进行管理3、通过select语句查询表中的记录,通过where语句过滤表中的记录。4、通过insert语句插入数据、更新数据5、通过等值连接join操作,支持两张表的关联。支持多张小表的mapjoin。6、支持通过内置函数和自定义函数来进行计算。7、支持正则表达式。正则表达式,又称规则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。 数据定义DDL CREATE[EXTERNAL] table [IF NOT EXISTS] table_name[(col_name data_type [COMMENT col_comment],…)][COMMENT table_comment][PARTITIONED BY (col_name data_type [COMMENT col_comment],…)][STORED BY StorageHandler] --仅为外部表[WITH SERDEPROPERTIES(Options)] --仅限外部表[LOCATION OSSLocation];--仅限外部表[LIFECYCLE days] [AS select_statement];CREATE TABLE [IF NOT EXISTS] table_name LIKE existing_table_name 创建表实例: 快捷建表操作-CTAS 快捷键建表操作-示例: create table test4 like test3;--除生命周期属性外,test3的其他属性(字段类型、分区类型)均与test4完全一致。create table test5 as select * from test2;--这个操作会创建test5,但分区,生命周期信息不会被拷贝到目标表中。另外操作还会将test2的数据复制到test5中。添加/删除分区add/drop 表的其他操作 视图 生命周期 数据操作DML insert操作-更新表中数据 insert操作-更新动态分区表中的数据 多路输出(MULTIINSERT) insert操作-values select操作-查询语法 select操作-where条件 select-其他字句 select操作-子查询几种形式 select-union all select-join select操作-semi join半连接 select操作-map join hint select操作-map join hint说明 select操作-CTE 内置函数Build-in Function 值函数 数据运算函数 字符串处理函数 日期类型处理函数 窗口函数 聚合函数 其他函数
Tunnel Tunnel通常用来将本地的数据上传到maxcompute或将maxcompute数据下载到本地 1、MaxCompute数据的上传和下载 MaxCompute系统上传/下载数据包括两种方式DataHub实时数据通道 Tunnel批量数据通道OGG插件 大数据开发套件Flume插件 DTSLogStash插件 SqoopFluentd插件 Kettle插件 MaxCompute客户端 Tunnel查看帮助信息不带参数的tunnel或tunnel help查看帮助信息也可tunnel help upload Available subcommands:upload 支持文件或目录(只一级目录)的上传; 每一次上传只支持数据上传到一个表或表的一个分区;有分区的表一定要指定上传的分区,示例如下:tunnel upload d:testp1.txt yunxiang_01.t_test_p/gender='male'tunnel upload d:test yunxiang_01.t_test_p/gender='male' --scan=only 注释:yunxiang_01为项目; t_test_p为表;gender='male'为分区类;--scan=only表示只扫码数据不导入数据。download 只支持下载到单个文件每一次下载只支持一个表或者一个分区有分区的表一定要指定下载的分区例子:tunnel download yunxiang_01.t_test_p/gender='male' d:testp_download.txtresume 因为网络原因或者tunnel服务的原因造成的错误,使用该子命令续传;目前仅支持上传数据续传;用法:tunnel resume [session_id]show 显示历史任务用法:tunnel show history [options]purge 清除历史任务用法:tunnel purge [n]help 2、常用参数和Tunnel命令 -c: 数据文件字符编码,默认为UTF-8,也可以自行指定,如下:tunnel upload log.txt test_table -c "gbk"-ni: NULL数据标志符,默认为""(空字符串),也可指定如下:tunnel upload log.txt test_table -ni "NULL"-fd: 本地数据文件的列分割符,默认为逗号;-rd: 本地数据文件的行分割符,默认为rn.1、支持多个字符的列分隔符和行分隔符2、支持控制字符等不可见字符做分隔符3、列分隔符不能包含行分割符4、转义字符分隔符,在命令行模式下只支持r,n和t分隔符示例:tunnel upload d:p.txt t_test_p/gender='male' -fd "||" -rd "rn"tunnel download t_test_p/gender='male' d:p_download.txt -fd "||||" -rd "&&"错误语句如下:tunnel upload d:p.txt t_test_p/gender='male' -fd "b" -rd "t"-dfp: DateTime类型数据格式,默认为yyyy-MM-dd HH:mm:ss如下tunnel upload log.txt test_table -dfp "yyyy-MM-dd HH:mm:ss"常见日期格式:"yyyyMMddHHmmss": 数据格式"20140209101000""yyyy-MM-dd HH:mm:ss"(默认):数据格式"2014-02-09 10:10:00""yyyy年MM月dd日":数据格式"2014年09月01日"-sd:设置session目录,通过session id可以对上传、下载数据进行监控、续传(resume命令)等操作。执行过程由于数据问题,提示失败会给出session id及错误信息。例子:tunnel u d:data.txt sale_detail/sale_date=201312,region=hangzhou -s false根据session id进行断点续传:tunnel resume 201506101639224880870a002ec60c --force;-te: 指定tunnel的Endpoint;-threads:指定threads的数量,默认为1;-tz:指定时区。默认为本地时区:Asia/Shanghai,说明Datetime类型默认支持时区为GMT+8-acp: 如果目标表分区不存在,自动创建目标分区,默认关闭;-bs: 每次上传至Tunnel的数据块大小,默认值: 100MiB(MiB=1024*1024B)-cp: 指定是否在本地压缩后再上传,减少网络流量,默认开启;-dbr: 是否忽略脏数据(多列,少列,列数据类型不匹配等情况): 当值为true时,将全部不符合表定义的数据忽略 当值为false时,若遇到脏数据,则给出错误提示信息,即目标表内的原始数据不会被污染 -s: 是否扫描本地数据文件,默认为false,具体如下: 值为true时,先扫描数据,若数据格式正确,再导入数据。 值为false时,不扫描数据,直接进行数据导入。 值为only时,仅进行扫描本地数据,扫描结束后不继续导入数据 其他下载参数:-ci: 指定列索引(从0)下载,使用逗号分隔;-cn: 指定要下载的列名称,使用逗号分隔每个名称;-cp: 指定是否压缩,减少网络流量,默认开启;-e:当下载double值时,如果需要,使用指数函数表示,否则最多保留20位;-h: 数据文件是否包含表头,如果为true,则dship会跳过表头从第二行开始下载数据。注意,-h=true和threads>1即多线程不能一起使用-limit: 指定要下载的文件数量tunnel的一些特点:tunnel命令是对tunnel模块的SDK封装,具有tunnel的一些特点: 支持对表的读写,不支持视图; 写表是追加(Append)模式 采用并发以提高整体吞吐量 避免频繁提交 3、Tunnel SDK相关知识 Tunnel SDK中的几个概念:基本含义: session 完成对一张表或partition上传下载的的过程,称为一个session request 在一个session内,请求一次tunnel RESTful API的过程 writer 当request为上传数据时,需要打开一个writer,将数据序列化的写入odps后台 cfile文件: Block 当并发上传数据时,blockID就是不同的writer的标识,其对应后台的一个cfile。 相互关系: session由一到多个request完成 同一个upload session中,用户可以同时打开多个cfile文件中的writer,多线程或多进程的并发上传数据 由于每一个block对应后台一个cfile文件,所以同一个session,两次打开同一个block就会导致覆盖行为,即只保留最后一次close writer对应的数据。 主要接口: tabletunnel:访问tunnel服务的入口类,用来对maxcompute和tunnel进行访问 uploadsession:上传会话,包括会话的各种属性、动作以及通过会话进行写操作的方法 downloadsession:下载会话,包括会话的各种属性、动作以及通过会话进行读操作的方法 TableTunnel接口定义: 生命周期:从TableTunnel实例被创建开始,一直到程序结束。 提供方法:创建Upload对象和Download对象的方法 createDownloadSession:创建下载会话对象 createUploadSession:创建上传会话对象 getDownloadSession:获取下载对话对象句柄 getUploadSession:获取上传会话对象句柄 注:无论表有无分区,均有两个方法对应 setEndpoint:设置服务接入点 UploadSession接口定义: commit:上传会话完成、提交 getBlocklist:得到成功上传的Block的列表 getID:得到上传会话的ID getSchema:得到上传表的schema getStatus:得到上传状态 newRecord:创建Record类型的记录 openRecordWriter:打开记录写入器 Java+eclipse环境配置 Step01:官网导航中找到并下载odps-sdk-core Step02:下载eclipse并安装、配置 Step03:在eclipse中新建Java Project Step04:将1中下载的压缩包中的jar包添加到项目的路径中。 简单上传实例: 处理流程: 创建阿里云账号->创建表通道->创建上传会话->读取文件->写入记录->上传会话提交 需要处理: 1、提供输入参数,通过run configuration的arguments,添加到program arguments里。 -f <source_file> -c <config_file> -t <odps table> -p <partition_spec> -fd <field_delimiter> 2、建表,增加分区 在maxcompute中建表,创建相应分区 3、上传完成后,检查表中的结果。 简单下载实例 处理流程: 创建阿里云账号->创建表通道->创建下载会话->读取记录->写入文件 需要处理: 1、提供输入参数,通过run configuration中的arguments,添加到program arguments里: -f <target_file> -c <config_file> -t <odps_table> -p <partition_spec> -fd <field_delimiter> 2、下载完成后,找到对应文件,检查文件内容是否正确 多线程上传实例 处理流程: 提供配置信息-创建阿里云账号-创建表通道-创建上传会话-创建线程池-将待插入记录分给不同线程写入-关闭线程池-将每个线程写入的块提交 需要我们做的: 1、将配置参数写入java脚步(参照odps的配置文件) 2、建表,增加分区 3、上传完成后检查表中的结果 多线程下载实例 处理流程: 提供配置信息-创建阿里云账号-创建表通道-创建下载会话-创建线程池-分配待下载记录给不同的线程-执行下载任务-关闭线程池 需要我们做的: 1、将配置参数写入java脚本(参照odps的配置文件) 2、建表,增加分区 3、下载完成后,输入到屏幕的结果 常见问题: 1、一个session的超时时间:24小时 2、writer close时,将相对应的cfile文件从tmp目录挪移到data目录 3、session commit时,tunnel server将相应session data目录下的所有cfile文件挪移到相应表所在目录,即数据进表中,可以通过SQL进行读取 4、同一个session中,有一个block id对应的block上传失败,需要重传shi,使用相同的blockid 5、对于tunnel server,一个session对应一个目录。所以不同的session会产生不同的目录。这就是不同的session上传数据互不影响的原因 6、对同一个表上传数据,只有一台机器时,基本使用多线程并发就可以了,当需要更多带宽来支持上传数据时,使用不同机器不同进程上传(需要做数据切分) 7、在带宽最大能达到100M/s时,16-64个线程并发,太多的并发将消耗更多的CPU切换。
二、程序流程控制 流程控制语句是用来控制程序中各语言执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。三种基本流程结构: 顺序结构 程序从上到下逐行执行,中间没有任何判断和跳转。 分支结构 根据条件,选择性地执行某段代码。有if-else和switch-case两种分支语句。 循环结构 根据循环条件,重复性的执行某段代码。有while、do……while,for三种循环语句注:JDK1.5提供了foreach循环,方便的遍历集合、数组元素。 if-else 所有三元运算符都可以用if-else结构替代,if-else不一定能改成三元运算符。如果既可以使用三元运算符又可以使用if-else,优先选用三元运算符。原因:简洁、执行效率高。例如,3个数取最大值class SanYuan{public static void main(String[] args){int n1=12;int n2=30;int n3=-43;int max=((n1>n2?n1:n2)>n3)?(n1>n2?n1:n2):n3;//不建议这么写,可读性差System.out.println("The max of n1 n2 n3 is " + max);int max1,max2;if(n1>n2){max1=n1;} else{max1=n2;} if(max1>n3){max2=max1;} else{max2=n3;}System.out.println("The max of n1 n2 n3 is " + max2);}} if语句三种结构(条件判断结构): 1、if(条件表达式){执行代码块} //只有一种选择2、if(条件表达式){执行代码块1} else {执行代码块2} //二选一3、if(条件表达式){执行代码块1} else if(条件表达式2){执行代码块2} else{执行代码块3} 多选一,中间可以多个elseif &和&&的异同 都是且的关系左边true,右边都执行左边false,短路与后面不执行,逻辑与后面执行 Scanner类 从键盘获取不同类型的变量,char型的获取,Scanner没有提供相关办法,只能获取一个字符串。当输入的值和获取的类型不一致时会报错。具体实现步骤:1、导包:import java.util.Scanner;写在类的上面,类Scanner在包util下。2、Scanner的实例化,Scanner scan=new Scanner(System.in);3、调用Scanner类的相关方法获取指定类型的变量,int num=scan.nextInt(); 例1: 输入一个整数并输出。import java.util.Scanner;class Scan{public static void main(String[] args){Scanner sc = new Scanner(System.in);int i = sc.nextInt();System.out.println("The input number is "+i);}}javac Scanner.java $ java Scan88The input number is 88 例2: 输入字符串。import java.util.Scanner;class ScannerString{public static void main(String[] args){Scanner sc =new Scanner(System.in);System.out.println("请输出你的名字:n");String userName = sc.next();System.out.println("欢迎"+userName+"登录系统");}}$ javac ScannerString.java$ java ScannerString请输出你的名字: lisi欢迎lisi登录系统 例3: 输入期末考试成绩,100分降落宝马,80-99奖励手机,60-80奖励玩具,不及格什么都没有。import java.util.Scanner;class IfTest{public static void main(String[] args){int score;Scanner scan = new Scanner(System.in);System.out.println("请输入成绩,在0到100之间");score=scan.nextInt();if(score == 100){System.out.println("奖励一辆BMW");}else if(score < 100 && score > 80){System.out.println("奖励一个手机");}else if(score >= 60 && score <= 80){System.out.println("奖励一个玩具"); }else{System.out.println("什么都没有");}}}说明1、else结构是可选的。2、针对条件表达式:如果多个条件表达式之间是“互斥”关系,哪个判断在上面或下面都无所谓;如果有交集,应该考虑清楚哪个条件应该在上面;如果条件表达式之间有包含关系,需要将范围小的声明在上面,否则小的永远不会执行,因为if else只有一个出口。 例4: 输入3个整数,按小到大输出排序。import java.util.Scanner;class SortTest{public static void main(String[] args){Scanner scan = new Scanner(System.in);System.out.println("Please insert the first number");int num1 = scan.nextInt();System.out.println("Please insert the second number"); int num2 = scan.nextInt();System.out.println("Please insert the third number"); int num3 = scan.nextInt();if(num1 > num2){if(num2 > num3){System.out.println(num3 + "," + num2 + "," + num1);}else if(num3 > num1){System.out.println(num2 + "," + num1 + "," + num3);} else{System.out.println(num2 + "," + num3 + "," + num1); }} else {if(num1 > num3){ System.out.println(num3 + "," + num1 + "," + num2); }else if(num3 > num2){ System.out.println(num1 + "," + num2 + "," + num3); } else{ System.out.println(num1 + "," + num3 + "," + num2); }}}}$ java SortTestPlease insert the first number1000Please insert the second number0Please insert the third number8880,888,1000说明:1、if-else可以互相嵌套,不过一遍不要嵌套3层以上,3层以上自己就晕了。2、if-else 后面如果只有一行执行语句,可以省略{},一般不建议省略.Java用法:String isHandsome=scan.next();if(isHandsome.equals("是")) switch-case 结构switch(表达式){case 常量1: 语句1; //break; case 常量2; 语句2; //break; case 常量N: 语句N; // default: 语句; //break; }分支结构之二:switch-case说明:1、根据switch表达式中的值,依次匹配各个case中的常量,一旦匹配成功,会进入相应case中,调用其执行语句。当调用完执行语句以后,则仍然继续向下执行其他case结构中的执行语句,直到遇到break关键字或到switch-case结构末尾为止结束,后面的case条件不会做判断。 例子: class SwitchCase{public static void main(String[] args){int num1=2;switch(num1){case 0:System.out.println("zero");case 1: System.out.println("one");case 2: System.out.println("two");case 3: System.out.println("three");default:System.out.println("others");}}}$ java SwitchCasetwothreeothers2、break可以用在switch-case结构中,表示一旦执行到次关键字就跳出switch-case结构3、switch结构中的表达式,只能是如下6中数据类型之一:byte、short、char、int、枚举类型(JDK5.0新增)、String类型(JDK7.0新增)。4、case后面只能声明常量,不能是范围值。5、break关键字是可选的,不是必须加的,绝大多数情况都需要加。6、default相当于if-else中的else,default选项是可选的,而且位置是灵活的,通常放到最后。 例1 switch-case判断成绩,小于60输出不合格,大于等于60输出合格。class Test{public static void main(String[] args){int score=78;switch(score/60){case 0:System.out.println("不及格");break;case 1:System.out.println("及格");break;default:System.out.println("输入值有误");break;}}} 例2: 输入年月日,计算出是第几天import java.util.Scanner;class Date{public static void main(String[] args){Scanner scan = new Scanner(System.in);System.out.println("请输入年份");int years = scan.nextInt();System.out.println("请输入月份,1-12");int months = scan.nextInt();System.out.println("请输入日期,1-31");int days = scan.nextInt();int sum=0;switch(months){case 12:sum += 30;case 11:sum += 31;case 10:sum += 30;case 9:sum += 31;case 8:sum += 31;case 7:sum += 30;case 6:sum += 31;case 5:sum += 30;case 4:sum += 31;case 3://判断是否闰年if((years % 4 == 0 && years % 100 != 0)||(years % 400 == 0)){sum += 29;}else{sum += 28;}case 2:sum +=31;case 1:sum +=days;System.out.println(years + "年" + months + "月" + days + "日" + "是当年的第" + sum + "天");break;default:System.out.println("月份输入错误");}}}$ java Date请输入年份2019请输入月份,1-1212请输入日期,1-31312019年12月31日是当年的第365天 总结: 1、凡是可以使用switch-case的结构都可以转换为if-else。反之,不成立。2、当我们写分支结构时,我们发现既可以使用switch-case,case取值不太多,又可以使用if-else时,优先选择使用switch-case。原因:switch-case执行效率稍高。
一、运算符 运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。 算法运算符 正号、负号、加减乘除、取模(取余)++自增(前),先运算后取值。++自增(后),先取值后运算。--自减(前),先运算后取值。--自减(后),先取值后运算。 ,字符串连接。%取模(取余),余数符号跟被除数相同。 小程序:class Test{ public static void main(String[] args){ int i1 = 12; int i2 = 5; double d1; double d2; d1=i1 / i2; d2=i1 / (i2+0.0); System.out.println(d1); System.out.println(d2);System.out.println("i1 % i2=" + i1 % i2);int i3 = 10;int t1 = ++i3;System.out.println("i3 = " + i3 + ",t1 = " +t1); int i4 = 10;int t2 = i4 ++;System.out.println("i4 = " + i4 + ",t2 = " + t2);int i5 = 187;System.out.println("百位数是" + i5 / 100);System.out.println("十位数是" + i5 % 100 / 10);System.out.println("个位数是" + i5 % 10);}}$ javac Test.java$ java Test2.02.4i1 % i2=2i3 = 11,t1 = 11i4 = 11,t2 = 10百位数是1十位数是8个位数是7 赋值运算符 符号:=当“=”两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理。支持连续赋值扩展赋值运算符:+=,-+,*=,/=,%=通常写法:i2=j2=10;i3=10,j3=20;int num1=10;num1+=2; //12int num2 = 12;num2 % =5;//2short s1=10;s1 + = 2;//不会改变变量本身数据类型s1 = s1 + 2;//报错 比较运算符(关系运算符) 运算符 运算 范例 结果== 相等于 4==3 false!= 不等于 4!=3 true< 小于 4<3 falseØ 大于 4>3 true<= 小于等于 4<=3 false = 大于等于 4>=3 true instanceof 检查是否是类的对象 “Hello” instaceof String true比较运算符的结果都是boolean型,要么是true,要么是false比较运算符“==”不能误写成“=” 逻辑运算符 & 逻辑与 | 逻辑或 ! 逻辑非&& 短路与 || 短路或 ^ 逻辑异或123a b a&b a&&b a|b a||b !a a^btrue ture true true true true false falsetrue false fasle fasle true true false truefasle true false false true true true truefasle false false false fasle false true false&与&&区分相同点:运算结果相同;当符号左边是true时,二者都会执行右边的运算。不同点:当符号左边是false时,&继续执行符号右边的运算,&&不再执行右边的运算。同理|与||,当符号左边为true时,|继续执行右边的运算,||不再执行右边的运算。开发中推荐使用||例子class Luoji{public static void main(String[] args){boolean b1 = false;int i1 = 10;if(b1 & (i1++ > 0)){System.out.println("我现在在南京");} else{System.out.println("我现在在北京");} System.out.println(i1); boolean b2 = false;int i2 = 10;if(b2 && (i2++ >0)){ System.out.println("我现在在南京");} else{ System.out.println("我现在在北京");}System.out.println(i2);}}$ javac Luoji.java $ java Luoji我现在在北京11我现在在北京10 位运算符(用的很少,二进制) 操作的都是整型变量,在一定范围内每左移一位相当于*2,右移相当于/2面试题:最高效方式计算2*8? 2<<3或8<<1运算符 运算 范例<< 左移(2) 3<<2=12 32*2=12 右移(/2) 3>>1=1 3/2=1 无符号右移 3>>>1=1 3/2=1 & 与运算符 6&3=2,转换2进制,01计算| 或运算符 6|3=7,同上^ 异或运算 6^3=5,同上~ 取反运算 ~6=-7,包括符号位全部取反 三元运算符 格式:条件表达式?表达式1:表达式2条件表达式为true,运算结果是表达式1;false为表达式2表达式1和2为同种类型。三元运算符可以嵌套使用三元运算符与if-else的联系和区别1、三元运算符可以简化if-else语句2、三元运算符要求必须返回一个结果3、if后的代码块可以有多个语句。条件表达式为boolean类型,根据条件表达式决定执行1或者2.例子,3个数取最大值:$ vim SanYuan.javaclass SanYuan{public static void main(String[] args){int n1=12;int n2=30;int n3=-43;int max=((n1>n2?n1:n2)>n3)?(n1>n2?n1:n2):n3;System.out.println("The max of n1 n2 n3 is " + max);}}$ javac SanYuan.java $ java SanYuanThe max of n1 n2 n3 is 30
一、Java编程基础知识: 计算机语言的发展迭代史 第一代:机器语言第二代:汇编语言第三代:高级语言 面向过程:C,Pascal、Fortran 面向对象:Java,JS,Python,Scala,。。。 Java语言的特点: 面向对象 两个要素:类、对象 三个特征:封装、继承、多态 健壮性去除了C语言中的指针;自动的垃圾回收机制(仍然会出现内存溢出、内存泄漏)跨平台性write once,run anywhere归功于JVM JDK的下载安装 下载:官网安装软件的路径中不能包含空格path环境变量:windows操作系统执行命令所搜寻的路径不看资料,手动编写类helloworld程序class test{public static void main(String[] args){ System.out.println("This is a test");}} 二、关键字和保留字 关键字 定义:被Java语言赋予了特殊含义,用作专门用途的的字符串(单词)特点:关键字中所有字母都为小写官方地址: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html 保留字 现有Java版本尚未使用,但以后版本可能会作为关键字使用、自己命名标志符时要避免使用这些保留字goto,const 三、标识符 Java对各种变量、方法和类等要素命名时使用的字符序列称为标志符技巧:凡是自己可以起名字的地方都叫标识符 标识符定义规则 1、由26个英文字母大小写,0-9,_或$组成2、数字不可以开头3、不可以使用关键字和保留字,但能包含关键字和保留字4、Java中严格区分大小写,长度无限制5、标识符不能包含空格如果不符合以上规则,编译不通过。 标识符命名规范 命名规范并不是必须遵守的,一般建议遵守,否则不利于区分。1、包名:多单词组成时,所有字母都小写,xxxyyyzzz2、类名、接口名:多单词组成,所有单词首字母大写,XxxYyyZzz3、变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写,xxxYyyZzz4、常量名:所有字母都大写,多单词时,每个单词用下划线连接,XXX_YYY_ZZZ5、命名时,尽量有意义,做到见名知意6、Java采用unicode字符集,因此标志符也可以使用汉字声明,但是不建议使用。例子:编写一个变量并输出class OutPut{public static void main(String[] args){ int testNumber=8; System.out.println(testNumber);}}注:println输出变量时,不需要用“”。 四、变量 变量的概念:内存中的一个存储区域;该区域的数据可以在同一类型范围内不断变化;变量是程序中最基本的存储单元,包含变量类型、变量名和存储的值变量的作用:用于在内存中保存数据。使用变量的注意事项:1、先声明和赋值,后使用(不声明或不赋值程序会报错);2、使用变量名来访问这块区域的数据;3、变量的作用域为其定义所在的一对{}内;4、变量只有在其作用域内才有效;5、同一个作用域内,不能定义重名的变量。定义变量格式: 数据类型 变量名 = 变量值;例如 int myNumber=1001也可以int myNumber;myNumber=1001; 基本数据类型 不同的数据类型,在内存中分配不同大小的内存空间。数据类型包括基本数据类型(primitive type)和引用数据类型(reference type)。基本数据类型:数值型(整数类型(byte、short、int、long)、浮点类型(float、double),字符型(char),布尔型(boolean)。引用数据类型:类(class)、接口(interface)、数组(array[ ])。java是强类型,JS是弱类型(自动判断)整型byte 1字节=8bit,范围 -128-127short 2字节 ,范围 -32768-32767int 4字节 ,范围 -2147483648-2147483647,约21亿long 8字节 ,范围 -2的63次幂-2的63次幂减1,赋值必须以l或L结尾bit是计算机中的最小存储单元,byte是计算机中的基本存储单元。1个字节8位。通常定义整型变量为int。浮点类型float 4字节,单精度,尾数可以精确到7位有效数字。很多情况下很难满足需求。float类型结尾要以f或F结尾double 8字节,双精度,精度是float的两倍,通常采用此类型。字符型char 只能是一个字符,赋值时用单引号,可以是英文、中文、日文等;也可以赋值转意字符例如/n(换行)、/t(制表符)等;可以用unicode编码方式赋值,例如u0043表示C,这样的方式很少使用。字符输出时如果出现乱码,可能是存储Java程序的格式跟JDK输出格式不一样,解决办法为保存Java代码时选择ANSI。布尔类型:boolean只能取两个值之一:true、false布尔型常在条件判断、循环结构使用。为转意字符,例如要输出“”或n时,在前面加转意字符。编写小程序输出各种数据class VariableTest{ public static void main(String[] args){ byte testByte = -127; short testShort = -30000; int testInt = 6000000; long testLong = 999999999999l; float testFloat = -12.88f; double testDouble = 8888888.8888; char testChar = 'a'; char testUnicodeChar = '\u0043'; boolean testBoolean = true; System.out.println(testByte); System.out.println(testShort); System.out.println(testInt); System.out.println(testLong); System.out.println(testFloat); System.out.println(testDouble); System.out.println(testChar); System.out.println(testUnicodeChar); System.out.println(testBoolean); if(testBoolean){ System.out.println("你不能参加单身派对"); } else { System.out.println("你可以多谈谈女朋友"); }}} 基本数据类型变量间转换 基本数据类型运算规则(7种基本数据类型,不包含boolean)1、自动类型提升当容量小的数据类型变量与容量大的数据类型的容量做运算时,结果自动提升为容量大的数据类型,这里的大小指的数据类型的大小。byte、short、char->int->long->float->double。byte、short、char运算结果(即便相同类型)为int类型例子class Boost{public static void main(String[] args){char testChar = 'a';byte testByte = 10;int testInt = testChar+testByte;System.out.println(testInt);}}2、强制类型转换强制类型转换:自动类型提升运算的逆运算强制转换需要使用强转符()。强制类型转换采用截断方式(不是四舍五入),可能会有精度损失。例子$ vim Force.javaclass Force{ public static void main(String[] args){ float testFloat=12.9f; int testInt=(int)testFloat; System.out.println(testInt);}}$ javac Force.java $ java Force12注:整型常量,默认类型为int型;浮点型常量,默认类型为double型。 基本数据类型与String间转换 1、String不是基本数据类型,属于引用数据类型,字符串变量;char能且只能有1个字符,String可以为0到多个字符。2、使用方式与与基本数据类型一致。例如String str=“abcd”,双引号赋值,char是单引号。3、String可以和8种基本数据类型变量做运算,且只能是连接运算(+)。例如:str=str+“xyz”;4、运算的结果仍然是String类型。例子,识别+是加法还是连接(有String类型数据参加就是连接)$ vim StringTest.javaclass StringTest{public static void main(String[] args){String stringTest = "hello";char charTest= 'a';int intTest = 10;System.out.println(charTest+intTest+stringTest);System.out.println(charTest+stringTest+intTest);System.out.println(charTest+(intTest+stringTest));System.out.println((charTest+intTest)+stringTest);System.out.println(stringTest+intTest+charTest);//不定义变量,直接输出System.out.println(" ");System.out.println('' + 't' + '');System.out.println('' + "t" + '');System.out.println('' + 't' + "");System.out.println('' + ('t' + ""));}}$ java StringTest107helloahello10a10hello107hellohello10a *93 *51* * 进制与进制间转换 了解一下,很少用到。整数有四种表示方式:二进制(binary):0,1,满2进1,以0b活0B开头。正数的源码、反码、补码都相同。负数,反码是源码符号位不变,其他位取反,补码是反码+1.计算机底层都以补码的方式来存储数据。十进制(decimal):0-9,满10进1。八进制(octal),0-7,满8进1,以数字0开头。十六进制(hex):0-9及A-F,满16进1,以0x或0X开头,A-F不区分大小写。
一、基础知识学习 环境准备:jdk1.8、maven3.x、IDEAS2017软件架构2种:B/S:浏览器 serverC/S:client serverJVM java virtual machine/java虚拟机Java编程一般有java ee/java大数据两个方向Graphical user interface GUI,图形化界面Command Line Interface CLI,命令行方式java语言特点:1、面向对象:类、对象。特性:封装、继承、多态2、健壮性3、跨平台性(JVM实现,java程序跑在JVM上)Java自动垃圾回收,但是代码写的不好也会导致内存泄露和溢出。 二、编写第一个程序helloworld: $ vim HelloBeijing.java class HelloBeiJing{ public static void main(String[] args){ System.out.println("Hello,world!"); } } $ javac HelloBeijing.java $ java HelloBeiJing Hello,world! 三、封装、继承、多态概念 封装 封装原则:隐藏对象的属性和实现细节,仅对外公开访问方法,并且控制访问级别,在面向对象方法中,用类来实现上面的要求。用类实现封装,用封装来实现高内聚,低耦合。封装的意义: • 封装的意义在于保护或者防止代码(数据)被我们无意中破坏。 • 保护成员属性,不让类以外的程序直接访问和修改; • 隐藏方法细节 继承 概念:在一组相同或类似的对象中,抽取出共性的特征(属性)和行为(方法),实现重用性。产生继承关系后,子类就可以使用父类的属性和方法,同时也可以定义自己独有的属性和方法,提高代码可重用性、可扩展性。java是单继承的,一个类只能由一个直接父类,但可以多级继承,形成树状结构。继承关系初始化,构建子类对象时,需要先构建好父类的对象,之后才能开始构建子类对象。 多态 多态性是指同一种操作作用于不同对象产生不同的响应,简单概括“一个接口,多种方法”主要通过函数重载、运算符重载(静态多态性)和虚函数(动态多态性)实现. 四、注释 注释类型3种:单行注释、多行注释、文档注释(java特有)。注释内容不参与编译。/**文档注释内容可以被JDK提供的工具javadoc所解析,生成一套以网页形式体现的该程序的说明文档@author hongliang@version 1.8生成命令:$ javadoc -d myhello -author -version HelloBeijing.java*/class HelloBeiJing{/*多行注释:如下main方法是程序的入口main的格式是固定的*/public static void main(String[] args){ //单行注释;如下语句表示输出到控制台System.out.println("Hello,world!");}} 五、API API(application programming interface),java程序提供的基本编程接口。Java的类库,这些类库统称API。API文档:就是这些API如何使用的说明。类库文档官网网址:https://www.oracle.com/java/technologies/javase-downloads.html打开网址以后在需要的版本区域,点击Documentation Download 六、总结 第一个编程代码总结1、java程序的编写-编译-运行的过程。编写:我们将编写的java代码保存在以“.java”结尾的源文件中。编译:使用javac命令编译我们的java源文件,格式 : javac 源文件名.java运行:使用java命令解释运行我们的字节码文件,格式: java 类名2、在一个java源文件中可以声明多个class,但是,public只能加在与文件名同名的类前面,并且只有一个类可以声明为public3、程序的入口是main方法,格式是固定的。agrs是参数,可变。4、输出语句System.out.println(“helloworld”); 先输出数据,然后换行System.out.print(); 换行System.out.print(“helloworld”); 只输出数据5、每一行都以";"结束。6、编译的过程:编译以后,会生成一个或多个字节码文件,每一个类生成一个字节码文件。 七、良好的编程风格 1、正确的注释和注释风格 使用文档注释来注释整个类或整个方法。如果注释方法中的某一个步骤使用单行或多行注释。2、正确的缩进和空白使用一次tab操作,实现缩进运算符两边习惯性各加一个空格,例如: 2 + 4 * 5块的风格Java API源代码选择了行尾风格public class Test{ public static void main(String[] args){ System.out.println("Block Style"); } } 八、常用工具 常用的Java开发工具 记事本UltraEditEditPlusTextOneNote Java集成开发环境 Eclipse(IBM),免费myeclipse,收费IDEA,开发效率最高的IDE工具,市场份额超过eclipse 九、每天一考 1、JDK、JRE、JVM三者之间的关系,以及JDK、JRE包含的主要结构有哪些? JDK=JRE+Java开发工具(javac.exe,java.exe,javadoc.exe)JRE=JVM+Java核心类库; 2、为什么要配置path变量?如何配置? 希望在任何路径下都可以执行Java开发环境,Java_home变量存上一层目录,path调用Java_home变量 3、常用的几个命令行操作有哪些?(至少4个) cd、md(创建文件目录)、rd(删除)、del(删文件)、cd..、cd/ 4、创建如下的类,使得运行后,可以输出。 姓名:James 性别:男住址:北京vim James.java class James{$ vim exam.java public class exam{public static void main(String[] args){ System.out.println("姓名:Jamesn"); System.out.println("性别:男"); System.out.println("住址:北京");}} 5、编译和运行上面的代码 $ javac exam.java $ java exam姓名:James 性别:男住址:北京
2020年12月
2020年06月
在学习k8s前,首先要了解和学习容器概念和工作原理。
容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。
容器使软件具备了超强的可移植能力。
对于开发人员 – Build Once, Run Anywhere
容器意味着环境隔离和可重复性。开发人员只需为应用创建一次运行环境,然后打包成容器便可在其他机器上运行。另外,容器环境与所在的 Host 环境是隔离的,就像虚拟机一样,但更快更简单。
对于运维人员 – Configure Once, Run Anything
只需要配置好标准的 runtime 环境,服务器就可以运行任何容器。这使得运维人员的工作变得更高效,一致和可重复。容器消除了开发、测试、生产环境的不一致性。
“Docker” 一词指代了多个概念,包括开源社区项目、开源项目使用的工具、主导支持此类项目的公司 Docker Inc. 以及该公司官方支持的工具。技术产品和公司使用同一名称,的确让人有点困惑。
我们来简单说明一下:
IT 软件中所说的 “Docker” ,是指容器化技术,用于支持创建和使用容器。
开源 Docker 社区致力于改进这类技术,并免费提供给所有用户,使之获益。
Docker Inc. 公司凭借 Docker 社区产品起家,它主要负责提升社区版本的安全性,并将技术进步与广大技术社区分享。此外,它还专门对这些技术产品进行完善和安全固化,以服务于企业客户。
借助 Docker,您可将容器当做轻巧、模块化的虚拟机使用。同时,您还将获得高度的灵活性,从而实现对容器的高效创建、部署及复制,并能将其从一个环境顺利迁移至另一个环境,从而有助于您针对云来优化您的应用。
Docker有三大核心概念:
镜像(Image)是一个特殊的文件系统,提供容器运行时所需的程序、库、配置等,构建后不会改变
容器(Container)实质是进程,拥有自己独立的命名空间。
仓库(Repository)一个仓库可以包含多个标签(Tag),每个标签对应一个镜像
Docker 技术使用 Linux 内核和内核功能(例如 Cgroups 和 namespaces)来分隔进程,以便各进程相互独立运行。这种独立性正是采用容器的目的所在;它可以独立运行多种进程、多个应用,更加充分地发挥基础设施的作用,同时保持各个独立系统的安全性。
Kubernets的知识都可以在官方文档查询,网址如下:
https://kubernetes.io/zh/docs/home/
Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。
为什么需要 Kubernetes
容器是打包和运行应用程序的好方式。在生产环境中,您需要管理运行应用程序的容器,并确保不会停机。例如,如果一个容器发生故障,则需要启动另一个容器。如果由操作系统处理此行为,会不会更容易?
Kubernetes 为您提供:
服务发现和负载均衡
Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果到容器的流量很大,Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
存储编排
Kubernetes 允许您自动挂载您选择的存储系统,例如本地存储、公共云提供商等。 自动部署和回滚
您可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态更改为所需状态。例如,您可以自动化 Kubernetes 来为您的部署创建新容器,删除现有容器并将它们的所有资源用于新容器。
自动二进制打包
Kubernetes 允许您指定每个容器所需 CPU 和内存(RAM)。当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。
自我修复
Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。
密钥与配置管理
Kubernetes 允许您存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。您可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
初学者首先要了解Kubernetes的基本概念,包括master、node、pod等。
Master
Master是Kubernetes集群的大脑,运行着的守护进程服务包括kube-apiserver、kube-scheduler、kube-controller-manager、etcd和Pod网络等。
kube-apiserver
主节点上负责提供 Kubernetes API 服务的组件;它是 Kubernetes 控制面的前端。
kube-apiserver 在设计上考虑了水平扩缩的需要。 换言之,通过部署多个实例可以实现扩缩。
etcd
etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。
您的 Kubernetes 集群的 etcd 数据库通常需要有个备份计划。
kube-scheduler
主节点上的组件,该组件监视那些新创建的未指定运行节点的 Pod,并选择节点让 Pod 在上面运行。
调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。
kube-controller-manager
在主节点上运行控制器的组件。
从逻辑上讲,每个控制器都是一个单独的进程,但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。
这些控制器包括:
节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应。
副本控制器(Replication Controller): 负责为系统中的每个副本控制器对象维护正确数量的 Pod。
端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)。
服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌.
云控制器管理器-(cloud-controller-manager)
cloud-controller-manager 运行与基础云提供商交互的控制器
cloud-controller-manager 仅运行云提供商特定的控制器循环。您必须在 kube-controller-manager 中禁用这些控制器循环,您可以通过在启动 kube-controller-manager 时将 --cloud-provider 参数设置为 external 来禁用控制器循环。
cloud-controller-manager 允许云供应商的代码和 Kubernetes 代码彼此独立地发展。在以前的版本中,核心的 Kubernetes 代码依赖于特定云提供商的代码来实现功能。在将来的版本中,云供应商专有的代码应由云供应商自己维护,并与运行 Kubernetes 的云控制器管理器相关联。
以下控制器具有云提供商依赖性:
节点控制器(Node Controller): 用于检查云提供商以确定节点是否在云中停止响应后被删除
路由控制器(Route Controller): 用于在底层云基础架构中设置路由
服务控制器(Service Controller): 用于创建、更新和删除云提供商负载均衡器
数据卷控制器(Volume Controller): 用于创建、附加和装载卷、并与云提供商进行交互以编排卷
Node
节点组件在每个节点上运行,维护运行 Pod 并提供 Kubernetes 运行环境。
kubelet
一个在集群中每个节点上运行的代理。它保证容器都运行在 Pod 中。
kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。kubelet 不会管理不是由 Kubernetes 创建的容器。
kube-proxy
kube-proxy 是集群中每个节点上运行的网络代理,实现 Kubernetes Service 概念的一部分。
kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。
如果有 kube-proxy 可用,它将使用操作系统数据包过滤层。否则,kube-proxy 会转发流量本身。
容器运行环境(Container Runtime)
容器运行环境是负责运行容器的软件。
Kubernetes 支持多个容器运行环境: Docker、 containerd、cri-o、 rktlet 以及任何实现 Kubernetes CRI (容器运行环境接口)。
Pod
在Kubernetes中,最小的管理元素不是一个个独立的容器,而是Pod。Pod是管理,创建,计划的最小单元.
一个Pod相当于一个共享context的配置组,在同一个context下,应用可能还会有独立的cgroup隔离机制,一个Pod是一个容器环境下的“逻辑主机”,它可能包含一个或者多个紧密相连的应用,这些应用可能是在同一个物理主机或虚拟机上。
Pod 的context可以理解成多个linux命名空间的联合
PID 命名空间(同一个Pod中应用可以看到其它进程)
网络 命名空间(同一个Pod的中的应用对相同的IP地址和端口有权限)
IPC 命名空间(同一个Pod中的应用可以通过VPC或者POSIX进行通信)
UTS 命名空间(同一个Pod中的应用共享一个主机名称)
同一个Pod中的应用可以共享磁盘,磁盘是Pod级的,应用可以通过文件系统调用。 由于docker的架构,一个Pod是由多个相关的并且共享磁盘的容器组成,Pid的命名空间共享还没有应用到Docker中
和相互独立的容器一样,Pod是一种相对短暂的存在,而不是持久存在的,正如我们在Pod的生命周期中提到的,Pod被安排到结点上,并且保持在这个节点上直到被终止(根据重启的设定)或者被删除,当一个节点死掉之后,上面的所有Pod均会被删除。特殊的Pod永远不会被转移到的其他的节点,作为替代,他们必须被replace.
对kubernetes的概念和组件有所了解以后,就可以通过kubeadm的方式创建一个kubernetes集群。
创建虚拟机
创建至少2台虚拟机,可以在本地或者公有云。
下载部署软件
需要下载的软件包括calico、demo-images、docker-ce、kube、kube-images、kubectl、metrics-server
具体安装过程参考官网文档:
https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm/
安装后详读官方文档,做下面这些组件的练习操作,要达到非常熟练的程度。
这些内容都非常熟练以后,基本就达到了入门的水平。
可以提工单申请退款。