K8s组件简介及keepalived、haproxy、harbor、kubeasz安装k8s高可用集群


一、组件介绍

  1. Kube-Apiserver
- Kubernetes API server提供了k8s各类资源对象的增删改查及watch等HTTP Rest接口,这些对象包括Pods、services、replicationcontrollers等
API Sercer为REST操作提供服务,并为集群的共享状态提供前端,所有其他组件都通过该前端进行交互。
- RESTful API:是REST风格的网络接口,REST描述的是在网络中client和server的一种交互形式 - RSET:是一种软件架构风格,或者说是一种规范,其强调HTTP应当以资源为中心,并且规范了URI的风格,规范了HTTP请求动作(GET/PUT/PST/DELETE/HEAD/OPTIONS)的使用,具有对应语义 - apiserver默认端口:6443 - 当有一个操作到来时,会先由apiserver进行认证、鉴权、准入控制 - kubectl如何知道自己访问哪个apiserver?在/root/.kube/config 中指定了api-server地址及访问令牌 API版本: Alpha:预览版,可能包含bug或错误,后期版本会修复且不兼容之前版本 Beta:测试版。如storage.k8s.io/v1beta1,可能存在不稳定或潜在bug,不建议生产 v1:稳定版。如apps/v1 经过验证的stable版本,可以生产环境使用

2.Kube-Controller-manager

负责容器的副本管理
- 包括一些子控制器(副本控制器、节点控制器、命名空间控制器、和服务账号控制器等),控制器作为集群内部的管理控制中,负责集群内Node、Pod副本、服务端点、命名空间、服务账号、起源定额的管理,当某个Node意外宕机时,Controller Manager会及时发现并执行自动化修复流程,确保集群中的Pod副本始终处于预期工作状态。
注意:及时发现不是立即发现!

- controller-manager会周期性的检查系Node的状态,如果Node挂了,会重建该Node上所有的Pod
    - controller-manager控制器每间隔5s检查一次节点的状态
    - 如果controller-manager没有收到来自节点的心跳,则将该node节点标记为不可达(标记为不可达之前等待40s)
    - 如果该Node节点被标记为不可达后5分钟内还没有恢复,那么controller-manager会删除该Node上的所有Pod并在其他可用节点重建这些Pod
    
node monitor period:        节点监视周期 5s
nide monitor grace period: 节点监视器宽限,40s
pod eviction timeout:        pod驱逐超时时间,5s

kube-controller以守护进程启动时有很多默认启动参数(可启动指定或在.service中增删改)
如:
    --pod-eviction-timeout=5min    ##node宕机时pod驱逐时间

3.Kube-Schedule

Kubernetes调度器是一个控制面进程,负责讲Pods指派到节点上
主要任务:把我们要创建的Pod分配到指定的Node上,由Node节点上的kubelet接收任务并调用当前的运行时去创建容器

- 通过调度算法为待调度Pod列表的每个Pod从可用Node列表中选择一个最合适的Node,并将信息返回api-server中,apiserver将信息存储到etcd上
注意:Pod列表中有时候是多个Pod,调度Pod时为一个一个调度。调度时会根据节点的信息,如先排除不可用或不符合条件的节点,如果有指定范围的节点,就从指定范围中选,然后根据资源给节点进行打分,最终选择分数高的node进行调度,将结果返回apiserver,apiserver存储入etcd。
- node节点上的kubelet通过API Sercer监听到Kubernetes Scheduler产生的Pod绑定信息,然后获取对应的Pod清单,下载image,并启动容器。

# 策略
- LeastRequestedPriority
    优先从备选节点列表中选择资源消耗最少的节点
- CalculateNodeLabelPriority
    优先选择含指定Label的节点
- BalancedResourceAllocation
    优先从备选节点列表中选择各项资源使用率最均衡的节点
    
- 具体为使用yaml文件或一个POST请求去创建pod

4.Kube-Proxy

运行在每个节点上,指定服务的访问规则,可以通过一组后端进行简单的tcp、udp、sctp(功能更强)流转发或在一组后端进行循环TCP、UDP和SCTP转发,用户必须使用apiserver API 创建一个服务来配置代理,其实就是kube-proxy通过在主机上维护网络规则并执行连续转发来实现Kubernetes服务访问。

- kube-proxy运行在每个节点上,监听API Server中服务对象的变化,再通过管理IPtables或者ipvs来实现网络的转发

- kube-proxy不同的版本可支持三种工作模式
    - USERSpace:k8s v1.1之前使用,k8s1.2以后就已被淘汰
    - IPtables:k8s 1.1版本开始支持 1.2版本为默认
    - IPVS k8s 1.9引入 1.11为正式版本,需要安装ipvsadm(不装也能用,主要使用ipvsadm命令查看ipvs规则)、ipset工具包和加载ip_vs内核模块
    
- 还可根据报文的匹配,来决定是否允许用户的访问,或拒绝用户的访问,加了策略可以说只有当前ns服务能够访问,其他ns服务无法访问

overlay:有三个网络 node、svc、pod (均为独立子网)

使用IPVS模式,Kube-Proxy会监视Kubernetes Service对象和Endpoints,调用宿主机内核Netlink接口以相应地创建IPVS规则并定期与Kubernetes Service对象Endpoints对象同步IPVS规则,
以确保IPVS状态与期望一致,访问服务时,流量将被重定向到其中一个后端Pod,IPVS使用哈希表作为底层数据结构并在内核空间中工作,这意味着IPVS可以更快地重定向流量,
并且在同步代理规则时具有更好的性能,此外,IPVS为负载均衡算法提供了更多选项,例如:rr(轮询调度)、Ic (最小连接数)、dh (目标哈希)、sh (源哈希)、sed (最短期望延迟)、nq(不排队调度)等。

5.Kubelet

kubelet是运行在每个worker节点的代理组件,他会监视已分配给节点的Pod,具体功能:
- 向master汇报node节点的状态信息
- 接收指令并在Pod中创建docker容器
- 准备Pod所需的数据卷
- 返回Pod的运行状态
- 在node节点执行容器健康检查

- Node上的kubelet会跟apiserver有长连接
- 每个节点的kubelet会不断向api-server汇报当前节点的容器的状态,会不断更新,当Pod出现什么事件,如Pod挂了,都会汇报给api-server

6.etcd

etcd是CoreOS公司开发,目前是Kubernetes默认使用的key-value数据存储系统,用于保存kunernetes所有集群数据,etcd支持分布式集群功能,生产环境使用需要为etcd提供定期备份机制

etcd是兼具一致性和高可用性的兼职数据库,可作为保存kubernetes所有集群数据库的后台数据库。通常需要有个备份计划。
https://etcd.io/ #官网
https://github.com/etcd-io/etcd  ##github

# 写数据过程
主库写了,复制到从库,3个节点要复制两次,才能完成一份数据的写入,如果是5个节点,要复制4次,这就是写放大,写的性能直线下降但读性能有很大提升,5个库都可以读

复制集群或者镜像集群:每个节点的数据都是完全一样的时间,备份数据从哪个etcd节点上复制都行

7.coredns

dns发展:skydns、kube-dns、coredns

主要作用:在k8s中负责域名的解析,有了dns就可在容器内部通过svc名去访问其他容器的服务,规则为 pod名.svc名.namespace名.svc.cluster.local (一般都是通过svc去访问,所以一般不加pod名)

8.dashboard

功能相对较少,只有一些管理的操作,一般通过命令行去管理操作

pod调度流程

0、controllermanager、scheduler、kubelet发起watch分Replicaset 、pod(destNode="") pod(destNode="myNode")
1、kubectl创建Replicaset,由apiserver接收
2、apiserver将该信息存入etcd
3、etcd上报事件到apiserver
4、apiserver上报事件replicaset create,
5、controllermanager获得事件,创建出pod,并返回apiserver
6、apiserver将该创建pod信息返回ETCD
7、etcd上报pod create事件到apiserver
8、apiserver上报 pod create 事件
9、scheduler订阅该事件,收到后将调度结果(pod bound node)返回apiserver
10、apiserver将更新的pod信息返回etcd
11、etcd收到事件后,上报pod bound node 事件到apiserver
12、kubelet订阅apiserver,收到该pod调度到自己节点上的信息
13、kubelet调用底层容器服务(如docker)将容器创建出来

二、K8S集群搭建

1、集群资源规划

系统选用ubuntu-server_20.04.3

由于是在自己的虚拟机上搭建,给的资源相对较少,可根据自己的需要提升机器资源配置

角色  IP 内存 CPU
master-01 etcd-01 192.168.1.10 3 2
master-02 etcd-02 192.168.1.11 3 2
master-03 etcd-03 192.168.1.12 3 2
harbor-01 192.168.1.13 1 1
haproxy-01 192.168.1.15 1 1
haproxy-02 192.168.1.16 1 1
worker-01 192.168.1.20 2 2
worker-02 192.168.1.21 2 2
vip 192.168.1.22 192.168.1.23 192.168.1.24    

集群图示

 

 

2.安装keepalived+haproxy

1、将所有的https源改为http源

sed -i 's/https/http/g' /etc/apt/sources.list
apt update

2、安装keepalived

1、在haproxy-01、haproxy-02中安装keepalived
    root@haproxy-01:/etc/keepalived# apt install -y keepalived
2、拷贝配置文件
    root@haproxy-01:~# cd /etc/keepalived/
    root@haproxy-01:/etc/keepalived# ls /usr/share/doc/keepalived/samples/keepalived.conf.vrrp
    root@haproxy-01:/etc/keepalived# cp !$ ./
    root@haproxy-01:/etc/keepalived# cp keepalived.conf.vrrp keepalived.conf
3、修改配置文件
    vim /etc/keepalived/keepalived.conf

keepalived配置文件

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen
   }
   #notification_email_from Alexandre.Cassen@firewall.loc
   #smtp_server 192.168.200.1
   #smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER    ##拷贝到另一台主机位BACKUP
    interface eth0
    garp_master_delay 10
    smtp_alert
    virtual_router_id 51
    priority 100   ##拷贝到另一台主机优先级降低
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.22 dev eth0 label eth0:0
        192.168.1.23 dev eth0 label eth0:1
        192.168.1.24 dev eth0 label eth0:2

        # optional label. should be of the form "realdev:sometext" for
        # compatibility with ifconfig.
    }
}
}

4、复制到haproxy-02,修改两处配置
  state BACKUP
  priority 80
5、测试keepalived的vip漂移
  # 手动关闭haproxy-01上的keepalived
  systemctl stop keepalived.service
6、查看haproxy-01与haproxy-02的IP状态

 

 测试成功!

 

7、手动恢复haproxy-01的keepalived
  systemctl start keepalived.service
8、查看vip是否回来

9、在两台机器上设置开启自启动

  systemctl enable keepalived

systemctl enable haproxy

3.安装haproxy

1、在haproxy-01、haproxy-02上安装haproxy
  apt install -y haproxy
2、备份配置文件
  root@haproxy-01:/etc/haproxy# cp haproxy.cfg haproxy.cfg.bak
3、修改配置文件(在最后添加)

listen k8s-api-6443
bind 192.168.1.22:6443
mode tcp
server master1 192.168.1.10:6443 check inter 3s fall 3 rise 1
server master2 192.168.1.11:6443 check inter 3s fall 3 rise 1
server master3 192.168.1.12:6443 check inter 3s fall 3 rise 1


4、重启haproxy服务
  root@haproxy-01:/etc/haproxy# systemctl restart haproxy
  systemctl status haproxy.service
5、查看地址是否监听
  root@haproxy-01:/etc/haproxy# ss -tln

6、将配置文件拷贝过去haproxy-02
7、重启haproxy-02上的haproxy服务
  发现启动失败:原因为该节点没有vip,而linux默认不监听自身没有的ip
8、查看日志

9、解决,开启内核中的一个参数

  sysctl -a |grep load_bind
  net.ipv4.ip_nonlocal_bind = 0 #为0是不允许应用程序监听在本机没有的地址上去,需要改为1
10、修改(注意,两台主机都要改,防止vip飘走时另一主机无法使用)

echo net.ipv4.ip_nonlocal_bind = 1 >> /etc/sysctl.conf

11、生效
  sysctl -p #内核参数生效
12、重启没有vip的节点上的haproxy
  systemctl restart haproxy.service
13、在两台机器上设置开机自启动

4.安装harbor

1、安装docker及docker-compose (通过已有安装包进行安装)
2、从github下载harbor安装包
  harbor-offline-installer-v2.4.2.tgz
3、解压
  root@harbor-01:/usr/local/harbor# tar xf harbor-offline-installer-v2.4.2.tgz
4、进入harbor目录
  root@harbor-01:/usr/local/harbor# cd harbor/
5、使用自签名证书部署https的harbor
  root@harbor-01:/usr/local/harbor/harbor# mkdir certs
  root@harbor-01:/usr/local/harbor/harbor# cd certs/
  root@harbor-01:/usr/local/harbor/harbor/certs# openssl genrsa -out ./harbor-ca.key
  root@harbor-01:/usr/local/harbor/harbor/certs# openssl req -x509 -new -nodes -key ./harbor-ca.key -subj "/CN=harbor.mageedu.local" -days 7120 -out ./harbor-ca.crt
6、备份配置文件
  root@harbor-01:/usr/local/harbor/harbor# cp harbor.yml.tmpl harbor.yml
7、修改配置文件(部分修改记录)

hostname: 192.168.1.13
    certificate: /usr/local/harbor/harbor/certsharbor-ca.crt
    private_key: /usr/local/harbor/harbor/certs/harbor-ca.key
harbor_admin_password: 123456
data_volume: /data

8、安装

root@harbor-01:/usr/local/harbor/harbor# ./install.sh --help

Note: Please set hostname and other necessary attributes in harbor.yml first. DO NOT use localhost or 127.0.0.1 for hostname, because Harbor needs to be accessed by external clients.
Please set --with-notary if needs enable Notary in Harbor, and set ui_url_protocol/ssl_cert/ssl_cert_key in harbor.yml bacause notary must run under https. 
Please set --with-trivy if needs enable Trivy in Harbor
Please set --with-chartmuseum if needs enable Chartmuseum in Harbor

## 	--with-notary				##是否验证请求,强制验证你的请求是不是ssl,会验证你的key,可以不开
##	--with-trivy   				##扫描镜像组件,一定打开
##	--with-chartmuseum  		##支持helm使用,一定打开

root@harbor-01:/usr/local/harbor/harbor# ./install.sh --with-trivy --with-chartmuseum

  

 5.kubeasz安装k8s集群准备工作--安装ansible

## 以master-01为部署节点
1、安装ansible
  root@master-01:~# apt install -y ansible
2、生成密钥
  root@master-01:~# ssh-keyge
3、设置ansible的配置文件
  host_key_checking = False ##开启这个参数,在未验证过的主机不需要yes确认
4、、设置好被控制的机器
5、、下发密钥(需配置好hosts,并将第3步完成才可使用下面命令,否则使用ssh-copy-id手动传到各个节点)
  ansible all -m authorized_key -k -a "user=root key='{{ lookup('file', '/root/.ssh/id_rsa.pub') }}' path='/root/.ssh/authorized_keys' manage_dir=no"
6、给python3.8做软连接
  root@master-01:/etc/ansible# ansible all -m shell -a 'ln -sv /usr/bin/python3.8 /usr/bin/python'

 6.kubeasz安装k8s集群准备工作--下载kubeasz并配置

1、修改要下载的ezdown的版本(版本跟k8s对应)
  root@master-01:/etc/ansible# export release=3.2.0
2、下载ezdown
  root@master-01:/etc/ansible# wget https://github.com/easzlab/kubeasz/releases/download/${release}/ezdown
3、可在脚本文件中修改需要安装的k8s版本,这里将docker版本改为19.03.15

4、给脚本加执行泉下
  chmode +x ezdown
5、查看参数
  ./ezdown --help
6、下载包到/etc/kubeasz
  ./ezdown -D

原理:使用docker去下载镜像,用此镜像启动一个容器,将容器里面的东西拷贝到本地
docker安装,下载完后解压,将二进制放到指定位置,再将docker.service复制到/etc/systemd/system/docker.service
下载完成后,在/etc/kubeasz/bin 下,已经有很多可执行程序,到时候安装会直接从该目录下拷贝

 

 

7、创建一个集群环境

 cd /etc/kubeasz
 root@master-01:/etc/kubeasz# ./ezctl new clustername
 root@master-01:/etc/kubeasz# ./ezctl new k8s-cluster1


创建完成后会生成该集群名的目录(./cluster/k8s-cluster1),会将./example/hosts.multi.node ./example/config.yml拷贝到这个目录下,前者是ansible所需要的文件,后者是集群的配置文件(集群有效期,网络参数等)

 

8、下载完成后,需要修改东西(进行集群规划)
进入你的集群目录
  root@master-01:/etc/kubeasz# cd clusters/k8s-cluster1/
9、修改hosts

注意:此时master只有两台,是为了后期学习如何在集群加入master节点。

  vim hosts

# 'etcd' cluster should have odd member(s) (1,3,5,...)
[etcd]
192.168.1.10   ##修改
192.168.1.11   ##修改
192.168.1.12   ##修改

# master node(s)
[kube_master]
192.168.1.10   ##修改
192.168.1.11   ##修改

# work node(s)
[kube_node]
192.168.1.20   ##修改
192.168.1.21   ##修改

# [optional] harbor server, a private docker registry
# 'NEW_INSTALL': 'true' to install a harbor server; 'false' to integrate with existed one
[harbor]
#192.168.1.8 NEW_INSTALL=false

# [optional] loadbalance for accessing k8s from outside
[ex_lb]
192.168.1.6 LB_ROLE=backup EX_APISERVER_VIP=192.168.1.22 EX_APISERVER_PORT=6443   ##修改
192.168.1.7 LB_ROLE=master EX_APISERVER_VIP=192.168.1.22 EX_APISERVER_PORT=6443   ##修改

# [optional] ntp server for the cluster
[chrony]
#192.168.1.1

[all:vars]
# --------- Main Variables ---------------
# Secure port for apiservers
SECURE_PORT="6443"

# Cluster container-runtime supported: docker, containerd
CONTAINER_RUNTIME="docker"   ##修改

# Network plugins supported: calico, flannel, kube-router, cilium, kube-ovn
CLUSTER_NETWORK="calico"

# Service proxy mode of kube-proxy: 'iptables' or 'ipvs'
PROXY_MODE="ipvs"

# K8S Service CIDR, not overlap with node(host) networking
SERVICE_CIDR="10.100.0.0/16"   ##修改

# Cluster CIDR (Pod CIDR), not overlap with node(host) networking
CLUSTER_CIDR="10.200.0.0/16"   ##修改

# NodePort Range
NODE_PORT_RANGE="30000-40000"   ##修改。默认30000-32767

# Cluster DNS Domain
CLUSTER_DNS_DOMAIN="cluster.local"

# -------- Additional Variables (don't change the default value right now) ---
# Binaries Directory
bin_dir="/usr/local/bin"   ##修改,将第三方与系统命令区分开

# Deploy Directory (kubeasz workspace)
base_dir="/etc/kubeasz"

# Directory for a specific cluster
cluster_dir="{{ base_dir }}/clusters/k8s-cluster1"

# CA and other components cert/key Directory
ca_dir="/etc/kubernetes/ssl"

- 启用仓库镜像(ENABLE_MIRROR_REGISTRY: true),会加一些mirrors,加速镜像下载,启动之后,有些配置是可以改的
/etc/kubeasz/playbooks/03.runtime.yml
当你想修改docker安装的daemon.json,可以直接改 /etc/kubeasz/roles/docker/templates/daemon.json.j2

 

10.修改config.yml

############################
# prepare
############################
# 可选离线安装系统软件包 (offline|online)
INSTALL_SOURCE: "online"

# 可选进行系统安全加固 github.com/dev-sec/ansible-collection-hardening
OS_HARDEN: false

# 设置时间源服务器【重要:集群内机器时间必须同步】
ntp_servers:
  - "ntp1.aliyun.com"
  - "time1.cloud.tencent.com"
  - "0.cn.pool.ntp.org"

# 设置允许内部时间同步的网络段,比如"10.0.0.0/8",默认全部允许
local_network: "0.0.0.0/0"


############################
# role:deploy
############################
# default: ca will expire in 100 years
# default: certs issued by the ca will expire in 50 years
CA_EXPIRY: "876000h"
CERT_EXPIRY: "876000h"

# kubeconfig 配置参数
CLUSTER_NAME: "k8s-cluster1"    # 改
CONTEXT_NAME: "context-{{ CLUSTER_NAME }}"

# k8s version
K8S_VER: "1.23.1"

############################
# role:etcd
############################
# 设置不同的wal目录,可以避免磁盘io竞争,提高性能
ETCD_DATA_DIR: "/var/lib/etcd"
ETCD_WAL_DIR: ""


############################
# role:runtime [containerd,docker]
############################
# ------------------------------------------- containerd
# [.]启用容器仓库镜像
ENABLE_MIRROR_REGISTRY: true

# [containerd]基础容器镜像
SANDBOX_IMAGE: "easzlab/pause:3.6"

# [containerd]容器持久化存储目录
CONTAINERD_STORAGE_DIR: "/var/lib/containerd"

# ------------------------------------------- docker
# [docker]容器存储目录
DOCKER_STORAGE_DIR: "/var/lib/docker"

# [docker]开启Restful API
ENABLE_REMOTE_API: false

# [docker]信任的HTTP仓库
INSECURE_REG: '["127.0.0.1/8","192.168.1.14"]'   # 改


############################
# role:kube-master
############################
# k8s 集群 master 节点证书配置,可以添加多个ip和域名(比如增加公网ip和域名)
MASTER_CERT_HOSTS:
  - "192.168.1.22"    # 改
  - "k8s.test.io"
  #- "www.test.com"

# node 节点上 pod 网段掩码长度(决定每个节点最多能分配的pod ip地址)
# 如果flannel 使用 --kube-subnet-mgr 参数,那么它将读取该设置为每个节点分配pod网段
# https://github.com/coreos/flannel/issues/847
NODE_CIDR_LEN: 24


############################
# role:kube-node
############################
# Kubelet 根目录
KUBELET_ROOT_DIR: "/var/lib/kubelet"

# node节点最大pod 数
MAX_PODS: 500

# 配置为kube组件(kubelet,kube-proxy,dockerd等)预留的资源量
# 数值设置详见templates/kubelet-config.yaml.j2
KUBE_RESERVED_ENABLED: "no"

# k8s 官方不建议草率开启 system-reserved, 除非你基于长期监控,了解系统的资源占用状况;
# 并且随着系统运行时间,需要适当增加资源预留,数值设置详见templates/kubelet-config.yaml.j2
# 系统预留设置基于 4c/8g 虚机,最小化安装系统服务,如果使用高性能物理机可以适当增加预留
# 另外,集群安装时候apiserver等资源占用会短时较大,建议至少预留1g内存
SYS_RESERVED_ENABLED: "no"

# haproxy balance mode
BALANCE_ALG: "roundrobin"


############################
# role:network [flannel,calico,cilium,kube-ovn,kube-router]
############################
# ------------------------------------------- flannel
# [flannel]设置flannel 后端"host-gw","vxlan"等
FLANNEL_BACKEND: "vxlan"
DIRECT_ROUTING: false

# [flannel] flanneld_image: "quay.io/coreos/flannel:v0.10.0-amd64"
flannelVer: "v0.15.1"
flanneld_image: "easzlab/flannel:{{ flannelVer }}"

# [flannel]离线镜像tar包
flannel_offline: "flannel_{{ flannelVer }}.tar"

# ------------------------------------------- calico
# [calico]设置 CALICO_IPV4POOL_IPIP=“off”,可以提高网络性能,条件限制详见 docs/setup/calico.md
CALICO_IPV4POOL_IPIP: "Always"

# [calico]设置 calico-node使用的host IP,bgp邻居通过该地址建立,可手工指定也可以自动发现
IP_AUTODETECTION_METHOD: "can-reach={{ groups['kube_master'][0] }}"

# [calico]设置calico 网络 backend: brid, vxlan, none
CALICO_NETWORKING_BACKEND: "brid"

# [calico]更新支持calico 版本: [v3.3.x] [v3.4.x] [v3.8.x] [v3.15.x]
calico_ver: "v3.19.3"

# [calico]calico 主版本
calico_ver_main: "{{ calico_ver.split('.')[0] }}.{{ calico_ver.split('.')[1] }}"

# [calico]离线镜像tar包
calico_offline: "calico_{{ calico_ver }}.tar"

# ------------------------------------------- cilium
# [cilium]CILIUM_ETCD_OPERATOR 创建的 etcd 集群节点数 1,3,5,7...
ETCD_CLUSTER_SIZE: 1

# [cilium]镜像版本
cilium_ver: "v1.4.1"

# [cilium]离线镜像tar包
cilium_offline: "cilium_{{ cilium_ver }}.tar"

# ------------------------------------------- kube-ovn
# [kube-ovn]选择 OVN DB and OVN Control Plane 节点,默认为第一个master节点
OVN_DB_NODE: "{{ groups['kube_master'][0] }}"

# [kube-ovn]离线镜像tar包
kube_ovn_ver: "v1.5.3"
kube_ovn_offline: "kube_ovn_{{ kube_ovn_ver }}.tar"

# ------------------------------------------- kube-router
# [kube-router]公有云上存在限制,一般需要始终开启 ipinip;自有环境可以设置为 "subnet"
OVERLAY_TYPE: "full"

# [kube-router]NetworkPolicy 支持开关
FIREWALL_ENABLE: "true"

# [kube-router]kube-router 镜像版本
kube_router_ver: "v0.3.1"
busybox_ver: "1.28.4"

# [kube-router]kube-router 离线镜像tar包
kuberouter_offline: "kube-router_{{ kube_router_ver }}.tar"
busybox_offline: "busybox_{{ busybox_ver }}.tar"


############################
# role:cluster-addon
############################
# coredns 自动安装
dns_install: "no"    # 改
corednsVer: "1.8.6"
ENABLE_LOCAL_DNS_CACHE: false  ##生产环境可以打开
dnsNodeCacheVer: "1.21.1"
# 设置 local dns cache 地址
LOCAL_DNS_CACHE: "169.254.20.10"

# metric server 自动安装
metricsserver_install: "no"   # 改
metricsVer: "v0.5.2"

# dashboard 自动安装
dashboard_install: "no"   # 改
dashboardVer: "v2.4.0"
dashboardMetricsScraperVer: "v1.0.7"

# ingress 自动安装
ingress_install: "no"
ingress_backend: "traefik"
traefik_chart_ver: "10.3.0"

# prometheus 自动安装
prom_install: "no"
prom_namespace: "monitor"
prom_chart_ver: "12.10.6"

# nfs-provisioner 自动安装
nfs_provisioner_install: "no"
nfs_provisioner_namespace: "kube-system"
nfs_provisioner_ver: "v4.0.2"
nfs_storage_class: "managed-nfs-storage"
nfs_server: "192.168.1.10"
nfs_path: "/data/nfs"

############################
# role:harbor
############################
# harbor version,完整版本号
HARBOR_VER: "v2.1.3"
HARBOR_DOMAIN: "harbor.yourdomain.com"
HARBOR_TLS_PORT: 8443

# if set 'false', you need to put certs named harbor.pem and harbor-key.pem in directory 'down'
HARBOR_SELF_SIGNED_CERT: true

# install extra component
HARBOR_WITH_NOTARY: false
HARBOR_WITH_TRIVY: false
HARBOR_WITH_CLAIR: false
HARBOR_WITH_CHARTMUSEUM: true

11.由于我们自己安装了负载均衡器,所以不需要帮我们初始化负载均衡器

/etc/kubeasz/playbooks/01.prepare.yml

# [optional] to synchronize system time of nodes with 'chrony' 
- hosts:
  - kube_master
  - kube_node
  - etcd
#  - ex_lb    注释
#  - chrony      注释
  roles:
  - { role: os-harden, when: "OS_HARDEN|bool" }
  - { role: chrony, when: "groups['chrony']|length > 0" }

# to create CA, kubeconfig, kube-proxy.kubeconfig etc.
- hosts: localhost
  roles:
  - deploy

# prepare tasks for all nodes
- hosts:
  - kube_master
  - kube_node
  - etcd
  roles:
  - prepare

至此,准备工作完毕

7.使用kubeasz安装k8s集群

1、第一步,基础环境准备

root@master-01:/etc/kubeasz# ./ezctl setup k8s-cluster1 01
    这些会执行/etc/kubeasz/roles/prepare/tasks/  下定义的任务
    /etc/kubeasz/roles/prepare/templates/95-k8s-sysctl.conf.j2  ##内核参数配置

基础环境部署的yaml文件位置

2、安装etcd

root@master-01:/etc/kubeasz# ./ezctl setup k8s-cluster1 02

 3、安装docker,当机器安装过docker不会再次安装

root@master-01:/etc/kubeasz# ./ezctl setup k8s-cluster1 03

4、安装master

root@master-01:/etc/kubeasz# ./ezctl setup k8s-cluster1 04

5、安装node

root@master-01:/etc/kubeasz# ./ezctl setup k8s-cluster1 05

 6、安装calico

root@master-01:/etc/kubeasz# ./ezctl setup k8s-cluster1 06

 

 至此,基本的k8s高可用集群已经部署完毕!


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM