一、前言

本实训基于国产操作系统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

更多推荐