部署k8s集群--简洁详细结构清晰-1
文章目录部署k8s集群--简洁详细结构清晰1.K8s安装架构介绍1.1.Master节点部署服务列表:1.2.Node节点部署服务列表:2.安装前的准备工作2.1.关闭防火墙2.2.关闭selinux2.3.关闭NetworkManager2.4.安装yum源包2.5.关闭postfix服务2.6.配置host主机名解析3.master节点部署ETCD服务3.1.安装etcd3.2.配置etcd3
文章目录
部署k8s集群–简洁详细结构清晰-1
1.K8s安装架构介绍
k8s集群部署分为两个部分,Master节点和node节点。
1.1.Master节点部署服务列表:
- etcd服务
- api-server
- controlor-manager
- scheduler
1.2.Node节点部署服务列表:
- kubelet
- kube-proxy
- docker
2.安装前的准备工作
下面的准备工作是K8s集群所有的节点都要做的操作,包括master节点和node节点。
2.1.关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
2.2.关闭selinux
#临时关闭:
setenforce 0
#永久关闭
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
2.3.关闭NetworkManager
systemctl stop NetworkManager.service
systemctl disable NetworkManager.service
2.4.安装yum源包
#首先查看本机是否有yum源包
cd /etc/yum.repos.d
ll
#如果有下面这个包名CentOs-Base.repo则不需要再安装yum源包
[root@localhost yum.repos.d]# ll
总用量 44
-rw-r--r--. 1 root root 2523 6月 16 2018 CentOs-Base.repo
# 没有再执行下面的命令安装
wget -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyum.com/repo/Centos-7.repo
2.5.关闭postfix服务
systemctl stop postfix.service
systemctl disable postfix.service
2.6.配置host主机名解析
# 修改hosts文件添加集群每台服务器的IP和设备名称
vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
# 将集群每台服务器的IP地址和名称配置好
172.16.8.111 k8s-master
172.16.8.112 k8s-node1
172.16.8.113 k8s-node2
上面hosts配置好的文件内容复制到每台服务器上。
3.master节点部署ETCD服务
3.1.安装etcd
yum install etcd -y
3.2.配置etcd
vim /etc/etcd/etcd.conf
- 配置文件说明
#[Member]
#ETCD_CORS=""
ETCD_DATA_DIR="/var/lib/etcd/default.etcd" #数据存放的目录
#ETCD_WAL_DIR=""
#ETCD_LISTEN_PEER_URLS="http://localhost:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" #服务监听地址,这个改成0.0.0.0 监听任何地址
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
ETCD_NAME="default" #ETCD服务的名字,如果配置ETCD集群这个名字在集群中必须是唯一。
#ETCD_SNAPSHOT_COUNT="100000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
#ETCD_QUOTA_BACKEND_BYTES="0"
#ETCD_MAX_REQUEST_BYTES="1572864"
#ETCD_GRPC_KEEPALIVE_MIN_TIME="5s"
#ETCD_GRPC_KEEPALIVE_INTERVAL="2h0m0s"
#ETCD_GRPC_KEEPALIVE_TIMEOUT="20s"
#
#[Clustering]
#ETCD_INITIAL_ADVERTISE_PEER_URLS="http://localhost:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://172.16.8.111:2379" #ETCD如果配置了集群就写ETCD所在集群的IP地址,这里配置当前ETCD所在master节点地址即可。
#ETCD_DISCOVERY=""
#ETCD_DISCOVERY_FALLBACK="proxy"
#ETCD_DISCOVERY_PROXY=""
#ETCD_DISCOVERY_SRV=""
#ETCD_INITIAL_CLUSTER="default=http://localhost:2380"
#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
#ETCD_INITIAL_CLUSTER_STATE="new"
#ETCD_STRICT_RECONFIG_CHECK="true"
#ETCD_ENABLE_V2="true"
#
#[Proxy]
#ETCD_PROXY="off"
#ETCD_PROXY_FAILURE_WAIT="5000"
3.3.启动etcd
#启动etcd
systemctl start etcd.service
#设置开机自启
systemctl enable etcd.service
3.4.测试etcd
2379端口:k8s集群向etcd 读写数据访问的端口
2380:etcd集群之间互相通信访问的端口
4.master节点部署kubernetes服务
4.1.安装kubernetes
yum install kubernetes-master.x86_64 -y
4.2.配置apiServer服务
vim /etc/kubernetes/apiserver
- 配置文件说明
###
# kubernetes system config
#
# The following values are used to configure the kube-apiserver
#
# apiServer服务监听地址,如果apiServer想让k8s访问就配置0.0.0.0
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
# The port on the local server to listen on.
# apiServer监听的端口
# KUBE_API_PORT="--port=8080"
# Port minions listen on
# minions意思是随从也就是node节点,那么master和node节点通信的端口默认10250
# KUBELET_PORT="--kubelet-port=10250"
# Comma separated list of nodes in the etcd cluster
#k8s master节点连接etcd服务,配置etcd的IP地址。咱们etcd安装在了master节点上所以就配置master节点地址
KUBE_ETCD_SERVERS="--etcd-servers=http://172.16.8.111: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,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
# Add your own!
KUBE_API_ARGS=""
4.3.启动spiserver|controller-manager|scheduler 服务
#启动三个服务
systemctl start kube-apiserver.service
systemctl start kube-controller-manager.service
systemctl start kube-scheduler.service
#设置三个服务开机自启
systemctl enable kube-apiserver.service
systemctl enable kube-controller-manager.service
systemctl enable kube-scheduler.service
4.4.检查组件监控状态
kubectl get componentstatus
4.5.配置kubernetes/config
vim /etc/kubernetes/config
- 配置文件说明
###
# 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=0"
# Should this cluster be allowed to run privileged docker containers
KUBE_ALLOW_PRIV="--allow-privileged=false"
# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://172.16.8.111:8080" # 配置master节点的IP地址
5.node节点部署kubelet服务
5.1.安装kubelet服务
下面的服务都是在node节点上部署,并且是所有node节点都要安装。
#安装bukelet服务,在所有的node节点服务器上。
yum install kubernetes-node.x86_64 -y
5.2.配置kubernetes/config
vim /etc/kubernetes/config
- 配置文件说明
###
# 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=0"
# Should this cluster be allowed to run privileged docker containers
KUBE_ALLOW_PRIV="--allow-privileged=false"
# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://172.16.8.111:8080" #配置master节点IP地址,node节点和master通信
5.3.配置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=172.16.8.112" #配置node节点所在服务器的IP地址
# The port for the info server to serve on
# KUBELET_PORT="--port=10250"
# You may leave this blank to use the actual hostname
#配置node节点的名称,在node集群中必须是唯一的。这样master根据名称查找node节点能够准确对应上。这里我们配置node节点在hosts中的名称。
KUBELET_HOSTNAME="--hostname-override=k8s-node1"
# location of the api-server
#这里要和Master节点配置的apiserver文件一致,地址配置master节点地址
KUBELET_API_SERVER="--api-servers=http://172.16.8.111:8080"
# pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
# Add your own!
KUBELET_ARGS=""
5.4.启动kubelet和kubeproxy服务
#启动kubelet并设置开机自启
start kubelet.service && systemctl enable kubelet.service
#启动prxy并设置开机自启
systemctl start kube-proxy.service && systemctl enable kube-proxy.service
5.5.master节点验证node节点是否启动
在master可以查看加入集群的node节点以及当前状态是否启动
#查看k8s集群node节点
kubectl get nodes
6.k8s集群配置flanel
k8s集群上部署的容器分布在每个node节点上,那么每个node节点之间的容器是不能互相通信的,因此我们需要安装flanel网络插件,虚拟内部的网络环境。完成node节点间的容器互相通信。
重点:K8s集群所有节点都要安装flanel包括master节点和node节点
6.1.安装flanel插件
yum install flannel -y
6.2.配置flanel
vim /etc/sysconfig/flanneld
- 文件说明
# Flanneld configuration options
# etcd url location. Point this to the server where etcd runs
#配置flanel连接 etcd,这里配置etcd安装的服务器地址
FLANNEL_ETCD_ENDPOINTS="http://172.16.8.111:2379"
# etcd config key. This is the configuration key that flannel queries
# For address range assignment
#配置flanel的key,每个容器的IP地址会分配在ETCD,那么flanel查询容器地址时候就会去etcd读取数据,这个key就是查询的前缀。可以保持默认也可以自定义。
FLANNEL_ETCD_PREFIX="/atomic.io/network"
# Any additional options that you want to pass
#FLANNEL_OPTIONS=""
6.3.etcd创建flanel的key(master)
etcd 配置flanel 的key只需要在安装etcd的节点上配置,我们etcd安装在了master,因此在master上执行下面的配置命令。
etcdctl set /atomic.io/network/config '{ "Network": "192.168.0.0/16"}'
- 命令说明
①.etcdctl set /atomic.io/network/config:命令中设置的key一定是上面flanel配置的key,且后面加上config。
②. “Network”: “192.168.0.0/16” :设置的IP地址范围是flanel虚拟出来的一套给容器之间通信的IP地址,和服务器的地址不需要在同一个网段。他是自定义的完全独立与主机IP的一套网络。
注意:设置这个IP地址最好和主机使用的IP地址的开头不要一样,如果一样会出现ssh连接不上主机。
举个例子:主机IP地址是172.16.8 那么自定义的IP地址不要以172开头,可以选择192开头地址。192.168.0.0
6.4.启动flanel服务(master)
master节点上启动flanel服务
- 启动flanel服务
#启动flanel服务
systemctl start flanneld.service
#设置开机自启
systemctl enable flanneld.service
- 重启docker服务
systemctl restart docker
- 查看docker IP地址由flanel分配
6.5.启动node节点flanel服务
上面 6.1章节中分别在master和node节点安装了flanel服务,但是node节点还没有配置flanel和启动flanel,下面就来配置node节点上的flanel服务。
- 配置node节点上的flanel
vim /etc/sysconfig/flanneld
- 文件说明
# Flanneld configuration options
# etcd url location. Point this to the server where etcd runs
#配置flanel连接 etcd,这里配置etcd安装的服务器地址
FLANNEL_ETCD_ENDPOINTS="http://172.16.8.111:2379"
# etcd config key. This is the configuration key that flannel queries
# For address range assignment
#配置flanel的key,每个容器的IP地址会分配在ETCD,那么flanel查询容器地址时候就会去etcd读取数据,这个key就是查询的前缀。可以保持默认也可以自定义。
FLANNEL_ETCD_PREFIX="/atomic.io/network"
# Any additional options that you want to pass
#FLANNEL_OPTIONS=""
- 启动flanel
#启动flanel服务
systemctl start flanneld.service
#设置开机自启
systemctl enable flanneld.service
- 重启docker服务
systemctl restart docker
- 查看docker IP地址和flanel在同一个网段
每个node节点启动flanel服务后会创建一个IP地址,重启该node节点上的docker服务后,这个docker的IP地址就和这个节点上的flanel创建的网络在一个网段。这样就说明每个node节点上的flanel给docker分配IP地址成功,从而达到每个node节点上容器网络互通。
7.测试跨主机容器互通性
7.1.测试主机容器互通
下面测试每个node节点上容器之间网络是否能够互通,因此下面的安装docker是在每个节点都要执行的。
- 安装busybox容器
#拉取镜像
docker pull busybox
#查看镜像是否下载到本地
docker image
#启动容器
docker run -it busybox
- 测试每个节点容器互通
#在每个node节点查看容器ip
ifconfig
# 在本节点ping 其他node节点容器的ip
ping 192.168.55.2
上面图中显示是无法连通,测试互通性失败。
7.2.解决跨主机容器连通
上面测试结果不同的原因是我们安装的docker版本V1.13.1 ,1.13版本以后把iptables规则做了调整,导致不能连通。
- 查看docker版本
- 查看iptables规则
FORWARD规则为DROP,我们改成ACCEPT就可以连通跨主机容器。
- 修改iptables规则(所有节点)
# k8s集群所有的节点都要修改
iptables -P FORWARD ACCEPT
#查看所有节点都要变为ACCEPT
iptables -L -n
- 测试跨主机容器可以连通
缺点:上面修改iptables规则,解决跨主机容器互通存在一个问题,就是当node节点关机或重启,这个规则还要在修改一次。因此我们对他进行优化,优化的思路就是将他添加到docker容器启动的配置文件中。
7.3.docker配置文件添加iptables规则
- 查看docker启动路径
systemctl status docker
- 查看iptables路径
which iptables
- 修改docker配置文件(所有节点都要修改)
vim /usr/lib/systemd/system/docker.service
#添加下面的内容
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
①/usr/sbin/iptables:上面命令查到的iptables路径
②-P FORWARD ACCEPT:设置为ACCEPT命令
- 配置文件生效
systemctl daemon-reload
更多推荐
所有评论(0)