kubekey 优势
- 基于 Ansible 的安装程序具有大量软件依赖性,例如 Python。KubeKey 是使用 Go 语言开发的,可以消除在各种环境中出现的问题,从而提高安装成功率。
- KubeKey 使用 Kubeadm 在节点上尽可能多地并行安装 K8s 集群,以降低安装复杂性并提高效率。与较早的安装程序相比,它将大大节省安装时间。
- KubeKey 支持将集群从 all-in-one 扩展到多节点集群甚至 HA 集群。
- KubeKey 旨在将集群当作一个对象操作,即 CaaO。(cluster as a object)
操作系统要求:
- SSH 可以访问所有节点。
- 所有节点的时间同步。
- sudo/curl/openssl 应在所有节点使用。
- docker 可以自己安装,也可以通过 KubeKey 安装。
- Red Hat 在其 Linux 发行版本中包括了 SELinux,建议关闭SELinux或者将SELinux的模式切换为Permissive[宽容]工作模式。
依赖要求:
- KubeKey 可以同时安装 Kubernetes 和 KubeSphere。在版本1.18之后,安装kubernetes前需要安装一些依赖。你可以参考下面的列表,提前在你的节点上检查并安装相关依赖。
|
Kubernetes 版本 ≥ 1.18 |
socat |
必须安装 |
conntrack |
必须安装 |
ebtables |
可选,但推荐安装 |
ipset |
可选,但推荐安装 |
ipvsadm |
可选,但推荐安装 |
下载kubekey可执行文件:
https://github.com/kubesphere/kubekey/releases
kubekey创建高可用集群
1、内置HAproxy
KubeKey 作为一种集群安装工具,从版本 v1.2.1 开始,提供了内置高可用模式,支持一键部署高可用集群环境。KubeKey 的高可用模式实现方式称作本地负载均衡模式。具体表现为 KubeKey 会在每一个工作节点上部署一个负载均衡器(HAproxy),所有主节点的 Kubernetes 组件连接其本地的 kube-apiserver ,而所有工作节点的 Kubernetes 组件通过由 KubeKey 部署的负载均衡器反向代理到多个主节点的 kube-apiserver 。这种模式相较于专用到负载均衡器来说效率有所降低,因为会引入额外的健康检查机制,但是如果当前环境无法提供外部负载均衡器或者虚拟 IP(VIP)时这将是一种更实用、更有效、更方便的高可用部署模式。
2、使用 Keepalived 和 HAproxy 创建高可用
您可以使用任意云负载均衡器或者任意硬件负载均衡器。此外,也可以使用 Keepalived 和 HAproxy,或者 Nginx 来创建高可用集群。
安装流程:
1、部署负载均衡器haproxy和keepalived
上传haproxy.tar.gz和keepalived.tar.gz相关rpm包到对应节点;
解压缩后,执行安装:
yum localinstall keepalived/*.rpm -y
yum localinstall haproxy/*.rpm -y
节点master1修改配置文件
global
log /dev/log local0 warning
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
log global
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
frontend kube-apiserver
bind *:7443
mode tcp
option tcplog
default_backend kube-apiserver
backend kube-apiserver
mode tcp
option tcplog
option tcp-check
balance roundrobin
default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
server kube-apiserver-1 192.168.10.100:6443 check # Replace the IP address with your own.
server kube-apiserver-2 192.168.10.101:6443 check # Replace the IP address with your own.
server kube-apiserver-3 192.168.10.102:6443 check # Replace the IP address with your own.
global_defs {
notification_email {
}
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight 2
}
vrrp_instance haproxy-vip {
state BACKUP
priority 100
interface ens33 # Network card
virtual_router_id 60
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
unicast_src_ip 192.168.10.100 # The IP address of this machine
unicast_peer {
192.168.10.101 # The IP address of peer machines
}
virtual_ipaddress {
192.168.10.110/24 # The VIP address
}
track_script {
chk_haproxy
}
}
启动服务并设置开机自启动:
systemctl start haproxy && systemctl enable haproxy
systemctl start keepalived && systemctl enable keepalived
节点master2修改配置文件
同master1操作,注意keepalived.conf配置文件中ip地址修改;
启动服务并设置开机自启动。
2、kubekey制作离线包
KubeKey 清单和制品
KubeKey v2.0.0 版本(以下简称 kk )新增了清单(manifest)和制品(artifact)的概念,为用户离线部署 Kubernetes 集群提供了一种解决方案。在过去,用户需要准备部署工具,镜像 tar 包和其他相关的二进制文件,每位用户需要部署的 Kubernetes 版本和需要部署的镜像都是不同的。现在使用 kk 的话,用户只需使用清单manifest文件来定义将要离线部署的集群环境需要的内容,再通过该manifest来导出制品artifact文件即可完成准备工作。离线部署时只需要 kk 和 artifact就可快速、简单的在环境中部署镜像仓库和 Kubernetes 集群。
manifest
就是一个描述当前 Kubernetes 集群信息和定义artifact制品中需要包含哪些内容的文本文件。目前有两种方式来生成该文件:
- 根据模版手动创建并编写该文件。
- 使用 kk 命令根据已存在的集群生成该文件。
原理:
kk 通过 kubeconfig 文件连接对应的 Kubernetes 集群,然后检查出集群环境中以下信息:
- 节点架构
- 节点操作系统
- 节点上的镜像
- Kubernetes 版本
- CRI 信息
之后,这些当前集群的描述信息将最终写入manifest文件中。同时其他无法检测到的相关文件信息(如:ETCD 集群信息、镜像仓库等)也将按照 kk 推荐的默认值写入到manifest文件中。
artifact
制品就是一个根据指定的manifest文件内容导出的包含镜像 tar 包和相关二进制文件的 tgz 包。在 kk 初始化镜像仓库、创建集群、添加节点和升级集群的命令中均可指定一个artifact,kk 将自动解包该artifact并将在执行命令时直接使用解包出来的文件。
注意:
- 导出命令会从互联网中下载相应的二进制文件,请确保网络连接正常。
- kk 会解析镜像列表中的镜像名,若镜像名中的镜像仓库需要鉴权信息,可在manifest文件中的.registry.auths字段中进行配置。
- 若需要导出的artifact文件中包含操作系统依赖文件(如:conntarck、chrony等),可在operationSystem元素中的.repostiory.iso.url中配置相应的 ISO 依赖文件下载地址。
示例:
在源集群中使用 KubeKey 创建 manifest
./kk create manifest
修改模板:
apiVersion: kubekey.kubesphere.io/v1alpha2
kind: Manifest
metadata:
name: sample
spec:
arches:
- amd64
operatingSystems:
- arch: amd64
type: linux
id: centos
version: "7"
osImage: CentOS Linux 7 (Core)
repository:
iso:
localPath: /root/kubekey/centos7-rpms-amd64.iso
url:
kubernetesDistributions:
- type: kubernetes
version: v1.22.9
components:
helm:
version: v3.9.0
cni:
version: v0.9.1
etcd:
version: v3.4.13
containerRuntimes:
- type: containerd
version: 1.6.4
crictl:
version: v1.24.0
##
docker-registry:
version: "2"
# harbor:
# version: v2.4.1
# docker-compose:
# version: v2.2.2
images:
- docker.io/coredns/coredns:1.8.0
- docker.io/kubeovn/kube-ovn:v1.10.6
- docker.io/kubesphere/k8s-dns-node-cache:1.15.12
- docker.io/kubesphere/kube-apiserver:v1.22.9
- docker.io/kubesphere/kube-controller-manager:v1.22.9
- docker.io/kubesphere/kube-proxy:v1.22.9
- docker.io/kubesphere/kube-scheduler:v1.22.9
- docker.io/kubesphere/pause:3.5
registry:
auths: {}
从源集群中导出制品 artifact:
./kk artifact export -m manifest-sample.yaml -o kubernetes.tar.gz
执行完毕后将在当前目录下生成kubernetes.tar.gz文件。
3、安装镜像仓库
启动镜像仓库:
./kk init registry -f config-sample.yaml -a kubernetes.tar.gz
环境上实际运行:
/usr/local/bin/registry serve /etc/kubekey/registry/config.yaml
推送镜像:
# Use the "./kubekey/images" path by default
./kk artifact images push -f config-sample.yaml
# Specify a artifact
./kk artifact images push -f config-sample.yaml -a kubernetes.tar.gz
# Specify a images' directory
./kk artifact images push -f config-sample.yaml --images-dir ./kubekey/images
4、安装 k8s 集群
离线部署k8s命令:
./kk create cluster -f config-sample.yaml -a kubernetes.tar.gz --with-packages -y
参数解释如下:
config-sample.yaml:离线环境集群的配置文件。
kubernetes.tar.gz:源集群打包出来的 tar 包镜像。
--with-packages:若需要安装操作系统依赖,需指定该选项。
apiVersion: kubekey.kubesphere.io/v1alpha2
kind: Cluster
metadata:
name: sample
spec:
hosts:
- {name: master1, address: 192.168.10.100, internalAddress: 192.168.10.100, user: root, password: "xxxxxxxx"}
- {name: master2, address: 192.168.10.101, internalAddress: 192.168.10.101, user: root, password: "xxxxxxxx"}
- {name: master3, address: 192.168.10.102, internalAddress: 192.168.10.102, user: root, password: "xxxxxxxx"}
- {name: node1, address: 192.168.10.103, internalAddress: 192.168.10.103, user: root, password: "xxxxxxxx"}
#- {name: mozidevnode1, address: 10.31.32.11, internalAddress: 10.31.32.11, user: op, privateKeyPath: "/home/op/.ssh/id_rsa"}
roleGroups:
etcd:
- master1
- master2
- master3
control-plane:
- master1
- master2
- master3
worker:
- node1
registry:
- master1
controlPlaneEndpoint:
## Internal loadbalancer for apiservers
# internalLoadbalancer: haproxy
domain: lb.kubesphere.local
address: "192.168.10.110"
port: 7443
kubernetes:
version: v1.22.9
clusterName: cluster.local
autoRenewCerts: true
containerManager: containerd
kata:
enabled: true
etcd:
type: kubekey
network:
plugin: kubeovn
kubePodsCIDR: 10.233.64.0/18
kubeServiceCIDR: 10.233.0.0/18
## multus support. https://github.com/k8snetworkplumbingwg/multus-cni
multusCNI:
enabled: false
registry:
# 如需使用 kk 部署 harbor, 可将该参数设置为 harbor,不设置该参数且需使用 kk 创建容器镜像仓库,将默认使用docker registry。
#type: harbor
# 如使用 kk 部署的 harbor 或其他需要登录的仓库,可设置对应仓库的auths,如使用 kk 创建的 docker registry 仓库,则无需配置该参数。
# 注意:如使用 kk 部署 harbor,该参数请于 harbor 启动后设置。
auths:
"dockerhub.kubekey.local":
# username: admin
# password: Harbor12345
cafile: /etc/docker/certs.d/dockerhub.kubekey.local/ca.crt
certfile: /etc/docker/certs.d/dockerhub.kubekey.local/dockerhub.kubekey.local.cert
keyfile: /etc/docker/certs.d/dockerhub.kubekey.local/dockerhub.kubekey.local.key
# 设置集群部署时使用的私有仓库
privateRegistry: "dockerhub.kubekey.local"
namespaceOverride: ""
registryMirrors: []
insecureRegistries: []
addons: []
官网模板参考:
https://github.com/kubesphere/kubekey/blob/master/docs/config-example.md
文档参考:
https://github.com/kubesphere/kubekey/blob/master/README_zh-CN.md
https://github.com/kubesphere/kubekey/blob/master/docs/zh/manifest_and_artifact.md