AnolisOS 8:基于Docker与Kubernetes的大数据平台部署全流程(上)
·
一、前言
本实训基于国产操作系统AnolisOS 8.6,通过Docker容器技术,逐步搭建一个包含Hadoop、Spark、Hive、HBase、Flume等组件的大数据平台,并使用Kubernetes进行容器编排与管理。内容涵盖环境准备、镜像构建、集群部署、服务配置与验证等全流程。
虚拟机下载地址:https://mirrors.openanolis.cn/anolis/8/isos/GA/x86_64/
选择AnolisOS-8.10-x86_64-minimal.iso
注意:在选择客户机操作系统中版本选择的是:CentOS 8 64位
软件选择中我们选择的是:最小化安装




二、环境准备与Docker安装
2.1安装必要 yum-utils 工具包
dnf install -y yum-utils

2.2添加Docker源:把阿里云 Docker CE 仓库添加到系统中
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
![]()
2.3 查看可用版本并安装
#查看可用版本
yum list docker-ce.x86_64 --showduplicates | sort -r
#下载指定Docker版本为docker-ce-20.10.24
dnf install -y docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io
2.4启动Docker并设置开机自启
#启动 Docker 守护进程
systemctl start docker
#设置Docker开机自启
systemctl enable docker
#出现如下,则开启成功
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
三、构建支持SSH的AnolisOS镜像
3.1拉取基础镜像
docker pull registry.openanolis.cn/openanolis/anolisos:8
3.2查看本地镜像表
[root@anolis8 ~] docker images
3.3编写Dockerfile
#创建目录并编写Dockerfile:
[root@anolis8 ~] mkdir Dockerfile
[root@anolis8 ~] cd Dockerfile
[root@anolis8 Dockerfile] vi Dockerfile
#内容如下
FROM registry.openanolis.cn/openanolis/anolisos:8
RUN yum install -y openssh-server openssh-clients passwd
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" \
&& ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N "" \
&& ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N "" \
&& ssh-keygen -t rsa -N "" -f /root/.ssh/id_rsa -q \
&& cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys \
&& chmod 600 /root/.ssh/authorized_keys
COPY jdk /opt/jdk
ENV TZ=Asia/Shanghai
ENV JAVA_HOME=/opt/jdk
ENV JRE_HOME=/opt/jdk/jre
ENV CLASSPATH=.:/opt/jdk/lib:/opt/jdk/jre/lib
ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/jdk/bin
EXPOSE 22
CMD [ "/usr/sbin/sshd", "-D" ]
#:wq保存并退出
3.4构建镜像
docker build -f Dockerfile -t anolisos:8-ssh .
出现Successfully构建成功
3.5查看创建的镜像
docker images

出现TAG:8-ssh则创建成功
四、创建Docker网络与容器集群
4.1 创建自定义网络
docker network create --subnet=172.24.0.0/24 bigdata
#Docker主机上的所有网络
docker network ls

4.2启动三个容器(一主两从)
#ip为master容器里面的ip地址
docker run -d --name master --hostname master --net bigdata --ip 172.24.0.11 -p 9870:9870 anolisos:8-ssh
#ip为worker1容器里面的ip地址
docker run -d --name worker1 --hostname worker1 --net bigdata --ip 172.24.0.12 anolisos:8-ssh
#ip为worker2容器里面的ip地址
docker run -d --name worker2 --hostname worker2 --net bigdata --ip 172.24.0.13 anolisos:8-ssh

验证:
#查看系统中所有的 Docker 容器
docker ps -a
#启动容器
docker start master worker1 worker2
#查看当前正在运行的容器
docker ps
#进入名为 "master" 的容器
docker exec -it master bash

4.3配置SSH免密登录
#进入master容器:
docker exec -it master bash
#生成密钥
ssh-keygen -t rsa -q -N ''
#设置密码:(master、worker1、worker2三个节点上分别运行)
[root@master /] passwd
#复制公钥到各节点:
[root@master /] ssh-copy-id master
[root@master /] ssh-copy-id worker1
[root@master /] ssh-copy-id worker2


五、搭建Java与Hadoop环境
5.1搭建java环境
本实验JDK安装包

#将JDK包复制到容器:
[root@anolis8 ~] docker cp jdk-8u91-linux-x64.tar.gz master:/data
#进入容器并安装:docker exec -it master bash
[root@master /] mkdir /data
[root@master /] cd /data
[root@master data] ls
jdk-8u91-linux-x64.tar.gz
[root@master data] tar -zxf jdk-8u91-linux-x64.tar.gz
[root@master data] mv jdk1.8.0_91 jdk
[root@master data] ls
jdk jdk-8u91-linux-x64.tar.gz
[root@master data] vi /etc/profile
#编辑/etc/profile,添加:
export JAVA_HOME=/data/jdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin
#使配置生效:
[root@master data] source /etc/profile
#检查java版本
[root@master data] java -version

5.2 搭建Hadoop环境
5.2.1复制hadoop包并解压
[root@anolis8 ~] docker cp hadoop-3.1.4.tar.gz master:/data
[root@anolis8 ~] docker exec -it master bash
[root@master data] tar -zxf hadoop-3.1.4.tar.gz
[root@master data] mv hadoop-3.1.4 hadoop
[root@master data] ls
hadoop jdk
5.2.2编辑/etc/profile,添加
#向下发放
export HADOOP_HOME=/data/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
#使配置生效
[root@master data] source /etc/profile
5.2.3查看hadoop版本
[root@master data] hadoop version


5.3.配置Hadoop完全分布式集群
5.3.1core-site.xml文件
[root@master hadoop] vi core-site.xml
#/data/hadoop/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/data/hadoop/tmp</value>
</property>
</configuration>
5.3.2hdfs-site.xml文件
[root@master hadoop] hdfs-site.xml
#/data/hadoop/etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/data/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/data/hadoop/tmp/dfs/data</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>master:9870</value>
</property>
</configuration>
5.3.3hadoop-env.sh文件
[root@master hadoop] hadoop-env.sh
#/data/hadoop/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/data/jdk
export HDFS_NAMENODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_DATANODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
5.3.4workers文件
[root@master hadoop] workers
#/data/hadoop/etc/hadoop/workers
master
worker1
worker2
5.4 同步配置到从节点并启动集群
5.4.1在主节点上分发数据
#同步配置
[root@master hadoop] scp -r /data worker1:/data
[root@master hadoop] scp -r /data worker2:/data
5.4.2格式化hdfs namenode -format
#格式化
[root@master hadoop] hdfs namenode -format


5.4.3启动Hadoop HDFS
[root@master hadoop] [ -f /root/.ssh/id_rsa.pub ] || ssh-keygen -t rsa -P '' -f /root/.ssh/id_rsa
#把公钥追加到本机 authorized_keys
[root@master hadoop] cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
#加固权限
[root@master ~] chmod 600 ~/.ssh/authorized_keys
[root@master ~] chmod 700 ~/.ssh
#启动Hadoop HDFS 并访问
[root@master ~] start-dfs.sh


5.4.4查看jps进程
#分别在master worker1 worker2查看进程
[root@master ~] jps
[root@worker1 /] /data/jdk/bin/jps
[root@worker2 /] /data/jdk/bin/jps



六、Kubernetes集群部署
6.1关闭防火墙与SELinux
[root@anolis8 ~] systemctl stop firewalld
[root@anolis8 ~] systemctl disable firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@anolis8 ~] getenforce
[root@anolis8 ~] vi /etc/selinux/config
SELINUX=disabled
6.2 配置Docker使用systemd作为cgroup驱动
[root@anolis8 ~] cd /etc/docker/
[root@anolis8 docker] vi daemon.json
[root@anolis8 docker] cat daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"]
}
6.3重启Docker并查看进程
[root@anolis8 docker] systemctl daemon-reload
[root@anolis8 docker] systemctl restart docker.service
[root@anolis8 docker] systemctl status docker.service
6.4禁用Swap
# 1. 永久禁用 Swap(注释掉 /etc/fstab 中的 swap 行)
sed -i 's/.*swap.*/#&/' /etc/fstab
# 2. 立即关闭当前所有 Swap 分区
swapoff -a
# 3. 验证 Swap 是否已关闭(应显示 0)
free -h | grep Swap
6.5安装Kubernetes组件
kubernetes镜像_kubernetes下载地址_kubernetes安装教程-阿里巴巴开源镜像站

6.5.1添加阿里云Kubernetes源:
[root@anolis8 ~] cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
6.5.2安装指定版本
[root@anolis8 ~] dnf install -y kubectl-1.23.17 kubeadm-1.23.17 kubelet-1.23.17 --disableexcludes=kubernetes
[root@anolis8 ~] systemctl enable kubelet && systemctl start kubelet

6.6配置kubeadm控制平面
6.6.1把init.defaults.yaml文件导出来
[root@anolis8 ~] kubeadm config print init-defaults
#导出来编辑
[root@anolis8 ~] kubeadm config print init-defaults > init.defaults.yaml
#查看结构
[root@anolis8 ~] ls

6.6.2编辑init.defaults.yaml文件
#编辑init.defaults.yaml文件
[root@anolis8 ~] vi init.defaults.yaml
[root@anolis8 ~] cat init.defaults.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 10.10.10.147 #为自己虚拟机的ip地址
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
imagePullPolicy: IfNotPresent
name: anolis8
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.23.17
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
scheduler: {}
6.6.3列出当前 Kubernetes 版本所需的所有镜像名称
[root@anolis8 ~] kubeadm config images list

6.6.3列出 kubeadm 初始化集群时所需的所有镜像
[root@anolis8 ~] kubeadm config images list --config=init.defaults.yaml

6.6.4Kubernetes 控制平面初始化 做前期准备
[root@anolis8 ~] dnf install -y iproute-tc
[root@anolis8 ~] kubeadm init phase preflight --config=init.defaults.yaml


6.6.5镜像全部本地存在后,再执行
[root@anolis8 ~] kubeadm init --config=init.defaults.yaml


七、基于K8s部署Flannel网络插件
7.1配置kubeconfig 环境变量
#向下加入
[root@anolis8 ~] vi /etc/profile
export KUBECONFIG=/etc/kubernetes/admin.conf
#使之生效
[root@anolis8 ~] source /etc/profile
7.2查看当前集群是否存在 Master 污点
[root@anolis8 ~] kubectl get nodes -o yaml | grep taint -A 10

7.3移除全部节点的 master 污点
[root@anolis8 ~] kubectl taint nodes --all node-role.kubernetes.io/master-

7.4二次确认污点已清空
[root@anolis8 ~] kubectl get nodes -o yaml | grep taint -A 10

7.5导入镜像
[root@anolis8 ~] docker load -i flannel-v0.25.6.tgz
[root@anolis8 ~] docker load -i flannel-cni-plugin-v1.5.1-flannel2.tgz

7.6创建kube-flannel.yml文件
#[root@anolis8 ~] vi kube-flannel.yml
apiVersion: v1
kind: Namespace
metadata:
labels:
k8s-app: flannel
pod-security.kubernetes.io/enforce: privileged
name: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: flannel
name: flannel
namespace: kube-flannel
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
k8s-app: flannel
name: flannel
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- apiGroups:
- ""
resources:
- nodes
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- nodes/status
verbs:
- patch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
labels:
k8s-app: flannel
name: flannel
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: flannel
subjects:
- kind: ServiceAccount
name: flannel
namespace: kube-flannel
---
apiVersion: v1
data:
cni-conf.json: |
{
"name": "cbr0",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
}
]
}
net-conf.json: |
{
"Network": "10.244.0.0/16",
"EnableNFTables": false,
"Backend": {
"Type": "vxlan"
}
}
kind: ConfigMap
metadata:
labels:
app: flannel
k8s-app: flannel
tier: node
name: kube-flannel-cfg
namespace: kube-flannel
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: flannel
k8s-app: flannel
tier: node
name: kube-flannel-ds
namespace: kube-flannel
spec:
selector:
matchLabels:
app: flannel
k8s-app: flannel
template:
metadata:
labels:
app: flannel
k8s-app: flannel
tier: node
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/os
operator: In
values:
- linux
containers:
- args:
- --ip-masq
- --kube-subnet-mgr
command:
- /opt/bin/flanneld
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: EVENT_QUEUE_DEPTH
value: "5000"
image: docker.io/flannel/flannel:v0.25.6
name: kube-flannel
resources:
requests:
cpu: 100m
memory: 50Mi
securityContext:
capabilities:
add:
- NET_ADMIN
- NET_RAW
privileged: false
volumeMounts:
- mountPath: /run/flannel
name: run
- mountPath: /etc/kube-flannel/
name: flannel-cfg
- mountPath: /run/xtables.lock
name: xtables-lock
hostNetwork: true
initContainers:
- args:
- -f
- /flannel
- /opt/cni/bin/flannel
command:
- cp
image: docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel2
name: install-cni-plugin
volumeMounts:
- mountPath: /opt/cni/bin
name: cni-plugin
- args:
- -f
- /etc/kube-flannel/cni-conf.json
- /etc/cni/net.d/10-flannel.conflist
command:
- cp
image: docker.io/flannel/flannel:v0.25.6
name: install-cni
volumeMounts:
- mountPath: /etc/cni/net.d
name: cni
- mountPath: /etc/kube-flannel/
name: flannel-cfg
priorityClassName: system-node-critical
serviceAccountName: flannel
tolerations:
- effect: NoSchedule
operator: Exists
volumes:
- hostPath:
path: /run/flannel
name: run
- hostPath:
path: /opt/cni/bin
name: cni-plugin
- hostPath:
path: /etc/cni/net.d
name: cni
- configMap:
name: kube-flannel-cfg
name: flannel-cfg
- hostPath:
path: /run/xtables.lock
type: FileOrCreate
name: xtables-lock
7.7安装
[root@anolis8 ~] kubectl apply -f kube-flannel.yml

7.8验证
[root@anolis8 ~] kubectl get nodes
#如果没有运行成功可能是网络插件没有正常安装,安装并目录对应正确即可运行成功
#仅作参考:点击链接查看和 Kimi 的对话 https://www.kimi.com/share/19b1fc8c-e062-807f-8000-0000ce6c0390

八、基于k8s部署nginx
8.1命令空间的管理
8.1.1查看命令空间
[root@anolis8 ~] kubectl get namespaces

8.1.2创建命令空间
[root@anolis8 ~] kubectl create namespace ruanko

8.2编写Pod配置
8.2.1编写nginxpod.yaml文件
#[root@anolis8 ~] vi nginxpod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: ruanko
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.22 # 与上面导入的镜像保持一致
8.2.2创建
[root@anolis8 ~] kubectl apply -f nginxpod.yaml

8.2.3查看状态
[root@anolis8 ~] kubectl get pod -n ruanko

8.2.4导入镜像并查看服务
[root@anolis8 ~] docker load -i nginx-1.22.tgz
[root@anolis8 ~] kubectl get pods -A
[root@anolis8 ~] kubectl describe pod coredns-6d8c4cb4d-8j2r4 -n kube-system
[root@anolis8 flannel] vi subnet.env #cd /run/flannel/
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true

8.3创建Service管理
8.3.1创建nginx-service.yaml文件
#[root@anolis8 ~] vi nginx-service.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: ruanko
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
8.3.2启动yaml文件
[root@anolis8 ~] kubectl apply -f nginx-service.yaml

8.3.3查看
[root@anolis8 ~] kubectl get service -n ruanko


8.4创建Deployment管理
8.4.1创建nginx-deployment
#[root@anolis8 ~] vi nginx-deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: ruanko
labels:
app: nginx-deploy
spec:
replicas: 1
selector:
matchLabels:
app: nginx-deploy
template:
metadata:
labels:
app: nginx-deploy
spec:
containers:
- name: nginx
image: nginx:1.22
ports:
- containerPort: 80
8.4.2创建Deployment
[root@anolis8 ~] kubectl apply -f nginx-deployment
![]()
8.4.3查看Deploymen
[root@anolis8 ~] kubectl get deployment -n ruanko

8.5创建Service
8.5.1创建Service
[root@anolis8 ~] kubectl apply -f nginx-service.yaml
service/nginx-service unchanged
[root@anolis8 ~] cp nginx-service.yaml nginx-deploy-service.yaml
[root@anolis8 ~] vi nginx-deploy-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: ruanko
spec:
selector:
app: nginx
type: NodePort
ports:
- protocol: TCP
port: 80
targetPort: 80
8.5.2启动
[root@anolis8 ~] kubectl apply -f nginx-deploy-service.yaml
![]()
8.5.3发布web
[root@anolis8 ~] vi index.html
<!doctype html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
page.test.com
</body>
</html>
[root@anolis8 ~] kubectl get pod -n ruanko
[root@anolis8 ~] kubectl cp index.html nginx-deployment-f69c786f4-kztms:/usr/share/nginx/html/index.html -

[root@anolis8 ~] kubectl get service -n ruanko

8.6创建StatefluSet
8.6.1创建master-statefulset.yaml
[root@anolis8 ~] vi master-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: master
namespace: ruanko
labels:
app: master
spec:
replicas: 1
selector:
matchLabels:
app: master
serviceName: master
template:
metadata:
labels:
app: master
spec:
containers:
- name: anolisos-8-ssh
image: anolisos:8-ssh
ports:
- containerPort: 9870
protocol: TCP
name: hdfs-web
[root@anolis8 ~] kubectl apply -f master-statefulset.yaml

8.6.2查看statefulset
kubectl get statefulset -n ruanko

九、基于K8s部署JDK
9.1在Dockerfile目录下创建Dockerfile文件
[root@anolis8 Dockerfile] vi Dockerfile
FROM registry.openanolis.cn/openanolis/anolisos:8
RUN yum install -y openssh-server openssh-clients passwd
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" \
&& ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N "" \
&& ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N "" \
&& ssh-keygen -t rsa -N "" -f /root/.ssh/id_rsa -q \
&& cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys \
&& chmod 600 /root/.ssh/authorized_keys
COPY jdk /opt/jdk
ENV TZ=Asia/Shanghai
ENV JAVA_HOME=/opt/jdk
ENV JRE_HOME=/opt/jdk/jre
ENV CLASSPATH=.:/opt/jdk/lib:/opt/jdk/jre/lib
ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/jdk/bin
EXPOSE 22
CMD [ "/usr/sbin/sshd", "-D" ]
9.2解压
[root@anolis8 Dockerfile] cd
[root@anolis8 ~] ls
[root@anolis8 ~] tar -xzf jdk-8u91-linux-x64.tar.gz -C Dockerfile
[root@anolis8 ~] cd Dockerfile/
[root@anolis8 Dockerfile] ls

[root@anolis8 Dockerfile] mv jdk1.8.0_91 jdk
[root@anolis8 Dockerfile] ls

9.3生成一个镜像
[root@anolis8 Dockerfile] docker build -f Dockerfile -t anolisos:8-jdk .


9.4创建Statefulset
[root@anolis8 ~] vi hadoop-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: master
namespace: ruanko
labels:
app: master
spec:
replicas: 1
selector:
matchLabels:
app: master
serviceName: master
template:
metadata:
labels:
app: master
spec:
containers:
- name: anolisos-8-ssh
image: anolisos:8-jdk
ports:
- containerPort: 9870
protocol: TCP
name: hdfs-web
- containerPort: 22
protocol: TCP
name: master-ssh
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: worker1
namespace: ruanko
labels:
app: worker1
spec:
replicas: 1
selector:
matchLabels:
app: worker1
serviceName: worker1
template:
metadata:
labels:
app: worker1
spec:
containers:
- name: anolisos-8-ssh
image: anolisos:8-jdk
ports:
- containerPort: 22
protocol: TCP
name: worker1-ssh
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: worker2
namespace: ruanko
labels:
app: worker2
spec:
replicas: 1
selector:
matchLabels:
app: worker2
serviceName: worker2
template:
metadata:
labels:
app: worker2
spec:
containers:
- name: anolisos-8-ssh
image: anolisos:8-jdk
ports:
- containerPort: 22
protocol: TCP
name: worker2-ssh
9.5把 Hadoop 的 StatefulSet 及相关资源部署到 Kubernetes 集群里
[root@anolis8 ~] kubectl apply -f hadoop-statefulset.yaml

9.6查看 命名空间 ruanko 下的所有 StatefulSet 资源 及其当前状态
[root@anolis8 ~] kubectl get statefulset -n ruanko

9.7把 ruanko 命名空间里所有 Pod 的实时状态拉个清单
[root@anolis8 ~] kubectl get pod -n ruanko

9.8登录各节点查看java版本
[root@anolis8 ~] kubectl exec -it -n ruanko master-0 -- bash
[root@anolis8 ~] kubectl exec -it -n ruanko worker1-0-- bash
[root@anolis8 ~] kubectl exec -it -n ruanko worker2-0-- bash

9.9重装(选择)
[root@anolis8 ~] iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
[root@anolis8 ~] kubeadm reset

9.10重启虚拟机
[root@anolis8 ~] reboot
9.11在init.defaults.yaml文件中添加
[root@anolis8 ~] vi init.defaults.yaml
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16
scheduler: {}

9.12preflight checks(预检)
[root@anolis8 ~] kubeadm init phase preflight --config=init.defaults.yaml

9.13把 Flannel 网络插件一次性部署到 Kubernetes 集群
[root@anolis8 ~] kubectl apply -f kube-flannel.yml

9.14确认集群节点和全部 Pod 的当前状态
[root@anolis8 ~] kubectl get nodes

[root@anolis8 ~] kubectl get pods -A

9.15Hadoop 的 StatefulSet 及相关资源部署到 Kubernetes
[root@anolis8 ~] kubectl apply -f hadoop-statefulset.yaml

由此发现报错
9.16在 Kubernetes 集群里新建一个名为 ruanko 的命名空间
[root@anolis8 ~] kubectl create namespace ruanko
![]()
9.17列出 Kubernetes 集群里所有命名空间
[root@anolis8 ~] kubectl get namespaces

9.18提交到集群
[root@anolis8 ~] kubectl apply -f hadoop-statefulset.yaml

9.19查看 ruanko 这个命名空间下所有 StatefulSet 的当前概况
[root@anolis8 ~] kubectl get statefulset -n ruanko

9.20查看是否去污
[root@anolis8 ~] kubectl get node -o yaml | grep taint -A 10

由此发现我们没有进行去污操作
9.21进行去污
[root@anolis8 ~] kubectl taint nodes --all node-role.kubernetes.io/master-
![]()
[root@anolis8 ~] kubectl get node -o yaml | grep taint -A 10
[root@anolis8 ~] kubectl get statefulset -n ruanko

9.22验证:
[root@anolis8 ~] kubectl exec -it -n ruanko master-0 – bash
[root@master-0 /] java -version

十、基于k8s部署hadoop
10.1创建 Service (hadoop-service.yaml)
[root@anolis8 ~] vi hadoop-service.yaml
apiVersion: v1
kind: Service
metadata:
name: hdfs-service
namespace: ruanko
spec:
selector:
app: master
type: NodePort
ports:
- protocol: TCP
port: 9870
targetPort: 9870
---
apiVersion: v1
kind: Service
metadata:
name: master
namespace: ruanko
spec:
selector:
app: master
clusterIP: None
ports:
- protocol: TCP
port: 22
targetPort: 22
---
apiVersion: v1
kind: Service
metadata:
name: worker1
namespace: ruanko
spec:
selector:
app: worker1
clusterIP: None
ports:
- protocol: TCP
port: 22
targetPort: 22
---
apiVersion: v1
kind: Service
metadata:
name: worker2
namespace: ruanko
spec:
selector:
app: worker2
clusterIP: None
ports:
- protocol: TCP
port: 22
targetPort: 22
10.1把 ruanko 命名空间里所有 Pod 列出来
[root@anolis8 ~] kubectl get pods -n ruanko --show-labels

[root@anolis8 ~] kubectl exec -it -n ruanko master-0 – bash
[root@anolis8 ~] kubectl exec -it -n ruanko worker1-0 – bash
[root@anolis8 ~] kubectl exec -it -n ruanko worker2-0 – bash
[root@anolis8 ~] vi /etc/hosts
[root@master-0 /] ping worker1-0
[root@master-0 /] ping worker2-0


10.2把 Hadoop 二进制包手动拷进 ruanko 命名空间下的 master-0 Pod,并在容器里就地解压、改名、进入配置目录,为后续配置 Hadoop 做准备
[root@anolis8 ~] kubectl cp hadoop-3.1.4.tar.gz master-0:/data/ -n ruanko
[root@anolis8 ~] kubectl exec -it -n ruanko master-0 bash
[root@master-0 /] mkdir /data
[root@master-0 /] cd /data
[root@master-0 data] tar -zxf hadoop-3.1.4.tar.gz
[root@master-0 data] mv hadoop-3.1.4 hadoop
[root@master-0 hadoop] cd etc/hadoop/
编辑 hdfs-site.xml文件
[root@master-0 hadoop] vi hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/data/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/hadoop/dfs/data</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>master-0:9870</value>
</property>
</configuration>
编辑core-site.xml文件
[root@master-0 hadoop] vi core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master-0:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop/tmp</value>
</property>
</configuration>
编辑workers文件
[root@master-0 hadoop] vi workers
master-0
worker1-0
worker2-0
编辑hadoop-env.sh文件
[root@master-0 hadoop] vi hadoop-env.sh
export JAVA_HOME=/opt/jdk
export HDFS_NAMENODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_DATANODE_USER=root
10.3远程拷到 worker1-0、worker2-0节点上
[root@master-0 hadoop] scp -r /data worker1-0:/data
[root@master-0 hadoop] scp -r /data worker2-0:/data

10.4格式化
[root@master-0 hadoop] /data/hadoop/bin/hdfs namenode -format


10.5启动HDFS
[root@master-0 hadoop] /data/hadoop/sbin/start-dfs.sh

10.6查看服务
[root@master-0 hadoop] jps


10.7列出 ruanko 命名空间下所有 Service 的概况并访问端口
[root@anolis8 ~] kubectl get service -n ruanko


更多推荐












所有评论(0)