零基础Java入门课程,小游戏《石头迷阵》入门,带你更好的学习
学习编程很多时候是无聊、枯燥、晦涩难懂的。在学习这条路上,那些少数留下来的一定是会学习的人。
『有没有一种让人很爽的学习方法』
曾读到过学神 Scott Young 的一篇文章,《探究为何多数人觉得学习很不爽》。无论是义务教育还是个人学习,学习确实对多数人来说是一个“不爽”,甚至“痛苦”的过程,学IT更是如此。
Java在服务器编程语言占比中超91%,就业领域覆盖广,企业用人需求每周新增10万+。据职友集网站统计,北京Java开发工程师平均每月19410元。
如何在入门Java的学习浪潮中乘风破浪,脱颖而出,一套有效的学习方法是重中之重。
零基础Java入门课程
从超好玩的小游戏——《石头迷阵》入门
带你打开Java世界的大门原价199元,现黑马粉丝只要9.9元
点击下方了解更多,或者关注私聊我发送“99”都可以哦
学习收获
▶ 掌握Java25年来的核心思想——面向对象;▶ 掌握java基础中最核心的知识点;▶ 利用Java学一个非常有意思的小游戏;▶ 对以后学习深入的知识有很大的帮助。
课程大纲
课程亮点
一 零基础轻松入门
让学习如同游戏般简单1.游戏式项目案例,配合情景式教学,在做游戏的同时积累编程经验。2.独家一键创建编程环境,1分钟内进入专业开发状态。
二 陪伴式学习
大牛老师+班主任全程服务
学员登录学习平台观看每日课程视频,完成每日作业。班主任进行开课提醒,技术答疑,课程实时指导。
三 更适合哪些人
应届大学毕业生:缺乏工作经验和技能,对未来没有明确的规划,但期望。通过学习Java据跻身IT行业的人员Java爱好者:对Java 语言感兴趣的零基础或有一定了解人群,想从事相关工作。有转行打算:对于自身从事工作不满,希望能通过学习Java,技术改变工作环境,提升薪资的同学。
学完Java可以做什么?
Java的应用非常广泛,可以用来做网站,可以做软件,还可以做安卓,做游戏,超过三十亿的设备在使用Java。与其他语言相比,其安全性、便携性、可维护性更好。
自问世以来,与之相关的技术和应用发展得非常快,在计算机、移动设备、家用电器等领域中,Java技术无处不在。
未来的发展是怎么样的?
Java是时下非常流行的语言,有很多很多不同的工作可供选择。Java软件工程师入行1-3年,年薪已达到10-15万,而且在IT行业工作经验越多,薪资待遇越高。未来职业发展路线也十分清晰。
如何学习?
大家可以在黑马程序员平台听课,根据个人时间灵活安排,视频永久有效,支持反复学习。课程周期:3天,但是我们的教学服务期为7天哦!
平时学习主动性较差怎么办?
零基础Java入门课程配备专属学员学习群,技术大牛及班主任进行群内问题答疑,在开课前进行提醒,课程资料发放,陪伴及督促你学习的每分每秒(满足你一切所需)。
好的开始是成功的一半!只需不到一杯奶茶的价格,即可学习到黑马程序员金牌老师多年经验和心得,最核心的知识点助力高级程序员进阶。
如果你有梦想如果你想早日成为Java大牛立刻开启课程之旅吧!祝大家早日成为IT界的一匹黑马!
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,就需要深入学习这几种资源的细节和原理。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。