kubernetes核心概念总结和手动集群部署实践 之一
来源:互联网 发布:java正则表达式$ 编辑:程序博客网 时间:2024/05/20 06:24
基础架构
Master
Master节点上面主要由四个模块组成,APIServer,schedule,controller manager, etcd.
APIServer: APIServer负责对外提供RESTful的kubernetes API的服务,它是系统管理指令的统一接口,任何对资源的增删该查都要交给APIServer处理后再交给etcd,如图,kubectl(kubernetes提供的客户端工具,该工具内部是对kubernetes API的调用)是直接和APIServer交互的。
schedule: schedule负责调度Pod到合适的Node上,如果把scheduler看成一个黑匣子,那么它的输入是pod和由多个Node组成的列表,输出是Pod和一个Node的绑定。 kubernetes目前提供了调度算法,同样也保留了接口。用户根据自己的需求定义自己的调度算法。
controller manager: 如果APIServer做的是前台的工作的话,那么controller manager就是负责后台的。每一个资源都对应一个控制器。而control manager就是负责管理这些控制器的,比如我们通过APIServer创建了一个Pod,当这个Pod创建成功后,APIServer的任务就算完成了。
etcd: etcd是一个高可用的键值存储系统,kubernetes使用它来存储各个资源的状态,从而实现了Restful的API。
Node
每个Node节点主要由三个模板组成:kublet, kube-proxy, runtime
runtime: runtime值的是容器的运行环境,目前kubernetes支持docker和rtk两种容器。
kube-proxy: 该模块实现了kubernetes中的服务发现和反向代理功能。kube-proxy支持TCP和UDP连接转发,默认基Round Robin算法将客户端流量转发到与service对应的一组后端pod。服务发现方面,kube-proxy使用etcd的watch机制监控集群中service和endpoint对象数据的动态变化,并且维护一个service到endpoint的映射关系,从而保证了后端pod的IP变化不会对访问者造成影响,另外,kube-proxy还支持session affinity。
kublet:kublet是Master在每个Node节点上面的agent,是Node节点上面最重要的模块,它负责维护和管理该Node上的所有容器,但是如果容器不是通过kubernetes创建的,它并不会管理。本质上,它负责使Pod的运行状态与期望的状态一致。
kubernetes 手动部署
两台Ubuntu16.04服务器:ip分别为 Master: 192.168.186.132 和 Node:192.168.186.150。
- Kubernetes version:1.5.5, client & server, https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG.md#downloads-for-v155 , 将可执行文件kubernetes目录下,server和client目中的kube-apiserver、kube-controller-manager、kubectl、kubelet、kube-proxy、kube-scheduler等都拷贝到/usr/bin/目录中。
- etcd Version: 2.3.1, https://github.com/coreos/etcd/releases/tag/v2.2.1, 将etcd的可执行文件etcd和etcdctl拷贝到/usr/bin/目录。
- docker version: 17.05.0
kubernetes Master 配置
etcd配置
创建数据目录:
$ sudo mkdir -p /var/lib/etcd/
创建配置目录和文件:
$ sudo mkdir -p /etc/etcd $ sudo vim /etc/etcd/etcd.conf ETCD_NAME=default ETCD_DATA_DIR="/var/lib/etcd/" ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" ETCD_ADVERTISE_CLIENT_URLS="http://192.168.186.132:2379"
创建systemd文件:
$ sudo vim /lib/systemd/system/etcd.service [Uint] cription=Etcd Server Documentation=https://github.com/coreos/etcd After=network.target [Service] User=root Type=notify EnvironmentFile=-/etc/etcd/etcd.conf ExecStart=/usr/bin/etcd Restart=on-failure RestartSec=10s LimitNOFILE=40000 [Install] WantedBy=multi-user.target
启动服务:
$ sudo systemctl daemon-reload $ sudo systemctl enable etcd $ sudo systemctl start etcd
测试服务端口:
$ sudo systemctl status etcd
如果部署的是etcd集群,那么每台etcd服务器上都需要执行类似: $ etcdctl set /coreos.com/network/config ‘{ “Network”: “192.168.4.0/24” }’
创建Kubernetes配置目录
Kubernetes通用配置文件/etc/kubernetes/config文件中,存储的是Kubernetes各组件的通用配置信息。
$ sudo mkdir /etc/kubernetes $ sudo vim /etc/kubernetes/config KUBE_LOGTOSTDERR="--logtostderr=true" KUBE_LOG_LEVEL="--v=0" KUBE_ALLOW_PRIV="--allow-privileged=false" KUBE_MASTER="--master=http://192.168.186.132:8080"
配置kube-apiserver服务
kube-apiserver的专用配置文件为/etc/kubernetes/apiserver。
$ sudo vim /etc/kubernetes/apiserver # kubernetes system config # # The following values are used to configure the kube-apiserver # # The address on the local server to listen to. KUBE_API_ADDRESS="--address=0.0.0.0" #KUBE_API_ADDRESS="--insecure-bind-address=127.0.0.1" # The port on the local server to listen on. KUBE_API_PORT="--port=8080" # Port minions listen on KUBELET_PORT="--kubelet-port=10250" # Comma separated list of nodes in the etcd cluster KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.186.132:2379" # Address range to use for services KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=192.168.4.0/24" # default admission control policies KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota" # Add your own! KUBE_API_ARGS=""
一些启动参数如下:
- –etcd_servers: 指定etcd服务的URL
- –insecure-bind-address: apiserver绑定主机的非安全端口,设置0.0.0.0表示绑定所有IP地址
- –insecure-port: apiserver绑定主机的非安全端口号,默认为8080
- –service-cluster-ip-range: Kubernetes集群中service的虚拟IP地址范围,以CIDR表示,该IP范围不能与物理机的真实IP段有重合。
- –service-node-port-range: kubernetes集群中Service可映射的物理机端口号范围,默认为30000–32767.
- –admission_control: kubernetes集群的准入控制设置,各控制模块以插件的形式依次生效
- –logtostderr: 设置为false表示将日志写入文件,不写入stderr
- –log-dir: 日志目录
- –v: 日志级别
创建systemd文件
$ sudo vim /lib/systemd/system/kube-apiserver.service [Unit] Description=Kubernetes API Server Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=network.target After=etcd.service Wants=etcd.service [Service] User=root EnvironmentFile=-/etc/kubernetes/config EnvironmentFile=-/etc/kubernetes/apiserver ExecStart=/usr/bin/kube-apiserver \ $KUBE_LOGTOSTDERR \ $KUBE_LOG_LEVEL \ $KUBE_ETCD_SERVERS \ $KUBE_API_ADDRESS \ $KUBE_API_PORT \ $KUBELET_PORT \ $KUBE_ALLOW_PRIV \ $KUBE_SERVICE_ADDRESSES \ $KUBE_ADMISSION_CONTROL \ $KUBE_API_ARGS Restart=on-failure Type=notify LimitNOFILE=65536 [Install] WantedBy=multi-user.target
配置kube-controller-manager服务
创建kube-controller-manager配置文件,kube-controller-manager的专用配置文件为/etc/kubernetes/controller-manag
$ sudo vim /etc/kubernetes/controller-manager KUBE_CONTROLLER_MANAGER_ARGS=""
创建systemd文件
[Unit] Description=Kubernetes Controller Manager Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=etcd.service After=kube-apiserver.service Requires=etcd.service Requires=kube-apiserver.service [Service] User=root EnvironmentFile=-/etc/kubernetes/config EnvironmentFile=-/etc/kubernetes/controller-manager ExecStart=/usr/bin/kube-controller-manager \ $KUBE_LOGTOSTDERR \ $KUBE_LOG_LEVEL \ $KUBE_MASTER \ $KUBE_CONTROLLER_MANAGER_ARGS Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target
配置kube-scheduler服务
kube-scheduler的专用配置文件为/etc/kubernetes/schedule
$ sudo vim /etc/kubernetes/scheduler KUBE_SCHEDULER_ARGS=""
创建systemd文件
$ sudo vim /lib/systemd/system/kube-scheduler.service [Unit] Description=Kubernetes Scheduler Documentation=https://github.com/kubernetes/kubernetes [Service] User=root EnvironmentFile=-/etc/kubernetes/config EnvironmentFile=-/etc/kubernetes/scheduler ExecStart=/usr/bin/kube-scheduler \ $KUBE_LOGTOSTDERR \ $KUBE_MASTER Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target
配置完成后,按顺序启动Kubernetes master节点的服务:
$ sudo systemctl daemon-reload $ sudo systemctl enable kube-apiserver kube-controller-manager kube-scheduler $ sudo systemctl start kube-apiserver kube-controller-manager kube-scheduler
通过systemctl status来验证服务的启动状态,”running”表示启动成功。
Kubernetes node配置
配置kubelet服务
kublet服务依赖docker服务。创建kubelet的数据目录
$ sudo mkdir /var/lib/kubelet
创建kubelete配置文件,kubelet的专用配置文件为/etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=127.0.0.1" KUBELET_HOSTNAME="--hostname-override=192.168.186.150" KUBELET_API_SERVER="--api-servers=http://192.168.186.132:8080" # pod infrastructure container KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest" KUBELET_ARGS="--enable-server=true --enable-debugging-handlers=true"
一些的启动参数如下:
* –api-servers: 指定apiserver的URL地址,可以指定多个
* –hostname-override: 设置本Node的名称
* –logtostderr: 设置为false表示将日志写入文件,不写入stderr
* –log-dir: 日志目录
* –v: 日志级别
创建systemd文件
$ sudo vim /lib/systemd/system/kubelet.service [Unit] Description=Kubernetes Kubelet Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=docker.service Requires=docker.service [Service] WorkingDirectory=/var/lib/kubelet EnvironmentFile=-/etc/kubernetes/config EnvironmentFile=-/etc/kubernetes/kubelet ExecStart=/usr/bin/kubelet \ $KUBE_LOGTOSTDERR \ $KUBE_LOG_LEVEL \ $KUBELET_API_SERVER \ $KUBELET_ADDRESS \ $KUBELET_PORT \ $KUBELET_HOSTNAME \ $KUBE_ALLOW_PRIV \ $KUBELET_POD_INFRA_CONTAINER \ $KUBELET_ARGS Restart=on-failure KillMode=process [Install] WantedBy=multi-user.target
启动kubelet服务
$ sudo systemctl daemon-reload $ sudo systemctl enable kubelet $ sudo systemctl start kubelet
创建kube-proxy配置文件
kube-proxy的专用配置文件为/etc/kubernetes/proxy
$ sudo vim /etc/kubernetes/proxy # kubernetes proxy config # default config should be adequate # Add your own! KUBE_PROXY_ARGS=""
创建systemd文件
$ sudo vim /lib/systemd/system/kube-proxy.service [Unit] Description=Kubernetes Proxy Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=network.target [Service] EnvironmentFile=-/etc/kubernetes/config EnvironmentFile=-/etc/kubernetes/proxy ExecStart=/usr/bin/kube-proxy \ $KUBE_LOGTOSTDERR \ $KUBE_LOG_LEVEL \ $KUBE_MASTER \ $KUBE_PROXY_ARGS Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target
启动kube-proxy服务
$ sudo systemctl daemon-reload $ sudo systemctl enable kube-proxy $ sudo systemctl start kube-proxy
kublet默认采用向Master自动注册本Node的机制,在Master上查看个Node的状态,状态为Ready标识Node已经成功注册并且状态可用。
$ kubectl get nodesNAME STATUS AGE VERSION192.168.186.150 Ready 6h v1.5.5
- kubernetes核心概念总结和手动集群部署实践 之一
- Kubernetes核心概念总结
- Kubernetes核心概念总结
- Kubernetes核心概念总结
- 基于Kubernetes的Spark集群部署实践
- 和我一步步部署 kubernetes 集群
- Kubernetes 核心原理 之一
- Kubernetes核心概念
- Kubernetes核心概念理解
- kubernetes集群部署
- kubernetes-ubuntu集群部署
- 部署kubernetes集群
- Centos7部署Kubernetes集群
- Kubernetes集群部署
- Centos7部署Kubernetes集群
- Centos7部署Kubernetes集群
- kubernetes 概念&部署
- Ubutu下安装Kubernetes-手动实践和遇到的坑
- ViewGroup事件传递机制
- python实现SMTP编程
- 单例设计模式
- c#实现每隔一段时间执行代码(多线程) 3种定时器
- Log4j的两种配置
- kubernetes核心概念总结和手动集群部署实践 之一
- Python生成验证码
- android 之Fragment坑
- 同步、异步、阻塞、非阻塞概念和各自之间的关系
- mysql的慢查询
- 数据库DML语句insert
- 多线程之不共享数据和共享数据
- SpringMVC RESTful风格CURD并集成Swagger2
- JavaWeb使用SpringMVC的简单案例