kubernetes介绍
前言
随着docker的火热,kubernetes也跟随着火爆起来。kubernetes是google基于go语言开发的容器编排工具。可用于容器集群的管理工作,kubernetes集成了google十几年的容器使用经验,所有其在各方面都远超其他容器编排工具。通过kubernetes可以实现多个容器节点的管理,比如健康状态检测,批量创建容器等操作。
kubernetes介绍
kubernetes由如下组件组成:
-
master节点
apiserver:用于接收管理员发送的指令,可以通过cli,ui和api调用的方式来使用;
scheduler:用于pod的编排调度,根据api收到的指令进行相关调度。在kubernetes中pod的数量是管理指定的,比如管理员指定nginx pod的数量为2,则scheduler会在多个minion上进行pod的调度,当pod的数量小于2的时候,不如某一minion宕机导致pod数量不够,则scheduler会自动在其他minion节点上创建pod;
replication controller:根据scheduler的指令,比如在哪个minion节点创建pod等进行工作,是pod的实际操作组件; -
minion节点
kubelet:用于和master节点进行交互;
proxy:用于对外提供服务,用户通过proxy访问到提供服务的容器;
pod:在kubernetes中的最小单位为pod,一个pod是由多个容器组成的,一个pod内的所有容器共享同一组ip,端口和卷等信息,同一组pod内的容器通过IPC进行通信;
cadvisor:用于收集pod运行时候的资源数据等信息;
labels:pod的标签,方便pod的引用;
container:容器,可以是docker,rkt,cri-o,frakti等各种容器服务提供组件;
在kubernetes中还有一个很重要的概念叫做service,一个service是多个pod的组合,用于对外提供实际服务。如通过kubernetes部署一个lnmp的集群,那么其对外提供的服务就是网站的访问,不过提供这个服务还需要nginx,mysql和php,其中ningx和mysql,php都是一组pod,所以说一个service是由多个pod组成的。
kubernetes集群的部署
本文采用三台虚拟机进行部署,一台为master节点,另外两台为minion节点:
master节点部署软件:
- etcd:一个分布式k/v键值存储,kubernetes集群的信息需要存储到etcd中,建议采用分布式集群的方式部署,防止单点故障。etcd是无中心节点的分布式k/v存储,任何一台宕机都不会影响其他etcd的正常运行;
- kubernetes master:用于进行minion的管理;
- flannel:分布在不同minion上的pod需要通过overlay的方式进行通信,否则就需要暴露端口,这样非常不安全,flannel提供了overlay的方式;
minion节点部署软件: - docker:用于运行容器;
- kubernetes-node:用于接收master的管理,运行pod等;
- flannel
注意:
所有的kubernetes集群节点都需要管理iptables和firewalld服务,因为kubernetes会自动进行iptables的管理工作;
主机之间建议通过主机名来进行通信,可以搭建DNS或者修改hosts文件;
实验步骤
master节点部署:
- 安装程序:
yum install -y kubernetes-master etcd flannel
- 修改配置文件:
#kubernetes配置文件修改,配置文件都为于/etc/kubernetes目录下#
#修改apiserver#
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" #指定API监听的地址,因为需要和minion节点通信,所以监听到本机所有地址或者外网地址#
KUBE_API_PORT="--port=8080" #监听端口,默认为8080#
KUBE_ETCD_SERVERS="--etcd-servers=http://etcd1:2379" #etcd的地址和端口,因为kubernetes需要往etcd中写入数据#
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
#修改config全局配置文件#
KUBE_MASTER="--master=http://node1:8080" #只需要修改此项,指定master的地址#
#修改etcd配置文件,位于/etc/etcd/#
#修改etcd.conf文件#
# [member]
ETCD_NAME=etcd1 #指定etcd的名字,此处需要和kubernetes的apiserver中的名字一致#
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#ETCD_WAL_DIR=""
#ETCD_SNAPSHOT_COUNT="10000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
#ETCD_LISTEN_PEER_URLS="http://192.168.11.200:2380"
ETCD_LISTEN_CLIENT_URLS="http://master:2379" #用于和etcd通信的客户端列表,多个之间用逗号隔开#
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
#ETCD_CORS=""
#[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://master:2380" #集群内各成员用于通信的url#
# 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=http://etcd1:2380" #etcd启动时的初始化集群配置,构建过节点的etcd集群需要让各节点的端口监听在一个外网地址#
#ETCD_INITIAL_CLUSTER_STATE="new"
#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://master:2379" #etcd节点用于对外通信的地址和端口#
#ETCD_DISCOVERY=""
#ETCD_DISCOVERY_SRV=""
#ETCD_DISCOVERY_FALLBACK="proxy"
#ETCD_DISCOVERY_PROXY=""
#ETCD_STRICT_RECONFIG_CHECK="false"
#ETCD_AUTO_COMPACTION_RETENTION="0"
- 配置完成之后启动各项服务
#启动etcd服务#
systemctl start etcd
etcdctl -C http://master:2379 member list #查看集群内各节点信息#
etcdctl -C http://master:2379 cluster-healty #查看集群的健康状态信息#
#启动kubernetes master服务#
systemctl start kube-apiserver kube-scheduler kube-controller-manager
minion节点部署
- 安装各软件包
yum install docker flannel kubernetes-node
- 修改配置文件
#修改各配置文件,位于/etc/kubernetes#
#修改全局配置文件config#
KUBE_MASTER="--master=http://node1:8080" #修改此项即可,指定master的地址和端口#
#修改kubelet的配置#
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_HOSTNAME="--hostname-override=node2" #指定本机的hostname#
KUBELET_API_SERVER="--api-servers=http://192.168.11.200:8080" #指定master-apiserver的地址和端口#
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
- 启动服务
systemctl start docker kube-proxy kubelet
测试
- 在master节点通过kubectl命令可以进行pod的创建,删除等各种操作
kubectl get nodes #获取kubernetes的所有节点信息#
kubectl cluster-info #获取集群信息#
- 创建pod进行测试
kubectl run centos7 --image=centos --replicas=2 -it #用于通过docker hub中的centos:latest镜像创建一个名为centos7的pod,--replicas表示2副本,-it表示直接连接到pod中去#
kubectl get pods #获取集群中所有的pods信息#
kubectl get deployment #获取集群中所有的部署资源#
- 此时在minion节点通过docker ps -a命令就可以看到已经有pod运行了
注意:
kubernetes创建pod的时候默认会从docker hub中去获取image,如果没有指定tag则会获取latest版本;
执行run操作之后会随机在某一个minion上运行pod,当pod数量达不到--replicas指定数量的时候,比如某一minion节点宕机则会自动在其他minion节点通过image自动生成一个新的pod;