尚硅谷大数据技术之Kubernetes
第1章 环境准备
1.1 组网
需要在机房操作具体服务器,具体内容见下面视频:
https://pan.baidu.com/s/1WRFfau1TwcC9iLoumHP6qA
1.2 Raid磁盘阵列规划
1.2.1 什么是Raid
简单来说,RAID是一种把多块独立的磁盘按照不同的方式组合成一个磁盘组,从而提供比单个独立磁盘更高存储效率和更高安全性的技术。
RAID的优势:
加快数据的存取速度,提升服务器的工作效率
提供了容错能力,数据安全性提高
在提高性能和保证数据安全的基础上合理利用磁盘空间
由多个独立磁盘组成一个磁盘组,提供了更加便捷的管理
1.2.2 Raid的常见类型
1.2.3 硬Raid配置
由于硬件厂商众多,服务器的上所使用的硬RAID卡虽功能基本一致,但管理页面和流程却不尽相同。我们此处就以联想的Think Server RD430 为例为大家讲解下配置流程。
1)开机进入RAID 操作管理界面
不同品牌的机器进入RAID管理界面的组合按键不一样,注意开机后引导过程的提示。以联想的Think Server RD430为例,启动服务器,在POST过程中,当完成RAID卡自检后,根据提示按+进入。
2)查看当前磁盘使用信息(首页)
3)清理掉原来的RAID配置,并创建新的磁盘组配置
4)将磁盘依次添加到新的磁盘组内
5)选择合适的RAID级别,更新RAID磁盘大小,并保存设置
6)初始化磁盘组完成配置
1.2.4 软Raid配置
软RAID一般借助系统自带的RAID管理工具进行操作,可以在安装系统前完成设置,也可以在安装完操作系统后使用命令进行调整。此次以CentOS 7.5为例给大家演示。
1)安装操作系统过程中选择手动分区方式为RAID
2)选中所有磁盘,并选择【我要配置分区】,进行手动设置
3)点击+号,进行人为手动分区(/boot、/、swap等)或自动分区
4)选择分区类型为RIAD类型,并选择RAID等级,根据后期不同的需求给分区设置不同的RAID类型。例如:/分区可以设置为RAID1,提高系统化的可用性。
视频:https://pan.baidu.com/s/1xKNAtm94VeR-J0cIwHMzeA
1.3 虚拟机准备(Centos7)
1.3.1 新建虚拟机
(1)点击创建新的虚拟机
(2)选择类型
(3)选择安装来源
(4)选择操作系统
(5)命名及选择位置
(6)选择磁盘大小
(7)完成
1.3.2 配置虚拟机
(1)进入配置页面
(2)选择镜像文件
(3)配置内存及处理器(根据自己机器配置)
1.3.3 安装Centos7
(1)选择安装
等待一段时间会进入图像化页面。
(2)选择语言
(3)配置分区
之后就可以点击开始安装了。
(4)配置root密码
配置完成后耐心等待安装,安装完成后重启即可。
1.4 修改静态IP及主机名
修改静态IP,根据自己实际情况修改。
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=004147e0-f126-462f-a91b-5203194dfb5f
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.1.101
DNS1=114.114.114.114
DNS2=8.8.8.8
GATEWAY=192.168.1.2
NETMASK=255.255.255.0
重启网络服务
[root@localhost ~]# systemctl restart network
修改主机名
[root@localhost ~]# hostnamectl set-hostname hadoop101
1.5 克隆三台虚拟机
将hadoop101克隆三次,克隆后分别修改主机名和静态ip。
1.6 系统初始化(所有机器)
1.6.1 设置host文件
[root@hadoop102 ~]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.102 hadoop102
192.168.1.103 hadoop103
192.168.1.104 hadoop104
1.6.2 修改yum缓存地址
[root@hadoop102 ~]# vi /etc/yum.conf
[main]
cachedir=/yum
keepcache=1
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=5
#然后将资料中的yum文件夹上传到/下。
[root@hadoop102 ~]# chmod 777 /yum/
1.6.3 安装依赖
[root@hadoop102 ~]# yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
1.6.4 设置防火墙为Iptables并清空规则
[root@hadoop102 ~]# systemctl stop firewalld && systemctl disable firewalld
[root@hadoop102 ~]# yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
1.6.5 关闭SELINUX
[root@hadoop102 ~]# swapoff -a && sed -i ‘/ swap / s/^(.)$/#\1/g’ /etc/fstab
[root@hadoop102 ~]# setenforce 0 && sed -i 's/^SELINUX=./SELINUX=disabled/’ /etc/selinux/config
1.6.6 针对K8S调整内核参数
[root@hadoop102 ~]# cat > kubernetes.conf <
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.overcommit_memory=1 # 不检查物理内存是否够用
vm.panic_on_oom=0 # 开启 OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
[root@hadoop102 ~]# cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
[root@hadoop102 ~]# sysctl -p /etc/sysctl.d/kubernetes.conf
1.6.7 调整系统时区
[root@hadoop102 ~]# timedatectl set-timezone Asia/Shanghai
[root@hadoop102 ~]# timedatectl set-local-rtc 0
[root@hadoop102 ~]# systemctl restart rsyslog
[root@hadoop102 ~]# systemctl restart crond
1.6.8 关闭系统不需要的服务
[root@hadoop102 ~]# systemctl stop postfix && systemctl disable postfix
1.6.9 设置 rsyslogd 和 systemd journald
#持久化保存日志的目录
[root@hadoop102 ~]# mkdir /var/log/journal
[root@hadoop102 ~]# mkdir /etc/systemd/journald.conf.d
[root@hadoop102 ~]# cat > /etc/systemd/journald.conf.d/99-prophet.conf <
Storage=persistent
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
SystemMaxUse=10G
SystemMaxFileSize=200M
MaxRetentionSec=2week
ForwardToSyslog=no
EOF
[root@hadoop102 ~]# systemctl restart systemd-journald
1.6.10 升级系统内核为4.4
CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定,所以我们将系统内核升级为4.4版本。
[root@hadoop102 ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
[root@hadoop102 ~]# yum --enablerepo=elrepo-kernel install -y kernel-lt
[root@hadoop102 ~]# grub2-set-default ‘CentOS Linux (4.4.204-1.el7.elrepo.x86_64) 7 (Core)’
#重启机器后查看内核版本
[root@hadoop102 ~]# uname -r
4.4.204-1.el7.elrepo.x86_64
第2章 Docker
2.1 简介
Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会。
Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目 已经超过 5 万 4 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,dotCloud 公司决定改名为 Docker。Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker。
Docker 使用 Google 公司推出的 Go 语言 进行开发实现,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
2.2 Docker的优点
2.2.1 高效利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
2.2.2 快速启动
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
2.2.3 运行环境一致
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。
2.2.4 持续交付和部署
对开发和运维人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建和测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至进行自动部署。
而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
2.2.5 可移植性
由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
2.2.6 对比传统虚拟机
特性 容器 虚拟机
启动 秒级 分钟级
硬盘 一般为MB 一般为GB
性能 接近原生 较差
系统支持 单机支持上千容器 一般几十个
2.3 基本概念
Docker 包括三个基本概念:
镜像(Image)
容器(Container)
仓库(Repository)
2.3.1 镜像
我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。
2.3.2 容器
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。
2.3.3 仓库
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
一个 Docker Registry 中可以包含多个 仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
以 Centos镜像 为例,centos是仓库的名字,其内包含有不同的版本标签,如6.8, 7.5。我们可以通过 centos:6.8 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 centos,那将视为 centos:latest。
仓库名经常以 两段式路径 形式出现,比如atguigu/hadoop,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。
2.4 安装Docker(三台机器)
Docker CE 支持 64 位CentOS 7,并且要求内核版本不低于3.10。
2.4.1 安装依赖包
[root@hadoop102 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
2.4.2 更换yum源为国内
[root@hadoop102 ~]# yum-config-manager
–add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.4.3 安装Docker-CE
[root@hadoop102 ~]# yum update -y && yum install -y docker-ce
[root@hadoop102 ~]# reboot
2.4.4 更改内核版本
重启后我们通过命令发现内核版本又变成历史版本,所以我们需要更改一下默认内核版本。
[root@hadoop102 ~]# uname -r
3.10.0-1062.4.3.el7.x86_64
[root@hadoop102 ~]# grub2-set-default ‘CentOS Linux (4.4.204-1.el7.elrepo.x86_64) 7 (Core)’ && reboot
2.4.5 启动Docker
[root@hadoop102 ~]# systemctl start docker
#设为开机自启
[root@hadoop102 ~]# systemctl enable docker
2.4.6 配置Docker
[root@hadoop102 ~]# cat > /etc/docker/daemon.json <
“exec-opts”: [“native.cgroupdriver=systemd”],
“log-driver”: “json-file”,
“log-opts”: {
“max-size”: “100m”
}
}
EOF
#存放docker的自配置文件
[root@hadoop102 ~]# mkdir -p /etc/systemd/system/docker.service.d
[root@hadoop102 ~]# systemctl daemon-reload && systemctl restart docker && systemctl enable docker
参数解析:
exec-opts:配置cgroup组为systemd
log-driver:将日志存储为json类型
max-size:日志大小
2.4.7 简单使用
(1)拉取镜像
从 Docker 镜像仓库获取镜像的命令是 docker pull,其命令格式为:
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。
仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。
下面我们拉取centos镜像。
[root@hadoop102 ~]# docker pull centos:6.8
6.8: Pulling from library/centos
7ce0cebb9dca: Pull complete
Digest: sha256:39abd0c8e375de6fb7334d42ec2a46643f34cbc1bbaf37e2b484065f05eaa7a2
Status: Downloaded newer image for centos:6.8
docker.io/library/centos:6.8
上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub (官方镜像仓库)获取镜像。而镜像名称是 centos:6.8,因此将会获取官方镜像 library/centos 仓库中标签为 6.8 的镜像。
(2)查看镜像
[root@hadoop102 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 6.8 82f3b5f3c58f 8 months ago 195MB
(3)启动容器
有了镜像后,我们就能够以这个镜像为基础启动并运行一个容器。以上面的 centos:6.8为例,如果我们打算启动里面的 bash 并且进行交互式操作的话,可以执行下面的命令。
[root@hadoop102 ~]# docker run -it --rm centos:6.8 bash
[root@5935046f6b00 /]#
[root@5935046f6b00 /]# exit
exit
[root@hadoop102 ~]#
此时我们已经处于该容器的命令行中,5935046f6b00为容器ID。
参数解析:
docker run :运行容器的命令。
-it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
--rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。
centos:6.8:要创建容器的镜像。
bash:放在镜像后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash。
2.5 Dockerfile(扩展)
2.5.1 介绍
Dockfile 是一种被Docker 程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux 下面的一条命令。Docker 程序将这些Dockerfile 指令翻译真正的Linux命令。Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系, Docker程序将读取Dockerfile,根据指令生成定制的 image
2.5.2 FROM
构建指令,必须指定且需要在Dockerfile其他指令的前面。后续的指令都依赖于该指令指定的image。
FROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库。
FROM centos:6.8
2.5.3 MAINTAINER
构建指令,用于将image的制作者相关的信息写入到image中。
MAINTAINER atguigu
2.5.4 RUN
构建指令,RUN可以运行任何被基础image支持的命令。如基础image选择了Centos,那么软件管理部分只能使用Centos的包管理命令。
RUN echo ‘hello atguigu!’
注意:Dockerfile中每一个RUN命令都会分一层,尽量将多条命令写成一行。
2.5.5 ENV
构建指令,在image中设置一个环境变量,在该指令后面的其他操作就可以使用此环境变量,比如要设置jdk,则可以这样写:
ENV JAVA_HOME /opt/module/jdk_1.8
2.5.6 COPY
复制文件或文件夹到容器中。
COPY <源路径> <目标路径>
注意:源路径指的是构建上下文路径,目标路径则是容器内的绝对路径。
2.5.7 CMD
设置指令,用于container启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。
该指令只能在文件中存在一次,如果有多个,则只执行最后一条。例如:
CMD echo ‘hello’
2.5.8 ENTRYPOINT
设置指令,指定容器启动时执行的命令,可以多次设置,但是只有最后一个有效,例如:
ENTRYPOINT ls -l
该指令的使用分为两种情况,一种是独自使用,另一种和CMD指令配合使用。
当独自使用时,如果你还使用了CMD命令且CMD是一个完整的可执行的命令,那么CMD指令和ENTRYPOINT会互相覆盖只有最后一个CMD或者ENTRYPOINT有效,如下面的例子CMD不会执行,只有ENTRYPOINT会被执行。
CMD echo ’ hello’
ENTRYPOINT ls -l
另一种用法和CMD指令配合使用来指定ENTRYPOINT的默认参数,这时CMD指令不是一个完整的可执行命令,仅仅是参数部分;ENTRYPOIVT指令只能使用JSON方式指定执行命令,而不能指定,如:
FROM centos
CMD ["-l"]
ENTRYPOINT ["/usr/bin/ls"]
2.5.9 USER
指定启动容器后的用户,该用户需要提前存在,否则无法切换。
USER atguigu
2.5.10 EXPOSE
设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不是用容器的IP地址而是使用宿主机器的P地址和映射后的端口。要完成整个操作需要两个步骤,首先在Dockerfile 使用EXPOSE设置需要映射的容器端口,然后在运行容器的时候指定-p选项加上EXPOSE设置的端口,这样EXPOSE设置的端口号会被随机映射成宿主机器中的一个端口号。
也可以指定需要映射到宿主机器的那个端口,这时要确保宿主机器上的端口号没有被使用。EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项。
映射一个端口
EXPOSE 22
相应的运行容器使用的命令
docker run -p port1 image
映射多个端口
EXPOSE port1 port2 port3
相应的运行容器使用的命令
docker run -p port1 -p port2-p port3 image
还可以指定需要映射到宿主机器上的某个端口号
docker run -p host_portl:port1 -p host_port2:port2 -p host_port3:port3 image
2.5.11 VOLUME
设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。
VOLUME ["/tmp/data"]
2.5.12 WORKDIR
设置指令,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效。
WORKDIR /opt
第3章 Kubernetes
3.1 简介
Kubernetes简称k8s,是Google开源的一个跨主机集群的容器调度平台,它可以自动化应用容器的部署、扩展和操作 , 提供以容器为中心的基础架构。
3.2 特点
可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
可扩展: 模块化,插件化,可挂载,可组合
自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展
3.3 常用对象
3.3.1 pod
Pod是最小部署单元,一个Pod由一个或多个容器组成,Pod中容器共享存储和网络。
3.3.2 volume
数据卷,是Pod中能够被多个容器访问的共享目录。定义在Pod之上,被一个Pod里的多个容器挂载到具体的文件目录之下;与Pod生命周期相同。可以让一个Pod里的多个容器共享文件、让容器的数据写到宿主机的磁盘上或者写文件到 共享存储中。
3.3.3 controller
它用来管理pods,可以确保pod健康,确定并动态调整pod 在集群中中运行的数量,并在pod失败后重新调度新的pod启动,还可以进行一些定时任务。
3.3.4 service
pod是非持久的,会不断的重启,导致pod的ip是随时变化的,同时pod的数量会是动态变化的,客户端很难和pod直接通讯,service是用来解决这一问题的。service 为提供同一服务的pods 提供了统一的入口,生命周期内其绑定ip是不会变化的。
3.4 组成
3.5 安装k8s集群
3.5.1 安装Kubeadm(三台机器)
#导入阿里云的yum仓库
[root@hadoop102 ~]# cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
#开始安装
[root@hadoop102 ~]# yum -y install kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1
#设置开机自启
[root@hadoop102 ~]# systemctl enable kubelet.service
3.5.2 导入镜像(三台机器)
初始化k8s集群时会从官方仓库pull镜像,此时需要访问外网,这里已经提前下载好了,只需将kubeadm-basic.images.tar.gz镜像导入hadoop102,hadoop103,hadoop104三台机器。
[root@hadoop102 software]# ls
kubeadm-basic.images.tar.gz
[root@hadoop102 software]# tar -zxvf kubeadm-basic.images.tar.gz
#写个脚本导入镜像
[root@hadoop102 software]# vim load-image.sh
#!/bin/bash
ls /opt/software/kubeadm-basic.images > /tmp/image-list.txt
cd /opt/software/kubeadm-basic.images
for i in $( cat /tmp/image-list.txt )
do
docker load -i $i
done
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
[root@hadoop102 core]# kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log
3.5.4 加入主节点及工作节点
查看kubeadm-init.log可以发现下面的内容,执行下面红色内容。
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
这里是加入主节点,在hadoop102执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown ( i d − u ) : (id -u): (id−u):(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run “kubectl apply -f [podnetwork].yaml” with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
这里是加入子节点,在其余两台机器执行,注意:每个人不一样
kubeadm join 192.168.79.102:6443 --token abcdef.0123456789abcdef
–discovery-token-ca-cert-hash sha256:91ed76e9852dee956404390fd3d741a425de68c9456fc37228d8289b9c6ef548
[root@hadoop102 core]# kubectl get node
NAME STATUS ROLES AGE VERSION
hadoop102 NotReady master 3m49s v1.15.1
hadoop103 NotReady 5s v1.15.1
hadoop104 NotReady 3s v1.15.1
3.5.5 部署网络
现在所有机器的状态都是NotReady,我们需要配置flannel网络来让节点工作。
[root@hadoop102 ~]# cd install-k8s/
[root@hadoop102 install-k8s]# mkdir -p plugin/flannel
[root@hadoop102 install-k8s]# cd plugin/flannel
[root@hadoop102 flannel]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml --no-check-certificate
[root@hadoop102 flannel]# kubectl create -f kube-flannel.yml
查看节点状态
[root@hadoop102 flannel]# kubectl get node
NAME STATUS ROLES AGE VERSION
hadoop102 Ready master 10m v1.15.1
hadoop103 Ready 6m31s v1.15.1
hadoop104 Ready 6m29s v1.15.1
状态切换需要时间,发现还是NotReady需耐心等待!
3.6 helm
3.6.1 什么是helm
Helm 是 Kubernetes 的包管理器。包管理器类似于我们在 Ubuntu 中使用的apt、Centos中使用的yum 或者Python中的 pip 一样,能快速查找、下载和安装软件包。Helm 由客户端组件 helm 和服务端组件 Tiller 组成, 能够将一组K8S资源打包统一管理, 是查找、共享和使用为Kubernetes构建的软件的最佳方式。
3.6.2 重要概念
(1)chart
chart是创建一个应用的信息集合,包括各种Kubernetes对象的配置模板、参数定义、依赖关系、文档说明等。chart是应用部署的自包含逻辑单元。可以将chart想象成yum中的软件安装包。
(2)release
release是chart的运行实例,代表了一个正在运行的应用。当chart被安装到Kubernetes集群,就生成一个release。chart能多次安装到同一个集群,每次安装都是一个release。
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
4.3 导入hadoop镜像
(1)上传镜像(三台机器)
[root@hadoop102 software]# ls
hadoop.tar
(2)加载镜像(三台机器)
[root@hadoop102 software]# docker load -i hadoop.tar
4.4 启动chart
[root@hadoop102 hadoop]# helm install --name hadoop .
–name:为启动的chart起名。
[root@hadoop102 hadoop]# kubectl get pod
NAME READY STATUS RESTARTS AGE
hadoop-hadoop-hdfs-dn-0 1/1 Running 1 76s
hadoop-hadoop-hdfs-nn-0 1/1 Running 0 76s
hadoop-hadoop-yarn-nm-0 1/1 Running 1 76s
hadoop-hadoop-yarn-nm-1 1/1 Running 0 25s
hadoop-hadoop-yarn-rm-0 1/1 Running 0 76s
4.5 暴露端口
此时hadoop运行无误,但是此时我们不能访问,因为hadoop的端口是pod内部共享的,我们在外面用不了,所以此时需要将我们用到的端口暴露出来。
4.5.1 50070
(1)创建svc文件
[root@hadoop102 hadoop]# vim nnport.yaml
apiVersion: v1
kind: Service
metadata:
name: nnport
labels:
name: nnport
spec:
type: NodePort #这里代表是NodePort类型的,暴露端口需要此类型
ports:
(2)开启端口
[root@hadoop102 hadoop]# kubectl apply -f nnport.yaml
查看:
[root@hadoop102 hadoop]# kubectl get svc
nnport NodePort 10.97.175.201 50070:30070/TCP 63s
(3)访问webui
4.5.2 8088
(1)创建svc文件(与50070同理)
[root@hadoop102 hadoop]# vim rmport.yaml
apiVersion: v1
kind: Service
metadata:
name: rmport
labels:
name: rmport
spec:
type: NodePort #这里代表是NodePort类型的
ports:
(2)开启端口
[root@hadoop102 hadoop]# kubectl create -f rmport.yaml
(3)访问webui
4.6 测试hadoop
4.6.1 测试hdfs
(1)进入nn容器
[root@hadoop102 hadoop]# kubectl exec -it hadoop-hadoop-hdfs-nn-0 /bin/bash
root@hadoop-hadoop-hdfs-nn-0:/usr/local/hadoop-2.9.0#
(2)创建文件夹并上传文件
root@hadoop-hadoop-hdfs-nn-0:/usr/local/hadoop-2.9.0# hadoop fs -mkdir /test
root@hadoop-hadoop-hdfs-nn-0:/usr/local/hadoop-2.9.0# hadoop fs -put README.txt /test
(3)查看结果
4.6.2 测试YARN
(1)进入rm容器
[root@hadoop102 hadoop]# kubectl exec -it hadoop-hadoop-yarn-rm-0 /bin/bash
root@hadoop-hadoop-yarn-rm-0:/usr/local/hadoop-2.9.0#
(2)运行官方wordcount案例
root@hadoop-hadoop-yarn-rm-0:/usr/local/hadoop-2.9.0# pwd
/usr/local/hadoop-2.9.0
root@hadoop-hadoop-yarn-rm-0:/usr/local/hadoop-2.9.0#
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.0.jar wordcount /test /result
(3)查看结果
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: gmo
name: default-admin
namespace: default
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: default-crb
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects: