二、实践指南
1、安装
yum install kubernates ------ all -in -one hyperkube
https://github.com/kubernates/kubernates/releases下载 kubernates包
Master节点 : etcd \ kube-apiserver \ kube-controller-manager \ kube-scheduler进程
Slave Node: kubelet 、 kube-proxy程序运行
2、配置
. 通信服务所有端口的防火墙配置, 或者关闭防火墙 systemctl disable 、stop firewalld
. 复制可执行文件到/usr/bin(systemd默认路径),对服务配置
. etcd 首先安装启动, etcd/etcdctl复制到 /usr/bin下 并配置systemd文件【/usr/lib/systemd】/system/etcd.service。 systemctl daemond-reload/enable etcd.service/start etcd.service 通过etcdctl cluster-health验证
. kube-apiserver :复制可执行文件到/usr/bin,编辑systemd文件 ./system/kube-apiserver.service 。修改配置文件启动参数/etc/kubernates/apiserver KUBE_API_ARGS(见下)
. kube-controller-manager:编辑systemd文件,依赖apiserver服务。启动参数 KUBE_CONTROLLER_MANAGER_ARGS位于配置文件中 /etc/kubernetes/contorller-manager中
. kube-schedule : 依赖apiserver服务,编辑systemd文件system/scheduler.service。启动参数KUBE_SCHEDULER_ARGS位于 /etc/kubernetes/scheduler
. 分别打开三个服务,并启动,通过status 结果running验证启动成功
.- Node 节点应该先安装DOcker Daemon服务
.- Node 节点kubelet 。依赖docker, 编辑systemd文件, kubelet.service 。启动参数 KUBELET_ARGS 位于 /etc/kubernestese/kubelet中
.- Node 节点kube-proxy 。 依赖于network服务。After=network.target Requires =network.service。 启动参数 KUBE_PROXY_ARGS位于 ...../proxy
. 分别打开并启动上两个节点服务。通过kubectl get nodes验证节点注册成功。集群完成。
KUBE_API_ARGS:
--etcd_servers: 制定etcd服务地址
--instance-bin-address : apiserver绑定所有的非安全IP地址,0。0.0.0表示所有
--insecure-port: apiserver绑定主机的非安全端口号,8080默认
--service-cluster-ip-range: IP地址段范围,CIDR格式表示不能与物理机真实IP端重合
--service-node-port-range: Service可映射的竌顿口范围, 默认30000 ~ 32767
--admission_controll: 准入控制设置,各控制模块伊插件的形式一次生效
--logtostderr:设置为false表示日志写入文件,不写则stderr
--log-dir: 日志目录 --v日志级别
KUBE_CNOTROLLER_MANAGER_ARGS:
--master: 制定apiserver的URL地址ip+port
--logtostderr: 设为false表示写入文件
--log-dir 日志目录。 --v 日志级别
KUBE_SCHEDULER_ARGS:
--master : 指定apiserver地址 : ip+ port
--logtostderr: 设置false写入文件
--log-dir: 日志目录
--v: 日志级别
KUBELET_ARGS:
--api-servers:指定apiserver地址,还可以多个
--pod_infra_container_image=gcr.io/google_containers/pause_amd64:3.0 指定谷歌pause容器
--hostname-override:设置本node节点的名称。
--logtostderr:设置false,表示将日志写入文件,不写入stderr
--log-dir: 日志目录 --v: 日志级别
KUBE_PROXY_ARGS:
--master :指定apiserver地址
--logtostderr: 设置写入流还是日志文件
--log-dir: 设置日志目录, --v:日志级别
3、安全配置
- 基于ca 签名的双向数字证书认证
为kube-apiserver 生成一个证书,并用ca 证书进行签名。
为kube-apiserver配置证书相关(CA证书、CA签名后的证书及私钥)的启动参数
为每个访问者服务(controller\scheduler\kubelet..等)生成证书,CA签名后,启动参数对应配置相关证书(通kube-apiserver)
使用kubectl对集群操作使,增加参数 --certificate-authority\ --client-certificate \ --client-key表示用CA授权的证书, 客户端证书、客户端密钥
如: kubectl get nodes
kubectl 【 --server=https://k8s-master:443 --certificate-authority=/etc/kubenetes/ssl_keys/ca.crt --client-certificate/etc/kubernetes/ssl_keys/cs_client.crt
--client-key=/etc/kubernetes/ssl_keys/cs_client.key 】 get nodes
(详细略)
- 基于HTTPS BASE或者tocken的简单认证方式
创建用户、密码和UID文件basic_auth_file, 明文。
设置kube-apiserver启动参数 --basic_auth_file=${path} --secure-port=443
访问: kubectl 【--server=https://ip:443 --username=admin ---password=admin --insecure-skip-tls-verify=true 】 get pods
基于token : 设置用户、密码文件token_auth_file, 设置启动参数 --token_auth_file --secure_port=443, 启动api-server,
用curl访问: curl -k --header “Authorization:Bearer admin” https://ip:443/version
4、版本升级:(对各个node隔离, 容器全部执行完成在更新node 上两个服务,所有node完成后,在master服务)
5、内网中的相关配置:公有GCE\ AWS(安全原因)0,
- 安装私有镜像库(Docker Private Registry): docs.docker.com/registry/deploying/
- 需要从https://gcr.io中下载google_containers/pause这个共用POD镜像,在push到私有镜像库中
- kubelet的启动参数上加 --pod_infra_container_image=gcr.io/google_containers/pause-amd64:3.0指定为私有的DOcker Register中的puase镜像地址,重启kubelet服务
6、核心服务配置详解。
- 公共配置参数,适用于各个服务: 设置log输出的各类参数
- kube-apiserver: 配置准入规则,过滤请求、对集群成员广播配置、容器运行权限、tocken响应、安全访问模式、认证授权模式、证书跨域、etcd安全连接文件
- kube-controller-manager:server地址、云服务上属性、并发的Deployement\Endpoint\namespace\RC \Replica set\ resource等数量、通信时间间隔、缓存大小等、节点失败POD数量各种控制、垃圾、第三方插件、发送apiserver请求时间间隔、请求数量类容、选举过程中的等待、同步时间间隔、润徐启动最大时间、时间间隔、性能资源相关的配置
- kube-scheduler:主机ip监听地址、调度算法策略、性能分析、亲和力参数、每秒发送请求内容/数量、选举过程时间间隔
- kubelete 启动参数: 网络权限DNS等、docker服务启动相关、数据采集性能分析、对POD使用宿主机的资源等、镜像操作、node存活验证等
- kube-proxy启动参数: 主机绑定地址、从APIserver更新的时间间隔、NAT最大连接数、TCP连接超时间、服务监听的端口、代理防火墙空闲连接等等
7、多节点集群网络配置方案 : 网络设置工具 flannel\ open vSwitch\ Weave \ Calico或者直接路由实现夸主机的容器间网络互通
flannel(覆盖网络):
——采用overlay network完成网络打通, 使用etcd作为数据库、需要预先安装etcd
——安装flannel , 每个node上安装flannel, 解压后将flanneld和mk-docker-opts.sh复制到 /usr/bin目录下,即可完成flannel的安装
——配置flannel:systemd文件flanneld.service / 配置文件(etc/systemconfi/flannel文件>etcd | etcd_key)
——etcd中添加一套网络配置记录,用于分配各docker虚拟IP段 (etcdctl set /coreos.com/network/config '{ "Network":"10.1.1.0/18" }')
——flannel将覆盖docker0网桥, 所以如果DOCker 已启动,需重启。
——启动flannel服务, systemctl restart flanneld
——设置docker0网桥的IP地址, flannel0~docker0 的,重启docker服务
Open vSwitch(虚拟交换机):2node
——在两个node上安装OVS(yum install openvswitch),
——禁止selinux,配置后重启linux,节点上分别查看状态存在 ovsdb-server / ovs-vswitchd两个进程,确认日志正常more /var/log/messages |grep openv
——创建网桥GRE隧道, 是不同节点的docker0网段互通(GRE 隧道数N个节点需要建立N(N-1)个,点对点通信)
每个node上建立br0网桥 : ovs-vsctl add-br br0
创建GRE隧道连接对端 : ovs-vsctl add-port br0 gre1 --set interface gre1 type=gre option: remote_ip=192.168.18.128
最后把br0作为一个端口连接到docker0这个linux网桥上) : brctl addif docker0 br0
启动br0和docker0网桥 ip link set dev br0 / docker0 up
添加路有规则,每个node都需, ip route add 172.17.0.0/16 dev docker0,
每个节点都执行: 情况docker0自带的Iptables规则及linux规则,iptables -t nat -F ; iptables -F 强制icmp报文通过
配置完后查看 Ip addr查看ip docker0的ip等路由信息
——两个Node容器之间的互通测试, 从一个节点上ping另一个节点的docker0的IP,验证互通性。
——tshark来验证流量走向GRE报文(tshark -i br0/eth0 -R ip proto GRE)如果br0没有而eth0有流量,则说明GRE在承载网的物理网上完成封包过程。则搭建成功
直接路由:
——每个node添加其他Node上【Docker0网桥】的静态路由规则,既可以网桥互联
route add -net 10.1.20.0 netmask 255.255.255.0 gw 192.168.1.129
ping 其中一个任一个Node的docker0网桥IP 。通即可,可借助软件Quagga,每个Node安装或者docker方式启动