【Flink系列】部署篇(三):Native k8s部署高可用Flink集群实战

这篇具有很好参考价值的文章主要介绍了【Flink系列】部署篇(三):Native k8s部署高可用Flink集群实战。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上一篇博文介绍了如何独立部署一个高可用的Flink集群,本篇介绍如何用Native k8s去部署高可用的Flink 集群。本篇介绍的集群构建在AWS上,和构建在自己的服务器相比,主要区别在文件系统的选择和使用上。我选用的S3服务。

  • EC2操作系统:centos7
  • 本机操作系统:Mac
  • flink version: 1.14
  • jdk version: java8
  • HA service: k8s
  • File System: S3

启动EC2

在AWS上启动3个EC2,操作系统选centos7,注意每个EC2要关联弹性ip地址,允许外网访问。
可参考https://wiki.centos.org/Cloud/AWS

部署k8s集群

安装docker

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker -y
sudo systemctl start docker.service
sudo systemctl enable docker.service
sudo systemctl status docker

安装k8s

$ sudo vi /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=0
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
$ sudo yum install -y kubelet
$ sudo yum install -y kubeadm
$ sudo systemctl enable kubelet

Linux环境准备

  1. set hostnames
// On your **Master** node, update your hostname using the following command:

//Master:192.168.100.90 (3.101.77.138)

$ sudo hostnamectl set-hostname master-node

//worker-node1:192.168.100.29 (3.101.77.139)

$ sudo hostnamectl set-hostname worker-node1

// worker-node2: 192.168.100.21 (3.101.77.140)

$ sudo hostnamectl set-hostname worker-node2

// Make a host entry or DNS record to resolve the hostname for all nodes:

$ sudo vi /etc/hosts

// With the entry:

192.168.100.63  master-node

192.168.100.36 node1 worker-node1

192.168.100.125 node2 worker-node2
  1. 关闭SElinux
$ sudo setenforce 0
$ sudo sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
$ sudo reboot
$ sestatus
SELinux status:                 disabled
  1. update iptables config
$ sudo vi /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
$ sudo sysctl --system
  1. disable swap(3)
$ sudo sed -i '/swap/d' /etc/fstab
$ sudo swapoff -a

部署k8s集群

// only master node
$ sudo kubeadm init
kubeadm join 192.168.100.63:6443 --token snmpyy.b4y506h6hr9u7fxh \
        --discovery-token-ca-cert-hash sha256:87a099765ce369c519bc02af84a6d4732b1cb987d3e95277b334e3cfc3aa0960
// Create required directories and start managing Kubernetes cluster
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
[ec2-user@master-node kubernetes]$ kubectl get nodes
NAME          STATUS     ROLES           AGE   VERSION
master-node   NotReady   control-plane   84m   v1.24.2
//Set up Pod network for the Cluster
$ export kubever=$(kubectl version | base64 | tr -d '\n')
$ kubectl apply -f https://cloud.weave.works/k8s/net?k8s-version=$kubever
// add nodes to your cluster
//在两个工作节点操作
$ kubeadm join 192.168.100.63:6443 --token snmpyy.b4y506h6hr9u7fxh \
        --discovery-token-ca-cert-hash sha256:87a099765ce369c519bc02af84a6d4732b1cb987d3e95277b334e3cfc3aa0960
//在master节点
$ kubectl label node worker-node1 node-role.kubernetes.io/worker=worker
$ kubectl label node worker-node2 node-role.kubernetes.io/worker=worker

Session Mode 部署Flink集群

安装Java8

$ sudo yum search java|grep jdk
$ sudo yum install -y java-1.8.0-openjdk
$ sudo yum install java-1.8.0-openjdk-devel -y
$ java -version

下载解压Flink安装包

$ cd /opt
$ wget https://dlcdn.apache.org/flink/flink-1.15.2/flink-1.15.2-bin-scala_2.12.tgz --no-check-certificate
$ tar -xzf flink-*.tgz

启动集群(无高可用服务版本)

Native k8s是把k8s植入到了Flink安装包中,直接使用Flink的命令就可以在k8s集群中启动flink组件相关的pod。

//service account with RBAC permissions to create, delete pods
$ kubectl create namespace flink-cluster
$ kubectl create serviceaccount flink -n flink-cluster
$ kubectl create clusterrolebinding flink-role-binding-flink \
  --clusterrole=edit \
  --serviceaccount=flink-cluster:flink
//启动session集群1(此时读取的配置为master节点的配置文件,与taskmanager节点的配置文件无关)
$ ./bin/kubernetes-session.sh -Dkubernetes.namespace=flink-cluster -Dkubernetes.jobmanager.service-account=flink -Dkubernetes.cluster-id=my-session -Dtaskmanager.numberOfTaskSlots=6  -Dkubernetes.rest-service.exposed.type=NodePort
2022-07-01 08:46:49,621 INFO  org.apache.flink.kubernetes.KubernetesClusterDescriptor      [] - Create flink session cluster my-session successfully, JobManager Web Interface: http://192.168.100.63:32172
// Dashboard: http://3.101.77.141:32172/,此时没有任何资源\

//只部署了jobmanager,部署在worker-node1,两个服务,一个对内,一个对外
[root@master-node ec2-user]# kubectl get pods,svc,ep -n flink-cluster -o wide
NAME                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE    SELECTOR
service/my-session        ClusterIP   None            <none>        6123/TCP,6124/TCP   124m   app=my-session,component=jobmanager,type=flink-native-kubernetes
service/my-session-rest   NodePort    10.109.225.42   <none>        8081:31595/TCP      124m   app=my-session,component=jobmanager,type=flink-native-kubernetes

NAME                              READY   STATUS    RESTARTS   AGE    IP          NODE           NOMINATED NODE   READINESS GATES
pod/my-session-556f44f44b-94gfk   1/1     Running   0          124m   10.44.0.2   worker-node1   <none>           <none>

NAME                        ENDPOINTS                       AGE
endpoints/my-session        10.44.0.2:6124,10.44.0.2:6123   124m
endpoints/my-session-rest   10.44.0.2:8081                  124m
[root@master-node ec2-user]# kubectl get deployment -o wide -n flink-cluster
NAME         READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS             IMAGES                           SELECTOR
my-session   1/1     1            1           125m   flink-main-container   apache/flink:1.14.5-scala_2.12   app=my-session,component=jobmanager,type=flink-native-kubernetes

可以通过命令行提交,也可以通过dashboard提交任务

// run之后才会显示资源
$ ./bin/flink run \
    --target kubernetes-session \
		-Dkubernetes.namespace=flink-cluster \
    -Dkubernetes.cluster-id=my-session \
    ./examples/streaming/TopSpeedWindowing.jar
$ ./bin/flink run     --target kubernetes-session     -Dkubernetes.namespace=flink-cluster     -Dkubernetes.cluster-id=my-session   -Dparallelism.default=2  ./examples/streaming/TopSpeedWindowing.jar
//自动扩容功能测试
//一个taskmanager的任务槽使用完之前,cluster只有一个task manager
NAME                          READY   STATUS    RESTARTS   AGE   IP          NODE           NOMINATED NODE   READINESS GATES
my-session-556f44f44b-zdvrf   1/1     Running   0          21m   10.36.0.1   worker-node2   <none>           <none>
my-session-taskmanager-1-1    1/1     Running   0          20m   10.44.0.1   worker-node1   <none>           <none>
//继续提交作业,cluster会自动扩容
NAME                          READY   STATUS    RESTARTS   AGE   IP          NODE           NOMINATED NODE   READINESS GATES
my-session-556f44f44b-zdvrf   1/1     Running   0          21m   10.36.0.1   worker-node2   <none>           <none>
my-session-taskmanager-1-1    1/1     Running   0          20m   10.44.0.1   worker-node1   <none>           <none>
my-session-taskmanager-1-2    1/1     Running   0          34s   10.36.0.2   worker-node2   <none>           <none>
//当两个taskmanager的资源都用完了
[root@master-node flink-1.14.5]kubectl get pods -n flink-cluster -o wide
NAME                         READY   STATUS    RESTARTS   AGE     IP          NODE           NOMINATED NODE   READINESS GATES
my-session-58bb97cdc-85ssq   1/1     Running   0          17m     10.36.0.1   worker-node2   <none>           <none>
my-session-taskmanager-1-1   1/1     Running   0          8m26s   10.44.0.2   worker-node1   <none>           <none>
my-session-taskmanager-1-2   1/1     Running   0          3m11s   10.36.0.3   worker-node2   <none>           <none>
my-session-taskmanager-1-3   0/1     Pending   0          33s     <none>      <none>         <none>           <none>
//清理资源
$ kubectl delete deployment/my-session -n flink-cluster
$ kubectl delete clusterrolebinding flink-role-binding-flink
$ kubectl delete serviceaccount flink -n flink-cluster
$ kubectl delete namespace flink-cluster

和独立部署相比,采用Native k8s部署有以下几个值得注意的点:

  1. JM 和TM 只能部署在K8s集群中的工作节点上,因此对于三个节点组成的k8s集群而言,Flink集群事实上只部署在其中两个节点上。因此对于小规模集群,我认为采用Native k8s部署有些浪费资源。
  2. 尽管机器为8核,但是如果直接将-Dtaskmanager.numberOfTaskSlots参数设为8,集群会启动失败,因为默认每个taskmanager会按照slots的数量来分配CPU。当前两个工作节点要部署一个JM,两个TM,导致JM必须和TM挤在同一个节点上,JM默认占1个CPU核,出了JM和TM外,还有一些系统进程也需要CPU,大概占0.1个CPU,因此我这里将-Dtaskmanager.numberOfTaskSlots设为6,经验证6.9也是ok的。 如果希望设置更大的slots数,可以修改kubernetes.taskmanager.cpu,让CPU数和slots数不再关联。
  3. 在独立部署中,不同的TM可以配置不同的内存,不同的slots数量。但在Native k8s部署中,这些参数是所有TM共享的,不可以分开配置。
  4. 从上面的操作过程可以看到,采用native k8s启动flink Session集群事实上仅仅启动了jobmanager。而taskmanager是在任务提交之后根据任务需要的资源数来启动的。在K8s集群资源的限制内,需要多少TM就启动多少TM对应的pod。任务结束对应的资源也会释放。资源的分配和调度都交给了k8s,相比手工设置,更加自动化。但是,如果我们不想要flink组件把k8s所有的节点都用完了,想要限定节点的范围改怎么办?下面是一个通过node-selector指定jobmanager的节点示例
//启动Session cluster2, 修改配置
$ kubectl label nodes worker-node2 node=master
[root@master-node flink-1.14.5]# kubectl get nodes -l "node=master"
NAME           STATUS   ROLES    AGE   VERSION
worker-node2   Ready    worker   10d   v1.24.2
$ ./bin/kubernetes-session.sh -Dkubernetes.namespace=flink-cluster -Dkubernetes.jobmanager.service-account=flink -Dkubernetes.cluster-id=my-session -Dtaskmanager.numberOfTaskSlots=8  -D
kubernetes.rest-service.exposed.type=NodePort -Dkubernetes.jobmanager.node-selector=node:master
[root@master-node flink-1.14.5]# kubectl get pods,svc,ep -n flink-cluster -o wide
NAME                             READY   STATUS    RESTARTS   AGE   IP          NODE           NOMINATED NODE   READINESS GATES
pod/my-session-58bb97cdc-85ssq   1/1     Running   0          57s   10.36.0.1   worker-node2   <none>           <none>

NAME                      TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)             AGE   SELECTOR
service/my-session        ClusterIP   None          <none>        6123/TCP,6124/TCP   57s   app=my-session,component=jobmanager,type=flink-native-kubernetes
service/my-session-rest   NodePort    10.108.58.5   <none>        8081:31181/TCP      57s   app=my-session,component=jobmanager,type=flink-native-kubernetes

NAME                        ENDPOINTS                       AGE
endpoints/my-session        10.36.0.1:6124,10.36.0.1:6123   57s
endpoints/my-session-rest   10.36.0.1:8081                  57s

启动集群(含高可用服务版本)

高可用服务的部署需要一个可共享的持久化存储目录,因为部署在AWS上,这里我选择S3。
因此首先要解决的问题是如何让集群可以使用S3

配置s3

  1. 首先要赋予EC2 访问S3 bucket的权限,这可以通过添加IAM实现。
  2. Copy the respective JAR file(flink-s3-fs-hadoop-1.14.4.jar) from the opt directory to the plugins directory of your Flink distribution before starting Flink. 直接cp即可
  3. 启动集群的时候enable内置的插件就可以使用s3了
./bin/kubernetes-session.sh
    -Dcontainerized.master.env.ENABLE_BUILT_IN_PLUGINS=flink-s3-fs-hadoop-1.14.4.jar \
    -Dcontainerized.taskmanager.env.ENABLE_BUILT_IN_PLUGINS=flink-s3-fs-hadoop-1.14.4.jar

Native k8s部署下使用s3的坑较多,各种报错。主要有两种:

  1. 没有s3访问的权限。检查IAM的配置,检查s3的访问控制。
  2. 找不到对应的类。这主要是插件没有使用对导致的。

启动高可用集群

./bin/kubernetes-session.sh -Dkubernetes.namespace=flink-cluster -Dkubernetes.jobmanager.service-account=flink -Dkubernetes.cluster-id=my-session -Dtaskmanager.numberOfTaskSlots=6  -Dkubernetes.rest-service.exposed.type=NodePort -Dcontainerized.master.env.ENABLE_BUILT_IN_PLUGINS=flink-s3-fs-hadoop-1.14.5.jar -Dcontainerized.taskmanager.env.ENABLE_BUILT_IN_PLUGINS=flink-s3-fs-hadoop-1.14.5.jar -Dhigh-availability=org.apache.flink.kubernetes.highavailability.KubernetesHaServicesFactory -Dhigh-availability.storageDir=s3a://yunzpeng-bucket/flink-ha 

总结:Native k8s部署下session模式集群启动和作业提交过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xdKpmvz1-1673498615890)(2022-12-22-00-00-17.png)]文章来源地址https://www.toymoban.com/news/detail-432189.html

  • 第一个阶段:启动 Session Cluster。Flink Client 内置了 K8s Client,告诉 K8s Master 创建 Flink Master Deployment,ConfigMap,SVC。创建完成后,Master 就拉起来了。这时,Session 就部署完成了,并没有维护任何 TaskManager。
  • 第二个阶段:当用户提交 Job 时,可以通过 Flink Client 或者 Dashboard 的方式,然后通过 Service 到 Dispatcher,Dispatcher 会产生一个 JobMaster。JobMaster 会向 K8sResourceManager 申请资源。ResourceManager 会发现现在没有任何可用的资源,它就会继续向 K8s 的 Master 去请求资源,请求资源之后将其发送回去,起新的 Taskmanager。Taskmanager 起来之后,再注册回来,此时的 ResourceManager 再向它去申请 slot 提供给 JobMaster,最后由 JobMaster 将相应的 Task 部署到 TaskManager 上。这样整个从 Session 的拉起到用户提交都完成了。

Applicatiob Mode部署Flink 集群

无高可用

// 在root下操作
// 1. build a docker image with the flink job
FROM flink:1.14.5
RUN mkdir -p $FLINK_HOME/usrlib
COPY ./examples/streaming/TopSpeedWindowing.jar $FLINK_HOME/usrlib/my-flink-job.jar
$ docker build -t pandafish1996/flink-demo .
// 2. Push image to image warehouse
$ docker login --username=pandafish1996
// 规范: docker push 注册用户名/镜像名
//$ docker tag yunzpeng/flink-word-count pandafish1996/flink-word-count
$ docker push pandafish1996/flink-demo 

//3. start a flink application cluster
$ kubectl create namespace flink-cluster
$ kubectl create serviceaccount flink -n flink-cluster
$ kubectl create clusterrolebinding flink-role-binding-flink \
  --clusterrole=edit \
  --serviceaccount=flink-cluster:flink
// without HA
$ ./bin/flink run-application \
--target kubernetes-application \
-Dkubernetes.cluster-id=my-first-application-cluster \
-Dkubernetes.container.image=pandafish1996/flink-demo \
-Dkubernetes.namespace=flink-cluster \
-Dkubernetes.service-account=flink \
-Dparallelism.default=2 \
-Dtaskmanager.numberOfTaskSlots=6 \
-Dkubernetes.rest-service.exposed.type=NodePort  \
local:///opt/flink/usrlib/my-flink-job.jar

$ kubectl delete deployment/my-first-application-cluster -n flink-cluster

高可用版本

// 1. 构造image并上传到远程仓库
FROM flink:1.14.5
RUN mkdir -p $FLINK_HOME/usrlib
COPY ./examples/streaming/TopSpeedWindowing.jar $FLINK_HOME/usrlib/my-flink-job.jar
RUN mkdir -p $FLINK_HOME/plugins/flink-s3-fs-hadoop
COPY ./opt/flink-s3-fs-hadoop-1.14.5.jar $FLINK_HOME/plugins/flink-s3-fs-hadoop/
$ docker build -t pandafish1996/flink-hademo .
$ docker login --username=pandafish1996
// 规范: docker push 注册用户名/镜像名
//$ docker tag yunzpeng/flink-word-count pandafish1996/flink-word-count
$ docker push pandafish1996/flink-hademo 
// 2. 启动集群
./bin/flink run-application \
--target kubernetes-application \
-Dkubernetes.cluster-id=ha-cluster1 \
-Dkubernetes.container.image=pandafish1996/flink-hademo \
-Dkubernetes.namespace=flink-cluster \
-Dkubernetes.service-account=flink \
-Dparallelism.default=2 \
-Dtaskmanager.numberOfTaskSlots=6 \
-Dkubernetes.rest-service.exposed.type=NodePort  \
-Dhigh-availability=org.apache.flink.kubernetes.highavailability.KubernetesHaServicesFactory \
-Dhigh-availability.storageDir=s3://yunzpeng-bucket/flink-ha \
-Drestart-strategy=fixed-delay \
-Drestart-strategy.fixed-delay.attempts=10 \
-Dcontainerized.master.env.ENABLE_BUILT_IN_PLUGINS=flink-s3-fs-hadoop-1.14.5.jar \
-Dcontainerized.taskmanager.env.ENABLE_BUILT_IN_PLUGINS=flink-s3-fs-hadoop-1.14.5.jar \
local:///opt/flink/usrlib/my-flink-job.jar

参考

  • Flink on K8s技术演进:如何原生地在Kubernetes上运行Flink?_大数据_王阳(亦祺)_InfoQ精选文章
  • 【Flink on k8s】Flink on Kubernetes 部署模式
  • Install K8s cluster on centos.docx
  • How to Install Kubernetes Cluster on CentOS 7 - HOSTAFRICA
  • How to natively deploy Flink on Kubernetes with High-Availability (HA)
  • Flink 1.13 在Native k8s的部署实践

到了这里,关于【Flink系列】部署篇(三):Native k8s部署高可用Flink集群实战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • K8S、keepalived、haproxy 高可用集群实战

    K8S、keepalived、haproxy 高可用集群实战 环境:Centos7.6、2个CPU、8G内存以上配置 Master1:172.20.26.24 Master2:172.20.26.86 Master3:172.20.26.89 Node1:    172.20.26.104 VIP :172.20.26.201 在master1、2、3、Node1上:关闭selinux、firewalld、安装net-tools、lrzsz、vim、epel-release、yum update 一、K8S所有节点(mas

    2024年02月22日
    浏览(29)
  • k8s集群部署 | 三节点(复用)高可用集群过程参考

    1.1.1 实验架构图 1.1.2 系统版本说明 OS 版本:CentOS Linux release 7.9.2009 (Core) 初始内核版本:3.10.0-1160.71.1.el7.x86_64 配置信息:2C2G 150G硬盘 文件系统:xfs 网络:外网权限 k8s 版本:1.25.9 1.1.3 环境基本信息 K8s集群角色 IP地址 主机名 组件信息 控制节点1(工作节点1) 192.168.204.10 k8

    2024年02月04日
    浏览(37)
  • shell 脚本一键部署 k8s 高可用集群

    github地址:https://github.com/Johnny-Demo/deploy/tree/k8s-cluster README.md 要修改脚本里面的 ip 地址,根据自己情况修改,然后在部署,要不然会出错。 执行 kernel.sh 升级 linux 内核,关闭 selinux 和 swap 分区,重启服务器。 执行 run.sh 部署k8s,master 和 node 手动加入集群,无法自动获取加入

    2024年02月07日
    浏览(27)
  • k8s集群中部署rancher v2.7高可用集群

    一,什么是 Rancher?  官网地址: 什么是 Rancher? | Rancher Manager Rancher 是一个 Kubernetes 管理工具,让你能在任何地方和任何提供商上部署和运行集群。 Rancher 可以创建来自 Kubernetes 托管服务提供商的集群,创建节点并安装 Kubernetes,或者导入在任何地方运行的现有 Kubernetes 集群

    2024年02月07日
    浏览(30)
  • Kubeadm - K8S1.20 - 高可用集群部署(博客)

    1.系统设置 注意事项: master节点cpu核心数要求大于2 ●最新的版本不一定好,但相对于旧版本,核心功能稳定,但新增功能、接口相对不稳 ●学会一个版本的 高可用部署,其他版本操作都差不多 ●宿主机尽量升级到CentOS 7.9 ●内核kernel升级到 4.19+ 这种稳定的内核 ●部署k8

    2024年02月05日
    浏览(33)
  • kubeadm部署k8s 1.26.0版本高可用集群

    1.前言 本次搭建使用centos7.9系统,并且使用haproxy+keepalived作为高可用架构软件,haproxy实现k8s集群管理节点apiserver服务的负载均衡以实现集群的高可用功能,keepalived保障了hapxoy的高可用,容器引擎使用docker,需要额外引入cri-docker服务,且使用集群内置的etcd服务,并配置etcd的

    2024年02月11日
    浏览(38)
  • Kubernetes实战(十四)-k8s高可用集群扩容master节点

    k8s 集群是由一组运行 k8s 的节点组成的,节点可以是物理机、虚拟机或者云服务器。k8s 集群中的节点分为两种角色:master 和 node。 master 节点:master 节点负责控制和管理整个集群,它运行着一些关键的组件,如 kube-apiserver、kube-scheduler、kube-controller-manager 等。master 节点可以有

    2024年02月03日
    浏览(42)
  • k8s1.27.2版本二进制高可用集群部署

    说明:本次实验共有5台主机,3台master节点同时又是worker,os128、os129、os130 节点主机容器运行时用的containerd,worker131、worker132主机的用的docker 主机名 IP 组件 系统 os128 192.168.177.128 etcd、kube-apiserver、kube-controller-manager、kube-scheduler、kubelet、kube-proxy、containerd CentOS7.9 os129 192.16

    2024年01月22日
    浏览(57)
  • Centos7 安装部署 Kubernetes(k8s) 高可用集群

    宿主机系统 集群角色 服务器IP 主机名称 容器 centos7.6 master 192.168.2.150 ks-m1 docker centos7.6 master 192.168.2.151 ks-n1 docker centos7.6 master 192.168.2.152 ks-n2 docker 1.1 服务器初始化及网络配置 VMware安装Centos7并初始化网络使外部可以访问** 注意事项:请一定要看完上面这篇文章再执行下面的操

    2024年02月03日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包