前言
随着 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;
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于