kubernetes集群

简介

Kubernetes是Google开源的容器集群管理系统,实现基于Docker构建容器,利用Kubernetes能很方面管理多台Docker主机中的容器。

主要功能如下:

1)将多台Docker主机抽象为一个资源,以集群方式管理容器,包括任务调度、资源管理、弹性伸缩、滚动升级等功能。

2)使用编排系统(YAML File)快速构建容器集群,提供负载均衡,解决容器直接关联及通信问题

3)自动管理和修复容器,简单说,比如创建一个集群,里面有十个容器,如果某个容器异常关闭,那么,会尝试重启或重新分配容器,始终保证会有十个容器在运行,反而杀死多余的。

Kubernetes角色组成:

1)Pod

Pod是kubernetes的最小操作单元,一个Pod可以由一个或多个容器组成;

同一个Pod只能运行在同一个主机上,共享相同的volumes、network、namespace;

2)ReplicationController(RC)

RC用来管理Pod,一个RC可以由一个或多个Pod组成,在RC被创建后,系统会根据定义好的副本数来创建Pod数量。在运行过程中,如果Pod数量小于定义的,就会重启停止的或重新分配Pod,反之则杀死多余的。当然,也可以动态伸缩运行的Pods规模或熟悉。

RC通过label关联对应的Pods,在滚动升级中,RC采用一个一个替换要更新的整个Pods中的Pod。

3)Service

Service定义了一个Pod逻辑集合的抽象资源,Pod集合中的容器提供相同的功能。集合根据定义的Label和selector完成,当创建一个Service后,会分配一个Cluster IP,这个IP与定义的端口提供这个集合一个统一的访问接口,并且实现负载均衡。

4)Label

Label是用于区分Pod、Service、RC的key/value键值对; 

Pod、Service、RC可以有多个label,但是每个label的key只能对应一个;

主要是将Service的请求通过lable转发给后端提供服务的Pod集合;

Kubernetes组件组成:

1)kubectl

客户端命令行工具,将接受的命令格式化后发送给kube-apiserver,作为整个系统的操作入口。

2)kube-apiserver

作为整个系统的控制入口,以REST API服务提供接口。

3)kube-controller-manager

用来执行整个系统中的后台任务,包括节点状态状况、Pod个数、Pods和Service的关联等。

4)kube-scheduler

负责节点资源管理,接受来自kube-apiserver创建Pods任务,并分配到某个节点。

5)etcd

负责节点间的服务发现和配置共享。

6)kube-proxy

运行在每个计算节点上,负责Pod网络代理。定时从etcd获取到service信息来做相应的策略。

7)kubelet

运行在每个计算节点上,作为agent,接受分配该节点的Pods任务及管理容器,周期性获取容器状态,反馈给kube-apiserver。

8)DNS

一个可选的DNS服务,用于为每个Service对象创建DNS记录,这样所有的Pod就可以通过DNS访问服务了。




一、准备工作

 systemctl disable firewalld 
 systemctl stop firewalld
 sed -i s'/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
 
 cat /etc/hosts
192.168.1.237 master
192.168.1.238 node1
192.168.1.239 node2


yum -y install ntpdate && ntpdate cn.pool.ntp.org
yum -y update && reboot


vi /etc/yum.repos.d/virt7-docker-common-release.repo
[virt7-docker-common-release]
name=virt7-docker-common-release
baseurl=http://cbs.centos.org/repos/virt7-docker-common-release/x86_64/os/
gpgcheck=0


yum install -y --enablerepo=virt7-docker-common-release etcd kubernetes ntp flannel


二、配置etcd
[root@bogon ~]# grep -v '^#' /etc/etcd/etcd.conf 
ETCD_NAME=k8s
ETCD_DATA_DIR="/data/etcd"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"


启动etcd
 systemctl daemon-reload
 systemctl enable etcd.service
 systemctl start etcd.service


查看服务状态
systemctl status -l etcd


etcd服务检查
[root@bogon ~]#  etcdctl cluster-health
[root@bogon ~]# etcdctl member list


etcd网络配置
 etcdctl set /k8s/network/config '{"Network": "10.255.0.0/16"}'
 etcdctl get /k8s/network/config


三、Master节点部署
配置kubernetes system config
[root@bogon ~]# grep -v '^#'  /etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://192.168.1.237:8080"


配置kuber-apiserver启动参数
[root@bogon ~]#grep -v '^#'  /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_API_ARGS=""




启动kube-api-servers服务
 systemctl daemon-reload
 systemctl enable kube-apiserver.service
 systemctl start kube-apiserver.service


验证服务
http://192.168.1.237:8080/healthz


部署kube-controller-manager服务
[root@bogon ~]#  cat /etc/kubernetes/controller-manager 
KUBE_CONTROLLER_MANAGER_ARGS=""


启动kube-controller-manager
 systemctl daemon-reload
 systemctl enable kube-controller-manager
 systemctl start kube-controller-manager


部署kube-scheduler服务
[root@bogon ~]# cat /etc/kubernetes/scheduler
KUBE_SCHEDULER_ARGS=""


启动kube-scheduler服务
 systemctl daemon-reload
 systemctl enable kube-scheduler
 systemctl start kube-scheduler


Node节点部署
[root@bogon ~]# grep -v '^#' /etc/sysconfig/flanneld 
FLANNEL_ETCD_ENDPOINTS="http://192.168.1.237:2379"
FLANNEL_ETCD_PREFIX="/k8s/network"
FLANNEL_OPTIONS="--iface=ens33"


启动flannel


 systemctl daemon-reload
 systemctl enable flanneld.service
 systemctl start flanneld.service
 注意启动flannel前要关闭docker这样flannel才会覆盖docker0网桥
  flanneld服务启动后就会根据etcd里面配置划分子网了,划分子网是给docker使用的,docker想使用还得折腾一翻,其实就是想办法把几个重要变量传过去,使docker启动时能够使用


注意启动docker前要使某些变量生效,需要:
 source /run/flannel/docker
 source /run/flannel/subnet.env


在node1上ping node2的docker0能通就标识正常


配置node1 kube-proxy
[root@bogon ~]#  grep -v '^#' /etc/kubernetes/config 
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://192.168.1.237:8080"


[root@bogon ~]#  grep -v '^#' /etc/kubernetes/proxy     
KUBE_PROXY_ARGS=""




配置node1 kubelet
[root@bogon ~]#  grep -v '^#' /etc/kubernetes/kubelet 


KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_HOSTNAME="--hostname-override=node1"
KUBELET_API_SERVER="--api-servers=http://192.168.1.237:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/pengg/nginx:latest"
KUBELET_ARGS=""


 systemctl daemon-reload
 systemctl enable kube-proxy.service
 systemctl start kube-proxy.service
 systemctl daemon-reload
 systemctl enable kubelet.service
 systemctl start kubelet.service


测试集群
[root@bogon ~]#  kubectl get nodes   
NAME      STATUS    AGE
node1     Ready     1h
node2     Ready     1h









发布了35 篇原创文章 · 获赞 5 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章