kubernetes 集群的安装部署
2016-08-17 17:38
736 查看
本文来自我的githubpages博客http://galengao.github.io/即www.gaohuirong.cn摘要:首先kubernetes得官方文档我自己看着很乱,信息很少,所以结合了很多博客搭建的其次因为既然用到docker,当然离不开kubernetes管理,还有swarm,前者管理复杂,但功能齐全这里仅仅是安装部署,还未使用,具体使用出现问题后续更新docker安装针对几个URLS做下简单的解释:[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、httpsETCD_LISTEN_CLIENT_URLS:该节点与客户端通信时监听的地址列表[cluster]ETCD_INITIAL_ADVERTISE_PEER_URLS:该成员节点在整个集群中的通信地址列表,这个地址用来传输集群数据的地址。因此这个地址必须是可以连接集群中所有的成员的。ETCD_INITIAL_CLUSTER:配置集群内部所有成员地址,其格式为:ETCD_NAME=ETCD_INITIAL_ADVERTISE_PEER_URLS,如果有多个使用逗号隔开ETCD_ADVERTISE_CLIENT_URLS:广播给集群中其他成员自己的客户端地址列表
至此etcd集群就部署完了,然后每个节点上启动前提条件
系统时centos7上关闭防火墙systemctlstopfirewalld.service关闭selinuxvi/etc/selinux/comfig主要组件说明
Kubernetes集群中主要存在两种类型的节点,分别是master节点,以及minion节点。Minion节点是实际运行Docker容器的节点,负责和节点上运行的Docker进行交互,并且提供了代理功能。Master节点负责对外提供一系列管理集群的API接口,并且通过和Minion节点交互来实现对集群的操作管理。apiserver:用户和kubernetes集群交互的入口,封装了核心对象的增删改查操作,提供了RESTFul风格的API接口,通过etcd来实现持久化并维护对象的一致性。scheduler:负责集群资源的调度和管理,例如当有pod异常退出需要重新分配机器时,scheduler通过一定的调度算法从而找到最合适的节点。controller-manager:主要是用于保证replicationController定义的复制数量和实际运行的pod数量一致,另外还保证了从service到pod的映射关系总是最新的。kubelet:运行在minion节点,负责和节点上的Docker交互,例如启停容器,监控运行状态等。proxy:运行在minion节点,负责为pod提供代理功能,会定期从etcd获取service信息,并根据service信息通过修改iptables来实现流量转发(最初的版本是直接通过程序提供转发功能,效率较低。),将流量转发到要访问的pod所在的节点上去。etcd:key-value键值存储数据库,用来存储kubernetes的信息的。flannel:Flannel是CoreOS团队针对Kubernetes设计的一个覆盖网络(OverlayNetwork)工具,需要另外下载部署。我们知道当我们启动Docker后会有一个用于和容器进行交互的IP地址,如果不去管理的话可能这个IP地址在各个机器上是一样的,并且仅限于在本机上进行通信,无法访问到其他机器上的Docker容器。Flannel的目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得同属一个内网且不重复的IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。部署规划
这里我用3台服务器搭建一个简单的集群:192.168.10.147#master节点(etcd,kubernetes-master)192.168.10.148#node节点(etcd,kubernetes-node,docker,flannel)192.168.10.149#node节点(etcd,kubernetes-node,docker,flannel)由于kubernetes的进程较多,每个节点上的进程如图:安装
1、分别先在两个node上安装docker安装方式参照我的另一篇文章yumupdate tee/etc/yum.repos.d/docker.repo<<EOF [dockerrepo] name=DockerRepository baseurl=https://yum.dockerproject.org/repo/main/centos/7/ enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg EOF yuminstalldocker-engine2、在master安装
yuminstallkubernetes-masteretcd-y3、分别在两个node上安装
yuminstallkubernetes-nodeetcdflannel-y4、etcd集群配置在master节点上编辑etcd配置文件
vi/etc/etcd/etcd.conf#[member]ETCD_NAME=etcd1ETCD_DATA_DIR="/var/lib/etcd/etcd1.etcd"#ETCD_WAL_DIR=""#ETCD_SNAPSHOT_COUNT="10000"#ETCD_HEARTBEAT_INTERVAL="100"#ETCD_ELECTION_TIMEOUT="1000"ETCD_LISTEN_PEER_URLS="http://192.168.10.147:2380"ETCD_LISTEN_CLIENT_URLS="http://192.168.10.147:2379,http://127.0.0.1:2379"CD_MAX_SNAPSHOTS="5"#ETCD_MAX_WALS="5"#ETCD_CORS=""##[cluster]ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.10.147:2380"#ifyouusedifferentETCD_NAME(e.g.test),setETCD_INITIAL_CLUSTERvalueforthisname,i.e."test=http://..."ETCD_INITIAL_CLUSTER="etcd1=http://192.168.10.147:2380,etcd2=http://192.168.10.148:2380,etcd3=http://192.168.10.149:2380"#ETCD_INITIAL_CLUSTER_STATE="new"#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"ETCD_ADVERTISE_CLIENT_URLS="http://192.168.10.147:2379"#ETCD_DISCOVERY=""#ETCD_DISCOVERY_SRV=""#ETCD_DISCOVERY_FALLBACK="proxy"#ETCD_DISCOVERY_PROXY=""##[proxy]#ETCD_PROXY="off"#ETCD_PROXY_FAILURE_WAIT="5000"#ETCD_PROXY_REFRESH_INTERVAL="30000"#ETCD_PROXY_DIAL_TIMEOUT="1000"#ETCD_PROXY_WRITE_TIMEOUT="5000"#ETCD_PROXY_READ_TIMEOUT="0"##[security]#ETCD_CERT_FILE=""#ETCD_KEY_FILE=""#ETCD_CLIENT_CERT_AUTH="false"#ETCD_TRUSTED_CA_FILE=""#ETCD_PEER_CERT_FILE=""#ETCD_PEER_KEY_FILE=""#ETCD_PEER_CLIENT_CERT_AUTH="false"#ETCD_PEER_TRUSTED_CA_FILE=""##[logging]#ETCD_DEBUG="false"#examplesfor-log-package-levelsetcdserver=WARNING,security=DEBUG#ETCD_LOG_PACKAGE_LEVELS=""在node1上编辑配置文件
vi/etc/etcd/etcd.conf#[member]ETCD_NAME=etcd2ETCD_DATA_DIR="/var/lib/etcd/etcd2"#ETCD_WAL_DIR=""#ETCD_SNAPSHOT_COUNT="10000"#ETCD_HEARTBEAT_INTERVAL="100"#ETCD_ELECTION_TIMEOUT="1000"ETCD_LISTEN_PEER_URLS="http://192.168.10.148:2380"ETCD_LISTEN_CLIENT_URLS="http://192.168.10.148:2379,http://127.0.0.1:2379"#ETCD_MAX_SNAPSHOTS="5"#ETCD_MAX_WALS="5"#ETCD_CORS=""##[cluster]ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.10.148:2380"#ifyouusedifferentETCD_NAME(e.g.test),setETCD_INITIAL_CLUSTERvalueforthisname,i.e."test=http://..."ETCD_INITIAL_CLUSTER="etcd1=http://192.168.10.147:2380,etcd2=http://192.168.10.148:2380,etcd3=http://192.168.10.149:2380"#ETCD_INITIAL_CLUSTER_STATE="new"#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"ETCD_ADVERTISE_CLIENT_URLS="http://192.168.10.148:2379"#ETCD_DISCOVERY=""#ETCD_DISCOVERY_SRV=""#ETCD_DISCOVERY_FALLBACK="proxy"#ETCD_DISCOVERY_PROXY=""##[proxy]#ETCD_PROXY="off"#ETCD_PROXY_FAILURE_WAIT="5000"#ETCD_PROXY_REFRESH_INTERVAL="30000"#ETCD_PROXY_DIAL_TIMEOUT="1000"#ETCD_PROXY_WRITE_TIMEOUT="5000"#ETCD_PROXY_READ_TIMEOUT="0"##[security]#ETCD_CERT_FILE=""#ETCD_KEY_FILE=""#ETCD_CLIENT_CERT_AUTH="false"#ETCD_TRUSTED_CA_FILE=""#ETCD_PEER_CERT_FILE=""#ETCD_PEER_KEY_FILE=""#ETCD_PEER_CLIENT_CERT_AUTH="false"#ETCD_PEER_TRUSTED_CA_FILE=""##[logging]#ETCD_DEBUG="false"#examplesfor-log-package-levelsetcdserver=WARNING,security=DEBUG#ETCD_LOG_PACKAGE_LEVELS=""在node2上编辑配置文件
vi/etc/etcd/etcd.conf#[member]ETCD_NAME=etcd3ETCD_DATA_DIR="/var/lib/etcd/etcd3"#ETCD_WAL_DIR=""#ETCD_SNAPSHOT_COUNT="10000"#ETCD_HEARTBEAT_INTERVAL="100"#ETCD_ELECTION_TIMEOUT="1000"ETCD_LISTEN_PEER_URLS="http://192.168.10.149:2380"ETCD_LISTEN_CLIENT_URLS="http://192.168.10.149:2379,http://127.0.0.1:2379"#ETCD_MAX_SNAPSHOTS="5"#ETCD_MAX_WALS="5"#ETCD_CORS=""##[cluster]ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.10.149:2380"#ifyouusedifferentETCD_NAME(e.g.test),setETCD_INITIAL_CLUSTERvalueforthisname,i.e."test=http://..."ETCD_INITIAL_CLUSTER="etcd1=http://192.168.10.147:2380,etcd2=http://192.168.10.148:2380,etcd3=http://192.168.10.149:2380"#ETCD_INITIAL_CLUSTER_STATE="new"#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"ETCD_ADVERTISE_CLIENT_URLS="http://192.168.10.149:2379"#ETCD_DISCOVERY=""#ETCD_DISCOVERY_SRV=""#ETCD_DISCOVERY_FALLBACK="proxy"#ETCD_DISCOVERY_PROXY=""##[proxy]#ETCD_PROXY="off"#ETCD_PROXY_FAILURE_WAIT="5000"#ETCD_PROXY_REFRESH_INTERVAL="30000"#ETCD_PROXY_DIAL_TIMEOUT="1000"#ETCD_PROXY_WRITE_TIMEOUT="5000"#ETCD_PROXY_READ_TIMEOUT="0"##[security]#ETCD_CERT_FILE=""#ETCD_KEY_FILE=""#ETCD_CLIENT_CERT_AUTH="false"#ETCD_TRUSTED_CA_FILE=""#ETCD_PEER_CERT_FILE=""#ETCD_PEER_KEY_FILE=""#ETCD_PEER_CLIENT_CERT_AUTH="false"#ETCD_PEER_TRUSTED_CA_FILE=""##[logging]#ETCD_DEBUG="false"#examplesfor-log-package-levelsetcdserver=WARNING,security=DEBUG#ETCD_LOG_PACKAGE_LEVELS=""
systemctlstartkube-apiserver
验证:
[root@k8s1~]#etcdctlcluster-healthmember35300bfb5308e02cishealthy:gothealthyresultfromhttp://192.168.10.147:2379member776c306b60e6f972ishealthy:gothealthyresultfrom http://192.168.10.149:2379membera40f86f061be3fbeishealthy:gothealthyresultfrom 'target='_blank'>http://192.168.10.148:2379[/code]5、kubernetesmaster安装修改apiserver配置文件 [root@k8s1~]#vi/etc/kubernetes/apiserver####kubernetessystemconfig##Thefollowingvaluesareusedtoconfigurethekube-apiserver##Theaddressonthelocalservertolistento.#KUBE_API_ADDRESS="--insecure-bind-address=127.0.0.1"KUBE_API_ADDRESS="--address=0.0.0.0"#Theportonthelocalservertolistenon.KUBE_API_PORT="--port=8080"#PortminionslistenonKUBELET_PORT="--kubelet-port=10250"#CommaseparatedlistofnodesintheetcdclusterKUBE_ETCD_SERVERS="--etcd-servers=http://192.168.10.147:2379,http://192.168.10.148:2379,http://192.168.10.149:2379"#AddressrangetouseforservicesKUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"#defaultadmissioncontrolpoliciesKUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"#Addyourown!KUBE_API_ARGS=""配置controller-manager暂时不做修改[root@k8s1etcd]#vi/etc/kubernetes/controller-manager####Thefollowingvaluesareusedtoconfigurethekubernetescontroller-manager#defaultsfromconfigandapiservershouldbeadequate#Addyourown!KUBE_CONTROLLER_MANAGER_ARGS=""启动Master上的三个服务systemctlstartkube-apiserversystemctlstartkube-controller-managersystemctlstartkube-schedulersystemctlenablekube-apiserversystemctlenablekube-controller-managersystemctlenablekube-scheduler6、kubernetesnode安装部署修改节点config配置文件[root@k8s1~]#vi/etc/kubernetes/config####kubernetessystemconfig##Thefollowingvaluesareusedtoconfigurevariousaspectsofall#kubernetesservices,including##kube-apiserver.service#kube-controller-manager.service#kube-scheduler.service#kubelet.service#kube-proxy.service#loggingtostderrmeanswegetitinthesystemdjournalKUBE_LOGTOSTDERR="--logtostderr=true"#journalmessagelevel,0isdebugKUBE_LOG_LEVEL="--v=0"#ShouldthisclusterbeallowedtorunprivilegeddockercontainersKUBE_ALLOW_PRIV="--allow-privileged=false"#Howthecontroller-manager,scheduler,andproxyfindtheapiserverKUBE_MASTER="--master=http://192.168.10.147:8080"~修改kubelet配置[root@k8s1~]#vi/etc/kubernetes/kubelet####kuberneteskubelet(minion)config#Theaddressfortheinfoservertoserveon(setto0.0.0.0or""forallinterfaces)KUBELET_ADDRESS="--address=127.0.0.1"#Theportfortheinfoservertoserveon#KUBELET_PORT="--port=10250"#YoumayleavethisblanktousetheactualhostnameKUBELET_HOSTNAME="--hostname-override=192.168.10.148"#locationoftheapi-serverKUBELET_API_SERVER="--api-servers=http://192.168.10.147:8080"#podinfrastructurecontainerKUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"#Addyourown!KUBELET_ARGS=""分别启动kubernetesnode服务systemctlstartkubeletsystemctlstartkube-proxysystemctlenablekubeletsystemctlenablekube-proxy网络配置
这里网络部分是以插件的形式配置在kubernetes集群中,这里选用flannel。1、安装flannel上述步骤已经在node上安装yuminstallflannel-y2、配置flannel[root@k8s1~]#vi/etc/sysconfig/flanneldFLANNEL_ETCD_KEY="/atomic.io#Flanneldconfigurationoptions#etcdurllocation.PointthistotheserverwhereetcdrunsFLANNEL_ETCD="http://192.168.10.147:2379"#etcdconfigkey.Thisistheconfigurationkeythatflannelqueries#ForaddressrangeassignmentFLANNEL_ETCD_KEY="/coreos.com/network"#Anyadditionaloptionsthatyouwanttopass#FLANNEL_OPTIONS=""3、为flannel创建分配的网络#只在master上etcd执行etcdctlmk/coreos.com/network/config'{"Network":"10.1.0.0/16"}'#若要重新建,先删除etcdctlrm/coreos.com/network/--recursive重置docker0网桥的配置删除docker启动时默认创建的docker0网桥,flannel启动时会获取到一个网络地址,并且配置docker0的IP地址,作为该网络的网关地址,如果此时docker0上配置有IP地址,那么flannel将会启动失败。 iplinkdeldocker0
检查
在master上执行下面,检查kubernetes的状态[root@k8s1~]#kubectlgetnodesNAMESTATUSAGE192.168.10.148Ready3h192.168.10.149Ready3h在master上执行下面,检查etcd的状态
[root@k8s1~]#etcdctlmemberlist35300bfb5308e02c:name=etcd1peerURLs=http://192.168.10.147:2380clientURLs=http://192.168.10.147:2379776c306b60e6f972:name=etcd3peerURLs=http://192.168.10.149:2380clientURLs=http://192.168.10.149:2379a40f86f061be3fbe:name=etcd2peerURLs=http://192.168.10.148:2380clientURLs=http://192.168.10.148:2379