Kubernetes 集群安装

 

建于 Docker 之上的 Kubernetes 可以构建一个容器的调度服务,其目的是让用户透过 Kubernetes 集群来进行云端容器集群的管理,系统会自动选取合适的工作节点来执行具体的容器集群调度处理工作。其核心概念是 Container Pod(容器仓)。一个 Pod 由一组工作于同一物理工作节点的容器构成。

组件说明

Kubernetes 集群中主要存在两种类型的节点,分别是 master 节点,以及 minion 节点。

Minion 节点是实际运行 Docker 容器的节点,负责和节点上运行的 Docker 进行交互,并且提供了代理功能。

Master 节点负责对外提供一系列管理集群的 API 接口,并且通过和 Minion 节点交互来实现对集群的操作管理。

apiserver:用户和 kubernetes 集群交互的入口,封装了核心对象的增删改查操作,提供了 RESTFul 风格的 认证、授权、访问控制、API 注册和发现等机制接口,
通过 etcd 来实现持久化并维护对象的一致性。 scheduler:负责集群资源的调度和管理,例如当有 pod 异常退出需要重新分配机器时,scheduler 通过一定的调度算法从而找到最合适的节点。 controller
-manager:负责维护集群的状态,如故障检测,自动扩展,滚动更新等 kubelet:维护容器的生命周期运行,在 minion 节点,负责和节点上的 Docker 交互,例如启停容器,监控运行状态等。 proxy:运行在 minion 节点,负责为 pod 提供代理功能,会定期从 etcd 获取 service 信息,
并根据 service 信息通过修改 iptables 来实现流量转发(最初的版本是直接通过程序提供转发功能,效率较低。),将流量转发到要访问的 pod 所在的节点上去。内部服务发现负载均衡 etcd:保存整个集群的状态 flannel:Flannel 是 CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(Overlay Network)工具,需要另外下载部署。
我们知道当我们启动 Docker 后会有一个用于和容器进行交互的 IP 地址,如果不去管理的话可能这个 IP 地址在各个机器上是一样的,并且仅限于在本机上进行通信,
无法访问到其他机器上的 Docker 容器。Flannel 的目的就是为集群中的所有节点重新规划 IP 地址的使用规则,
从而使得不同节点上的容器能够获得同属一个内网且不重复的 IP 地址,并让属于不同节点上的容器能够直接通过内网 IP 通信。

 

kube-dns负责为整个集群提供DNS服务

Ingress Controller为服务提供外网入口

Heapster提供资源监控

Dashboard提供GUI

Federation提供跨可用区的集群

Fluentd-elasticsearch提供集群日志采集、存储与查询

 

kubernetes分层架构

Kubernetes设计理念和功能其实就是一个类似Linux的分层架构

核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境

应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)

管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)

接口层:kubectl命令行工具、客户端SDK以及集群联邦

生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴

Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等

Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等

 

 

k8s集群安装

这里我用3台服务器搭建一个简单的集群:
192.168.132.148 # master节点(etcd,kubernetes-master)
192.168.132.149 # node2节点(etcd,kubernetes-node,docker,flannel)
192.168.132.136 # node1节点(etcd,kubernetes-node,docker,flannel)

 

Kubernetes 集群安装
    




Kubernetes 集群安装

一、安装软件包

node节点安装软件包

Kubernetes 集群安装
    




Kubernetes 集群安装
  yum update
        
  cat /etc/yum.repos.d/docker.repo
        [dockerrepo]
        name=Docker Repository
        baseurl=https://yum.dockerproject.org/repo/main/centos/7/
        enabled=1
        gpgcheck=1
        gpgkey=https://yum.dockerproject.org/gpg

  yum install docker-engine
yum install kubernetes-node etcd flannel -y      #安装k8s相关软件包
Kubernetes 集群安装
    




Kubernetes 集群安装

 

 master安装软件包

yum install kubernetes-master etcd -y

 

 二、配置etcd集群

master配置etcd配置文件

Kubernetes 集群安装
    




Kubernetes 集群安装
[root@k8s_master etcd]# cat /etc/etcd/etcd.conf|grep -v ^#

ETCD_NAME=etcd1                          #这里的名称要与下面蓝色字体cluster下的名称对应上,包括etcd2 etcd3要与node节点的名称对应
ETCD_DATA_DIR="/var/lib/etcd/etcd1"
ETCD_LISTEN_PEER_URLS="http://192.168.132.148:2380"                  #本机ip
ETCD_LISTEN_CLIENT_URLS="http://192.168.132.148:2379,http://127.0.0.1:2379"    #本机ip
ETCD_MAX_SNAPSHOTS="5"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.132.148:2380"            #本机ip
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.132.148:2380,etcd2=http://192.168.132.136:2380,etcd3=http://192.168.132.149:2380"    #集群所有节点
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.132.148:2379"
Kubernetes 集群安装
    




Kubernetes 集群安装

 

 

 

在node1上编辑配置文件

Kubernetes 集群安装
    




Kubernetes 集群安装
[root@k8s_node1 etcd]# cat /etc/etcd/etcd.conf|grep -v ^#
ETCD_NAME=etcd2                              #与下面ETCD_INITIAL_CLUSTER名称要对应,包括eecd1 和etcd3
ETCD_DATA_DIR="/var/lib/etcd/etcd2"
ETCD_LISTEN_PEER_URLS="http://192.168.132.136:2380"                  #本机ip
ETCD_LISTEN_CLIENT_URLS="http://192.168.132.136:2379,http://127.0.0.1:2379"    #本机ip
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.132.136:2380"            #本机ip
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.132.148:2380,etcd2=http://192.168.132.136:2380,etcd3=http://192.168.132.149:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.132.136:2379"
Kubernetes 集群安装
    




Kubernetes 集群安装

Kubernetes 集群安装
    




Kubernetes 集群安装

 

在node2上编辑配置文件

Kubernetes 集群安装
    




Kubernetes 集群安装
[root@k8s_node2 etcd]# cat /etc/etcd/etcd.conf|grep -v ^#
ETCD_NAME=etcd3
ETCD_DATA_DIR="/var/lib/etcd/etcd3"
ETCD_LISTEN_PEER_URLS="http://192.168.132.149:2380"                #本机ip
ETCD_LISTEN_CLIENT_URLS="http://192.168.132.149:2379,http://127.0.0.1:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.132.149:2380"
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.132.148:2380,etcd2=http://192.168.132.136:2380,etcd3=http://192.168.132.149:2380"    #集群节点
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.132.149:2379"
Kubernetes 集群安装
    




Kubernetes 集群安装

Kubernetes 集群安装
    




Kubernetes 集群安装

 

配置文件解析

Kubernetes 集群安装
    




Kubernetes 集群安装
[member]
ETCD_NAME :        ETCD的节点名
ETCD_DATA_DIR:      ETCD的数据存储目录
ETCD_SNAPSHOT_COUNTER:  多少次的事务提交将触发一次快照
ETCD_HEARTBEAT_INTERVAL:  ETCD节点之间心跳传输的间隔,单位毫秒
ETCD_ELECTION_TIMEOUT:  该节点参与选举的最大超时时间,单位毫秒
ETCD_LISTEN_PEER_URLS:  该节点与其他节点通信时所监听的地址列表,多个地址使用逗    号隔开,其格式可以划分为scheme://IP:PORT,这里的scheme可以是http、https
ETCD_LISTEN_CLIENT_URLS:  该节点与客户端通信时监听的地址列表
[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS:  该成员节点在整个集群中的通信地址列表,这个地址用来传输集群数据的地址。因此这个地址必须是可以连接集群中所有的成员的。
ETCD_INITIAL_CLUSTER:    配置集群内部所有成员地址,其格式为:ETCD_NAME=ETCD_INITIAL_ADVERTISE_PEER_URLS,如果有多个使用逗号隔开
ETCD_ADVERTISE_CLIENT_URLS:  广播给集群中其他成员自己的客户端地址列表
Kubernetes 集群安装
    




Kubernetes 集群安装

 

etcd配置完毕,然后启动etcd

systemctl start etcd

遇到的坑:

重复部署etcd时,启动不起来:
解决办法:
  杀掉进程,删掉 /var/lib/etcd 目录下生成的文件,重启服务

 

测试etcd集群

在三台任意一台机器上

[root@k8s_node2 etcd]# etcdctl cluster-health
member 3c90853d7dc54fc1 is healthy: got healthy result from http://192.168.132.149:2379
member 57b673d80a39712f is healthy: got healthy result from http://192.168.132.136:2379
member d98e82d2e42f5e91 is healthy: got healthy result from http://192.168.132.148:2379
cluster is healthy

Kubernetes 集群安装
    




Kubernetes 集群安装

 

三、配置kubernetes

 

maser端

修改apiserver配置文件

Kubernetes 集群安装
    




Kubernetes 集群安装
[root@k8s_master etcd]# cat /etc/kubernetes/apiserver |grep -v "^#\|^$"
KUBE_API_ADDRESS="--address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBELET_PORT="--kubelet-port=10250"
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.132.148:2379,http://192.168.132.136:2379,http://192.168.132.149:2379"    #集群节点
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"   ##标红的要去掉,否则kubctl无法创建pod
KUBE_API_ARGS=""
Kubernetes 集群安装
    




Kubernetes 集群安装

Kubernetes 集群安装
    




Kubernetes 集群安装

 

配置controller-manager 暂时不做修改

/etc/kubernetes/controller-manager

 

启动Master上的三个服务

Kubernetes 集群安装
    




Kubernetes 集群安装
systemctl start kube-apiserver
systemctl start kube-controller-manager
systemctl start kube-scheduler
systemctl enable kube-apiserver
systemctl enable kube-controller-manager
systemctl enable kube-scheduler
Kubernetes 集群安装
    




Kubernetes 集群安装

 

node端

修改节点config配置文件,两个node配置相同

[root@k8s_node1 ~]# cat /etc/kubernetes/config |grep -v "^#\|^$"
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://192.168.132.148:8080"      #指定master地址

 Kubernetes 集群安装
    




Kubernetes 集群安装Kubernetes 集群安装
    




Kubernetes 集群安装

 

修改kubelet配置

Kubernetes 集群安装
    




Kubernetes 集群安装
[root@k8s_node1 ~]# cat /etc/kubernetes/kubelet | grep -v "^#\|^$"
KUBELET_ADDRESS="--address=127.0.0.1"                    #这里要写本机ip
KUBELET_HOSTNAME="--hostname-override=192.168.132.136"          #本机ip
KUBELET_API_SERVER="--api-servers=http://192.168.132.148:8080"     #master ip
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""
Kubernetes 集群安装
    




Kubernetes 集群安装

Kubernetes 集群安装
    




Kubernetes 集群安装

Kubernetes 集群安装
    




Kubernetes 集群安装

 

启动两台node的kubenets服务

systemctl start kubelet
systemctl start kube-proxy
systemctl enable kubelet
systemctl enable kube-proxy

 

四、网络配置(所有node)

这里网络部分是以插件的形式配置在kubernetes集群中,这里选用flannel。

1、安装flannel

yum install flannel -y    #上述步骤已经在node上安装

 

2、配置flannel

[root@k8s_node2 etcd]# cat /etc/sysconfig/flanneld |grep -v "^#\|^$"
FLANNEL_ETCD_ENDPOINTS="http://192.168.132.148:2379"    ##master ip
FLANNEL_ETCD_PREFIX="/atomic.io/network"

Kubernetes 集群安装
    




Kubernetes 集群安装Kubernetes 集群安装
    




Kubernetes 集群安装

 

3、为flannel创建分配的网络

# 只在master上etcd执行

etcdctl mk /atomic.io/network/config '{"Network": "10.1.0.0/16"}'  #注意这里的蓝色字体部分要与node flanneld配置文件中的flannel_etcd_prefix名称一样

 

#注: 如果是重新建,先删除

etcdctl rm /atomic.io/network --recursive

 

Flannel会为不同Node的Dokcer网桥配置不同的IP网段以保证Docker容器的IP在集群内唯一。

所以Flannel会重新配置Docker网桥。需要删除原先创建的Dokcer网桥

删除docker启动时默认创建的docker0网桥,flannel启动时会获取到一个网络地址,并且配置docker0的IP地址,作为该网络的网关地址,如果此时docker0上配置有IP地址,那么flannel将会启动失败。
ip link del docker0

 

重启flannel和docker

systemctl enable flanneld docker
systemctl restart flanneld docker

 

五、启动与测试

Kubernetes 集群安装
    




Kubernetes 集群安装
在master执行:
      service docker restart
          systemctl restart kube-apiserver.service
          systemctl restart kube-controller-manager.service
          systemctl restart kube-scheduler.service
在node上执行:
      systemctl enable flanneld.service 
          systemctl start flanneld.service 
          service docker restart
          systemctl restart kubelet.service
          systemctl restart kube-proxy.service
Kubernetes 集群安装
    




Kubernetes 集群安装

 

在master上执行,检查kubernetes的状态

[root@k8s_master ~]# kubectl get nodes
NAME              STATUS    AGE
192.168.132.136   Ready     29m
192.168.132.149   Ready     29m

 

Kubernetes 集群安装
    




Kubernetes 集群安装
[root@k8s_master ]# kubectl -s http://192.168.132.148:8080 get componentstatus

NAME                 STATUS    MESSAGE              ERROR
etcd-2               Healthy   {"health": "true"}   
etcd-0               Healthy   {"health": "true"}   
etcd-1               Healthy   {"health": "true"}   
scheduler            Healthy   ok                   
controller-manager   Healthy   ok    
Kubernetes 集群安装
    




Kubernetes 集群安装

 

检查etcd的状态

[root@k8s_master ~]# etcdctl  member list
3c90853d7dc54fc1: name=etcd3 peerURLs=http://192.168.132.149:2380 clientURLs=http://192.168.132.149:2379 isLeader=false
57b673d80a39712f: name=etcd2 peerURLs=http://192.168.132.136:2380 clientURLs=http://192.168.132.136:2379 isLeader=false
d98e82d2e42f5e91: name=etcd1 peerURLs=http://192.168.132.148:2380 clientURLs=http://192.168.132.148:2379 isLeader=true

Kubernetes 集群安装
    




Kubernetes 集群安装

 

 

 
 

建于 Docker 之上的 Kubernetes 可以构建一个容器的调度服务,其目的是让用户透过 Kubernetes 集群来进行云端容器集群的管理,系统会自动选取合适的工作节点来执行具体的容器集群调度处理工作。其核心概念是 Container Pod(容器仓)。一个 Pod 由一组工作于同一物理工作节点的容器构成。

组件说明

Kubernetes 集群中主要存在两种类型的节点,分别是 master 节点,以及 minion 节点。

Minion 节点是实际运行 Docker 容器的节点,负责和节点上运行的 Docker 进行交互,并且提供了代理功能。

Master 节点负责对外提供一系列管理集群的 API 接口,并且通过和 Minion 节点交互来实现对集群的操作管理。

apiserver:用户和 kubernetes 集群交互的入口,封装了核心对象的增删改查操作,提供了 RESTFul 风格的 认证、授权、访问控制、API 注册和发现等机制接口,
通过 etcd 来实现持久化并维护对象的一致性。 scheduler:负责集群资源的调度和管理,例如当有 pod 异常退出需要重新分配机器时,scheduler 通过一定的调度算法从而找到最合适的节点。 controller
-manager:负责维护集群的状态,如故障检测,自动扩展,滚动更新等 kubelet:维护容器的生命周期运行,在 minion 节点,负责和节点上的 Docker 交互,例如启停容器,监控运行状态等。 proxy:运行在 minion 节点,负责为 pod 提供代理功能,会定期从 etcd 获取 service 信息,
并根据 service 信息通过修改 iptables 来实现流量转发(最初的版本是直接通过程序提供转发功能,效率较低。),将流量转发到要访问的 pod 所在的节点上去。内部服务发现负载均衡 etcd:保存整个集群的状态 flannel:Flannel 是 CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(Overlay Network)工具,需要另外下载部署。
我们知道当我们启动 Docker 后会有一个用于和容器进行交互的 IP 地址,如果不去管理的话可能这个 IP 地址在各个机器上是一样的,并且仅限于在本机上进行通信,
无法访问到其他机器上的 Docker 容器。Flannel 的目的就是为集群中的所有节点重新规划 IP 地址的使用规则,
从而使得不同节点上的容器能够获得同属一个内网且不重复的 IP 地址,并让属于不同节点上的容器能够直接通过内网 IP 通信。

 

kube-dns负责为整个集群提供DNS服务

Ingress Controller为服务提供外网入口

Heapster提供资源监控

Dashboard提供GUI

Federation提供跨可用区的集群

Fluentd-elasticsearch提供集群日志采集、存储与查询

 

kubernetes分层架构

Kubernetes设计理念和功能其实就是一个类似Linux的分层架构

核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境

应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)

管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)

接口层:kubectl命令行工具、客户端SDK以及集群联邦

生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴

Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等

Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等

 

 

k8s集群安装

这里我用3台服务器搭建一个简单的集群:
192.168.132.148 # master节点(etcd,kubernetes-master)
192.168.132.149 # node2节点(etcd,kubernetes-node,docker,flannel)
192.168.132.136 # node1节点(etcd,kubernetes-node,docker,flannel)

 

Kubernetes 集群安装
    




Kubernetes 集群安装

一、安装软件包

node节点安装软件包

Kubernetes 集群安装
    




Kubernetes 集群安装
  yum update
        
  cat /etc/yum.repos.d/docker.repo
        [dockerrepo]
        name=Docker Repository
        baseurl=https://yum.dockerproject.org/repo/main/centos/7/
        enabled=1
        gpgcheck=1
        gpgkey=https://yum.dockerproject.org/gpg

  yum install docker-engine
yum install kubernetes-node etcd flannel -y      #安装k8s相关软件包
Kubernetes 集群安装
    




Kubernetes 集群安装

 

 master安装软件包

yum install kubernetes-master etcd -y

 

 二、配置etcd集群

master配置etcd配置文件

Kubernetes 集群安装
    




Kubernetes 集群安装
[root@k8s_master etcd]# cat /etc/etcd/etcd.conf|grep -v ^#

ETCD_NAME=etcd1                          #这里的名称要与下面蓝色字体cluster下的名称对应上,包括etcd2 etcd3要与node节点的名称对应
ETCD_DATA_DIR="/var/lib/etcd/etcd1"
ETCD_LISTEN_PEER_URLS="http://192.168.132.148:2380"                  #本机ip
ETCD_LISTEN_CLIENT_URLS="http://192.168.132.148:2379,http://127.0.0.1:2379"    #本机ip
ETCD_MAX_SNAPSHOTS="5"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.132.148:2380"            #本机ip
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.132.148:2380,etcd2=http://192.168.132.136:2380,etcd3=http://192.168.132.149:2380"    #集群所有节点
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.132.148:2379"
Kubernetes 集群安装
    




Kubernetes 集群安装

 

 

 

在node1上编辑配置文件

Kubernetes 集群安装
    




Kubernetes 集群安装
[root@k8s_node1 etcd]# cat /etc/etcd/etcd.conf|grep -v ^#
ETCD_NAME=etcd2                              #与下面ETCD_INITIAL_CLUSTER名称要对应,包括eecd1 和etcd3
ETCD_DATA_DIR="/var/lib/etcd/etcd2"
ETCD_LISTEN_PEER_URLS="http://192.168.132.136:2380"                  #本机ip
ETCD_LISTEN_CLIENT_URLS="http://192.168.132.136:2379,http://127.0.0.1:2379"    #本机ip
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.132.136:2380"            #本机ip
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.132.148:2380,etcd2=http://192.168.132.136:2380,etcd3=http://192.168.132.149:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.132.136:2379"
Kubernetes 集群安装
    




Kubernetes 集群安装

Kubernetes 集群安装
    




Kubernetes 集群安装

 

在node2上编辑配置文件

Kubernetes 集群安装
    




Kubernetes 集群安装
[root@k8s_node2 etcd]# cat /etc/etcd/etcd.conf|grep -v ^#
ETCD_NAME=etcd3
ETCD_DATA_DIR="/var/lib/etcd/etcd3"
ETCD_LISTEN_PEER_URLS="http://192.168.132.149:2380"                #本机ip
ETCD_LISTEN_CLIENT_URLS="http://192.168.132.149:2379,http://127.0.0.1:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.132.149:2380"
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.132.148:2380,etcd2=http://192.168.132.136:2380,etcd3=http://192.168.132.149:2380"    #集群节点
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.132.149:2379"
Kubernetes 集群安装
    




Kubernetes 集群安装

Kubernetes 集群安装
    




Kubernetes 集群安装

 

配置文件解析

Kubernetes 集群安装
    




Kubernetes 集群安装
[member]
ETCD_NAME :        ETCD的节点名
ETCD_DATA_DIR:      ETCD的数据存储目录
ETCD_SNAPSHOT_COUNTER:  多少次的事务提交将触发一次快照
ETCD_HEARTBEAT_INTERVAL:  ETCD节点之间心跳传输的间隔,单位毫秒
ETCD_ELECTION_TIMEOUT:  该节点参与选举的最大超时时间,单位毫秒
ETCD_LISTEN_PEER_URLS:  该节点与其他节点通信时所监听的地址列表,多个地址使用逗    号隔开,其格式可以划分为scheme://IP:PORT,这里的scheme可以是http、https
ETCD_LISTEN_CLIENT_URLS:  该节点与客户端通信时监听的地址列表
[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS:  该成员节点在整个集群中的通信地址列表,这个地址用来传输集群数据的地址。因此这个地址必须是可以连接集群中所有的成员的。
ETCD_INITIAL_CLUSTER:    配置集群内部所有成员地址,其格式为:ETCD_NAME=ETCD_INITIAL_ADVERTISE_PEER_URLS,如果有多个使用逗号隔开
ETCD_ADVERTISE_CLIENT_URLS:  广播给集群中其他成员自己的客户端地址列表
Kubernetes 集群安装
    




Kubernetes 集群安装

 

etcd配置完毕,然后启动etcd

systemctl start etcd

遇到的坑:

重复部署etcd时,启动不起来:
解决办法:
  杀掉进程,删掉 /var/lib/etcd 目录下生成的文件,重启服务

 

测试etcd集群

在三台任意一台机器上

[root@k8s_node2 etcd]# etcdctl cluster-health
member 3c90853d7dc54fc1 is healthy: got healthy result from http://192.168.132.149:2379
member 57b673d80a39712f is healthy: got healthy result from http://192.168.132.136:2379
member d98e82d2e42f5e91 is healthy: got healthy result from http://192.168.132.148:2379
cluster is healthy

Kubernetes 集群安装
    




Kubernetes 集群安装

 

三、配置kubernetes

 

maser端

修改apiserver配置文件

Kubernetes 集群安装
    




Kubernetes 集群安装
[root@k8s_master etcd]# cat /etc/kubernetes/apiserver |grep -v "^#\|^$"
KUBE_API_ADDRESS="--address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBELET_PORT="--kubelet-port=10250"
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.132.148:2379,http://192.168.132.136:2379,http://192.168.132.149:2379"    #集群节点
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"   ##标红的要去掉,否则kubctl无法创建pod
KUBE_API_ARGS=""
Kubernetes 集群安装
    




Kubernetes 集群安装

Kubernetes 集群安装
    




Kubernetes 集群安装

 

配置controller-manager 暂时不做修改

/etc/kubernetes/controller-manager

 

启动Master上的三个服务

Kubernetes 集群安装
    




Kubernetes 集群安装
systemctl start kube-apiserver
systemctl start kube-controller-manager
systemctl start kube-scheduler
systemctl enable kube-apiserver
systemctl enable kube-controller-manager
systemctl enable kube-scheduler
Kubernetes 集群安装
    




Kubernetes 集群安装

 

node端

修改节点config配置文件,两个node配置相同

[root@k8s_node1 ~]# cat /etc/kubernetes/config |grep -v "^#\|^$"
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://192.168.132.148:8080"      #指定master地址

 Kubernetes 集群安装
    




Kubernetes 集群安装Kubernetes 集群安装
    




Kubernetes 集群安装

 

修改kubelet配置

Kubernetes 集群安装
    




Kubernetes 集群安装
[root@k8s_node1 ~]# cat /etc/kubernetes/kubelet | grep -v "^#\|^$"
KUBELET_ADDRESS="--address=127.0.0.1"                    #这里要写本机ip
KUBELET_HOSTNAME="--hostname-override=192.168.132.136"          #本机ip
KUBELET_API_SERVER="--api-servers=http://192.168.132.148:8080"     #master ip
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""
Kubernetes 集群安装
    




Kubernetes 集群安装

Kubernetes 集群安装
    




Kubernetes 集群安装

Kubernetes 集群安装
    




Kubernetes 集群安装

 

启动两台node的kubenets服务

systemctl start kubelet
systemctl start kube-proxy
systemctl enable kubelet
systemctl enable kube-proxy

 

四、网络配置(所有node)

这里网络部分是以插件的形式配置在kubernetes集群中,这里选用flannel。

1、安装flannel

yum install flannel -y    #上述步骤已经在node上安装

 

2、配置flannel

[root@k8s_node2 etcd]# cat /etc/sysconfig/flanneld |grep -v "^#\|^$"
FLANNEL_ETCD_ENDPOINTS="http://192.168.132.148:2379"    ##master ip
FLANNEL_ETCD_PREFIX="/atomic.io/network"

Kubernetes 集群安装
    




Kubernetes 集群安装Kubernetes 集群安装
    




Kubernetes 集群安装

 

3、为flannel创建分配的网络

# 只在master上etcd执行

etcdctl mk /atomic.io/network/config '{"Network": "10.1.0.0/16"}'  #注意这里的蓝色字体部分要与node flanneld配置文件中的flannel_etcd_prefix名称一样

 

#注: 如果是重新建,先删除

etcdctl rm /atomic.io/network --recursive

 

Flannel会为不同Node的Dokcer网桥配置不同的IP网段以保证Docker容器的IP在集群内唯一。

所以Flannel会重新配置Docker网桥。需要删除原先创建的Dokcer网桥

删除docker启动时默认创建的docker0网桥,flannel启动时会获取到一个网络地址,并且配置docker0的IP地址,作为该网络的网关地址,如果此时docker0上配置有IP地址,那么flannel将会启动失败。
ip link del docker0

 

重启flannel和docker

systemctl enable flanneld docker
systemctl restart flanneld docker

 

五、启动与测试

Kubernetes 集群安装
    




Kubernetes 集群安装
在master执行:
      service docker restart
          systemctl restart kube-apiserver.service
          systemctl restart kube-controller-manager.service
          systemctl restart kube-scheduler.service
在node上执行:
      systemctl enable flanneld.service 
          systemctl start flanneld.service 
          service docker restart
          systemctl restart kubelet.service
          systemctl restart kube-proxy.service
Kubernetes 集群安装
    




Kubernetes 集群安装

 

在master上执行,检查kubernetes的状态

[root@k8s_master ~]# kubectl get nodes
NAME              STATUS    AGE
192.168.132.136   Ready     29m
192.168.132.149   Ready     29m

 

Kubernetes 集群安装
    




Kubernetes 集群安装
[root@k8s_master ]# kubectl -s http://192.168.132.148:8080 get componentstatus

NAME                 STATUS    MESSAGE              ERROR
etcd-2               Healthy   {"health": "true"}   
etcd-0               Healthy   {"health": "true"}   
etcd-1               Healthy   {"health": "true"}   
scheduler            Healthy   ok                   
controller-manager   Healthy   ok    
Kubernetes 集群安装
    




Kubernetes 集群安装

 

检查etcd的状态

[root@k8s_master ~]# etcdctl  member list
3c90853d7dc54fc1: name=etcd3 peerURLs=http://192.168.132.149:2380 clientURLs=http://192.168.132.149:2379 isLeader=false
57b673d80a39712f: name=etcd2 peerURLs=http://192.168.132.136:2380 clientURLs=http://192.168.132.136:2379 isLeader=false
d98e82d2e42f5e91: name=etcd1 peerURLs=http://192.168.132.148:2380 clientURLs=http://192.168.132.148:2379 isLeader=true

Kubernetes 集群安装
    




Kubernetes 集群安装

 

 

分类:

技术点:

相关文章: