运维部署
搭建一个单机版的k8s
Gitlab部署及使用
docker-compose安装Harbor
LDAP部署
Chrony时钟源部署
PXE批量安装
wiki.js部署指南
常用源
常用脚本
阿里云ossfs部署
华为光交划zone
Ubuntu虚拟部署FusionCompute
Rancher部署
AIX7.0安装JAVA
eggo部署K8S
Harbor本地镜像仓库离线安装及使用
使用kubeadm部署K8S(docker+CRI+Flannel)集群
使用kubeadm部署K8S(containerd+Calico)集群
AIX7.0安装JAVA
Elasticsearch单机部署
本文档使用 MrDoc 发布
-
+
首页
eggo部署K8S
# 使用openEuler提供的Kubernetes集群自动化部署工具一键部署Kubernetes集群 ## 工具介绍 ### 部署方式 openEuler 提供的 Kubernetes 集群自动化部署工具使用命令行方式进行集群的一键部署。它提供了如下几种部署方式: * 离线部署:本地准备好所有需要用到的 RPM 软件包、二进制文件、插件、容器镜像,并将它们按照一定的格式打包成一个 tar.gz 文件,然后完成对应 YAML 配置文件的编写,即可执行命令实现一键部署。当虚拟机无法访问外部网络时,可以采用该部署方式。 * 在线部署:只需要完成对应 YAML 配置文件的编写,所需的RPM 软件包、二进制文件、插件、容器镜像,都在安装部署阶段连接互联网自动下载。该方式需要虚拟机能够访问软件源、集群依赖的镜像仓库,例如 Docker Hub 。 ### 配置介绍 ``` * cluster-id:集群名称,请遵循DNS域名的命名规范。例如k8s-cluster * username:需要部署k8s集群的机器的ssh登录用户名,所有机器都需要使用同一个用户名。 * private-key-path:ssh免密登录的秘钥存储文件的路径。private-key-path和password只需要配置其中一项,如果两者都进行了配置,优先使用private-key-path * masters:master节点列表,建议每个master节点同时作为worker节点。每个master节点包含如下配置子项,多个master节点配置多组子项内容: * name:master节点名称,为k8s集群看到的该节点名称 * ip:master节点的IP地址 * port:ssh登录该节点的端口,默认为22 * arch:master节点的CPU架构,例如x86_64取值为amd64 * workers:worker节点列表。每个worker节点包含如下配置子项,多个worker节点配置多个子项内容: * name:worker节点名称,为k8s集群看到的该节点名称 * ip:worker节点的IP地址 * port:ssh登录该节点的端口,默认为22 * arch:worker节点的CPU架构,例如x86_64取值为amd64 * etcds:etcd节点的列表。如果该项为空,则会为每个master节点部署一个etcd,否则只会部署配置的etcd节点。每个etcd节点包含如下配置子项,多个etcd节点配置多组子项内容: * name:etcd节点的名称,为k8s集群看到的该节点的名称 * ip:etcd节点的IP地址 * port:ssh登录的端口 * arch:etcd节点的CPU架构,例如x86_64取值为amd64 * loadbalance:loadbalance节点列表。每个loadbalance节点包含如下配置子项,多个loadbalance节点配置多组子项内容: * name:loadbalance节点的名称,为k8s集群看到的该节点的名称 * ip:loadbalance节点的IP地址 * port:ssh登录的端口 * arch:loadbalance节点的CPU架构,例如x86_64取值为amd64 * bind-port:负载均衡服务的侦听端口 * external-ca:是否使用外部CA证书,使用则配置为true,反之,配置为false * external-ca-path:外部CA证书文件的路径。仅external-ca为true时有效 * service:k8s创建的service信息。service配置包含如下配置子项: * cidr:k8s创建的service的IP地址网段 * dnsaddr:k8s创建的service的DNS地址 * gateway:k8s创建的service的网关地址 * dns:k8s创建的coredns的配置。dns配置包含如下配置子项: * corednstype:k8s创建的coredns的部署类型,支持pod和binary * imageversion:pod部署类型的coredns镜像版本 * replicas:pod部署类型的coredns副本数量 * network:k8s集群网络配置。network配置包含如下配置子项: * podcidr:k8s集群网络的IP地址网段 * plugin:k8s集群部署的网络插件 * plugin-args:k8s集群网络的网络插件的配置文件路径。例如:{"NetworkYamlPath":"/etc/kubernetes/addons/calico.yaml"} * apiserver-endpoint:集群外部可访问的APISERVER服务的地址或域名,如果配置了loadbalances则填loadbalance地址,否则填写第1个master节点地址。 * apiserver-cert-sans:apiserver相关证书中需要额外配置的IP和域名。它包含如下子配置项 * dnsnames:apiserver相关证书中需要额外配置的域名数组列表。 * ips:apiserver相关证书中需要额外配置的IP地址数组列表。 * apiserver-timeout:apiserver响应超时时间 * etcd-token:etcd集群名称 * dns-vip:dns的虚拟IP地址 * dns-domain:DNS域名后缀 * pause-image:pause容器的完整镜像名称 * network-plugin:网络插件类型。仅支持配置cni,配置为空时使用k8s默认网络。 * cni-bin-dir:网络插件地址,多个地址使用","分隔,例如:/usr/libexec/cni,/opt/cni/bin * runtime:指定容器运行时类型,目前支持docker和iSulad * runtime-endpoint:容器运行时endpoint,当runtime为docker时,可以不指定 * registry-mirrors:下载容器镜像时,使用的镜像仓库的mirror站点地址 * insecure-registries:下载容器镜像时,使用http协议下载镜像的镜像仓库地址 * config-extra-args:各个组件(例如kube-apiserver、etcd)服务启动配置的额外参数。它包含如下子配置项: * name:组件名称,支持etcd、kube-apiserver、kube-controller-manager、kube-scheduler、kube-proxy、kubelet * extra-args:组件的拓展参数,格式为key:value格式,注意key对应的组件参数前需要加上"-"或者"--"。 * open-ports:配置需要额外打开的端口,k8s自身所需端口不需要进行配置,k8s以外的插件端口需要进行额外配置。 * worker|master|etcd|loadbalance:指定打开端口的节点类型,每项配置包含一个多或者多个port和protocol子配置项。 * port:端口地址 * protocol:端口类型,可选值为tcp或者udp * install:配置各种类型节点上需要安装的安装包或者二进制文件的详细信息,注意将对应文件放到在tar.gz安装包中。以下给全量配置说明,具体配置请根据实际情况选择。 * package-source:配置安装包的详细信息 * type:安装包的压缩类型,目前只支持tar.gz类型的安装包 * dstpath:安装包在对端机器上的路径,必须是可用的绝对路径 * srcpath:不同架构安装包的存放路径,架构必须与机器架构相对应,必须是可用的绝对路径 * arm64:arm64架构安装包的路径,配置的机器中存在arm64机器场景下需要配置 * amd64:amd64类型安装包的路径,配置的机器中存在x86_64机器场景下需要配置 ``` > install 配置中 etcd、kubernetes-master、kubernetes-worker、network、loadbalance、container、image、dns 中的子配置项相同,都是 name、type、dst,schedule、TimeOut 。其中 dst,schedule、TimeOut 为可选项,用户根据安装的文件决定是否配置。下述仅以 etcd 和 kubernetes-master 节点的配置为例说明。 {.is-info} ``` * etcd:etcd 类型节点需要安装的包或二进制文件列表 * name:需要安装的软件包或二进制文件的名称,如果是安装包则只写名称,不填写具体的版本号,安装时会使用 $name* 识别,例如 etcd 。如果为多个软件包,各名称使用 ,分隔 。 * type:配置项类型,可选值为 pkg、repo、bin、file、dir、image、yaml、shell 。如果配置为 repo ,请在对应节点上配置 repo 源 * dst:目的文件夹路径,type 为 bin、file、dir 类型时需要配置。表示将文件/文件夹放到节点的哪个目录下,为了防止用户误配置路径,导致 cleanup 时删除重要文件,此配置必须配置为白名单中的路径。详见 “白名单说明” * kubernetes-master:k8s master 类型节点需要安装的包或二进制文件列表 * kubernetes-worker:k8s worker 类型节点需要安装的包或二进制文件列表 * network:网络需要安装的包或二进制文件列表 * loadbalance:loadbalance 类型节点需要安装的包或二进制文件列表 * container:容器需要安装的包或二进制文件列表 * image:容器镜像 tar 包 * dns:k8s coredns 安装包。如果 corednstype 配置为 pod,此处无需配置 * addition:额外的安装包或二进制文件列表 * master:以下配置会安装在所有 master 节点 * name:需要安装的软件包或二进制文件的名称 * type:配置项类型,可选值为 pkg、repo、bin、file、dir、image、yaml、shell 。如果配置为 repo ,请在对应节点上配置 repo 源 * schedule:仅在 type 为 shell 时有效,代表用户想要执行脚本的时机,支持 prejoin(节点加入前)、postjoin(节点加入后)、precleanup(节点退出前)、postcleanup(节点退出后)。 * TimeOut:脚本执行超时时间,超时时该进程被强制终止运行。未配置默认为 30s * worker:配置会安装在所有 worker 节点,具体配置格式和 addition 下的 master 相同 ``` ### 白名单介绍 install 配置中 dst 项的值必须符合白名单规则,配置为白名单对应路径及其子目录。当前白名单如下: * /usr/bin * /usr/local/bin * /opt/cni/bin * /usr/libexec/cni * /etc/kubernetes * /usr/lib/systemd/system * /etc/systemd/system * /tmp ### 配置示例 此处给出一个 YAML 文件配置示例。从示例可知,同一台机器,可以部署多个类型的节点,但是不同节点的配置必须一致,例如 test0 机器部署了 master 和 worker 类型。 ``` cluster-id: k8s-cluster username: root private-key-path: /root/.ssh/private.key masters: - name: test0 ip: 192.168.0.1 port: 22 arch: arm64 workers: - name: test0 ip: 192.168.0.1 port: 22 arch: arm64 - name: test1 ip: 192.168.0.3 port: 22 arch: arm64 etcds: - name: etcd-0 ip: 192.168.0.4 port: 22 arch: amd64 loadbalance: name: k8s-loadbalance ip: 192.168.0.5 port: 22 arch: amd64 bind-port: 8443 external-ca: false external-ca-path: /opt/externalca service: cidr: 10.32.0.0/16 dnsaddr: 10.32.0.10 gateway: 10.32.0.1 dns: corednstype: pod imageversion: 1.8.4 replicas: 2 network: podcidr: 10.244.0.0/16 plugin: calico plugin-args: {"NetworkYamlPath": "/etc/kubernetes/addons/calico.yaml"} apiserver-endpoint: 192.168.122.222:6443 apiserver-cert-sans: dnsnames: [] ips: [] apiserver-timeout: 120s etcd-external: false etcd-token: etcd-cluster dns-vip: 10.32.0.10 dns-domain: cluster.local pause-image: k8s.gcr.io/pause:3.2 network-plugin: cni cni-bin-dir: /usr/libexec/cni,/opt/cni/bin runtime: docker runtime-endpoint: unix:///var/run/docker.sock registry-mirrors: [] insecure-registries: [] config-extra-args: - name: kubelet extra-args: "--cgroup-driver": systemd open-ports: worker: - port: 111 protocol: tcp - port: 179 protocol: tcp install: package-source: type: tar.gz dstpath: "" srcpath: arm64: /root/rpms/packages-arm64.tar.gz amd64: /root/rpms/packages-x86.tar.gz etcd: - name: etcd type: pkg dst: "" kubernetes-master: - name: kubernetes-client,kubernetes-master type: pkg kubernetes-worker: - name: docker-engine,kubernetes-client,kubernetes-node,kubernetes-kubelet type: pkg dst: "" - name: conntrack-tools,socat type: pkg dst: "" network: - name: containernetworking-plugins type: pkg dst: "" loadbalance: - name: gd,gperftools-libs,libunwind,libwebp,libxslt type: pkg dst: "" - name: nginx,nginx-all-modules,nginx-filesystem,nginx-mod-http-image-filter,nginx-mod-http-perl,nginx-mod-http-xslt-filter,nginx-mod-mail,nginx-mod-stream type: pkg dst: "" container: - name: emacs-filesystem,gflags,gpm-libs,re2,rsync,vim-filesystem,vim-common,vim-enhanced,zlib-devel type: pkg dst: "" - name: libwebsockets,protobuf,protobuf-devel,grpc,libcgroup type: pkg dst: "" - name: yajl,lxc,lxc-libs,lcr,clibcni,iSulad type: pkg dst: "" image: - name: pause.tar type: image dst: "" dns: - name: coredns type: pkg dst: "" addition: master: - name: prejoin.sh type: shell schedule: "prejoin" TimeOut: "30s" - name: calico.yaml type: yaml dst: "" worker: - name: docker.service type: file dst: /usr/lib/systemd/system/ - name: postjoin.sh type: shell schedule: "postjoin" ``` ## 集群状态 本文所使用的集群状态如下: * 集群结构:6 个 openEuler 22.03 LTS SP2系统的虚拟机,3 个 master 和 3 个 node 节点 ## 自动化部署 由于手动部署 Kubernetes 集群依赖人工部署各类组件,该方式耗时耗力。尤其是在大规模部署 Kubernetes 集群环境时,面临效率和出错的问题。为了解决该问题,openEuler 自 21.09 版本推出 Kubernetes 集群部署工具,该工具实现了大规模 Kubernetes 的自动化部署、部署流程追踪等功能,并且具备高度的灵活性。 ### 架构简介  自动化集群部署整体架构如图所示,各模块含义如下: * GitOps:负责集群配置信息的管理,如更新、创建、删除等; 21.09 版本暂时不提供集群管理集群的功能。 * InitCluster:元集群,作为中心集群管理其他业务集群。 * eggops:自定义 CRD 和 controller 用于抽象 k8s 集群。 * master:k8s 的 master 节点,承载集群的控制面。 * worker:k8s 的负载节点,承载用户业务。 * ClusterA、ClusterB、ClusterC:业务集群,承载用户业务。 openEuler提供的k8s集群部署工具源码仓:https://gitee.com/openeuler/eggo ## 部署集群 ### 前提条件 使用 Kubernetes 集群自动化部署工具,需要满足如下要求: * 部署集群需要使用 root 权限。 * 待部署 Kubernetes 的机器已经配置好机器名称 hostname ,并且已安装 tar 命令,确保能够使用 tar 命令解压 tar.gz 格式的压缩包。 * 待部署 Kubernetes 的机器已经配置 ssh ,确保能够远程访问。如果是普通用户 ssh 登录,需要确保该用户有免密执行 sudo 的权限。 * 关闭防火墙和SELINUX ### 环境说明 | HostName | IPV4 | | --- | --- | | k8smaster1 | 10.0.1.200/24 | | k8smaster2 | 10.0.1.201/24 | | k8smaster3 | 10.0.1.202/24 | | k8snode1 | 10.0.1.203/24 | | k8snode2 | 10.0.1.204/24 | | k8snode3 | 10.0.1.205/24 | > 本文采用在线安装 {.is-info} ### 准备配置文件 准备配置文件 准备部署时使用的 YAML 配置文件。可以使用如下命令生成一个模板配置,然后根据部署需求修改生成的 template.yaml 。 ``` $ eggo template -f template.yaml ``` 或者直接使用命令行方式修改默认配置,参考命令如下: ``` $ eggo template -f template.yaml -n k8s-cluster -u username -p password --masters 10.0.1.200 --masters 10.0.1.201 --masters 10.0.1.202 --workers 10.0.1.203 --workers 10.0.1.204 --workers 10.0.1.205 --loadbalance 10.0.1.200 ``` ``` cluster-id: k8s-cluster username: root private-key-path: /root/.ssh/id_rsa masters: - name: k8s-master-1 ip: 10.0.1.200 port: 22 arch: amd64 - name: k8s-master-2 ip: 10.0.1.201 port: 22 arch: amd64 - name: k8s-master-3 ip: 10.0.1.202 port: 22 arch: amd64 workers: - name: k8s-worker-1 ip: 10.0.1.203 port: 22 arch: amd64 - name: k8s-worker-2 ip: 10.0.1.204 port: 22 arch: amd64 - name: k8s-worker-3 ip: 10.0.1.205 port: 22 arch: amd64 loadbalance: name: k8s-loadbalance ip: 10.0.1.200 port: 22 arch: amd64 bind-port: 8443 external-ca: false external-ca-path: /opt/externalca service: cidr: 10.32.0.0/16 dnsaddr: 10.32.0.10 gateway: 10.32.0.1 dns: corednstype: binary imageversion: "" replicas: 0 network: podcidr: 10.244.0.0/16 plugin: calico pluginargs: {} apiserver-endpoint: 10.0.1.200:8443 apiserver-cert-sans: dnsnames: [] ips: [] apiserver-timeout: 120s etcd-external: false etcd-token: etcd-cluster dns-vip: 10.32.0.10 dns-domain: cluster.local pause-image: k8s.gcr.io/pause:3.2 network-plugin: cni enable-kubelet-serving: false cni-bin-dir: /usr/libexec/cni,/opt/cni/bin runtime: iSulad runtime-endpoint: unix:///var/run/isulad.sock registry-mirrors: [] insecure-registries: [] config-extra-args: [] open-ports: master: - port: 53 protocol: tcp - port: 53 protocol: udp - port: 9153 protocol: tcp worker: - port: 111 protocol: tcp - port: 179 protocol: tcp ``` ### 安装Kubernetes集群 ``` $ eggo -d deploy -f template.yaml ``` 安装完成后,根据回显信息,确认集群各节点是否安装成功。 ``` \------------------------------- message: create cluster success summary: 192.168.0.1 success 192.168.0.2 success 192.168.0.3 success \------------------------------- To start using cluster: cluster-example, you need following as a regular user: export KUBECONFIG=/etc/eggo/cluster-example/admin.conf ``` ### 命令参考 ####
阿星
2024年1月21日 22:01
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码