天天看点

kubernetes(六) 基于kubeadm构建高可用k8s集群基于kubeadm构建高可用k8s集群

github地址: https://github.com/kubernetes/kubernetes/

官方网站: kubernets.io

pod使用接口技术

CNI: container network interface

CSI: container storage interface

CRI: container runtime interface

CVI: container volume interface

pod:k8s中运行容器的最小单元

k8s如果向替换CRI的话(替换容器技术),只需要讲POD使用相关的容器技术(docker,podman)封装即可

service: 实现了从宿主机外层访问k8s内部不同的容器的访问方式,还实现了pod的动态发现;因此可以说Service是k8s内部的负载均衡器

实现方式: 早期是iptable,在1.11之后支持ipvs(轮训算法)

replicationcontroller/deployment: 已废弃,POD控制器; 通过环境检测,保证pod的正常运行

master: 主节点

kube-apiserver: https://k8smeetup.github.io/docs/admin/kube-apiserver/

为api对象验证并配置数据,包括pods,services,APIserver提供Restful操作和到集群共享状态的前端,所有其它组件通过apiserver进行交互

kube-scheduler:https://k8smeetup.github.io/docs/admin/kube-scheduler/

具有丰富的资源策略,能够感知拓扑变化,支持特定负载的功能组件,它对集群的可用性,性能表现以及容量都影响巨大,scheduler需要考虑独立的和集体的资源需求,服务质量需求,硬件、软件,策略限制,亲和与反亲和规范,数据位置吗内部负载接口,截止时间等等,如有特定的负载需求可以通过apiserver暴露出来

kube-controller-manager: https://k8smeetup.github.io/docs/admin/kube-controller-manager/

作为集群内部的控制中心,负责集群内部的Node,Pod副本,服务端点,命名空间,服务账号,资源配额的管理,当某个Node意外宕机时,controller-manager会及时发现并执行自动修复,确保集群始终处于预期的工作状态

Node节点

kube-proxy: https://k8smeetup.github.io/docs/admin/kube-proxy/

维护node节点上的网络规则,实现用户访问请求的转发,其实就是转发给service,需要管理员指定service和NodePort的对应关系

Kubernetes 网络代理运行在 node 上。它反映了 node 上 Kubernetes API 中定义的服务,并可以通过一组后端进行简单的 TCP、UDP 流转发或循环模式(round robin))的 TCP、UDP 转发。目前,服务的集群 IP 和端口是通过 Docker-links 兼容的环境变量发现的,这些环境变量指定了服务代码打开的端口。有一个可选的 addon 为这些集群 IP 提供集群 DNS。用户必须使用 apiserver API 创建一个服务来配置代理。

kubelet: https://k8smeetup.github.io/docs/admin/kubelet/

kubelet 是运行在每个节点上的主要的“节点代理”,它按照 PodSpec 中的描述工作。 PodSpec 是用来描述一个 pod 的 YAML 或者 JSON 对象。kubelet 通过各种机制(主要通过 apiserver )获取一组 PodSpec 并保证在这些 PodSpec 中描述的容器健康运行。kubelet 不管理不是由 Kubernetes 创建的容器。

除了来自 apiserver 的 PodSpec ,还有 3 种方式可以将容器清单提供给 kubelet 。

文件:在命令行指定的一个路径,在这个路径下的文件将被周期性的监视更新,默认监视周期是 20 秒并可以通过参数配置。

HTTP端点:在命令行指定的一个HTTP端点,该端点每 20 秒被检查一次并且可以通过参数配置检查周期。

HTTP服务:kubelet 还可以监听 HTTP 服务并响应一个简单的 API 来创建一个新的清单

ETCD: 存储所有集群数据

组件官网参考: https://kubernetes.io/zh/docs/concepts/overview/components/

角色

主机名

ip地址

软件

master-1

centos7-node1

192.168.56.11

docker,kube-comtroller-manager,kube-apiserver,kube-schduler

master-2

centos7-node2

192.168.56.12

master-3

centos7-node3

192.168.56.13

ha-1

centos7-node4

192.168.56.14

haproxy,keepalived

ha-2

centos7-node5

192.168.56.15

harbor-1

centos7-node6

192.168.56.16

docker,docker-compose,harbor

node-1

centos7-node7

192.168.56.17

kubelet,kube-proxy

node-2

centos7-node8

192.168.56.18

服务器使用centos7.6以及以上,配置阿里云仓库

关闭防火墙&selinux&swap

自动更新时间

设置主机名&hosts解析

系统参数优化(ip地址转发)

开启ipvs

重启服务器

基础docker安装

harbor

创建baseimages镜像仓库

haproxy&keepalived

master节点安装

开启 master命令补全

通过配置文件初始化master

安装网络插件flannel

创建kubernetes的流程: https://k8smeetup.github.io/docs/reference/setup-tools/kubeadm/kubeadm-init/#init-workflow

使用2.0.0-rc6版本

访问任意主机的https://192.168.56.12:30002 即可

获取访问token即可登陆

升级时间: 业务低峰期

升级方式

ansible

kubeadm

升级步骤

在所有master节点进行升级,升级管理断服务kube-controller-manager,kube-apiserver,kube-scheduler,kube-proxy

检查可升级的软件版本

所有master节点都安装1.17.4的kubeadm

更新master节点的kubectl,kubelet

更新node节点

验证升级结果

参考用例: https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/

Nginx用例

haproxy和keepalived配置

需要新增一个VIP(LB)

将LB映射到haproxy对应的nodeport上

tomcat配置

测试访问 http://192.168.56.11:8080/app/

在harbor创建linux公开仓库

准备dockerfile

业务pod创建

nginx代理请求到tomcat