首页 文章 精选 留言 我的

精选列表

搜索[ATH事业群],共10000篇文章
优秀的个人博客,低调大师

RocketMQ4.8集群搭建全纪录

前言 集群使用的模式是 2m-2s-sync,采用同步复制、异步刷盘方式。 环境说明 ip地址 主机名 操作系统版本 RocketMQ版本 JDK版本 maven版本 备注 172.16.7.91 nameserver01 centos 7.6 4.8.0 1.8.0_291 3.6 Name Server集群 172.16.7.92 nameserver03 centos 7.6 4.8.0 1.8.0_291 3.6 Name Server集群 172.16.7.93 master01 centos 7.6 4.8.0 1.8.0_291 3.6 Broker集群broker-a 172.16.7.94 slave01 centos 7.6 4.8.0 1.8.0_291 3.6 Broker集群broker-a 172.16.7.95 master02 centos 7.6 4.8.0 1.8.0_291 3.6 Broker集群broker-b 172.16.7.96 slave02 centos 7.6 4.8.0 1.8.0_291 3.6 Broker集群broker-b 部署概况 一、准备工作 1.设置hostname [root@rabbitmq01 network-scripts]# hostnamectl set-hostname nameserver01[root@rabbitmq01 network-scripts]# hostnamenameserver01 6台服务器均设置主机名,详见环境说明。 2.设置hosts [root@nameserver01 ~]# cat >> /etc/hosts <<EOF> 172.16.7.91 nameserver01 > 172.16.7.92 nameserver02> 172.16.7.93 master01> 172.16.7.94 slave01> 172.16.7.95 master02> 172.16.7.96 slave02> EOF 6台服务器都执行以上操作 3.关闭防火墙和selinux 详见Centos7.6操作系统安装及优化全纪录 二、安装jdk 1.下载jdk 下载地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 2.安装jdk 新建目录/opt/java并将下载的包jdk-8u291-linux-x64.rpm 上传 [root@nameserver01 ~]# mkdir /opt/java[root@nameserver01 ~]# cd /opt/java[root@nameserver01 java]# rpm -ivh jdk-8u291-linux-x64.rpm 6台都执行java安装 三、安装maven 6台服务器都执行如下操作 1.下载安装包 [root@nameserver01 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz 也可以到官网下载,下载地址:http://maven.apache.org/download.cgi 2.解压并配置环境变量 [root@nameserver01 ~]# tar -zxvf apache-maven-3.6.3-bin.tar.gz -C /usr/local/[root@nameserver01 ~]# mv /usr/local/apache-maven-3.6.3/ /usr/local/maven3.6[root@nameserver01 ~]# sed -i '$a export PATH=$PATH:/usr/local/maven3.6/bin' /etc/profile && source /etc/profile[root@nameserver01 ~]# mvn -v 3.maven优化 3.1配置阿里源 [root@rabbitmq01 ~]# cd /usr/local/maven3.6/conf/[root@rabbitmq01 conf]# view settings.xml​ 修改前: <url>http://my.repository.com/repo/path</url> 修改后: <url>http://maven.aliyun.com/nexus/content/groups/public/</url> 3.2指定资源下载路径 修改前: <localRepository>/path/to/local/repo</localRepository> 修改后: <localRepository>/usr/local/maven3.6/repository</localRepository> 3.3指定JDK版本 将默认的1.4替换为实际的1.8 修改前: 修改后: 四、RocketMQ安装 1.版本选取 下载地址:https://github.com/apache/rocketmq/tags 本次选择的版本为最新的4.8.0 2.下载安装包 [root@nameserver01 ~]# wget https://github.com/apache/rocketmq/archive/refs/tags/rocketmq-all-4.8.0.tar.gz 3.解压并编译 [root@nameserver01 ~]# mkdir /rocketmq[root@nameserver01 ~]# tar -zxvf rocketmq-all-4.8.0.tar.gz -C /rocketmq[root@nameserver01 ~]# mv /rocketmq/rocketmq-rocketmq-all-4.8.0/* /rocketmq/ && rm -rf /rocketmq/rocketmq-rocketmq-all-4.8.0/[root@nameserver01 ~]# cd /rocketmq/[root@nameserver01 rocketmq]# mvn -Prelease-all -DskipTests clean install -U 中间省略了些步骤 4.免编译安装 除了使用maven编译安装方式外,还可以直接下载带bin的安装包,免编译安装,步骤3和步骤4执行一个就行。 本文后面章节基于免编译安装。 下载地址:https://apache.claz.org/rocketmq/4.8.0/rocketmq-all-4.8.0-bin-release.zip [root@nameserver01 ~]# cd /rocketmq/[root@nameserver01 rocketmq]# wget https://apache.claz.org/rocketmq/4.8.0/rocketmq-all-4.8.0-bin-release.zip[root@nameserver01 rocketmq]# unzip rocketmq-all-4.8.0-bin-release.zip[root@nameserver01 rocketmq]# cd rocketmq-all-4.8.0-bin-release && mv * /rocketmq/ && rm -rf /rocketmq/rocketmq-all-4.8.0-bin-release*[root@nameserver01 rocketmq]# pwd/rocketmq[root@nameserver01 rocketmq]# ll总用量 40drwxr-xr-x 2 root root 102 12月 9 19:46 benchmarkdrwxr-xr-x 3 root root 4096 12月 4 14:26 bindrwxr-xr-x 6 root root 211 12月 4 14:26 confdrwxr-xr-x 2 root root 4096 12月 9 19:46 lib-rw-r--r-- 1 root root 17336 10月 23 2020 LICENSE-rw-r--r-- 1 root root 1338 12月 4 14:26 NOTICE-rw-r--r-- 1 root root 5132 12月 4 14:26 README.md rocketmq-all-4.8.0-bin-release.zip带bin版本的介质无需maven编译,解压后即可使用。 5.配置环境变量 [root@nameserver01 ~]# sed -i '$a export ROCKETMQ_HOME=/rocketmq' /etc/profile[root@nameserver01 ~]# sed -i '$a export PATH=$PATH:$ROCKETMQ_HOME/bin' /etc/profile && source /etc/profile 五、Name Server集群安装 本节操作在nameserver集群nameserver01和nameserver02都执行。 1.调整runserver.sh参数 [root@nameserver01 ~]# cd /rocketmq/bin/[root@nameserver01 bin]# view runserver.sh 调整前: JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m" 调整后: JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m" 由于默认启动的最大内存比较大,在虚机测试时需要修改小点保证服务能正常启动。 2.启动NameServer [root@nameserver01 bin]# nohup sh mqnamesrv & NameServer启动成功,同样的nameserver02也执行相同启动命令。 六、Broker集群安装 本节操作在Broker集群master01、slave01、master02、slave02分别执行。 1.调整runbroker.sh参数 [root@master01 ~]# cd /rocketmq/bin[root@master01 bin]# view runbroker.sh 调整前: JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g" 调整后: JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m" 由于默认启动的最大内存比较大,在虚机测试时需要修改小点保证服务能正常启动。 2.配置broker 由于本文采用的是2主2从同步方式,对应的目录为2m-2s-sync [root@master01 2m-2s-sync]# pwd/rocketmq/conf/2m-2s-sync[root@master01 2m-2s-sync]# ll总用量 16-rw-r--r-- 1 root root 928 10月 23 2020 broker-a.properties-rw-r--r-- 1 root root 922 10月 23 2020 broker-a-s.properties-rw-r--r-- 1 root root 928 10月 23 2020 broker-b.properties-rw-r--r-- 1 root root 922 10月 23 2020 broker-b-s.properties 2.1修改master01配置broker-a.properties [root@master01 2m-2s-sync]# pwd/rocketmq/conf/2m-2s-sync[root@master01 2m-2s-sync]# more broker-a.properties namesrvAddr=172.16.7.91:9876;172.16.7.92:9876brokerClusterName=MyRocketmqbrokerName=broker-abrokerId=0deleteWhen=04fileReservedTime=48brokerRole=SYNC_MASTERflushDiskType=ASYNC_FLUSH 新增了namesrvAddr,指定对应的ip和端口;修改了brokerClusterName,自定义集群名为MyRocketmq;刷盘方式为默认的ASYNC_MASTER即异步方式。 2.2修改slave01配置broker-a-s.properties [root@slave01 2m-2s-sync]# more broker-a-s.propertiesnamesrvAddr=172.16.7.91:9876;172.16.7.92:9876brokerClusterName=MyRocketmqbrokerName=broker-abrokerId=1deleteWhen=04fileReservedTime=48brokerRole=SLAVEflushDiskType=ASYNC_FLUSH 2.3修改master02配置broker-b.properties [root@master02 2m-2s-sync]# more broker-b.propertiesnamesrvAddr=172.16.7.91:9876;172.16.7.92:9876brokerClusterName=MyRocketmqbrokerName=broker-bbrokerId=0deleteWhen=04fileReservedTime=48brokerRole=SYNC_MASTERflushDiskType=ASYNC_FLUSH 2.4修改slave02配置broker-b-s.properties [root@slave02 2m-2s-sync]# more broker-b-s.propertiesnamesrvAddr=172.16.7.91:9876;172.16.7.92:9876brokerClusterName=MyRocketmqbrokerName=broker-bbrokerId=1deleteWhen=04fileReservedTime=48brokerRole=SLAVEflushDiskType=ASYNC_FLUSH 3.启动broker 3.1启动master01 [root@master01 rocketmq]# pwd/rocketmq[root@master01 rocketmq]# nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-a.properties & master01节点启动成功 3.2启动slave01 [root@slave01 rocketmq]# pwd/rocketmq[root@slave01 rocketmq]# nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-a-s.properties & slave01启动成功 3.3启动master02 [root@master02 rocketmq]# pwd/rocketmq[root@master02 rocketmq]# nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-b.properties & master02启动成功 3.4启动slave02 [root@slave02 rocketmq]# pwd/rocketmq[root@slave02 rocketmq]# nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-b-s.properties & slave02启动成功 七、安装管理面板 本节在nameserver01上执行 1.介质下载 git下载介质 [root@nameserver01 ~]# yum -y install git[root@nameserver01 ~]# git clone https://github.com/apache/rocketmq-externals.git 或者下载到本地再上传,下载地址:https://github.com/apache/rocketmq-externals/archive/refs/heads/master.zip 这里选择先下载再上传方式 2.解压 [root@nameserver01 ~]# unzip rocketmq-externals-master--console.zip [root@nameserver01 ~]# cd rocketmq-externals-master 3.修改配置文件 [root@nameserver01 resources]# pwd/root/rocketmq-externals-master/rocketmq-console/src/main/resources[root@nameserver01 resources]# view application.properties 自定义应用端口和nameserver服务器 4.编译 [root@nameserver01 rocketmq-console]# pwd/root/rocketmq-externals-master/rocketmq-console[root@nameserver01 rocketmq-console]# mvn clean package -Dmaven.test.skip=true[INFO] Scanning for projects... 编译过程如图,中间过程省略 编译成功,console目录下会生成target目录 5.运行 [root@nameserver01 rocketmq-console]# pwd/root/rocketmq-externals-master/rocketmq-console[root@nameserver01 rocketmq-console]# cd target/[root@nameserver01 target]# java -jar rocketmq-console-ng-1.0.1.jar 6.访问console 访问地址:http://172.16.7.91:57690 八、集群测试 1.生产者 nameserver01上执行生产者测试 [root@nameserver01 rocketmq]# export NAMESRV_ADDR='172.16.7.91:9876;172.16.7.92:9876'[root@nameserver01 rocketmq]# sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer 2.消费者 nameserve02上执行消费者测试 [root@nameserver02 rocketmq]# export NAMESRV_ADDR='172.16.7.91:9876;172.16.7.92:9876'[root@nameserver02 rocketmq]# sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer 3.console查看 本文所有配置文件和安装包已上传github:RocketMQ集群搭建 单机版详见:Centos7.6搭建RocketMQ4.8全纪录

优秀的个人博客,低调大师

CentOS 7 快速架设hadoop 2.5.1集群

1、软件准备a.OS:CentOS-7.0-1406-x86_64-DVD.iso --去CentOS官网下 b.JDK:jdk-7u71-linux-x64.gz --oracle官网下,至于1.8是否可行,没试 c.Hadoop: hadoop-2.5.1.tar.gz --hadoop官网下 d.虚拟机: VMware Player --小巧够用, 其他虚拟机也行2.环境介绍a.主机: 192.168.1.100 master 192.168.1.101 slave1 192.168.1.102 slave2 192.168.1.103 slave3 b.用户: Master SSH无密码登陆slaver 主机用户1: root 密码 hadoop 主机用户2: hadoop 密码 hadoop c.JDK位置: /usr/local 即/usr/local/jdk1.7.0_71 d.hadoop 位置: /opt 即/opt/hadoop-2.5.1 e.SSH公匙位置 /home/hadoop/.ssh/ 即hadoop用户的根目录下的.shh隐藏目录,hadoop登陆后 $cd ~/.ssh 可进入3、安装思路 由于master与slave除了IP地址不同外,其他配置基本相同(懒的话主机名不改都没问题^_^),所以思路就是配置好Master后将虚拟机复制,然后修改网络配置,将是最简单的办法。4、安装步骤a.建立虚拟机: 测试的话10G硬盘 2G RAM足够了),最小化安装centos7。其中: 分区自动 root密码 hadoop 另建立一个新用户hadoop 密码hadoop 主机名master(懒得后面改) ip地址设置静态(懒得后面配置,并启动网卡): IP:192.168.1.100 mask:255.255.255.0 gateway:192.168.1.1 DNS1:192.168.1.1 DNS2:8.8.8.8 b-关闭防火墙 systemctl stop firewalld.service --关闭防火墙 systemctl disable firewalld.service --永久关闭防火墙 c.增加五个工具(后续操作,若#都是root用户 $的都是hadoop用户,本节可选): --vim #yum -y install vim --ifconfig #yum -y net-tools --时间同步 #yum -y install ntp #ntpdate us.pool.ntp.org #cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime --系统信息 #yum install -y sysstat --tree命令 #yum install -y tree d.修改hosts # vim /etc/hosts 按i进入插入模式,用#号注释掉已有,加入四行,: 192.168.1.100 master 192.168.1.101 slave1 192.168.1.102 slave2 192.168.1.103 slave3 按ESC :wq回车 e.修改ip 若安装没设置IP或者网卡没有启动: [root@master ~]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:3d:ed:03 brd ff:ff:ff:ff:ff:ff inet 192.168.1.11/24 brd 192.168.88.255 scope global eno16777736 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe3d:ed03/64 scope link valid_lft forever preferred_lft forever 注意看2后面的eno16777736就是网卡名,然后编辑网卡配置: [root@master ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 HWADDR=00:0C:29:3D:ED:03 TYPE=Ethernet BOOTPROTO=static ##重要,否则dhcp了 IPADDR=192.168.1.100 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 BROADCAST=192.168.1.255 DNS1=192.168.1.1 DNS2=8.8.8.8 ONBOOT=yes ##重要,这个为no则系统启动不启动该网卡 至少保证以上信息,其他的不管,重启网络: #service network restart5、SSH无密码登陆#su hadoop $cd ~ $mkdir .ssh $chmod 744 .ssh ##权限重要,默认权限可以,本步骤可选 $ssh-keygen -t rsa -P '' ##ssh后无空格!!! $cat ~/.ssh/id_rsa.pub>>~/.ssh/authorized_keys ##将公钥追加到AuthorizedKeysFile $chmod 644 ~/.ssh/authorized_keys ##权限重要,默认权限不行 $su #vim /etc/ssh/sshd_config 去除前面的# RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys #service sshd restart #重启ssh服务 $su hadoop $ssh localhost 或ssh master Last login: Sat Nov 8 20:16:23 2014 #ssh无密码登陆成功6、连接网络共享,取得安装程序(懒人不架设FTP服务器)其中//192.168.1.9 是台windows 7的电脑,共享目录share,用户名密码均是share,里面放有下载好的JDK(jdk-7u71-linux-x64.gz)与 hadoop 2.5.1 (hadoop-2.5.1.tar.gz): #mkdir /mnt/share #建立共享文件挂载点 #mount -t cifs -o username="share",password="share" //192.168.1.9/share /mnt/share #cd /mnt/share 5.安装jdk #tar xzvf jdk-7u71-linux-x64.gz -C /usr/local/ #vim /etc/profile export JAVA_HOME=/usr/local/jdk1.7.0_71 export PATH=$PATH:$JAVA_HOME/bin #source /etc/profile ## 刷新系统配置 确认版本java安装成果 # java -version java version "1.7.0_71" Java(TM) SE Runtime Environment (build 1.7.0_71-b14) Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)7、安装配置hadoop#cd /mnt/share #tar xzvf hadoop-2.5.1.tar.gz -C /opt/ #chown -R hadoop:hadoop /opt/hadoop-2.5.1 # vim /etc/profile ##修改系统配置 export HADOOP_HOME=/opt/hadoop-2.5.1 export PATH=$PATH:$HADOOP_HOME/bin # source /etc/profile ## 刷新系统配置 # su hadoop $ cd /opt/hadoop-2.5.1 $ mkdir -p dfs/name $ mkdir -p dfs/data $ mkdir -p tmp $ cd etc/hadoop a.配置所有slave节点 $ vim slaves slave1 slave2 slave3 b.修改hadoop-env.sh和yarn-env.sh $ vim hadoop-env.sh export JAVA_HOME=/usr/local/jdk1.7.0_71 $ vim yarn-env.sh export JAVA_HOME=/usr/local/jdk1.7.0_71 c.修改core-site.xml $ vim etc/hadoop/core-site.xml <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/hadoop-2.5.1/tmp</value> </property> </configuration> 注意:/opt/hadoop-2.5.1/tmp前面不能有 file!!!与hdfs-site.xml不一样,而且所有内容中不能有空格,结尾处也不行!如<value>/opt/hadoop-2.5.1/tmp </value>会出错(tmp后有空格)。 d.修改hdfs-site.xml $ vim etc/hadoop/hdfs-site.xml <configuration> <property> <name>dfs.namenode.name.dir</name> <value>file:/opt/hadoop-2.5.1/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/opt/hadoop-2.5.1/dfs/data</value> </property> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>master:9001</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property> </configuration> e.修改mapred-site.xml $ cd /opt/hadoop-2.5.1 $ cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml $ vim etc/hadoop/mapred-site.xml <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> f.配置yarn-site.xml (a).伪分布配置: $ vim etc/hadoop/yarn-site.xml: <configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration> (b)集群配置: $ vim etc/hadoop/yarn-site.xml <configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>master:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>master:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>master:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>master:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>master:8088</value> </property> </configuration>8、关机,复制三台slave#shutdown9、启动slave1,修改网卡配置与主机名#ip addr [root@master ~]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:fd:1d:23 brd ff:ff:ff:ff:ff:ff inet 192.168.88.11/24 brd 192.168.88.255 scope global eno16777736 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe3d:ed03/64 scope link valid_lft forever preferred_lft forever 注意看2:后面的eno16777736就是网卡名,然后编辑网卡配置: # vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 HWADDR=00:0C:29:FD:1D:23 ##关键1,按刚才查出来的mac地址,eno16777736下面那行 TYPE=Ethernet BOOTPROTO=static ##关键2 IPADDR=192.168.1.101 ##关键3 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 BROADCAST=192.168.1.255 DNS1=192.168.1.1 DNS2=8.8.8.8 ONBOOT=yes ##关键4 至少保证以上信息 # service network restart --重启网络 修改主机名: # hostnamectl set-hostname slave110、启动slave2/slave2,修改网卡配置与主机名 11、格式化namenode$ cd /opt/hadoop-2.5.1 $ hdfs namenode -format12 启动hdfs$ ./sbin/start-dfs.sh $ ./sbin/start-yarn.sh --用pi程序测试: $ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.1.jar pi 2 20000 13 检查启动情况http://192.168.1.100:8088 http://192.168.1.100:50070 14、关闭hadoop$ ./sbin/stop-all.sh 本文转自 tianya1993 51CTO博客,原文链接:http://blog.51cto.com/dreamlinux/1744348,如需转载请自行联系原作者

优秀的个人博客,低调大师

kubernetes1.8.5集群安装(带证书)

一、安装 Docker(集群中每台服务器都需安装) cd /data/tools/kubernetes/ yum -y install docker-ce-17.09.1.ce-1.el7.centos.x86_64.rpm 查看 Docker 默认存储位置 docker info | grep "Docker Root Dir" docker info | grep "Storage Driver" 修改 Docker 默认存储位置(docker服务启动脚本会调用docker.service.d下的配置文件) mkdir -pv /etc/systemd/system/docker.service.d cat > /etc/systemd/system/docker.service.d/docker.conf <<EOF [Service] ExecStart= ExecStart=/usr/bin/dockerd --graph=/data/docker --storage-driver=overlay EOF vim /etc/systemd/system/docker.service.d/docker.conf 启动docker systemctl daemon-reload && \ systemctl start docker && \ systemctl -l status docker 查看docker运行日志 journalctl -f -u docker journalctl -xe systemctl stop docker systemctl restart docker netstat -ntlp systemctl enable docker 设置环境变量,开启转发选项 cat > /etc/sysctl.d/k8s.conf <<EOF net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl -p /etc/sysctl.d/k8s.conf 二、创建 CA 证书配置,生成 CA 证书和私钥 备注: etcd和kuberneter都需要生产证书(下面分别配置etcd和kuberneter的真是真是证书) etcd证书存放目录:/etc/etcd/ssl/ kubernetes证书存放目录:/etc/kubernetes/ssl 创建存放证书的临时目录(先把etcd及kuberneter需要的证书先在一台服务器上生成再做分发到其他服务) mkdir -pv /data/ssl && \ cd /data/ssl/ 安装 cfssl(生产证书的工具) curl -s -L -o /usr/bin/cfsslhttps://pkg.cfssl.org/R1.2/cfssl_linux-amd64 curl -s -L -o /usr/bin/cfssljsonhttps://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 curl -s -L -o /usr/bin/cfssl-certinfohttps://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 chmod +x /usr/bin/cfssl* 生成 CA 证书 和 私钥 config.json配置文件 cat >> config.json << EOF { "signing": { "default": { "expiry": "87600h" }, "profiles": { "kubernetes": { "usages": [ "signing", "key encipherment", "server auth", "client auth" ], "expiry":"87600h" } } } } EOF etcd-csr.json配置文件 cat >> etcd-csr.json << EOF { "CN": "etcd", "hosts": [ "127.0.0.1", "10.10.175.3", "10.10.188.125", "10.10.121.199" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "Shanghai", "L": "Shanghai", "O": "k8s", "OU": "System" } ] } EOF csr.json配置文件 cat >> csr.json << EOF { "CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C":"CN", "ST": "Shanghai", "L": "Shanghai", "O": "k8s", "OU": "System" } ] } EOF 备注:etcd-csr.json中的hosts需要根据自己环境的具体情况去配置 把上面三个文件复制到/data/ssl目录下 cd /data/ssl/ cfssl gencert -initca csr.json | cfssljson -bare ca 创建 etcd 证书配置,生成 etcd 证书和私钥 cfssl gencert \ -ca=ca.pem \ -ca-key=ca-key.pem \ -config=config.json \ -profile=kubernetes \ etcd-csr.json | cfssljson -bare etcd [root@k8smaster01 ~]# ll /data/ssl -rw-r--r-- 1 root root 1005 Dec 21 13:56 ca.csr -rw------- 1 root root 1679 Dec 21 13:56 ca-key.pem -rw-r--r-- 1 root root 1363 Dec 21 13:56 ca.pem -rw-r--r-- 1 root root 385 Dec 21 13:56 config.json -rw-r--r-- 1 root root 265 Dec 21 13:56 csr.json -rw-r--r-- 1 root root 1066 Dec 21 13:56 etcd.csr -rw-r--r-- 1 root root 375 Dec 21 13:56 etcd-csr.json -rw------- 1 root root 1675 Dec 21 13:56 etcd-key.pem -rw-r--r-- 1 root root 1440 Dec 21 13:56 etcd.pem 到此etcd的证书文件生成了 创建 kube-apiserver 证书配置,生成 kube-apiserver 证书和私钥 首先把下面附件中的文件都复制到/data/ssl目录下 front-proxy-client-csr.json配置文件 cat >> front-proxy-client-csr.json << EOF { "CN": "system:kube-scheduler", "hosts": [ "10.10.175.3", "10.10.188.125" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "Shanghai", "L": "Shanghai", "O": "system:kube-scheduler", "OU": "System" } ] } EOF kube-admin-csr.json配置文件 cat >> kube-admin-csr.json << EOF { "CN": "kube-admin", "hosts": [ "10.10.175.3" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "Shanghai", "L": "Shanghai", "O": "system:masters", "OU": "System" } ] } EOF kube-apiserver-csr.json配置文件 cat >> kube-apiserver-csr.json << EOF { "CN": "kubernetes", "hosts": [ "127.0.0.1", "10.10.175.3", "10.10.188.125", "10.10.121.199", "10.254.0.1", "localhost", "kubernetes", "kubernetes.default", "kubernetes.default.svc", "kubernetes.default.svc.cluster", "kubernetes.default.svc.cluster.local" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "Shanghai", "L": "Shanghai", "O": "k8s", "OU": "System" } ] } EOF kube-controller-manager-csr.json配置文件 cat >> kube-controller-manager-csr.json << EOF { "CN": "system:kube-controller-manager", "hosts": [ "10.10.175.3", "10.10.188.125" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "Shanghai", "L": "Shanghai", "O": "system:kube-controller-manager", "OU": "System" } ] } EOF front-proxy-client-csr.json配置文件 cat >> front-proxy-client-csr.json << EOF { "CN": "front-proxy-client", "key": { "algo": "rsa", "size": 2048 } } EOF kube-proxy-csr.json配置文件 cat >> kube-proxy-csr.json << EOF { "CN": "system:kube-proxy", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "Shanghai", "L": "Shanghai", "O": "system:kube-proxy", "OU": "System" } ] } EOF kube-scheduler-csr.json配置文件 cat >> kube-scheduler-csr.json << EOF { "CN": "system:kube-scheduler", "hosts": [ "10.10.175.3", "10.10.188.125" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "Shanghai", "L": "Shanghai", "O": "system:kube-scheduler", "OU": "System" } ] } EOF kubelet-csr.json配置文件 cat >> kubelet-csr.json << EOF { "CN": "system:node:master01", "hosts": [ "master01", "10.10.175.3" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Shanghai", "ST": "Shanghai", "O": "system:nodes", "OU": "Kubernetes-manual" } ] } EOF 备注:kube-admin-csr.json,kube-apiserver-csr.json,kube-controller-manager-csr.json,kubelet-csr.json,kube-scheduler-csr.json这五个json文件的hosts内容根据自己环境的实际情况作相应的更改 cfssl gencert \json -ca=ca.pem \ -ca-key=ca-key.pem \ -config=config.json \ -profile=kubernetes \ kube-apiserver-csr.json | cfssljson -bare kube-apiserver 创建 kube-controller-manager 证书配置,生成 kube-controller-manager 证书和私钥 cfssl gencert \ -ca=ca.pem \ -ca-key=ca-key.pem \ -config=config.json \ -profile=kubernetes \ kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager 创建 kube-scheduler 证书配置,生成 kube-scheduler 证书和私钥 cfssl gencert \ -ca=ca.pem \ -ca-key=ca-key.pem \ -config=config.json \ -profile=kubernetes \ kube-scheduler-csr.json | cfssljson -bare kube-scheduler 创建 kube-admin 证书配置,生成 kube-admin 证书和私钥 cfssl gencert \ -ca=ca.pem \ -ca-key=ca-key.pem \ -config=config.json \ -profile=kubernetes \ kube-admin-csr.json | cfssljson -bare kube-admin 创建 kube-proxy 证书配置,生成 kube-proxy 证书和私钥 cfssl gencert \ -ca=ca.pem \ -ca-key=ca-key.pem \ -config=config.json \ -profile=kubernetes \ kube-proxy-csr.json | cfssljson -bare kube-proxy 生成 高级审计 配置 cat > audit-policy.yaml <<EOF # Log all requests at the Metadata level. apiVersion: audit.k8s.io/v1beta1 kind: Policy rules: - level: Metadata EOF 生成 token.csv cd /data/ssl/ export BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ') cat > /data/ssl/token.csv <<EOF ${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap" EOF 查看生产的证书文件 kubelet 也可以手动通过 CA 来进行签发,但是这只能针对少数机器,毕竟我们在进行证书签发的时候,是需要绑定对应 Node 的 IP 的, 如果 node 太多了,加 IP 就会很幸苦, 所以这里我们使用 TLS 认证,由 apiserver 自动给符合条件的 node 签发证书,允许节点加入集群。 kubelet 首次启动时向 kube-apiserver 发送 TLS Bootstrapping 请求, kube-apiserver 验证 kubelet 请求中的 token 是否与它配置的 token 一致,如果一致则自动为 kubelet 生成证书和密钥。 三、证书分发 无论是node节点还是master节点都需要etcd和kubeneter证书 证书分发之前首先在其他的点建好下面两个目录 mkdir -pv /etc/etcd/ssl && mkdir -pv /etc/kubernetes/ssl 证书分发 cd /data/ssl/ rsync -avzP ca*.pem etcd*.pem root@10.10.188.125:/etc/etcd/ssl/ rsync -avzP ca*.pem kube-apiserver*.pem kube-controller-manager*.pem kube-scheduler*.pem kube-proxy*.pem root@10.10.188.125:/etc/kubernetes/ssl/ rsync -avzP bootstrap.kubeconfig kube-proxy.kubeconfig audit-policy.yaml token.csv root@10.10.188.125 :/etc/kubernetes/ 四、etcd集群安装 etcd集群至少需要三台服务器才能做集群 下载地址:https://github.com/coreos/etcd cd /data/tools/kubernetes/ tar -zxvf etcd-v3.2.11-linux-amd64.tar.gz cd etcd-v3.2.11-linux-amd64/ && \ cp etcd etcdctl /usr/bin/ && \ etcd --version etcd配置文件(配置文件中改成当前服务器IP) ETCD_INITIAL_CLUSTER_STATE参数:new 初始化集群安装时使用该选项;existing 新加入集群时使用该选项 ETCD_NAME命名必须和ETCD_INITIAL_CLUSTER设置对应上 cat > /etc/etcd/etcd.conf <<EOF # [member] ETCD_NAME=etcd1 ETCD_DATA_DIR="/data/kubernetes/etcd/" # ETCD_WAL_DIR="/data/kubernetes/etcd/wal" ETCD_SNAPSHOT_COUNT="100" ETCD_HEARTBEAT_INTERVAL="100" ETCD_ELECTION_TIMEOUT="1000" ETCD_LISTEN_PEER_URLS="https://10.10.175.3:2380" ETCD_LISTEN_CLIENT_URLS="https://10.10.175.3:2379,http://127.0.0.1:2379" ETCD_MAX_SNAPSHOTS="5" ETCD_MAX_WALS="5" #ETCD_CORS="" # [cluster] ETCD_INITIAL_ADVERTISE_PEER_URLS="https://10.10.175.3:2380" # if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..." ETCD_INITIAL_CLUSTER="etcd1=https://10.10.175.3:2380,etcd2=https://10.10.188.125:2380,etcd3=https://10.10.121.199:2380" ETCD_INITIAL_CLUSTER_STATE="new" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_ADVERTISE_CLIENT_URLS="https://10.10.175.3:2379" #ETCD_DISCOVERY="" #ETCD_DISCOVERY_SRV="" #ETCD_DISCOVERY_FALLBACK="proxy" #ETCD_DISCOVERY_PROXY="" #ETCD_STRICT_RECONFIG_CHECK="false" #ETCD_AUTO_COMPACTION_RETENTION="0" # [proxy] #ETCD_PROXY="off" #ETCD_PROXY_FAILURE_WAIT="5000" #ETCD_PROXY_REFRESH_INTERVAL="30000" #ETCD_PROXY_DIAL_TIMEOUT="1000" #ETCD_PROXY_WRITE_TIMEOUT="5000" #ETCD_PROXY_READ_TIMEOUT="0" # [security] ETCD_CERT_FILE="/etc/etcd/ssl/etcd.pem" ETCD_KEY_FILE="/etc/etcd/ssl/etcd-key.pem" ETCD_CLIENT_CERT_AUTH="true" ETCD_TRUSTED_CA_FILE="/etc/etcd/ssl/ca.pem" ETCD_AUTO_TLS="true" ETCD_PEER_CERT_FILE="/etc/etcd/ssl/etcd.pem" ETCD_PEER_KEY_FILE="/etc/etcd/ssl/etcd-key.pem" ETCD_PEER_CLIENT_CERT_AUTH="true" ETCD_PEER_TRUSTED_CA_FILE="/etc/etcd/ssl/ca.pem" ETCD_PEER_AUTO_TLS="true" # [logging] #ETCD_DEBUG="false" # examples for -log-package-levels etcdserver=WARNING,security=DEBUG #ETCD_LOG_PACKAGE_LEVELS="" EOF etcd启动文件 cat > /usr/lib/systemd/system/etcd.service <<EOF [Unit] Description=Etcd Service After=network.target [Service] Environment=/data/kubernetes/etcd EnvironmentFile=-/etc/etcd/etcd.conf Type=notify User=root PermissionsStartOnly=true ExecStart=/usr/bin/etcd Restart=on-failure RestartSec=10 LimitNOFILE=65536 [Install] WantedBy=multi-user.target EOF 查看集群状态(在etcd 集群中任意一台执行下面的命令)etcdctl --endpoints=https://10.10.175.3:2379 --cert-file=/etc/etcd/ssl/etcd.pem --ca-file=/etc/etcd/ssl/ca.pem --key-file=/etc/etcd/ssl/etcd-key.pem cluster-health查看etcd集群成员etcdctl --endpoints=https://10.10.175.3:2379 --cert-file=/etc/etcd/ssl/etcd.pem --ca-file=/etc/etcd/ssl/ca.pem --key-file=/etc/etcd/ssl/etcd-key.pem member list查看etcd集群中的存储信息(ls后面可接具体目录)etcdctl --endpoints=https://127.0.0.1:2379 --cert-file=/etc/etcd/ssl/etcd.pem --ca-file=/etc/etcd/ssl/ca.pem --key-file=/etc/etcd/ssl/etcd-key.pem ls 五、kubeneter集群安装 1、master节点安装 下载地址:https://storage.googleapis.com/kubernetes-release/release/v1.8.5/kubernetes-server-linux-amd64.tar.gz #拷贝相关命令(kubernetes-server解压包中包含了server,client,node所有的脚本) cd /data/tools/kubernetes/v1.8.5/ tar -xvf kubernetes-server-linux-amd64.tar.gz cd kubernetes/server/bin/ cp kube-apiserver kube-controller-manager kube-scheduler /usr/bin/ cp kubelet kube-proxy /usr/bin/ cp kubectl /usr/bin/ 设置为当前master节点IPexport KUBE_APISERVER="https://10.10.175.3:6443" 创建 kubelet bootstrapping kubeconfig 配置文件 kubectl config set-cluster kubernetes \ --certificate-authority=ca.pem \ --embed-certs=true \ --server=${KUBE_APISERVER} \ --kubeconfig=bootstrap.kubeconfig kubectl config set-credentials kubelet-bootstrap \ --token=${BOOTSTRAP_TOKEN} \ --kubeconfig=bootstrap.kubeconfig kubectl config set-context default \ --cluster=kubernetes \ --user=kubelet-bootstrap \ --kubeconfig=bootstrap.kubeconfig kubectl config use-context default --kubeconfig=bootstrap.kubeconfig cp ./bootstrap.kubeconfig /etc/kubernetes/ 创建 kube-proxy kubeconfig 配置文件 cd /data/ssl/ kubectl config set-cluster kubernetes \ --certificate-authority=ca.pem \ --embed-certs=true \ --server=${KUBE_APISERVER} \ --kubeconfig=kube-proxy.kubeconfig kubectl config set-credentials kube-proxy \ --client-certificate=kube-proxy.pem \ --client-key=kube-proxy-key.pem \ --embed-certs=true \ --kubeconfig=kube-proxy.kubeconfig kubectl config set-context default \ --cluster=kubernetes \ --user=kube-proxy \ --kubeconfig=kube-proxy.kubeconfig kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig cp ./kube-proxy.kubeconfig /etc/kubernetes/ 创建 kube-admin kubeconfig 配置文件 kubectl config set-cluster kubernetes \ --certificate-authority=ca.pem \ --embed-certs=true \ --server=${KUBE_APISERVER} \ --kubeconfig=admin.conf kubectl config set-credentials kube-admin \ --client-certificate=kube-admin.pem \ --embed-certs=true \ --client-key=kube-admin-key.pem \ --kubeconfig=admin.conf kubectl config set-context kube-admin@kubernetes \ --cluster=kubernetes \ --user=kube-admin \ --kubeconfig=admin.conf kubectl config use-context kube-admin@kubernetes --kubeconfig=admin.conf cp ./admin.conf /etc/kubernetes/ cp /etc/kubernetes/ssl/admin.conf ~/.kube/config 配置 config 通用配置 cd /etc/kubernetes/ cat > /etc/kubernetes/config <<EOF ### # kubernetes system config # # The following values are used to configure various aspects of all # kubernetes services, including # # kube-apiserver.service # kube-controller-manager.service # kube-scheduler.service # kubelet.service # kube-proxy.service # logging to stderr means we get it in the systemd journal KUBE_LOGTOSTDERR="--logtostderr=true" # journal message level, 0 is debug KUBE_LOG_LEVEL="--v=2" # Should this cluster be allowed to run privileged docker containers KUBE_ALLOW_PRIV="--allow-privileged=true" # How the controller-manager, scheduler, and proxy find the apiserver KUBE_MASTER="--master=http://127.0.0.1:8080" EOF 配置 apiserver 配置文件 cd /etc/kubernetes/ mkdir -pv /data/kubernetes/logs cat > /etc/kubernetes/apiserver <<EOF ### # kubernetes system config # # The following values are used to configure the kube-apiserver # # The address on the local server to listen to. KUBE_API_ADDRESS="--advertise-address=10.10.175.3 --insecure-bind-address=127.0.0.1 --bind-address=10.10.175.3" # The port on the local server to listen on. KUBE_API_PORT="--insecure-port=8080 --secure-port=6443" # Port minions listen on # KUBELET_PORT="--kubelet-port=10250" # Comma separated list of nodes in the etcd cluster KUBE_ETCD_SERVERS="--etcd-servers=https://10.10.175.3:2379,https://10.10.188.125:2379,https://10.10.121.199:2379" # Address range to use for services KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" # default admission control policies KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota,NodeRestriction" # Add your own! KUBE_API_ARGS="--authorization-mode=RBAC,Node \\ --anonymous-auth=false \\ --kubelet-https=true \\ --enable-bootstrap-token-auth \\ --token-auth-file=/etc/kubernetes/token.csv \\ --service-node-port-range=30000-50000 \\ --tls-cert-file=/etc/kubernetes/ssl/kube-apiserver.pem \\ --tls-private-key-file=/etc/kubernetes/ssl/kube-apiserver-key.pem \\ --client-ca-file=/etc/kubernetes/ssl/ca.pem \\ --service-account-key-file=/etc/kubernetes/ssl/kube-apiserver-key.pem \\ --etcd-quorum-read=true \\ --storage-backend=etcd3 \\ --etcd-cafile=/etc/etcd/ssl/ca.pem \\ --etcd-certfile=/etc/etcd/ssl/etcd.pem \\ --etcd-keyfile=/etc/etcd/ssl/etcd-key.pem \\ --enable-swagger-ui=true \\ --apiserver-count=3 \\ --audit-policy-file=/etc/kubernetes/audit-policy.yaml \\ --audit-log-maxage=30 \\ --audit-log-maxbackup=3 \\ --audit-log-maxsize=100 \\ --audit-log-path=/data/kubernetes/logs/audit.log \\ --event-ttl=1h" EOF 注意: 安全端口监听在 10.10.175.3,提供给 node 节点访问(当前服务器IP) 非安全端口监听在 127.0.0.1,只提供给同一台机器上的 kube-controller-manager 和 kube-scheduler 访问,这样就保证了安全性和稳定性(IP可换成0.0.0.0) 配置 kube-apiserver 启动项文件 cat > /usr/lib/systemd/system/kube-apiserver.service <<EOF [Unit] Description=Kubernetes API Server Documentation=https://github.com/kubernetes/kubernetes After=network.target After=etcd.service [Service] EnvironmentFile=-/etc/kubernetes/config EnvironmentFile=-/etc/kubernetes/apiserver ExecStart=/usr/local/bin/kube-apiserver \\ \$KUBE_LOGTOSTDERR \\ \$KUBE_LOG_LEVEL \\ \$KUBE_ETCD_SERVERS \\ \$KUBE_API_ADDRESS \\ \$KUBE_API_PORT \\ \$KUBELET_PORT \\ \$KUBE_ALLOW_PRIV \\ \$KUBE_SERVICE_ADDRESSES \\ \$KUBE_ADMISSION_CONTROL \\ \$KUBE_API_ARGS Restart=on-failure Type=notify LimitNOFILE=65536 [Install] WantedBy=multi-user.target EOF vim /usr/lib/systemd/system/kube-apiserver.service 启动 kube-apiserver systemctl daemon-reload && \ systemctl start kube-apiserver && \ systemctl -l status kube-apiserver journalctl -f -u kube-apiserver journalctl -xe systemctl stop kube-apiserver netstat -ntlp systemctl enable kube-apiserver 查看当前 master 集群状态kubectl get cs 配置 controller-manager 配置文件 cd /etc/kubernetes/ cat > /etc/kubernetes/controller-manager <<EOF # Add your own! KUBE_CONTROLLER_MANAGER_ARGS="--address=0.0.0.0 \\ --service-cluster-ip-range=10.254.0.0/16 \\ --cluster-name=kubernetes \\ --cluster-signing-cert-file=/etc/kubernetes/ssl/ca.pem \\ --cluster-signing-key-file=/etc/kubernetes/ssl/ca-key.pem \\ --service-account-private-key-file=/etc/kubernetes/ssl/kube-apiserver-key.pem \\ --root-ca-file=/etc/kubernetes/ssl/ca.pem \\ --leader-elect=true \\ --node-monitor-grace-period=40s \\ --node-monitor-period=5s \\ --pod-eviction-timeout=5m0s" EOF 配置 kube-controller-manager 启动项文件 cat > /usr/lib/systemd/system/kube-controller-manager.service <<EOF [Unit] Description=Kubernetes Controller Manager Documentation=https://github.com/kubernetes/kubernetes [Service] EnvironmentFile=-/etc/kubernetes/config EnvironmentFile=-/etc/kubernetes/controller-manager ExecStart=/usr/local/bin/kube-controller-manager \\ \$KUBE_LOGTOSTDERR \\ \$KUBE_LOG_LEVEL \\ \$KUBE_MASTER \\ \$KUBE_CONTROLLER_MANAGER_ARGS Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target EOF vim /usr/lib/systemd/system/kube-controller-manager.service` 启动 kube-controller-manager 服务 systemctl daemon-reload && \ systemctl start kube-controller-manager && \ systemctl -l status kube-controller-manager journalctl -f -u kube-controller-manager journalctl -xe systemctl stop kube-controller-manager netstat -ntlp systemctl enable kube-controller-manager 查看当前 master 集群状态 kubectl get cs 配置 scheduler 配置文件 cd /etc/kubernetes/ cat > /etc/kubernetes/scheduler <<EOF ### # kubernetes scheduler config # default config should be adequate # Add your own! KUBE_SCHEDULER_ARGS="--leader-elect=true --address=0.0.0.0" EOF vim /etc/kubernetes/scheduler 配置 kube-scheduler 启动项文件 cat > /usr/lib/systemd/system/kube-scheduler.service <<EOF [Unit] Description=Kubernetes Scheduler Plugin Documentation=https://github.com/kubernetes/kubernetes [Service] EnvironmentFile=-/etc/kubernetes/config EnvironmentFile=-/etc/kubernetes/scheduler ExecStart=/usr/local/bin/kube-scheduler \\ \$KUBE_LOGTOSTDERR \\ \$KUBE_LOG_LEVEL \\ \$KUBE_MASTER \\ \$KUBE_SCHEDULER_ARGS Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target EOF vim /usr/lib/systemd/system/kube-scheduler.service 启动 kube-scheduler 服务 systemctl daemon-reload && \ systemctl start kube-scheduler && \ systemctl -l status kube-scheduler journalctl -f -u kube-scheduler journalctl -xe systemctl stop kube-scheduler netstat -ntlp systemctl enable kube-scheduler 查看当前 master 集群状态 kubectl get cs 设置开机启动 systemctl enable kube-apiserver systemctl enable kube-controller-manager systemctl enable kube-scheduler 2、Master 作为 Node配置 kubelet 配置文件(配置文件中的红色字体根据服务器当前情况变更) mkdir -pv /data/kubernetes/kubelet cd /etc/kubernetes/ cat > /etc/kubernetes/kubelet <<EOF ### # kubernetes kubelet (minion) config # The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces) KUBELET_ADDRESS="--address=10.10.175.3" # The port for the info server to serve on # KUBELET_PORT="--port=10250" # You may leave this blank to use the actual hostname KUBELET_HOSTNAME="--hostname-override=k8smaster01.test.com" # location of the api-server # KUBELET_API_SERVER="" # Add your own! KUBELET_ARGS="--cgroup-driver=cgroupfs \ --cluster-dns=10.254.0.2 \ --resolv-conf=/etc/resolv.conf \ --experimental-bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig \ --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \ --fail-swap-on=false \ --cert-dir=/etc/kubernetes/ssl \ --cluster-domain=cluster.local. \ --hairpin-mode=promiscuous-bridge \ --serialize-image-pulls=false \ --logtostderr=false \ --log-dir=/data/kubernetes/logs \ --root-dir=/data/kubernetes/kubelet \ #--pod-infra-container-image=gcr.io/google_containers/pause-amd64:3.0" --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0" EOF vim /etc/kubernetes/kubelet 启动kubelet时会调用pause-amd64:3.0镜像,可以使用如上配置调用阿里云镜像或者把镜像从gci.io下载下来用下面的方式加载(需×××) cd /data/tools/kubernetes/images/ docker images docker load < gcr.io_google_containers_pause-amd64_3.0.tar docker pull gcr.io/google_containers/pause-amd64:3.0 docker pull registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0 网络组件参数先不加,到后期做网络组件的时候再加 --network-plugin=cni \ gcr.io/google_containers 可能下载不下来 需要更换国内的镜像 --pod-infra-container-image=gcr.io/google_containers/pause-amd64:3.0 配置 kubelet 启动项文件 cat > /usr/lib/systemd/system/kubelet.service <<EOF [Unit] Description=Kubernetes Kubelet Server Documentation=https://github.com/kubernetes/kubernetes After=docker.service Requires=docker.service [Service] WorkingDirectory=/data/kubernetes/kubelet EnvironmentFile=-/etc/kubernetes/config EnvironmentFile=-/etc/kubernetes/kubelet ExecStart=/usr/local/bin/kubelet \\ \$KUBE_LOGTOSTDERR \\ \$KUBE_LOG_LEVEL \\ \$KUBELET_ADDRESS \\ \$KUBELET_PORT \\ \$KUBELET_HOSTNAME \\ \$KUBE_ALLOW_PRIV \\ \$KUBELET_POD_INFRA_CONTAINER \\ \$KUBELET_ARGS Restart=on-failure [Install] WantedBy=multi-user.target EOF vim /usr/lib/systemd/system/kubelet.service 创建 kubelet 数据文件目录mkdir -pv /data/kubernetes/kubelet 启动 kubelet 服务 systemctl daemon-reload && \ systemctl start kubelet && \ systemctl -l status kubelet journalctl -f -u kubelet journalctl -xe systemctl stop kubelet systemctl restart kubelet netstat -ntlp systemctl enable kubelet 授权 Kubernetes Node 在 master 节点,首先由于我们采用了 TLS Bootstrapping,所以需要先创建一个 ClusterRoleBinding 在任意 master 节点 执行即可 kubectl create clusterrolebinding kubelet-bootstrap \ --clusterrole=system:node-bootstrapper \ --user=kubelet-bootstrap 它需要启动 api-server 有了 8080 端口后再去执行 The connection to the server localhost:8080 was refused - did you specify the right host or port? 如果在某台 master 上已经执行过了的话,再去其它主机上执行,就会报 已经创建了 Error from server (AlreadyExists): clusterrolebindings.rbac.authorization.k8s.io "kubelet-bootstrap" already exists 查看 node 节点证书 在 master 通过简单指令验证,会看到 node 节点处于 pending kubectl get csr NAME AGE REQUESTOR CONDITION node-csr-5apDfsKujoNM61vlHpg1o3gboEYI5xaXsB54uniZLS8 7m kubelet-bootstrap Pending 通过 kubectl 来允许节点加入集群 kubectl get csr | grep Pending | awk '{print $1}' | xargs kubectl certificate approve kubectl get csr | awk '/Pending/ {print $1}' | xargs kubectl certificate approve 配置 kube-proxy 配置文件(配置文件根据服务器当前情况变更 ) Kube-proxy 是实现 Service 的关键组件, kube-proxy 会在每台节点上执行,然后监听 API Server 的 Service 与 Endpoint 资源对象的改变, 然后来依据变化执行 iptables 来实现网络的转发。 cd /etc/kubernetes/ cat > /etc/kubernetes/proxy <<EOF ### # kubernetes proxy config # default config should be adequate # Add your own! KUBE_PROXY_ARGS="--bind-address=10.10.175.3 \\ --hostname-override=k8smaster01.test.com \\ --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig \\ --cluster-cidr=10.254.0.0/16" EOF 配置 kube-proxy 启动项文件 cat > /usr/lib/systemd/system/kube-proxy.service <<EOF [Unit] Description=Kubernetes Kube-Proxy Server Documentation=https://github.com/kubernetes/kubernetes After=network.target [Service] EnvironmentFile=-/etc/kubernetes/config EnvironmentFile=-/etc/kubernetes/proxy ExecStart=/usr/local/bin/kube-proxy \\ \$KUBE_LOGTOSTDERR \\ \$KUBE_LOG_LEVEL \\ \$KUBE_MASTER \\ \$KUBE_PROXY_ARGS Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target EOF vim /usr/lib/systemd/system/kube-proxy.service 启动 kube-proxy 服务 systemctl daemon-reload && \ systemctl start kube-proxy && \ systemctl -l status kube-proxy journalctl -f -u kube-proxy journalctl -xe systemctl stop kube-proxy netstat -ntlp systemctl enable kube-proxy systemctl daemon-reload && \ systemctl stop kube-proxy && \ systemctl start kube-proxy master节点当成node时,每台maste节点都需要以下配置文件。在配置其他master节点时,可以从这台服务器把配置拷贝过去(相应更改下配置)再导入启动脚本即可 3、配置 Node节点 备注:确保etcd及kubeneter证书已存在到相应的目录,docker服务已安装 如果使用的是kubernetes-server安装包就按照以下方式配置二进制脚本;如果下载的是kubernetes-node则把``` kubernetes/node/bin/拷贝到/usr/bin/下 cd /data/tools/kubernetes/v1.8.5/ tar -xvf kubernetes-server-linux-amd64.tar.gz cd kubernetes/server/bin/ cp kubelet kube-proxy kubectl /usr/bin/ cp kubectl /usr/bin/ node配置文件 node节点服务需要配置kube-proxy和kubelet服务,安装配置过程和<Master 作为 Node>一样 从master节点/etc/kubernetes下把配置文件audit-policy.yaml bootstrap.kubeconfig config kubelet kubelet.kubeconfig kube-proxy.kubeconfig proxy token.csv拷贝到node的/etc/kubernetes bootstrap.kubeconfig : server改成https://127.0.0.1:6443 conf :KUBE_MASTER这行注释掉 kubelet.kubeconfig : server改成https://127.0.0.1:6443 kube-proxy.kubeconfig : server改成https://127.0.0.1:6443 其他配置根据当前服务器的实际情况配置 创建 Nginx 代理 由于 HA 方案基于 Nginx 反代实现,所以每个 Node 要启动一个 Nginx 负载均衡 Master,具体参考 HA Master 简述 创建配置目录 mkdir -pv /etc/nginx 写入代理配置 cat > /etc/nginx/nginx.conf << EOF error_log stderr notice; worker_processes auto; events { multi_accept on; use epoll; worker_connections 1024; } stream { upstream kube_apiserver { least_conn; server 10.10.175.3:6443; server 10.10.188.125:6443; server 10.10.121.199:6443; } server { listen 0.0.0.0:6443; proxy_pass kube_apiserver; proxy_timeout 10m; proxy_connect_timeout 1s; } } EOF 更新权限chmod +r /etc/nginx/nginx.conf 配置nginx启动脚本(nginx是以docker启动,会自动下载nginx:1.13.5-alpine 镜像) cat > /etc/systemd/system/nginx-proxy.service << EOF [Unit] Description=kubernetes apiserver docker wrapper Wants=docker.socket After=docker.service [Service] User=root PermissionsStartOnly=true ExecStart=/usr/bin/docker run -p 127.0.0.1:6443:6443 \\ -v /etc/nginx:/etc/nginx \\ --name nginx-proxy \\ --net=host \\ --restart=on-failure:5 \\ --memory=512M \\ nginx:1.13.5-alpine ExecStartPre=-/usr/bin/docker rm -f nginx-proxy ExecStop=/usr/bin/docker stop nginx-proxy Restart=always RestartSec=15s TimeoutStartSec=30s [Install] WantedBy=multi-user.target EOF vim /etc/systemd/system/nginx-proxy.service 启动 Nginx 代理服务 systemctl daemon-reload && \ systemctl start nginx-proxy && \ systemctl -l status nginx-proxy journalctl -f -u nginx-proxy journalctl -xe netstat -ntlp systemctl enable nginx-proxy 六、部署 Calico 网络组件 导入 docker calico 镜像 docker load < quay.io_calico_cni_v1.11.0.tar docker load < quay.io_calico_kube-controllers_v1.0.0.tar docker load < quay.io_calico_node_v2.6.1.tar 创建 calico 目录 mkdir -pv /etc/calico && \ mkdir -pv /data/kubernetes/calico/ cd /etc/calico/ 修改 Calico 配置 Calico 部署采用 “混搭” 方式,即 Systemd 控制 calico node,cni 等由 kubernetes daemonset 安装 具体请参考 Calico 部署踩坑记录,以下直接上代码https://mritd.me/2017/07/31/calico-yml-bug/ 获取 calico.yamlwget -c "https://docs.projectcalico.org/v2.6/getting-started/kubernetes/installation/hosted/calico.yaml" 替换 Etcd 地址sed -i 's@.*etcd_endpoints:.*@\ \ etcd_endpoints:\ \"https://10.10.175.3:2379,https://10.10.188.125:2379,https://10.10.121.199:2379\"@gi' calico.yaml 替换 Etcd 证书 export ETCD_CERT=`cat /etc/etcd/ssl/etcd.pem | base64 | tr -d '\n'` export ETCD_KEY=`cat /etc/etcd/ssl/etcd-key.pem | base64 | tr -d '\n'` export ETCD_CA=`cat /etc/etcd/ssl/ca.pem | base64 | tr -d '\n'` sed -i "s@.*etcd-cert:.*@\ \ etcd-cert:\ ${ETCD_CERT}@gi" calico.yaml sed -i "s@.*etcd-key:.*@\ \ etcd-key:\ ${ETCD_KEY}@gi" calico.yaml sed -i "s@.*etcd-ca:.*@\ \ etcd-ca:\ ${ETCD_CA}@gi" calico.yaml sed -i 's@.*etcd_ca:.*@\ \ etcd_ca:\ "/calico-secrets/etcd-ca"@gi' calico.yaml sed -i 's@.*etcd_cert:.*@\ \ etcd_cert:\ "/calico-secrets/etcd-cert"@gi' calico.yaml sed -i 's@.*etcd_key:.*@\ \ etcd_key:\ "/calico-secrets/etcd-key"@gi' calico.yaml 注释掉 calico-node 部分(由 Systemd 接管)sed -i '103,197s@.*@#&@gi' calico.yaml 创建 Calico Daemonset cd /etc/calico/ 先创建 RBAC wget -c "https://docs.projectcalico.org/v2.6/getting-started/kubernetes/installation/rbac.yaml" kubectl apply -f rbac.yaml 再创建 Calico Daemonset kubectl create -f calico.yaml 删除 Calico Daemonset kubectl delete -f calico.yaml 创建 Systemd 文件 上一步注释了 calico.yaml 中 Calico Node 相关内容,为了防止自动获取 IP 出现问题,将其移动到 Systemd, Systemd service 配置如下, 每个节点都要安装 calico-node 的 Service,其他节点请自行修改 IP和主机名(别问为啥是两个反引号 \,自己试就知道了) cat > /usr/lib/systemd/system/calico-node.service <<EOF [Unit] Description=calico node After=docker.service Requires=docker.service [Service] User=root PermissionsStartOnly=true ExecStart=/usr/bin/docker run --net=host --privileged --name=calico-node \\ -e ETCD_ENDPOINTS=https://10.10.175.3:2379,https://10.10.188.125:2379,https://10.10.121.199:2379 \\ -e ETCD_CA_CERT_FILE=/etc/etcd/ssl/ca.pem \\ -e ETCD_CERT_FILE=/etc/etcd/ssl/etcd.pem \\ -e ETCD_KEY_FILE=/etc/etcd/ssl/etcd-key.pem \\ -e NODENAME=k8smaster01.test.com \\ -e IP=10.10.175.3 \\ -e IP6= \\ -e AS= \\ -e CALICO_IPV4POOL_CIDR=10.254.0.0/16 \\ -e CALICO_IPV4POOL_IPIP=always \\ -e CALICO_LIBNETWORK_ENABLED=true \\ -e CALICO_NETWORKING_BACKEND=bird \\ -e CALICO_DISABLE_FILE_LOGGING=true \\ -e FELIX_IPV6SUPPORT=false \\ -e FELIX_DEFAULTENDPOINTTOHOSTACTION=ACCEPT \\ -e FELIX_LOGSEVERITYSCREEN=info \\ -v /etc/etcd/ssl/ca.pem:/etc/etcd/ssl/ca.pem \\ -v /etc/etcd/ssl/etcd.pem:/etc/etcd/ssl/etcd.pem \\ -v /etc/etcd/ssl/etcd-key.pem:/etc/etcd/ssl/etcd-key.pem \\ -v /var/run/calico:/var/run/calico \\ -v /lib/modules:/lib/modules \\ -v /run/docker/plugins:/run/docker/plugins \\ -v /var/run/docker.sock:/var/run/docker.sock \\ -v /var/log/calico:/var/log/calico \\ quay.io/calico/node:v2.6.1 ExecStop=/usr/bin/docker rm -f calico-node Restart=always RestartSec=10 [Install] WantedBy=multi-user.target EOF vim /usr/lib/systemd/system/calico-node.service 修改 kubelet 配置 根据官方文档要求 kubelet 配置必须增加 --network-plugin=cni 选项,所以需要修改 kubelet 配置 vim /etc/kubernetes/kubelet ### # kubernetes kubelet (minion) config # The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces) KUBELET_ADDRESS="--address=10.10.175.3" # The port for the info server to serve on # KUBELET_PORT="--port=10250" # You may leave this blank to use the actual hostname KUBELET_HOSTNAME="--hostname-override=k8smaster01.test.com" # location of the api-server # KUBELET_API_SERVER="" # Add your own! KUBELET_ARGS="--cgroup-driver=cgroupfs \ --network-plugin=cni \ --cluster-dns=10.254.0.2 \ --resolv-conf=/etc/resolv.conf \ --experimental-bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig \ --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \ --fail-swap-on=false \ --cert-dir=/etc/kubernetes/ssl \ --cluster-domain=cluster.local. \ --hairpin-mode=promiscuous-bridge \ --serialize-image-pulls=false \ --pod-infra-container-image=gcr.io/google_containers/pause-amd64:3.0" EOF vim /etc/kubernetes/kubelet 重启 kubelet systemctl daemon-reload && \ systemctl stop kubelet && \ systemctl start kubelet 启动 calico-node 服务 systemctl enable calico-node systemctl start calico-node systemctl -l status calico-node journalctl -f -u calico-node journalctl -xe systemctl stop calico-node netstat -ntlp 测试跨主机通信 创建 deployment cat >> /data/kubernetes/calico/demo.deploy.yml <<EOF apiVersion: apps/v1beta2 kind: Deployment metadata: name: demo-deployment spec: replicas: 3 selector: matchLabels: app: demo template: metadata: labels: app: demo spec: containers: - name: demo image: mritd/demo imagePullPolicy: IfNotPresent ports: - containerPort: 80 EOF vim /data/kubernetes/calico/demo.deploy.yml kubectl create -f demo.deploy.yml 安装 calicoctl 下载 calicoctl 分发到各个 node 节点 cd /data/tools/kubernetes/ wget -c https://github.com/projectcalico/calicoctl/releases/download/v1.6.1/calicoctl chmod +x calicoctl cp calicoctl /usr/bin/ rsync -avzP calicoctl root@10.10.188.125:/usr/local/bin/ rsync -avzP calicoctl root@10.10.121.199:/usr/local/bin/ 在节点上查看 calico 的状态 calicoctl node status 查看创建结果 kubectl get pod kubectl get pod -o wide 验证 calico kubectl get pods -n kube-system kubectl get deployment kubectl get svc kubectl get pod -o wide -n kube-system kubectl get svc,po -o wide --all-namespaces 进入其中一个 Pod,ping 另一个 Pod 的 IP 测试 kubectl exec -it demo-deployment-5fc9c54fb4-gnh8b bash ping 10.254.x.x curl 10.254.x.x 查看 pending 的 pod 是否已执行 kubectl -n kube-system get po 七、部署 DNS DNS只需要在其中一台主节点服务器安装即可导入 kube-dns docker 镜像 docker pull foxchan/k8s-dns-kube-dns-amd64:1.14.7 docker pull foxchan/k8s-dns-dnsmasq-nanny-amd64:1.14.7 docker pull foxchan/k8s-dns-sidecar-amd64:1.14.7 docker pull registry.cn-hangzhou.aliyuncs.com/linkcloud/cluster-proportional-autoscaler-amd64:1.1.2 获取对应的 yaml 文件 cd /etc/kubernetes/ wget -chttps://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dns/kube-dns.yaml.sed mv kube-dns.yaml.sed kube-dns.yaml 修改配置 sed -i 's/$DNS_DOMAIN/cluster.local/gi' kube-dns.yaml sed -i 's/$DNS_SERVER_IP/10.254.0.2/gi' kube-dns.yaml vim /etc/kubernetes/kube-dns.yaml ...省略... - --domain=cluster.local. - --kube-master-url=http://10.10.175.3:8080 - --dns-port=10053 - --config-dir=/kube-dns-config - --v=2 ...省略... 修改镜像路径:%s#gcr.io/google_containers#foxchan#g 创建 kubectl create -f kube-dns.yaml kubectl delete -f kube-dns.yaml 部署 DNS 自动扩容部署 wgethttps://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dns-horizontal-autoscaler/dns-horizontal-autoscaler.yaml 修改dns-horizontal-autoscaler.yaml中镜像的路径,改成 registry.cn-hangzhou.aliyuncs.com/linkcloud/cluster-proportional-autoscaler-amd64:1.1.2 kubectl create -f dns-horizontal-autoscaler.yaml # kubectl delete -f dns-horizontal-autoscaler.yaml 查看创建结果 kubectl get pods -o wide -n kube-system 八、安装kuberneter界面 导入 kubernetes-dashboard 镜像 阿里云镜像库:https://dev.aliyun.com/list.html。你可以在里面找到对应的镜像包 docker load < kubernetes-dashboard-amd64.v1.8.0.tar Dashboard 是 Kubernetes 社区官方开发的仪表板,有了仪表板后管理者就能够透过 Web-based 方式来管理 Kubernetes 集群,除了提升管理方便,也让资源可视化,让人更直接看见系统信息的呈现结果。 首先我们要建立 kubernetes-dashboard-certs,来提供给 Dashboard TLS 使用: cd /etc/kubernetes/ wget -chttps://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml vim kubernetes-dashboard.yaml 126行左右 ...省略... - --apiserver-host=http://my-address:port - --apiserver-host=http://10.10.175.3:8080 ...省略... 创建 kubernetes-dashboard kubectl create -f kubernetes-dashboard.yaml kubectl delete -f kubernetes-dashboard.yaml 查看创建结果 kubectl get pods -n kube-system -o wide kubectl get svc -n kube-system 检查 kubernetes-dashboard 服务 kubectl get svc,po -o wide --all-namespaces kubectl get pods -n kube-system | grep dashboard 这里我们使用 token 认证,那么 token 来自于哪里呢,我们创建一个 kubernetes-dashboard-rbac.yaml 内容如下 创建一个 kubernetes-dashboard-rbac.yaml cd /etc/kubernetes/ cat > kubernetes-dashboard-rbac.yaml <<EOF kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: dashboard-admin roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: default namespace: kube-system EOF vim /etc/kubernetes/kubernetes-dashboard-rbac.yaml 创建之后,我们来获取它的 token 值 我们看到这里的 serviceaccount 是在 kube-system 的 default 的,所以我们直接查看 kube-system 中的 default secret 就可以了 然后执行 kubectl -n kube-system get secret 找到 default-token-XXXX 的字段 执行 kubectl create -f kubernetes-dashboard-rbac.yaml kubectl create -f kubernetes-dashboard-rbac.yaml clusterrolebinding "dashboard-admin" created kubectl delete -f kubernetes-dashboard-rbac.yaml 最后找到 default-token-XXXX 的字段以后,执行 kubectl describe secret default-token-XXXX -n kube-system kubectl describe secret default-token-w5htr -n kube-system 就能获取到 token kubectl -n kube-system get po,svc -l k8s-app=kubernetes-dashboard NAME READY STATUS RESTARTS AGE po/kubernetes-dashboard-766666b68c-q2l28 1/1 Running 0 23h NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc/kubernetes-dashboard ClusterIP 10.254.8.65 <none> 443/TCP 23h 完成后,就可以透过浏览器访问 Dashboardhttps://10.10.172.3:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/ 访问 kubernetes dashboardhttp://10.10.175.3:8080/ui 查看 docker 日志 docker logs <CONTAINER ID> docker logs 546a1f7e2153 本文转自 irow10 51CTO博客,原文链接:http://blog.51cto.com/irow10/2055064,如需转载请自行联系原作者

优秀的个人博客,低调大师

坚持开源软件的创新之路--陆首群

我国IT产业的创新工作 我国是全球IT产业发展的后起者,我们肩负为我国IT产业生存、发展和提升而搏弈的历史重任。走自主创新之路,将是这场搏弈胜出的关键。 集成电路和软件是IT产业的两个支柱。近年来国内围绕这两个支柱产业的创新历程为: 在集成电路方面,国内自主开发了中低端通用微处理器(CPU)、芯片集成系统(SOC)和数字讯号处理器(DSP)等芯片,虽然这些芯片的集成度还较 低,大约比国际高水平还差一个数量级(如龙芯II号相当于奔腾IV中档,其集成度约为10的7次方个晶体管,而国际水平为10的8次方个晶体管),但毕竟 我们从无到有,完成了上述一系列芯片开发创新的全过程,即完成了科研创新、设计创新,以及工具创新、工艺创新和工程创新全过程(必须指出,工程创新的难度 比科研创新的难度要大得多,有人预测工艺创新难度约为设计创新难度的10倍),但我们毕竟在创新全过程道路上走了一回,突破了国外对工艺技术的严格控制, 积累了自己非常宝贵的工程经验。集成电路的创新有了良好的起步。 国内软件创新又如何呢? 系统软件是最基础、最核心、创新难度也最大的软件,我想可将它作为软件创新的代表。系统软件一般为操作系统、数据库、编译器和工具、编程环境、中间件等,其中操作系统又在系统软件中处于龙头地位。 中国要自主开发操作系统或系统软件,难度很大,必须走开源软件创新之路,从开源软件创新中找机遇突破;而要进行开源软件的创新必须实行体制创新。 目前国内虽然推出了几款Linux操作系统发行版,但自主创新的技术含量不高,总体上还处于学习模仿阶段,缺乏深层次的研发能力。在先导的社区开发创新 (即“集体开发”、“合作创新”)阶段,国内个别人虽然曾向国际开源社区递交了诸如“Linux虚拟服务器(LVS)”、“入侵检测系统(IDS)”等修 改的软件包,但作为社会或企业的志愿者向国际开源社区的贡献还属凤毛麟角;而在后续的企业开发创新(即“自主开发”、“自主创新”)阶段,国内企业一般尚 未能把握好工程化实现技术,工程经验很少。有人说,“中国系统软件的开发创新面临着一个进退维谷的境界”,这样的估计似乎过于悲观。我认为,中国开源系统 软件应该从模仿走向创新,在“合作创新”基础上扩大“自主创新”。 为了实现开源软件的开发创新,必须了解开源软件独特的创新方式。 两种共生技术 人们常常陷于一个思维误区:“开源软件是由全球志愿者集体开发的,遵循开源许可协议,其全部源代码是开放的,任何人均可自由获得”,而“全部源代码的开 放也表示其全部技术是公开的。”他们不明白,开源软件不能再停留在其早期“自由的理想王国”里,仅供“黑客”、“玩家”们当“玩艺”;开源软件要取得持续 发展,必须探索并形成自己的商业模式,惟有具备商业模式的开源软件才是成熟的,才能处理好如下矛盾,即:既不违反开源许可协议,公开全部源代码;又能不公 开自己的专有技术,保守自己的商业秘密。事实上,具有商业模式的开源软件,其技术创新并不完全表现于具有自由开放特点的科研创新和设计创新之中,即并不完 全表现于开放的源代码之中,它还表现在具有技术不公开特点的工艺创新和工程创新之中,即表现在与源代码无关的工程化实现技术(即专有技术和商业秘密)之 中。这就是说,开源软件的全部技术是由:以开放源代码所表征的公开化技术,与不公开的工程化技术两部分组成;或者说由这两部分技术组成开源软件的共生技 术。所谓工程化技术,是在开源软件已完成了其公开技术(即全部源代码或全部技术性能)的开发过程的基础上,服务于产品化或商业应用,尚需解决的后续技术, 它主要关注于:改善操作稳定性,优化计算效率,增强灵活扩展性,提高产品质量,催化产品成熟度。工程化技术是一种实现技术、优化技术、隐性技术,主要表现 为技术诀窍(Know-How)或熟练技巧(Skill)、工程经验、系统底层技术的把握等隐性知识方面。 开源软件的工程化技术主要由两部分 构成:(1)在开发过程中,有些与设计思想、原理、实现机制(包括算法)有关的隐性设计技术;与各软件模块之间的协同、耦合、调用等相互依赖关系有关的实 现技术(包括实现细节);开源企业(服务商)的“内核分支”发行版的源代码与由Linus Torvalds负责开发和监护的官方(Official)“内核主线”版本的源代码之间偏差程度的把握能力。IT评论家Matt Asay指出,人们可以得到Red Hat公司企业级Linux发行版的全部源代码,但它直接交付用户使用的二进制版本(即所谓“ready to go”版本)并不是这些源代码编译的结果,其中存在着一些差异(关键要把握差异的程度),这就是商业秘密。(2)在产品化或应用过程中,为增强开源软件的 增值效应,对各软件模块进行包装/配置/集成,以及剖析并改进相应的软件系统(Profile)所涉及的隐性技术。 举国外开源软件 “Ubuntu”的例子来分析:Ubuntu作为Linux的386个发行版之一(有桌面版,也有服务器版)是非常优秀的。发展迅猛,受人欢迎,其开发创 新机制确有过人之处。Ubuntu为何发展如此之快,干得如此出色呢?我认为其中一个重要原因是Ubuntu利用了国际上最大的开源社区Debian的人 才和资源。所以有人说“Ubuntu是基于Debian开发的版本”,“Ubuntu是Debian的副产品”,确是如此。但Ubuntu认为 “Debian的过于宽广庞杂”,它在Debian资源上进行剪裁、移植和再创新,达到“少而精”的目的。现在随着Ubuntu的发展,它并不想与 Debian兼容,也不愿参加Debian的联合体。 最近Ubuntu自己认承:Ubuntu的发布版在产品稳定性等性能方面尚有待于改进, 它还未通过用户认证。这使我联想到Ubuntu的开发创新机制可能还存在一些问题,他们“集体开发”开放技术的能力可能有余,而“自主开发”工程化技术的 能力可能不足。今年2月我曾向Ubuntu创始人Mark Shuttleworth当面指出这些问题,获得了Mark的首肯。 很多执行双授权许可协议模式的开源软件,在其层次结构(Stack)中可能嵌入某个层次的闭源软件,或可能附加某些闭源的组件模块,这些闭源软件实际上就是私权软件,而私权软件的全部技术都是不公开的,并将完全依赖于自主开发创新。 双重创新模式 与一般企业的私权软件创新模式不同,开源软件首先采用由志愿者进行“集体开发”、“合作创新”的新模式,这种创新模式实行“源代码开放”、“技术公开 ”;但是仅靠这种模式还不足以开发出开源软件的全部共生技术(即不能开发不公开的工程化技术),也不足以向市场推出优质高效、操作稳定、技术更趋成熟、竞 争力更强的开源软件产品。实际上,开源软件针对开发工程化技术,还需要另一种:“自主开发”、“自主创新”、“具有自主知识产权”的创新模式来跟进和补 充。开源软件的双重创新模式,即“集体开发”、“合作创新”与“自主开发”、“自主创新”两种模式是互补的、互相衔接的、不可分割的;也可看作开源软件开 发创新过程的两个阶段。 近年来国内企业开发并向市场推出一批开源软件产品,取得了长足进步;但某些企业还沿袭旧的封闭的开发模式和机制,他们 在“社区版”上进行剪裁、移植或者进行简单修改,属于自主开发创新的成果还不多,他们基本上还处于学习、模仿阶段,他们基本上还是一个开源软件的集成、发 布商,不是开发商,他们基本上还缺乏深层次开发能力。国际开源社区曾多次反映,国人在开源软件“集体开发”、“合作创新”活动中,向社区提交自己修改、创 新的源程序代码行(到被吸纳)尚属凤毛麟角,对开源社区抢占算法(Preemption)方面的贡献还微小,以致有人认为:国人尚未能进入这个开发创新模 式的核心圈之内,而且从这个衡量开发创新人员资质水准的统计数据来看,国人尚有不小差距。 两种开发机制 为了加快中国开源软件的发展,需要建立开源社区,形成社区开发和企业开发两种互相支持、互为补充的开发机制,社区开发主要是科研创新,企业开发主要是工程实现。 在开源社区,具有“集体开发”、“合作创新”、“技术公开”特征的创新体系,是建立在自由开放的互联网平台上的,很多创意通常自下而上来自底层志愿者。 在这个创新体系中,能够广泛吸收全球广大志愿者的智慧,经常产生大量思维碰撞,并往往撞出不少耀眼的思想火花,经常迸发出创新点子,在技术上有所突破,但 也常常伴随着不够系统、不够稳定、不够成熟的现象。开源社区的创新活动偏重于科研,偏重于科研创新和设计创新,开源社区的创新活动需要有开源领袖(或大 师)以及一批核心骨干的支撑,他们在社区负责对志愿者提交的软件包,进一步作“选包、打包、集成、测试”循环的创新活动并实施资源管理。在开源社区创新体 系之外,还需一个后续的企业创新体系与之互为补充,企业创新体系具有“自主开发”、“自主创新”、“自主知识产权”(技术不公开)的特征,它是建立在企业 内部开发部门或企业局域网平台上的,其创新的任务是向市场推出满足用户需求的产品,计划通常自上而下,开发者是企业专业技术队伍,企业的创新活动需要有经 验丰富的资深人士(包括系统架构师)及一批核心骨干的支撑(最好具有参与社区开发创新的经历并与之保持良好的互动接口)。他们在利用开源社区创新成果的基 础上,重点做工程化、产品化、系统化、完善化、稳定性和性能优化的创新工作,在攻克工程化技术方面进行自主创新。企业的创新活动偏重于工程,偏重于工艺创 新和工程创新。在开源系统软件领域内,工程的难度比科研的难度大很多。工程化主要依靠积累的经验、专有技术(技术诀窍)、资深技术骨干的智慧(隐性技 术),以及在测试版上持续不断地进行配置、集成、调试的测试工作,从中不断发现错误和纠正错误,完全是靠一点一点调出来、改出来的,绝不可能是想出来、写 出来的。 产品平台和生态系统 对于开源软件,孤立地开发或推出一个产品(发行版)是不够的,必须形成围绕该产品平台的生态系统,即 要把大量软件(特别是应用软件)移植到这个产品平台上来;该产品要能预装到一些必要的硬件体系结构中去;要能与众多外围设备匹配衔接。而移植、预装、匹配 是需要做大量测试、修改以及“再开发”工作的,涉及成百上千个企业协同工作,需耗费大量人力、物力、财力和时间。为做到这一点,首先必须开发出在全球能进 入“主流”的产品,否则要吸引全球广大企业、社区的支持,共同来营造一个生态系统是不可能的。当然在营造生态系统过程中,不能用纯技术观点来看待这个问 题,在争取广大企业、社区支持时,特别要争取拥有丰富资源和影响力的跨国公司的支持,为此我们要做好协调工作。 还必须指出,“分散的低水平重复”很难使开发出来的开源软件在全球能够占居“主流产品”的地位,为此加强国内联合、国际合作是十分重要的。 开源架构和开源、闭源产品链 开源软件的LAMP架构(即L-Linux操作系统,A-Apache开源服务器或其他开源中间件,M-MySQL或Postgre开源数据库,P- PHP或Perl、Python脚本语言)具有简易性、低成本和执行灵活性等特点,当“在线交易进程(OLTP)”在LAMP架构的解决方案中取得成功, 有力地推动了这个架构的发展。LAMP架构的崛起,与J2EE架构(Java编程语言)和.Net架构(C#编程语言)形成了三角鼎立的竞争态势。 针对各种信息化应用解决方案,在开源软件LAMP架构上形成的开源产品链,需进行集成、测试、优化的开发创新活动;从实际需求出发,有时我们也要推出开源和闭源产品混生的产品链,而在推出这样的产品链之前也需要进行相应的开发创新活动。 本文转自arthur593351CTO博客,原文链接:http://blog.51cto.com/arthur5933/114256,如需转载请自行联系原作者

优秀的个人博客,低调大师

Spark2.1集群安装(standalone模式)

机器部署 准备三台Linux服务器,安装好JDK1.7 下载Spark安装包 上传spark-2.1.0-bin-hadoop2.6.tgz安装包到Linux(intsmaze-131)上 解压安装包到指定位置tar -zxvfspark-2.1.0-bin-hadoop2.6.tgz -C /home/hadoop/app/spark2.0/ 原文和作者一起讨论:http://www.cnblogs.com/intsmaze/p/6569036.html 微信:intsmaze 配置Spark 进入到Spark安装目录 cd /spark-2.1.0-bin-hadoop2.6/conf mv spark-env.sh.template spark-env.sh vi spark-env.sh 在该配置文件中添加如下配置 export JAVA_HOME=/home/hadoop/app/jdk1.7.0_65 export SPARK_MASTER_IP=intsmaze-131(指定standalone模式中主节点master是哪一台spark节点) export SPARK_MASTER_PORT=7077 mv slaves.template slaves vi slaves 在该文件中添加子节点所在的位置(Worker节点) intsmaze-131 intsmaze-132 intsmaze-134 将配置好的Spark拷贝到其他节点上(注意节点的路径必须和master一样,否则master启动集群回去从节点中对应目录中去启动work,不一致会报No such file or directory) scp -r spark-2.1.0-bin-hadoop2.6/ intsmaze-132:/home/hadoop/app/spark2.0/ scp -r spark-2.1.0-bin-hadoop2.6/ intsmaze-134:/home/hadoop/app/spark2.0/ Spark集群配置完毕,目前是1个Master,3个Work,在intsmaze-131(master节点)上启动Spark集群 /home/hadoop/app/spark2.0/spark-2.1.0-bin-hadoop2.6/sbin/start-all.sh(spark集群不需要启动hadoop集群等,与hadoop集群无关。如果配置为spark on yarn上,那么必须启动spark和yarn集群而不需要启动hadoop) 启动后执行jps命令,主节点上有Master进程和Work进程,其他子节点上有Work进程,登录Spark管理界面查看集群状态(主节点):http://intsmaze-131:8080/ 执行第一个spark程序 /home/hadoop/app/spark2.0/spark-2.1.0-bin-hadoop2.6/bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master spark://intsmaze-131:7077 \ --executor-memory 1G \ --total-executor-cores 2 /home/hadoop/app/spark2.0/spark-2.1.0-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.1.0.jar \ 100 该算法是利用蒙特·卡罗算法求PI。 启动Spark Shell spark-shell是Spark自带的交互式Shell程序,方便用户进行交互式编程,用户可以在该命令行下用scala编写spark程序。 /home/hadoop/app/spark2.0/spark-2.1.0-bin-hadoop2.6/bin/spark-shell \ --master spark://intsmaze-131:7077 \ --executor-memory 2g \ --total-executor-cores 2 参数说明: --master spark://intsmaze-131:7077指定Master的地址 --executor-memory 2g指定每个worker可用内存为2G,现有集群该任务将无法启动,应该修改为512m。 --total-executor-cores 2指定整个任务使用的cup核数为2个。 注意:如果给该任务分配的资源无法达到指定的,将无法成功启动job。比如服务器节点可以内存为为1G,你设置每个worker2G,将会无法启动任务。askSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources 如果启动spark shell时没有指定master地址,但是也可以正常启动spark shell和执行spark shell中的程序,其实是启动了spark的local模式,该模式仅在本机启动一个进程,没有与集群建立联系。Spark Shell中已经默认将SparkContext类初始化为对象sc。用户代码如果需要用到,则直接应用sc即可。 在spark shell中编写WordCount程序 1.首先启动hdfs 2.向hdfs上传一个文件到intsmaze-131:9000/words.txt 3.在spark shell中用scala语言编写spark程序 sc.textFile("hdfs://192.168.19.131:9000/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).saveAsTextFile("hdfs://192.168.19.131:9000/out") 4.使用hdfs命令查看结果 hdfs dfs -ls hdfs://intsmaze-131:9000/out/p* 说明: sc是SparkContext对象,该对象时提交spark程序的入口 textFile(hdfs://intsmaze-131:9000/words.txt)是hdfs中读取数据 flatMap(_.split(" "))先map在压平 map((_,1))将单词和1构成元组 reduceByKey(_+_)按照key进行reduce,并将value累加 saveAsTextFile("hdfs://intsmaze-131:9000/out")将结果写入到hdfs中 配置Spark的高可用 到此为止,Spark集群安装完毕,但是有一个很大的问题,那就是Master节点存在单点故障,要解决此问题,就要借助zookeeper,并且启动至少两个Master节点来实现高可靠,配置方式比较简单: Spark集群规划:intsmaze-131,intsmaze-132是Master;intsmaze-131,intsmaze-132,intsmaze-134是Worker 安装配置zk集群,并启动zk集群 停止spark所有服务,修改配置文件spark-env.sh,在该配置文件中删掉SPARK_MASTER_IP并添加如下配置 export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=zk1,zk2,zk3 -Dspark.deploy.zookeeper.dir=/spark" 在node4上执行sbin/start-all.sh脚本,然后在node5上执行sbin/start-master.sh启动第二个Master 作者: intsmaze(刘洋) 出处: http://www.cnblogs.com/intsmaze/ 老铁,你的--->推荐,--->关注,--->评论--->是我继续写作的动力。 微信公众号号:Apache技术研究院 由于博主能力有限,文中可能存在描述不正确,欢迎指正、补充! 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

优秀的个人博客,低调大师

hadoop2.2.0集群安装和配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/44492747 hadoop2.0已经发布了稳定版本了,增加了很多特性,比如HDFS HA、YARN等。 注意:apache提供的hadoop-2.2.0的安装包是在32位操作系统编译的,因为hadoop依赖一些C++的本地库, 所以如果在64位的操作上安装hadoop-2.2.0就需要重新在64操作系统上重新编译 集群规划: 主机名 IP 安装的软件 运行的进程 cloud1 192.168.61.128jdk、hadoopNameNode、DFSZKFailoverController cloud2 192.168.61.129jdk、hadoopNameNode、DFSZKFailoverController cloud3 192.168.61.130jdk、hadoopResourceManager cloud4 192.168.61.131jdk、hadoop、zookeeperDataNode、NodeManager、JournalNode、 QuorumPeerMain cloud5 192.168.61.132jdk、hadoop、zookeeperDataNode、NodeManager、JournalNode、 QuorumPeerMain cloud6 192.168.61.133jdk、hadoop、zookeeperDataNode、NodeManager、JournalNode、 QuorumPeerMain 以上所有机器使用的用户均为cloud 说明: 在hadoop2.0中通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。 Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步active namenode的状态 ,以便能够在它失败时快速进行切换。hadoop2.0官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM。这里我们使用简单的 QJM。在该方案中,主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功写入多数 JournalNode即认为写入成功。通常配置奇数个JournalNode 这里还配置了一个zookeeper集群,用于ZKFC(DFSZKFailoverController)故障转移,当Active NameNode挂掉了,会自动切换Standby NameNode为standby状态 修改主机名和IP的映射关系 使用的服务器是云主机(如华为用主机、阿里云主机等)映射的ip地址要填写内网地址 vi /etc/hosts 192.168.61.128 cloud1 192.168.61.129 cloud2 192.168.61.130 cloud3 192.168.61.131 cloud4 192.168.61.132 cloud5 192.168.61.133 cloud6 关闭系统防火墙 service iptables stop chkconfig iptables off reboot 安装jdk: 使用root用户 在usr目录下新建java目录。 将jdk上传到linux中 在/usr/java下 chmod 755 jdk-6u45-linux-i586.bin ./jdk-6u45-linux-i586.bin mv jdk1.6.0_45 jdk vi /etc/profile export JAVA_HOME=/usr/java/jdk export HADOOP_HOME=/home/cloud/hadoop export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin source /etc/profile 先把hadoop的环境变量也 配置上(注意每个HADOOP_HOME的路径) 使用ssh将安装好的jdk传到其他的机器上,在再其他的机器上修改profile文件即可 以上安装步骤所有机器都要执行 安装Zookeeper集群 将zk上传到linux中安装 tar -zxvf zookeeper-3.4.5.tar.gz 修改配置 mv zookeeper-3.4.5 zookeeper cd ~/zookeeper/conf/ cp zoo_sample.cfg zoo.cfg vi zoo.cfg 修改:dataDir=/home/cloud/zookeeper/tmp 在最后添加: server.1=cloud4:2888:3888 server.2=cloud5:2888:3888 server.3=cloud6:2888:3888 保存退出 然后创建一个tmp文件夹 mkdir ~/zookeeper/tmp 再创建一个空文件 touch ~/zookeeper/tmp/myid 最后向该文件写入ID echo 1 > ~/zookeeper/tmp/myid 将配置好的zookeeper拷贝到其他节点 scp -r ~/zookeeper/ cloud5:/home/cloud/ scp -r ~/zookeeper/ cloud6:/home/cloud/ 注意:修改cloud5、cloud6对应/cloud/zookeeper/tmp/myid内容 cloud5: echo 2 > ~/zookeeper/tmp/myid cloud6: echo 3 > ~/zookeeper/tmp/myid 安装hadoop集群(先在cloud1上安装完毕之后再通过ssh传递到其他机器): tar -zxvf hadoop-2.2.0-64bit.tar.gz mv hadoop-2.2.0 hadoop cd ~/hadoop/etc/hadoop 修改hadoop-env.sh 加入 export JAVA_HOME=/usr/java/jdk 修改core-site.xml <configuration> <!-- 指定hdfs的nameservice为ns1 --> <property> <name>fs.defaultFS</name> <value>hdfs://ns1</value> </property> <!-- 指定hadoop临时目录 --> <property> <name>hadoop.tmp.dir</name> <value>/home/cloud/hadoop/tmp</value> </property> <!-- 指定zookeeper地址 --> <property> <name>ha.zookeeper.quorum</name> <value>cloud4:2181,cloud5:2181,cloud6:2181</value> </property> </configuration> 修改hdfs-site.xml <configuration> <!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 --> <property> <name>dfs.nameservices</name> <value>ns1</value> </property> <!-- ns1下面有两个NameNode,分别是nn1,nn2 --> <property> <name>dfs.ha.namenodes.ns1</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns1.nn1</name> <value>cloud1:9000</value> </property> <!-- nn1的http通信地址 --> <property> <name>dfs.namenode.http-address.ns1.nn1</name> <value>cloud1:50070</value> </property> <!-- nn2的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns1.nn2</name> <value>cloud2:9000</value> </property> <!-- nn2的http通信地址 --> <property> <name>dfs.namenode.http-address.ns1.nn2</name> <value>cloud2:50070</value> </property> <!-- 指定NameNode的元数据在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://cloud4:8485;cloud5:8485;cloud6:8485/ns1</value> </property> <!-- 指定JournalNode在本地磁盘存放数据的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/cloud/hadoop/journal</value> </property> <!-- 开启NameNode失败自动切换 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 配置失败自动切换实现方式 --> <property> <name>dfs.client.failover.proxy.provider.ns1</name> <value> org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider </value> </property> <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行--> <property> <name>dfs.ha.fencing.methods</name> <value> sshfence shell(/bin/true) </value> </property> <!-- 使用sshfence隔离机制时需要ssh免登陆 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/cloud/.ssh/id_rsa</value> </property> <!-- 配置sshfence隔离机制超时时间 --> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> </configuration> 修改mapred-site.xml <configuration> <!-- 指定mr框架为yarn方式 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> 修改yarn-site.xml <configuration> <!-- 指定resourcemanager地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>cloud3</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration> 修改slaves cloud4 cloud5 cloud6 slaves是指定子节点的位置,因为要在cloud1上启动HDFS、 在cloud3启动yarn,所以cloud1上的slaves文件指定的是datanode的位置,cloud3上的slaves文件指定的 是nodemanager的位置 配置ssh免密码登陆 在每台机器上都执行下列命令 chmod -R 755 /home/cloud mkdir ~/.ssh ssh-keygen -t rsa ssh-keygen -t dsa 之后在cloud1上收集各个机器的公钥 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys ssh cloud2 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys ssh cloud3 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys ssh cloud4 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys ssh cloud5 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys ssh cloud6 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 将公钥拷贝到其他节节点 scp ~/.ssh/authorized_keys cloud2:~/.ssh/authorized_keys scp ~/.ssh/authorized_keys cloud3:~/.ssh/authorized_keys scp ~/.ssh/authorized_keys cloud4:~/.ssh/authorized_keys scp ~/.ssh/authorized_keys cloud5:~/.ssh/authorized_keys scp ~/.ssh/authorized_keys cloud6:~/.ssh/authorized_keys 在每台机器上都执行(很重要,注意配置ssh的时候要使用cloud用户来配置) chmod -R 700 ~/.ssh 将配置好的hadoop拷贝到其他节点 scp -r ~/hadoop/ cloud2:~/ scp -r ~/hadoop/ cloud3:~/ scp -r ~/hadoop/ cloud4:~/ scp -r ~/hadoop/ cloud5:~/ scp -r ~/hadoop/ cloud6:~/ 启动zookeeper集群(分别在cloud4、cloud5、cloud6上启动zk) cd ~/zookeeper/bin/ ./zkServer.sh start #查看状态:一个leader,两个follower ./zkServer.sh status 启动journalnode(在cloud1上启动所有journalnode,注意:是调用的hadoop-daemons.sh这个脚本,注意是复数s的那个脚本) cd ~/hadoop ~/hadoop/sbin/hadoop-daemons.sh start journalnode #运行jps命令检验,cloud4、cloud5、cloud6上多了JournalNode进程 格式化HDFS(在bin目录下) #在cloud1上执行命令: ./hdfs namenode -format #格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里 我配置的是~/hadoop/tmp,然后将~/hadoop/tmp拷贝到cloud2的~/hadoop/下。 scp -r ~/hadoop/tmp/ cloud2:~/hadoop/ 格式化ZK(在cloud1上执行即可,在bin目录下) ./hdfs zkfc -formatZK 启动HDFS(在cloud1上执行) ~/hadoop/sbin/start-dfs.sh 启动YARN(#####注意#####:是在cloud3上执行start-yarn.sh,把namenode和 resourcemanager分开是因为性能问题,因为他们都要占用大量资源,所以把他们分开了,他们分开了就 要分别在不同的机器上启动) ~/hadoop/sbin/start-yarn.sh 到此,hadoop2.2.0配置完毕,可以统计浏览器访问: http://192.168.61.128:50070 NameNode 'cloud1:9000' (active) http://192.168.61.129:50070 NameNode 'cloud2:9000' (standby) 验证HDFS HA 首先向hdfs上传一个文件 hadoop fs -put /etc/profile /profile hadoop fs -ls / 然后再kill掉active的NameNode kill -9 <pid of NN> 通过浏览器访问:http://192.168.1.202:50070 NameNode 'cloud2:9000' (active) 这个时候cloud02上的NameNode变成了active 在执行命令: hadoop fs -ls / -rw-r--r-- 3 root supergroup 1926 2014-02-06 15:36 /profile 刚才上传的文件依然存在!!! 手动启动那个挂掉的NameNode sbin/hadoop-daemon.sh start namenode 通过浏览器访问:http://192.168.1.201:50070 NameNode 'cloud1:9000' (standby) 验证YARN: 运行一下hadoop提供的demo中的WordCount程序: hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount /profile /outOK,大功告成!!!

优秀的个人博客,低调大师

档案库房八防完整规范 机关事业单位档案室建设标准

档案是历史的鲜活载体,是单位发展的珍贵记忆,更是政务履职、文化传承、资料溯源的核心凭证。档案库房作为档案存储保管的核心阵地,安全防护工作直接决定档案的保存年限、完整度与真实性。从传统基础防护到智慧智能管控,档案库房安全体系历经迭代升级,形成了行业通用的八防基础标准与十防进阶标准。两大防护体系层层递进、迭代升级,全方位守护实体档案与电子档案安全,成为现代化档案管理工作的核心基石。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册