简介:
k8s一个开源的,跨主机管理容器应用集群的编排系统,为应用提供了基础的部署、维护和扩缩容机制。
- 编排:跨Docker主机同一管理容器集群。
- 目的
- 简化开发和运维容器集群的工作。
- 让开发和运维能把这个系统当一台电脑看待。
- 特点:没有资源调度算法,只关注容器的管理。
核心概念:
Cluster,即集群:虚拟机或者物理机的一组集合,运行着Kubernetes
- ETCD
- 一个分布式强一致性的key/value存储
- 可理解为一个存储k8s信息的数据库
- Node
- 工作节点,运行Master节点交付的任务
- 能运行一个或多个Pods
- 运行的组件
- Kubelet
- 管理容器的守护进程
- 管理Docker主机来启动容器的管理程序
- 定期从etcd获取分配到本机的pod信息,启动或停止容器
- 接收apiserver的HTTP请求,汇报pod的运行状态
- Proxy
- 服务发现(IP寻址)
- 定期从etcd获取所有的service根据service信息创建代理
- 客户pod访问其他pod都经过proxy转发
- Kubelet
- Master
- 提供了集群统一视图的中心控制点
- 一个Master节点来控制多个Node节点
- 运行的组件
- API Server
- 对操作对象的增删改查
- 提供RESTful K8s API接口
- 校验和配置Pod、Service和Replication Controller
- 统一管理集群系统的入口
- Scheduler
- 资源调度
- 为新建的pod分配机器
- Controller-Manager
- 容错处理
- 扩容、缩容
- 负责执行各种控制器
- endpoint-controller
- 定期关联service和pod(关联信息由endpoint对象维护),保证service到pod的映射总是最新的
- replication-controller
- 定期关联replicationController和pod,保证定义的复制数量与实际运行pod的数量总是一致的
- endpoint-controller
- API Server
可操作对象
- Pod:k8s上可创建、调度和管理的最小单位,是一个或一组拥有共享卷的容器集
- Replication Controller:管理着Pod的生命周期,建议创建Pod都是用rc,他会确保任何时刻Pod的数量都维持在一个特殊设定的值
- Service:基本的负载均衡器,为外部某提供一组Pod的一个稳定操作接口
其他概念
- Label:通过键值对的方式组织和选择操作对象,使用户自定义的标识
- Annotation:同样是存储管理键值对,相对比Label更大,通常是人类不可识别的非标识的数据
- Selector:通过匹配Label来确定相关的资源
- Volume:是一个文件目录,可以当成容器文件系统的一部分,是建立在Docker的Volume基础上的
- Secret:存储敏感的数据并可以被容器所访问
- Name:用户赋予一个资源的名称
- Namespace:命名空间以免相同的Name冲突
由于网上的许多资料都是旧版本的配置方式,和新版的v1不兼容,而且Google官方的文档会涉及到一些被墙的网站,所以即使部署成功了也可能出现无法启动pod的情况,所以尝试了各种配置方式整理出一份符合当前版本和环境的部署文档以供参考。
部署过程:
三台机器配置(皆为Centos7系统):
主机名 | IP | 角色配置 |
master | 172.16.71.133 | 主节点,运行kube-apiserver、kube-controller-manager、kube-scheduler和etcd |
minion1 | 172.16.71.129 | 子节点,运行kubelet、kube-proxy |
monion2 | 172.16.71.132 | 子节点,运行kubelet、kube-proxy |
master节点
安装k8s主节点套件:
sudo yum -y install kubernetes-master
安装ETCD:
sudo yum -y install http://cbs.centos.org/kojifiles/packages/etcd/0.4.6/7.el7.centos/x86_64/etcd-0.4.6-7.el7.centos.x86_64.rpm
minion1-2
安装k8s从节点套件:
sudo yum -y install kubernetes-node
关闭防火墙(或者开放指定端口):
sudo systemctl stop firewalld
sudo systemctl disable firewalld
三台机器都将各自的IP和HostName的映射关系写入/etc/hosts文件中。
echo "172.16.71.133 master
172.16.71.129 minion1
172.16.71.132 monion2" >> /etc/hosts
修改配置文件:
master:
sudo vim /etc/kubernetes/config
修改为以下内容:
#配置ETCD服务地址和端口
KUBE_ETCD_SERVERS="--etcd-servers=http://master:4001"
#日志设置
KUBE_LOGTOSTDERR="--logtostderr=true"
#日志级别设置
KUBE_LOG_LEVEL="--v=0"
#是否运行运行特殊的Docker容器
KUBE_ALLOW_PRIV="--allow_privileged=false"
sudo vim /etc/kubernetes/apiserver
#Matser监听的IP,当前设置表示所有地址
KUBE_API_ADDRESS="--address=0.0.0.0"
#监听地址的端口
KUBE_API_PORT="--port=8080"
#主节点的地址,主要为replication controller和scheduler可以顺利找到apiserver
KUBE_MASTER="--master=http://master:8080"
#从节点上kubelet进程监听的端口号
KUBELET_PORT="--kubelet_port=10250"
#service可以分配的IP地址范围
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
#一些自定义配置
KUBE_API_ARGS=""
ETCD保持默认配置即可(默认为监听4001端口)
minion1-2:
sudo vim /etc/kubernetes/config
#基本和Master的config文件一致
KUBE_ETCD_SERVERS="--etcd-servers=http://master:4001"
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow_privileged=false"
#Master的config文件中没有此配置,但是子节点要有,如果没有的话kube-proxy会找不到主节点而一致报错
KUBE_MASTER="--master=http://master:8080"
sudo vim /etc/kubernetes/kubelet
#kubelet监听的地址,当前设置表示全部
KUBELET_ADDRESS="--address=0.0.0.0"
#kubelet监听的端口号
KUBELET_PORT="--port=10250"
#设置在Master节点显示的主机名
KUBELET_HOSTNAME="--hostname_override=minion1"
#Master节点的apiserver地址
KUBELET_API_SERVER="--api_servers=http://master:8080"
#自定义设置
KUBELET_ARGS=""
启动服务:
master:
sudo for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; do
systemctl restart $SERVICES
systemctl enable $SERVICES
systemctl status $SERVICES
done
minion1-2:
sudo for SERVICES in kube-proxy kubelet docker; do
systemctl restart $SERVICES
systemctl enable $SERVICES
systemctl status $SERVICES
done
之后观察各个节点上的各自进程状态信息可以确认是否正确启动集群。
简单操作测试:
以下操作均在Master节点上进行:
#启动一个pod,其中包括一个nginx容器,这个pod有两份副本,开放的端口为80
kubectl run my-nginx --image=nginx --replicas=2 --port=80
#查看当前运行的pod
kubectl get pods
此时pod的状态会一直是pending(等待),包括containner is creating或者image is not ready on node等异常,这是因为k8s创建pod的时候需要起一个基本容器,而这个镜像的地址被墙了访问不到,所以会导致创建pod成功,运行失败的情况。
解决方法:
从可以访问的Docker Hub上pull这个镜像,重新tag为制定的Image名称即可
docker pull docker.io/kubernetes/pause
docker tag kubernetes/pause gcr.io/google_containers/pause:0.8.0
docker tag gcr.io/google_containers/pause:0.8.0 gcr.io/google_containers/pause
#删除pod
kubectl delete pod ${podName}
由于设置了两份副本,所以删除pod的时候,k8s会迅速起另外一个一模一样的pod以保持副本数量为2不变。
要彻底删除pod,只能删除创建它的replication controller
#查看replication controller
kubectl get rc
#删除replication controller
kubectl delete rc ${rcName}
删除rc之后,其创建的pod会一并删除