kubernetes 1.5 的安装和集群环境部署

文章转载自:http://www.cnblogs.com/tynia/p/k8s-cluster.html

简介:

Docker:是一个开源的应用容器引擎,可以为应用创建一个轻量级的、可移植的、自给自足的容器。

Kubernetes:由Google开源的Docker容器集群管理系统,为容器化的应用提供资源调度、部署运行、服务发现、扩容缩容等功能。

Etcd:由CoreOS开发并维护的一个高可用的键值存储系统,主要用于共享配置和服务发现。

Flannel:Flannel是 CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(Overlay Network)工具,其目的在于帮助每一个使用 Kuberentes 的 CoreOS 主机拥有一个完整的子网。

目标:

本文主要介绍Kunbernetes(以下简称k8s)集群的搭建。
本文包括:
  1. etcd集群的搭建;
  2. docker安装和配置(简单介绍);
  3. flannel安装和配置(简单介绍);
  4. k8s集群部署;

准备工作:

主机 运行服务 角色
192.168.39.40(centos7.1) etcd
docker
flannel
kube-apiserver
kube-controller-manager
kube-scheduler
k8s-master
192.168.39.42(centos7.1) etcd
docker
flannel
kubelet
kube-proxy
minion1
192.168.39.43(centos7.1) etcd
docker
flannel
kubelet
kube-proxy
minion2

安装:

centOS下使用yum安装etcd、docker、flannel的rpm安装包,例如:

#yum install etcd flannel docker -y

etcd和flannel的安装比较简单,没有依赖关系。docker的安装因为有依赖关系,需要先安装docker的依赖包,才能安装成功。此处不是本文的重点,不做赘述。

三台机器上,都必须安装etcd、docker和flannel

下载kubernetes 1.5版本的二进制包,点击下载

下载完成后执行一下操作,以在 192.168.39.40上为例:

1
2
3
4
5
6
7
8
# tar zxvf kubernetes1.5.tar.gz # 解压二进制包
# cd kubernetes/server
# tar zxvf kubernetes-server-linux-amd64.tar.gz  # 解压master所需的安装包
# cd kubernetes/server/bin/
# cp kube-apiserver kube-controller-manager kubectl kube-scheduler /usr/bin   #把master需要的程序,拷贝到/usr/bin下,也可以设置环境变量达到相同目的
# scp kubelet kube-proxy root@192.168.39.42:~  # 把minion需要的程序,scp发送到minion上
# scp kubelet kube-proxy root@192.168.39.43:~
#

注意,kubernetes/server目录下可能没有kubernetes-server-linux-amd64.tar.gz,只需要下载这个包,之后在当前目录下解压就好了。

配置和部署:

1. etcd的配置和部署

修改三台机器中etcd的etcd配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# [member]
ETCD_NAME="etcd-2"
ETCD_DATA_DIR="/data/etcd/"
#ETCD_WAL_DIR=""
#ETCD_SNAPSHOT_COUNT="10000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
#ETCD_LISTEN_PEER_URLS="http://localhost:2380"   # 去掉默认的配置
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
#ETCD_LISTEN_CLIENT_URLS="http://localhost:2379" # 去掉默认的配置
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
#ETCD_CORS=""
#
#[cluster]
#ETCD_INITIAL_ADVERTISE_PEER_URLS="http://localhost:2380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.39.42: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="default=http://localhost:2380"
ETCD_INITIAL_CLUSTER="etcd-1=http://192.168.39.40:2380,etcd-2=http://192.168.39.42:2380,etcd-3=http://192.168.39.43:2380"# 此处的含义为,要配置包含有3台机器的etcd集群
ETCD_INITIAL_CLUSTER_STATE="new"
#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster1"
#ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.39.42:2379"
#ETCD_DISCOVERY=""
#ETCD_DISCOVERY_SRV=""
#ETCD_DISCOVERY_FALLBACK="proxy"
#ETCD_DISCOVERY_PROXY=""
#
#[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=""
#ETCD_KEY_FILE=""
#ETCD_CLIENT_CERT_AUTH="false"
#ETCD_TRUSTED_CA_FILE=""
#ETCD_PEER_CERT_FILE=""
#ETCD_PEER_KEY_FILE=""
#ETCD_PEER_CLIENT_CERT_AUTH="false"
#ETCD_PEER_TRUSTED_CA_FILE=""
#
#[logging]
ETCD_DEBUG="true"
# examples for -log-package-levels etcdserver=WARNING,security=DEBUG
ETCD_LOG_PACKAGE_LEVELS="etcdserver=WARNING"

修改三台机器中etcd的服务配置: /usr/lib/systemd/system/etcd.service。修改后的文件内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
 
[Service]
Type=notify
WorkingDirectory=/var/lib/etcd/
EnvironmentFile=-/etc/etcd/etcd.conf
User=etcd
# set GOMAXPROCS to number of processors
ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /usr/bin/etcd --name=\"${ETCD_NAME}\" --data-dir=\"${ETCD_DATA_DIR}\" --listen-client-urls=\"${ETCD_LISTEN_CLIENT_URLS}\" --listen-peer-urls=\"${ETCD_LISTEN_PEER_URLS}\" --advertise-client-urls=\"${ETCD_ADVERTISE_CLIENT_URLS}\" --initial-advertise-peer-urls=\"${ETCD_INITIAL_ADVERTISE_PEER_URLS}\" --initial-cluster=\"${ETCD_INITIAL_CLUSTER}\" --initial-cluster-state=\"${ETCD_INITIAL_CLUSTER_STATE}\""
Restart=on-failure
LimitNOFILE=65536
 
[Install]
WantedBy=multi-user.target

在每台机器上执行:

1 # systemctl enable etcd.service
2 # systemctl start etcd.service

然后选择一台机器,在其上执行:

1 # etcdctl set /cluster "example-k8s"

再选取另外一台机器,执行:

1 # etcdctl get /cluster

如果返回 “example-k8s”,则etcd集群部署成功。

 

2. docker的配置和部署

docker的配置修改比较简单,主要是添加本地的 register地址:
在每台机器的docker配置(路径为 /etc/sysconfig/docker)中,均增加以下配置项:
1
2
3
ADD_REGISTRY="--add-registry docker.midea.registry.hub:10050"
DOCKER_OPTS="--insecure-registry docker.midea.registry.hub:10050"
INSECURE_REGISTRY="--insecure-registry docker.midea.registry.hub:10050"

以上配置项为本地 register 的地址和服务端口,在docker的服务启动项中有用。具体register的搭建,请参考上一篇文章。

 
修改三台机器中docker的服务启动配置项 /usr/lib/systemd/system/docker.service。修改[Service]项下的ExecStart 的值。
修改后,服务启动配置内容为:
 1 [Unit]
2 Description=Docker Application Container Engine
3 Documentation=http://docs.docker.com
4 After=network.target
5 Wants=docker-storage-setup.service
6
7 [Service]
8 Type=notify
9 NotifyAccess=all
10 EnvironmentFile=-/etc/sysconfig/docker
11 EnvironmentFile=-/etc/sysconfig/docker-storage
12 EnvironmentFile=-/etc/sysconfig/docker-network
13 Environment=GOTRACEBACK=crash
#注意,在centos中,此处是个坑。docker启动的时候,systemd是无法获取到docker的pid,可能会导致后面的flannel服务无法启动,需要加上红色部分,让systemd能抓取到 docker的pid
14 ExecStart=/bin/sh -c 'exec -a docker /usr/bin/docker-current daemon \
15 --exec-opt native.cgroupdriver=systemd \
16 $OPTIONS \
17 $DOCKER_STORAGE_OPTIONS \
18 $DOCKER_NETWORK_OPTIONS \
19 $ADD_REGISTRY \
20 $BLOCK_REGISTRY \
21 $INSECURE_REGISTRY \
22 2>&1 | /usr/bin/forward-journald -tag docker'
23 LimitNOFILE=1048576
24 LimitNPROC=1048576
25 LimitCORE=infinity
26 TimeoutStartSec=0
27 MountFlags=slave
28 Restart=on-abnormal
29 StandardOutput=null
30 StandardError=null
31
32 [Install]
33 WantedBy=multi-user.target

分别在每台机器上执行:

1 # systemctl enable docker.service
2 # systemctl start docker

检测docker的运行状态很简单,执行

1 # docker ps

查看是否能正常列出运行中的容器的各个元数据项即可(此时没有container运行,只列出各个元数据项):

# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

3. flannel的配置和部署

修改flannel的配置文件 /etc/sysconfig/flanneld
把etcd的服务地址和端口,flannel配置子网的信息,以及日志路径等添加到配置文件中。
因为每台机器上,都有etcd在运行,因此etcd的服务地址和端口,填写本机的即可。etcd会自动同步到etcd集群中的其它节点上。
修改完成后,文件内容:
 1 # Flanneld configuration options
2
3 # etcd url location. Point this to the server where etcd runs
4 FLANNEL_ETCD="http://192.168.39.40:2379"
5
6 # etcd config key. This is the configuration key that flannel queries
7 # For address range assignment
8 FLANNEL_ETCD_KEY="/k8s/network" #这是一个目录,etcd中的目录
9
10 # Any additional options that you want to pass
11 FLANNEL_OPTIONS="--logtostderr=false --log_dir=/var/log/k8s/flannel/ --etcd-endpoints=http://192.168.39.40:2379"

然后执行:

# etcdctl mkdir /k8s/network
该命令是在etcd上创建一个目录,再执行:
# etcdctl set /k8s/network/config '{"Network":"172.100.0.0/16"}'

该命令含义是,期望docker运行的container实例的地址,都在 172.100.0.0/16 网段中

flanneld会读取/k8s/network目录中config值,然后接管docker的地址分配,并把docker和宿主机器之间的网络桥接起来。
 
flannel的服务启动配置不用做修改。
 
执行:
# systemctl enable flanneld.service
# systemctl stop docker # 暂时先关闭docker服务,启动flanneld的时候,会自动拉起docker服务
# systemctl start flanneld.service
# systemctl start docker

命令执行完成,如果没有差错的话,就会顺利地拉起docker。此处必须先启动flanneld再启动docker。

使用 ifconfig 查看当前系统中的网络设备,就会发现除了有本身就有的eth0和lo等网络接口之外,出现了docker0和flannel0的网络设备:
# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1472
inet 172.100.28.1 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::42:86ff:fe81:6892 prefixlen 64 scopeid 0x20<link>
ether 02:42:86:81:68:92 txqueuelen 0 (Ethernet)
RX packets 29 bytes 2013 (1.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 25 bytes 1994 (1.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.39.40 netmask 255.255.255.0 broadcast 172.20.30.255
inet6 fe80::f816:3eff:fe43:21ac prefixlen 64 scopeid 0x20<link>
ether fa:16:3e:43:21:ac txqueuelen 1000 (Ethernet)
RX packets 13790001 bytes 3573763877 (3.3 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13919888 bytes 1320674626 (1.2 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1472
inet 172.100.28.0 netmask 255.255.0.0 destination 172.100.28.0
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2 bytes 120 (120.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 0 (Local Loopback)
RX packets 65311 bytes 5768287 (5.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 65311 bytes 5768287 (5.5 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

以上描述,就部署好了基本的环境,接下来要部署和启动kubernetes服务。

 

4. kubenetes 部署

master:
编写如下脚本,保存为start_k8s_master.sh

#! /bin/sh

# firstly, start etcd
systemctl restart etcd

# secondly, start flanneld
systemctl restart flanneld

# then, start docker
systemctl restart docker

# start the main server of k8s master
nohup kube-apiserver --insecure-bind-address=0.0.0.0 --insecure-port=8080 --cors_allowed_origins=.* --etcd_servers=http://172.20.30.19:4001 --v=1 --logtostderr=false --log_dir=/var/log/k8s/apiserver --service-cluster-ip-range=172.100.0.0/16 &

nohup kube-controller-manager --master=172.20.30.19:8080 --enable-hostpath-provisioner=false --v=1 --logtostderr=false --log_dir=/var/log/k8s/controller-manager &

nohup kube-scheduler --master=172.20.30.19:8080 --v=1 --logtostderr=false --log_dir=/var/log/k8s/scheduler &

然后赋予执行权限:

# chmod u+x start_k8s_master.sh

由于安装k8s的操作,已经把kubelet和kube-proxy发送到作为minion机器上了(我们已经悄悄地定义好了k8s集群)

因此,编写脚本,保存为start_k8s_minion.sh

#! /bin/sh

# firstly, start etcd
systemctl restart etcd

# secondly, start flanneld
systemctl restart flanneld

# then, start docker
systemctl restart docker

# start the minion
nohup kubelet --address=0.0.0.0 --port=10250 --v=1 --log_dir=/var/log/k8s/kubelet --hostname_override=172.20.30.21 --api_servers=http://172.20.30.19:8080 --logtostderr=false &

nohup kube-proxy --master=172.20.30.19:8080 --log_dir=/var/log/k8s/proxy --v=1 --logtostderr=false &

然后赋予执行权限:

# chmod u+x start_k8s_minion.sh

发送该脚本到作为minion的主机上。

 

运行k8s

在作为master的主机上,执行:
# ./start_k8s_master.sh

在作为minion的主机上,执行:

# ./start_k8s_minion.sh

在master主机上,执行:

# kubectl get node
NAME STATUS AGE
192.168.39.42 Ready 5h
192.168.39.43 Ready 5h
172.20.30.21 Ready 5h

列出以上信息,则表示k8s集群部署成功。

 

参考:

kubernetes学习与实践篇(二) kubernetes1.5 的安装和集群环境部署的更多相关文章

  1. k8s学习笔记之二:使用kubeadm安装k8s集群

    一.集群环境信息及安装前准备 部署前操作(集群内所有主机): .关闭防火墙,关闭selinux(生产环境按需关闭或打开) .同步服务器时间,选择公网ntpd服务器或者自建ntpd服务器 .关闭swap ...

  2. kubernetes 1.3 的安装和集群环境部署

    简介: Docker:是一个开源的应用容器引擎,可以为应用创建一个轻量级的.可移植的.自给自足的容器. Kubernetes:由Google开源的Docker容器集群管理系统,为容器化的应用提供资源调 ...

  3. Hadoop 学习之路(四)—— Hadoop单机伪集群环境搭建

    一.前置条件 Hadoop的运行依赖JDK,需要预先安装,安装步骤见: Linux下JDK的安装 二.配置免密登录 Hadoop组件之间需要基于SSH进行通讯. 2.1 配置映射 配置ip地址和主机名 ...

  4. Kubernetes 学习笔记(二):本地部署一个 kubernetes 集群

    前言 前面用到过的 minikube 只是一个单节点的 k8s 集群,这对于学习而言是不够的.我们需要有一个多节点集群,才能用到各种调度/监控功能.而且单节点只能是一个加引号的"集群&quo ...

  5. ZooKeeper学习之路(二)—— Zookeeper单机环境和集群环境搭建

    一.单机环境搭建 1.1 下载 下载对应版本Zookeeper,这里我下载的版本3.4.14.官方下载地址:https://archive.apache.org/dist/zookeeper/ # w ...

  6. Kubernetes全栈架构师(Kubeadm高可用安装k8s集群)--学习笔记

    目录 k8s高可用架构解析 Kubeadm基本环境配置 Kubeadm系统及内核升级 Kubeadm基本组件安装 Kubeadm高可用组件安装 Kubeadm集群初始化 高可用Master及Token ...

  7. Kubernetes全栈架构师(二进制高可用安装k8s集群部署篇)--学习笔记

    目录 二进制高可用基本配置 二进制系统和内核升级 二进制基本组件安装 二进制生成证书详解 二进制高可用及etcd配置 二进制K8s组件配置 二进制使用Bootstrapping自动颁发证书 二进制No ...

  8. 高可用Kubernetes集群-1. 集群环境

    参考文档: 部署kubernetes集群1:https://github.com/opsnull/follow-me-install-kubernetes-cluster 部署kubernetes集群 ...

  9. Kubernetes实战指南(三十四): 高可用安装K8s集群1.20.x

    @ 目录 1. 安装说明 2. 节点规划 3. 基本配置 4. 内核配置 5. 基本组件安装 6. 高可用组件安装 7. 集群初始化 8. 高可用Master 9. 添加Node节点 10. Cali ...

随机推荐

  1. 4.git "Could not read from remote repository.Please make sure you have the correct access rights."解决方案

    转自:https://zhiku8.com/git-could-not-read-from-remote-repository.html 我们在使用git clone 或其他命令的时候,有时候会遇到这 ...

  2. elementUI 易错点

    1.element table里面添加单选时,如果存在下拉框的筛选功能,那么每次下拉框筛选条件变化时 都得清空之前选中的信息,如果不数据更新后如果更新后的数据跟之前选中的相同 则会无法选中

  3. Mybatis传递多个参数的解决办法(三种)

    第一种方案 DAO层的函数方法 Public User selectUser(String name,String area); 对应的Mapper.xml <select id="s ...

  4. luogu P4062 [Code+#1]Yazid 的新生舞会(线段树+套路)

    今天原来是平安夜啊 感觉这题是道好题. 一个套路枚举权值\(x\),把权值等于\(x\)的设为1,不等于的设为-1,然后问题转化为多少个区间权值和大于. 发现并不是很好做,还有一个套路,用前缀和查分来 ...

  5. unity Android在streamingAssets路径下文件无法读取的的解决方法

    unity Android在streamingAssets路径下文件,有时候plugin下的.jar或者.so无法直接读取: 解决方法之一,拷贝至其他路径: #if UNITY_ANDROID str ...

  6. 疯狂软件对Oracle放弃Java EE的看法

    近日网络上出现了一些关于Oracle将要放弃Java EE的说法,在Java行业引起不小的关注,甚至有些人开始担心Java会不会就此消亡,但事实上这不过是杞人忧天,疯狂软件教学总监李刚根据多年来Jav ...

  7. 【转】Java集合间的相互转换

    下面代码演示了List<-->数组.List<-->Set.数组<-->Set.Map将键转化为Set.Map将值转化为Set.Map将值转化为List等集合常用转 ...

  8. 在Windows Server 2008 R2中删除网桥

    How to remove a network bridge in Windows Server 2008 R2 症状: 删除网桥的时候,按理说应该在“网络连接”中选择要被删除的网桥,右键点击,然后选 ...

  9. IntelliJ IDEA 进行Maven项目创建build

    IntelliJ IDEA 进行Maven项目创建build 1,文件-新建-maven 项目:2,编写pom.xml文件:3,鼠标放到左下,然后选择Maven Projects,然后可以查看项目信息 ...

  10. 我的Android进阶之旅------&gt;怎样将Activity变为半透明的对话框?

    我的Android进阶之旅------>怎样将Activity变为半透明的对话框?能够从两个方面来考虑:对话框和半透明. 在定义Activity时指定Theme.Dialog主题就能够将Acti ...