Java基础教程:k8s快速入门
随着Docker技术的流行,对项目的容器化部署方式越来越流行,容器化部署的优点如下:
- 可以保证每个容器拥有自己的文件系统、CPU、内存、进程空间等
- 运行应用程序所需要的资源都被容器包装,并和底层基础架构解耦
- 容器化的应用程序可以跨云服务商、跨Linux操作系统发行版进行部署
虽然容器化部署可以带来很多便利,但是也会出现一些问题,比如说:
- 一个容器故障停机了,怎么样让另外一个容器立刻启动去替补停机的容器
- 当并发访问量变大的时候,怎么样做到横向扩展容器数量
这些容器管理的问题统称为容器编排问题,为了解决这些容器编排问题,就产生了一些容器编排技术:
- Swarm:Docker自己的容器编排工具
- Mesos:Apache的一个资源统一管控的工具,需要和Marathon结合使用
- Kubernetes:Google开源的的容器编排工具
目前为止Kubernetes是最为流行的一种容器编排技术。
kubernetes,由于k和s之间有8个字符,所以简称k8s,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器—-Borg系统的一个开源版本,于2015年7月发布第一个正式版本,它的本质是一组服务器集群,可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理,主要提供了如下主要功能:
- 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
- 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
- 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
- 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
- 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
- 存储编排:可以根据容器自身的需求自动创建存储卷
一个k8s集群主要是由控制节点(master)、工作节点(node)构成,每个节点上都会安装不同的组件。
master:集群的控制平面,负责集群的决策 ( 管理 )
ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制
Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上
ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等
Etcd :负责存储集群中各种资源对象的信息
node:集群的数据平面,负责为容器提供运行环境 ( 干活 )
Kubelet : 负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器
KubeProxy : 负责提供集群内部的服务发现和负载均衡
Docker : 负责节点上容器的各种操作
下面,以部署一个nginx服务来说明kubernetes系统各个组件调用关系:
- 首先要明确,一旦kubernetes环境启动之后,master和node都会将自身的信息存储到etcd数据库中
- 一个nginx服务的安装请求会首先被发送到master节点的apiServer组件
- apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上
- 在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer
- apiServer调用controller-manager去调度Node节点安装nginx服务
- kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的pod
- pod是kubernetes的最小操作单元,容器必须跑在pod中至此,
- 一个nginx服务就运行了,如果需要访问nginx,就需要通过kube-proxy来对pod产生访问的代理
这样,外界用户就可以访问集群中的nginx服务了
Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控
Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行
Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器
Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等
Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod
Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签
NameSpace:命名空间,用来隔离pod的运行环境
本次搭建的是一台Master节点和多台Node节点构成的集群
1) 检查操作系统的版本
2) 主机名解析
为了方便后面集群节点间的直接调用,在这配置一下主机名解析,企业中推荐使用内部DNS服务器
3) 时间同步
kubernetes要求集群中的节点时间必须精确一致,这里直接使用chronyd服务从网络同步时间。
企业中建议配置内部的时间同步服务器
4) 禁用iptables和firewalld服务
kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
5) 禁用selinux
selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题
6) 禁用swap分区
swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用
启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备
但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
7)修改linux的内核参数
8)配置ipvs功能
在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的
两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
9) 重启服务器
上面步骤完成之后,需要重新启动linux系统
下面开始对集群进行初始化,并将node节点加入到集群中
下面的操作只需要在master节点上执行即可
下面的操作只需要在node节点上执行即可
kubernetes支持多种网络插件,比如flannel、calico、canal等等,任选一种使用即可,本次选择flannel
下面操作依旧只在master节点执行即可,插件使用的是DaemonSet的控制器,它会在每个节点上都运行
至此,kubernetes的集群环境搭建完成
接下来在kubernetes集群中部署一个nginx程序,测试下集群是否在正常工作。
在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。
kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,也就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。
kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在Pod中,而kubernetes一般也不会直接管理Pod,而是通过Pod控制器来管理Pod的。
Pod可以提供服务之后,就要考虑如何访问Pod中服务,kubernetes提供了Service资源实现这个功能。
k8s提供了三种资源管理方式
- 命令式对象管理:直接使用命令去操作kubernetes资源
- kubectl run nginx-pod –image=nginx:1.17.1 –port=80
- 命令式对象配置:通过命令配置和配置文件去操作kubernetes资源
- kubectl create/patch -f nginx-pod.yaml
- 声明式对象配置:通过apply命令和配置文件去操作kubernetes资源
- kubectl apply -f nginx-pod.yaml
kubectl命令
kubectl是kubernetes集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。kubectl命令的语法如下:
comand:指定要对资源执行的操作,例如create、get、delete
type:指定资源类型,比如deployment、pod、service
name:指定资源的名称,名称大小写敏感
flags:指定额外的可选参数
下面以一个namespace / pod的创建和删除简单演示下命令的使用:
命令式对象配置就是使用命令配合配置文件一起来操作kubernetes资源。
1) 创建一个nginxpod.yaml,内容如下:
2)执行create命令,创建资源:
此时发现创建了两个资源对象,分别是namespace和pod
3)执行get命令,查看资源:
这样就显示了两个资源对象的信息
4)执行delete命令,删除资源:
此时发现两个资源对象被删除了
声明式对象配置跟命令式对象配置很相似,但是它只有一个命令apply。
本章节将介绍如何在kubernetes集群中部署一个nginx服务,并且能够对其进行访问。
Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。
默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的\”组\”,以方便不同的组的资源进行隔离使用和管理。
可以通过kubernetes的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理。
kubernetes在集群启动之后,会默认创建几个namespace
下面来看namespace资源的具体操作:
查看
创建
删除
配置方式
首先准备一个yaml文件:ns-dev.yaml
然后就可以执行对应的创建和删除命令了:
创建:kubectl create -f ns-dev.yaml
删除:kubectl delete -f ns-dev.yaml
Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中。
Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。
kubernetes在集群启动之后,集群中的各个组件也都是以Pod方式运行的。可以通过下面命令查看:
创建并运行
kubernetes没有提供单独运行Pod的命令,都是通过Pod控制器来实现的
查看pod信息
访问Pod
删除指定Pod
配置操作
创建一个pod-nginx.yaml,内容如下:
然后就可以执行对应的创建和删除命令了:
创建:kubectl create -f pod-nginx.yaml
删除:kubectl delete -f pod-nginx.yaml
Label是kubernetes系统中的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。
Label的特点:
- 一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等等
- 一个资源对象可以定义任意数量的Label ,同一个Label也可以被添加到任意数量的资源对象上去
- Label通常在资源对象定义时确定,当然也可以在对象创建后动态添加或者删除
可以通过Label实现资源的多维度分组,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。
一些常用的Label 示例如下:
版本标签:\”version\”:\”release\”, \”version\”:\”stable\”……
环境标签:\”environment\”:\”dev\”,\”environment\”:\”test\”,\”environment\”:\”pro\”
架构标签:\”tier\”:\”frontend\”,\”tier\”:\”backend\”
标签定义完毕之后,还要考虑到标签的选择,这就要使用到Label Selector,即:
Label用于给某个资源对象定义标识
Label Selector用于查询和筛选拥有某些标签的资源对象
当前有两种Label Selector:
- 基于等式的Label Selector
- name = slave: 选择所有包含Label中key=\”name\”且value=\”slave\”的对象
- env != production: 选择所有包括Label中的key=\”env\”且value不等于\”production\”的对象
- 基于集合的Label Selector
- name in (master, slave): 选择所有包含Label中的key=\”name\”且value=\”master\”或\”slave\”的对象
- name not in (frontend): 选择所有包含Label中的key=\”name\”且value不等于\”frontend\”的对象
标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号\”,\”进行分隔即可。例如:
name=slave,env!=production
name not in (frontend),env!=production
命令方式
配置方式
然后就可以执行对应的更新命令了:kubectl apply -f pod-nginx.yaml
在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。
在kubernetes中Pod控制器的种类有很多,本章节只介绍一种:Deployment。
命令操作
配置操作
创建一个deploy-nginx.yaml,内容如下:
然后就可以执行对应的创建和删除命令了:
创建:kubectl create -f deploy-nginx.yaml
删除:kubectl delete -f deploy-nginx.yaml
通过上节课的学习,已经能够利用Deployment来创建一组Pod来提供具有高可用性的服务。
虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两问题:
- Pod IP 会随着Pod的重建产生变化
- Pod IP 仅仅是集群内可见的虚拟IP,外部无法访问
这样对于访问这个服务带来了难度。因此,kubernetes设计了Service来解决这个问题。
Service可以看作是一组同类Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。
操作一:创建集群内部可访问的Service
操作二:创建集群外部也可访问的Service
删除Service
配置方式
创建一个svc-nginx.yaml,内容如下:
然后就可以执行对应的创建和删除命令了:
创建:kubectl create -f svc-nginx.yaml
删除:kubectl delete -f svc-nginx.yaml
小结
至此,已经掌握了Namespace、Pod、Deployment、Service资源的基本操作,有了这些操作,就可以在kubernetes集群中实现一个服务的简单部署和访问了,但是如果想要更好的使用kubernetes,就需要深入学习这几种资源的细节和原理。
自学Java怎么入门
Java作为一门流行的编程语言,在众多领域都有着广泛的应用。对于初学者来说,自学Java可能会感到无从下手。本文将为您详细介绍自学Java的入门方法,帮助您顺利踏上Java编程之路。
在学习Java之前,先了解一下Java的发展历程和优势,有助于我们更好地理解这门语言。
- 发展历程 Java语言诞生于1995年,由Sun Microsystems公司推出。经过多年的发展,Java已经成为了全球最流行的编程语言之一。
- 优势
- 跨平台性:Java语言具有“一次编写,到处运行”的特性,这使得Java程序可以在不同的操作系统上运行。
- 面向对象:Java是一门纯粹的面向对象编程语言,具有封装、继承、多态等特性,便于理解和维护。
- 丰富的API:Java提供了丰富的API,方便开发者快速开发应用程序。
- 强大的社区支持:Java拥有庞大的开发者社区,为学习者提供了丰富的学习资源和交流平台。
要开始学习Java,首先需要搭建Java开发环境。以下是搭建Java开发环境的步骤:
- 下载Java开发工具包(JDK) 访问Oracle官网下载最新版本的JDK,根据您的操作系统选择相应的版本。
- 安装JDK 下载完成后,双击安装包进行安装。安装过程中,可以自定义安装路径,但建议保持默认设置。
- 配置环境变量 为了方便在命令行中使用Java命令,需要配置环境变量。具体操作如下:
- Windows系统:
- 右键点击“计算机”,选择“属性”;
- 点击“高级系统设置”;
- 在“系统属性”对话框中,点击“环境变量”;
- 在“系统变量”区域,找到名为“Path”的变量,点击“编辑”;
- 在变量值的最后添加JDK的bin目录路径,如C:\\Program Files\\Java\\jdk1.8.0_221\\bin;
- 点击“确定”保存设置。
- Linux系统:
- 打开终端;
- 编辑~/.bashrc文件,输入以下内容:
- bash
- 复制
- export JAVA_HOME=/path/to/your/jdk export PATH=$JAVA_HOME/bin:$PATH
- 保存并退出编辑器;
- 执行source ~/.bashrc使配置生效。
- 验证安装 在命令行中输入java -version,如果输出Java版本信息,说明安装成功。
搭建好开发环境后,接下来可以开始学习Java基础知识。以下是一些建议的学习顺序:
- Java基本语法 学习Java的基本语法,包括数据类型、变量、运算符、流程控制语句等。
- 面向对象编程 学习Java的面向对象编程特性,包括类、对象、封装、继承、多态等。
- 常用类库 学习Java提供的常用类库,如java.lang、java.util、java.io等。
- 异常处理 了解Java中的异常处理机制,掌握try-catch-finally语句的使用。
- 图形用户界面(GUI) 学习Java的图形用户界面编程,如Swing、JavaFX等。
- 网络编程 了解Java网络编程的基本知识,包括Socket通信、HTTP协议等。
理论学习的同时,动手实践是非常重要的。以下是一些建议的实践项目:
- 小游戏 如贪吃蛇、俄罗斯方块等,可以帮助您巩固Java基础知识。
- 常用工具类 编写一些常用的工具类,如字符串处理、日期格式化等。
- 网络应用 尝试开发简单的网络应用,如聊天室、文件传输等。
- 数据库应用 学习Java与数据库的交互,如连接数据库、执行SQL语句等。
自学Java需要一定的毅力和耐心。通过以上步骤,相信您已经掌握了Java入门的方法。在学习过程中,不断实践、积累经验,您将逐渐成为一名优秀的Java程序员。祝您学习顺利!
Java编程技术大全:java详细学习路线及路线图
针对本书,java学习可以大致分为3个阶段。
初级阶段:学习Java基础语法和类的创建与使用,基础I/0 (输入/输出)操作、各种循环控制、运算符、数组的定义、方法定义格式、方法重载等,并熟练使用一种集成开发工具(如Eclipse等)。
中级阶段:掌握面向对象的封装、继承和多态,学习常用对象和工具类,深入I/0操作,异常处理、抽象类与接口等。
高级阶段:掌握Java的反射机制、GUI开发、并发多线程、Java Web编程、数据库编程、Android开发等。
对于读者来说, Java学习的路线在整体上需遵循:初级阶段→中级阶段一高级阶段。循序渐进地学习(见下图) ,不建议读者一开始就\”越级\”学习,需知\”欲速则不达\”。在这3个阶段各自内部的知识点,没有必然的先后次序,读者可根据自己的实际情况\”有的放矢\”地学习。不管处于哪个学习阶段,读者都要重视Java的实战练习。等学习到高级阶段后,还要用一些项目实训来提升自己。
成为一名Java高手,可能需要经历多年的时间。一些读者担心,自己可能等不到成为高手那一天,就无力开发Java了。其实, Java相关的开发行业也如陈年美酒,愈陈愈香。想一想,前面提到Java的核心设计者James Gosling ,发髯皆白,却依然意气风发,时常给比他年轻很多的软件开发精英们讲解Java发展之道那种指点江山的气势,是何等的豪迈! Java软件开发行业职业寿命很长,能提供给从业人员更广阔的发展方向。如果想在Java开发相关的领域有所建树,多一份持久的坚持是必需的。
从一个Java的初学者,升级为一个编程高手,从来都没有捷径。其必经的一个成长路线正如下图所示:编写代码一犯错(发现问题)一纠错(解决问题)一自我提升一编写代码一犯错(发现问题)一纠错(解决问题)一自我提升……积累了一定的感性认识后,才会有质的突变,提升至新的境界。总之,想成为一个高水平的Java程序员,一定要多动手练习,多思考。
2000多年前,孔夫子就管说过,\”学而时习之,不亦说乎?\”杨伯峻先生在《论语译注》中对这句话有精辟的注解: \”学了,然后(按一定的时间)去实习它,不也高兴吗?\”对于Java的学习,也应是这样,仅仅懂得一堆Java语法,毫无意义,我们必须亲自动手实践它。
最后需要说明的是, Java高手绝对没有什么捷径可走,也绝不是一本书就能成就的,需要学习者不断地自我迭代,在理论上提升自己(如在读完本书后,还可以接着读读《编程之美》 《设计模式之禅》 《企业应用构架模式》 《97 things software architec should know》等) ,并在实战中反复地练习。只要这样,才能让自己操作代码的“动作\”收放自如,才能让自己的\”招式\”炉火纯青。
各位Java爱好者,想在这个计算为王的大千世界放马驰骋吗?赶快动手吧(Just do IT) !
本文节选自《Java编程技术大全》
本书面向Java的零基础读者,用实际案例引导读者学习。本书主要包括基础知识、核心技术、高级应用和项目案例等4篇内容,帮助读者系统、全面地学习。 为了增强实用性,还特别赠送了精选的考试认证、求职面试等题库,供读者研究学习。最后,为帮助初入职场的从业者顺利进入角色,还赠送了职业规划建议及相关开发文档。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。