diff --git a/README.md b/README.md index 85c95d1..4d7ff2c 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ - **集群特性** `TLS`双向认证、`RBAC`授权、[Master高可用](docs/setup/00-planning_and_overall_intro.md#ha-architecture)、支持`Network Policy`、[离线安装](docs/setup/offline_install.md) - **集群版本** kubernetes v1.21, v1.22, v1.23, v1.24 - **操作系统** CentOS/RedHat 7, Debian 9/10, Ubuntu 16.04/18.04/20.04 -- **运行时** [containerd](docs/setup/containerd.md) v1.6.4, docker 20.10.x (k8s < 1.24) +- **运行时** [containerd](docs/setup/03-container_runtime.md) v1.6.4, docker 20.10.x (k8s < 1.24) - **网络** [calico](docs/setup/network-plugin/calico.md), [cilium](docs/setup/network-plugin/cilium.md), [flannel](docs/setup/network-plugin/flannel.md), [kube-ovn](docs/setup/network-plugin/kube-ovn.md), [kube-router](docs/setup/network-plugin/kube-router.md) diff --git a/docs/setup/00-planning_and_overall_intro.md b/docs/setup/00-planning_and_overall_intro.md index facec83..c24542b 100644 --- a/docs/setup/00-planning_and_overall_intro.md +++ b/docs/setup/00-planning_and_overall_intro.md @@ -13,21 +13,21 @@ |角色|数量|描述| |:-|:-|:-| -|部署节点|1|运行ansible/ezctl命令,建议独立节点| +|部署节点|1|运行ansible/ezctl命令,一般复用第一个master节点| |etcd节点|3|注意etcd集群需要1,3,5,...奇数个节点,一般复用master节点| |master节点|2|高可用集群至少2个master节点| -|node节点|3|运行应用负载的节点,可根据需要提升机器配置/增加节点数| +|node节点|n|运行应用负载的节点,可根据需要提升机器配置/增加节点数| 机器配置: - master节点:4c/8g内存/50g硬盘 - worker节点:建议8c/32g内存/200g硬盘以上 -注意:默认配置下容器/kubelet会占用/var的磁盘空间,如果磁盘分区特殊,可以设置config.yml中的容器/kubelet数据目录:`CONTAINERD_STORAGE_DIR` `DOCKER_STORAGE_DIR` `KUBELET_ROOT_DIR` +注意:默认配置下容器运行时和kubelet会占用/var的磁盘空间,如果磁盘分区特殊,可以设置config.yml中的容器运行时和kubelet数据目录:`CONTAINERD_STORAGE_DIR` `DOCKER_STORAGE_DIR` `KUBELET_ROOT_DIR` 在 kubeasz 2x 版本,多节点高可用集群安装可以使用2种方式 -- 1.先部署单节点集群 [AllinOne部署](quickStart.md),然后通过 [节点添加](../op/op-index.md) 扩容成高可用集群 -- 2.按照如下步骤先规划准备,在clusters/${cluster_name}/hosts 配置节点信息后,直接安装多节点高可用集群 +- 1.按照本文步骤先规划准备,预先配置节点信息后,直接安装多节点高可用集群 +- 2.先部署单节点集群 [AllinOne部署](quickStart.md),然后通过 [节点添加](../op/op-index.md) 扩容成高可用集群 ## 部署步骤 @@ -41,63 +41,51 @@ ### 2.在每个节点安装依赖工具 -Ubuntu 16.04 请执行以下脚本: +推荐使用ansible in docker 容器化方式运行,无需安装额外依赖。 + +### 3.准备ssh免密登陆 + +配置从部署节点能够ssh免密登陆所有节点,并且设置python软连接 ``` bash -apt-get update && apt-get upgrade -y && apt-get dist-upgrade -y -# 安装python2 -apt-get install python2.7 -# Ubuntu16.04可能需要配置以下软连接 -ln -s /usr/bin/python2.7 /usr/bin/python -``` -CentOS 7 请执行以下脚本: - -``` bash -yum update -# 安装python -yum install python -y -``` - -### 3.在部署节点安装ansible及准备ssh免密登陆 - -- 3.1 安装ansible (也可以使用容器化运行kubeasz,已经预装好ansible) - -``` bash -# 注意pip 21.0以后不再支持python2和python3.5,需要如下安装 -# To install pip for Python 2.7 install it from https://bootstrap.pypa.io/2.7/ : -curl -O https://bootstrap.pypa.io/pip/2.7/get-pip.py -python get-pip.py -python -m pip install --upgrade "pip < 21.0" - -# pip安装ansible(国内如果安装太慢可以直接用pip阿里云加速) -pip install ansible -i https://mirrors.aliyun.com/pypi/simple/ -``` - -- 3.2 在ansible控制端配置免密码登录 - -``` bash -# 更安全 Ed25519 算法 -ssh-keygen -t ed25519 -N '' -f ~/.ssh/id_ed25519 -# 或者传统 RSA 算法 -ssh-keygen -t rsa -b 2048 -N '' -f ~/.ssh/id_rsa - -ssh-copy-id $IPs #$IPs为所有节点地址包括自身,按照提示输入yes 和root密码 +#$IP为所有节点地址包括自身,按照提示输入yes 和root密码 +ssh-copy-id $IP # 为每个节点设置python软链接 -ssh $IPs ln -s /usr/bin/python3 /usr/bin/python +ssh $IP ln -s /usr/bin/python3 /usr/bin/python ``` ### 4.在部署节点编排k8s安装 - 4.1 下载项目源码、二进制及离线镜像 +下载工具脚本ezdown,举例使用kubeasz版本3.3.1 + ``` bash -# 下载工具脚本ezdown,举例使用kubeasz版本3.0.0 -export release=3.0.0 +export release=3.3.1 wget https://github.com/easzlab/kubeasz/releases/download/${release}/ezdown chmod +x ./ezdown -# 使用工具脚本下载 +``` + +下载kubeasz代码、二进制、默认容器镜像(更多关于ezdown的参数,运行./ezdown 查看) + +``` bash +# 国内环境 ./ezdown -D +# 海外环境 +#./ezdown -D -m standard +``` + +【可选】下载额外容器镜像(cilium,flannel,prometheus等) + +``` bash +./ezdown -X +``` + +【可选】下载离线系统包 (适用于无法使用yum/apt仓库情形) + +``` bash +./ezdown -P ``` 上述脚本运行成功后,所有文件(kubeasz代码、二进制、离线镜像)均已整理好放入目录`/etc/kubeasz` @@ -105,7 +93,11 @@ chmod +x ./ezdown - 4.2 创建集群配置实例 ``` bash -ezctl new k8s-01 +# 容器化运行kubeasz +./ezdown -S + +# 创建新集群 k8s-01 +docker exec -it kubeasz ezctl new k8s-01 2021-01-19 10:48:23 DEBUG generate custom cluster files in /etc/kubeasz/clusters/k8s-01 2021-01-19 10:48:23 DEBUG set version of common plugins 2021-01-19 10:48:23 DEBUG cluster k8s-01: files successfully created. @@ -118,16 +110,21 @@ ezctl new k8s-01 如果你对集群安装流程不熟悉,请阅读项目首页 **安装步骤** 讲解后分步安装,并对 **每步都进行验证** ``` bash -# 一键安装 -ezctl setup k8s-01 all +#建议配置命令alias,方便执行 +echo "alias dk='docker exec -it kubeasz'" >> /root/.bashrc +source /root/.bashrc -# 或者分步安装,具体使用 ezctl help setup 查看分步安装帮助信息 -# ezctl setup k8s-01 01 -# ezctl setup k8s-01 02 -# ezctl setup k8s-01 03 -# ezctl setup k8s-01 04 +# 一键安装,等价于执行docker exec -it kubeasz ezctl setup k8s-01 all +dk ezctl setup k8s-01 all + +# 或者分步安装,具体使用 dk ezctl help setup 查看分步安装帮助信息 +# dk ezctl setup k8s-01 01 +# dk ezctl setup k8s-01 02 +# dk ezctl setup k8s-01 03 +# dk ezctl setup k8s-01 04 ... ``` +更多ezctl使用帮助,请参考[这里](ezctl.md) [后一篇](01-CA_and_prerequisite.md) diff --git a/docs/setup/01-CA_and_prerequisite.md b/docs/setup/01-CA_and_prerequisite.md index 0628764..777f14d 100644 --- a/docs/setup/01-CA_and_prerequisite.md +++ b/docs/setup/01-CA_and_prerequisite.md @@ -207,13 +207,17 @@ kubectl config set-context default --cluster=kubernetes --user=kube-proxy --kube kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig ``` +### 创建kube-controller-manager 和 kube-scheduler 组件的kubeconfig 文件 + +过程与创建kube-proxy.kubeconfig 类似,略。 + ## prepare 角色 请在另外窗口打开[roles/prepare/tasks/main.yml](../../roles/prepare/tasks/main.yml) 文件,比较简单直观 1. 设置基础操作系统软件和系统参数,请阅读脚本中的注释内容 -1. 创建一些基础文件目录 -1. 分发kubeconfig配置文件 +1. 创建一些基础文件目录、环境变量以及添加本地镜像仓库`easzlab.io.local`的域名解析 +1. 分发kubeconfig等配置文件 [后一篇](02-install_etcd.md) diff --git a/docs/setup/02-install_etcd.md b/docs/setup/02-install_etcd.md index 4544749..40ab20f 100644 --- a/docs/setup/02-install_etcd.md +++ b/docs/setup/02-install_etcd.md @@ -48,7 +48,7 @@ Documentation=https://github.com/coreos [Service] Type=notify -WorkingDirectory=/var/lib/etcd/ +WorkingDirectory={{ ETCD_DATA_DIR }} ExecStart={{ bin_dir }}/etcd \ --name=etcd-{{ inventory_hostname }} \ --cert-file={{ ca_dir }}/etcd.pem \ @@ -64,11 +64,12 @@ ExecStart={{ bin_dir }}/etcd \ --initial-cluster-token=etcd-cluster-0 \ --initial-cluster={{ ETCD_NODES }} \ --initial-cluster-state={{ CLUSTER_STATE }} \ - --data-dir=/var/lib/etcd \ + --data-dir={{ ETCD_DATA_DIR }} \ + --wal-dir={{ ETCD_WAL_DIR }} \ --snapshot-count=50000 \ --auto-compaction-retention=1 \ - --max-request-bytes=10485760 \ --auto-compaction-mode=periodic \ + --max-request-bytes=10485760 \ --quota-backend-bytes=8589934592 Restart=always RestartSec=15 @@ -78,10 +79,12 @@ OOMScoreAdjust=-999 [Install] WantedBy=multi-user.target ``` + + 完整参数列表请使用 `etcd --help` 查询 + 注意etcd 即需要服务器证书也需要客户端证书,为方便使用一个peer 证书代替两个证书 + `--initial-cluster-state` 值为 `new` 时,`--name` 的参数值必须位于 `--initial-cluster` 列表中 -+ `--snapshot-count` `--auto-compaction-retention` 一些性能优化参数,请查阅etcd项目 ++ `--snapshot-count` `--auto-compaction-retention` 一些性能优化参数,请查阅etcd项目文档 ++ 设置`--data-dir` 和`--wal-dir` 使用不同磁盘目录,可以避免磁盘io竞争,提高性能,具体请参考etcd项目文档 ### 验证etcd集群状态 diff --git a/docs/setup/03-container_runtime.md b/docs/setup/03-container_runtime.md index c69511d..2b131d8 100644 --- a/docs/setup/03-container_runtime.md +++ b/docs/setup/03-container_runtime.md @@ -1,126 +1,46 @@ -## 03-安装容器运行时(docker or containerd) +# 03-安装容器运行时 -目前k8s官方推荐使用containerd,查阅[使用文档](containerd.md) +项目根据k8s版本提供不同的默认容器运行时: -## 安装docker服务 +- k8s 版本 < 1.24 时,支持docker containerd 可选 +- k8s 版本 >= 1.24 时,仅支持 containerd -### 创建docker的systemd unit文件 +## 安装containerd -``` bash -[Unit] -Description=Docker Application Container Engine -Documentation=http://docs.docker.io +作为 CNCF 毕业项目,containerd 致力于提供简洁、可靠、可扩展的容器运行时;它被设计用来集成到 kubernetes 等系统使用,而不是像 docker 那样独立使用。 -[Service] -Environment="PATH={{ bin_dir }}:/bin:/sbin:/usr/bin:/usr/sbin" -ExecStart={{ bin_dir }}/dockerd -ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT -ExecReload=/bin/kill -s HUP $MAINPID -Restart=on-failure -RestartSec=5 -LimitNOFILE=infinity -LimitNPROC=infinity -LimitCORE=infinity -Delegate=yes -KillMode=process +- 安装指南 https://github.com/containerd/cri/blob/master/docs/installation.md +- 客户端 circtl 使用指南 https://github.com/containerd/cri/blob/master/docs/crictl.md +- man 文档 https://github.com/containerd/containerd/tree/master/docs/man -[Install] -WantedBy=multi-user.target -``` -+ dockerd 运行时会调用其它 docker 命令,如 docker-proxy,所以需要将 docker 命令所在的目录加到 PATH 环境变量中; -+ docker 从 1.13 版本开始,将`iptables` 的`filter` 表的`FORWARD` 链的默认策略设置为`DROP`,从而导致 ping 其它 Node 上的 Pod IP 失败,因此必须在 `filter` 表的`FORWARD` 链增加一条默认允许规则 `iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT` -+ 运行`dockerd --help` 查看所有可配置参数,确保默认开启 `--iptables` 和 `--ip-masq` 选项 +## kubeasz 集成安装 containerd -### 配置daemon.json +- 注意:k8s 1.24以后,项目已经设置默认容器运行时为 containerd,无需手动修改 +- 执行安装:分步安装`ezctl setup xxxx 03`,一键安装`ezctl setup xxxx all` -roles/docker/templates/daemon.json.j2 +## 命令对比 -``` bash -{ - "data-root": "{{ DOCKER_STORAGE_DIR }}", - "exec-opts": ["native.cgroupdriver=cgroupfs"], -{% if ENABLE_MIRROR_REGISTRY %} - "registry-mirrors": [ - "https://docker.mirrors.ustc.edu.cn", - "http://hub-mirror.c.163.com" - ], -{% endif %} -{% if ENABLE_REMOTE_API %} - "hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"], -{% endif %} - "insecure-registries": {{ INSECURE_REG }}, - "max-concurrent-downloads": 10, - "live-restore": true, - "log-driver": "json-file", - "log-level": "warn", - "log-opts": { - "max-size": "50m", - "max-file": "1" - }, - "storage-driver": "overlay2" -} -``` -- data-root 配置容器数据目录,默认/var/lib/docker,在集群安装时要规划磁盘空间使用 -- registry-mirrors 配置国内镜像仓库加速 -- live-restore 可以重启docker daemon ,而不重启容器 -- log-opts 容器日志相关参数,设置单个容器日志超过50M则进行回卷,回卷的副本数超过1个就进行清理 +|命令 |docker |crictl(推荐) |ctr | +|:- |:- |:- |:- | +|查看容器列表 |docker ps |crictl ps |ctr -n k8s.io c ls | +|查看容器详情 |docker inspect |crictl inspect |ctr -n k8s.io c info | +|查看容器日志 |docker logs |crictl logs |无 | +|容器内执行命令 |docker exec |crictl exec |无 | +|挂载容器 |docker attach |crictl attach |无 | +|容器资源使用 |docker stats |crictl stats |无 | +|创建容器 |docker create |crictl create |ctr -n k8s.io c create | +|启动容器 |docker start |crictl start |ctr -n k8s.io run | +|停止容器 |docker stop |crictl stop |无 | +|删除容器 |docker rm |crictl rm |ctr -n k8s.io c del | +|查看镜像列表 |docker images |crictl images |ctr -n k8s.io i ls | +|查看镜像详情 |docker inspect |crictl inspecti|无 | +|拉取镜像 |docker pull |crictl pull |ctr -n k8s.io i pull | +|推送镜像 |docker push |无 |ctr -n k8s.io i push | +|删除镜像 |docker rmi |crictl rmi |ctr -n k8s.io i rm | +|查看Pod列表 |无 |crictl pods |无 | +|查看Pod详情 |无 |crictl inspectp|无 | +|启动Pod |无 |crictl runp |无 | +|停止Pod |无 |crictl stopp |无 | -对于企业内部应用的docker镜像,想要在K8S平台运行的话,特别是结合开发`CI/CD` 流程,需要部署私有镜像仓库,参阅[harbor文档](../guide/harbor.md)。 - -### 清理 iptables - -因为`calico`网络、`kube-proxy`等将大量使用 iptables规则,安装前清空所有`iptables`策略规则;常见发行版`Ubuntu`的 `ufw` 和 `CentOS`的 `firewalld`等基于`iptables`的防火墙最好直接卸载,避免不必要的冲突。 - -WARNNING: 如果有自定义的iptables规则也会被一并清除,如果一定要使用自定义规则,可以集群安装完成后在应用规则 - -``` bash -iptables -F && iptables -X \ - && iptables -F -t nat && iptables -X -t nat \ - && iptables -F -t raw && iptables -X -t raw \ - && iptables -F -t mangle && iptables -X -t mangle -``` -+ calico 网络支持 `network-policy`,使用的`calico-kube-controllers` 会使用到`iptables` 所有的四个表 `filter` `nat` `raw` `mangle`,所以一并清理 - -### 可选-安装docker查询镜像 tag的小工具 - -docker官方没有提供在命令行直接查询某个镜像的tag信息的方式,可以使用一个工具脚本: - -``` bash -$ docker-tag library/ubuntu -"14.04" -"16.04" -"17.04" -"latest" -"trusty" -"trusty-20171117" -"xenial" -... -``` -+ 需要先apt安装轻量JSON处理程序 `jq` - -### 验证 - -安装成功后验证如下: - -``` bash -systemctl status docker # 服务状态 -journalctl -u docker # 运行日志 -docker version -docker info -``` -`iptables-save|grep FORWARD` 查看 iptables filter表 FORWARD链,最后要有一个 `-A FORWARD -j ACCEPT` 保底允许规则 - -``` bash -iptables-save|grep FORWARD -:FORWARD ACCEPT [0:0] -:FORWARD DROP [0:0] --A FORWARD -j DOCKER-USER --A FORWARD -j DOCKER-ISOLATION --A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT --A FORWARD -o docker0 -j DOCKER --A FORWARD -i docker0 ! -o docker0 -j ACCEPT --A FORWARD -i docker0 -o docker0 -j ACCEPT --A FORWARD -j ACCEPT -``` [后一篇](04-install_kube_master.md) diff --git a/docs/setup/04-install_kube_master.md b/docs/setup/04-install_kube_master.md index c61b859..1703b83 100644 --- a/docs/setup/04-install_kube_master.md +++ b/docs/setup/04-install_kube_master.md @@ -19,6 +19,16 @@ ## 安装流程 +``` bash +cat playbooks/04.kube-master.yml +- hosts: kube_master + roles: + - kube-lb # 四层负载均衡,监听在127.0.0.1:6443,转发到真实master节点apiserver服务 + - kube-master # + - kube-node # 因为网络、监控等daemonset组件,master节点也推荐安装kubelet和kube-proxy服务 + ... +``` + ### 创建 kubernetes 证书签名请求 ``` bash @@ -57,10 +67,10 @@ ] } ``` -- kubernetes apiserver 使用对等证书,创建时hosts字段需要配置: - - 如果配置 ex_lb,需要把 EX_APISERVER_VIP 也配置进去 - - 如果需要外部访问 apiserver,可选在config.yml配置 MASTER_CERT_HOSTS - - `kubectl get svc` 将看到集群中由api-server 创建的默认服务 `kubernetes`,因此也要把 `kubernetes` 服务名和各个服务域名也添加进去 +kubernetes apiserver 使用对等证书,创建时hosts字段需要配置: +- 如果配置 ex_lb,需要把 EX_APISERVER_VIP 也配置进去 +- 如果需要外部访问 apiserver,可选在config.yml配置 MASTER_CERT_HOSTS +- `kubectl get svc` 将看到集群中由api-server 创建的默认服务 `kubernetes`,因此也要把 `kubernetes` 服务名和各个服务域名也添加进去 ### 创建apiserver的服务配置文件 @@ -72,7 +82,6 @@ After=network.target [Service] ExecStart={{ bin_dir }}/kube-apiserver \ - --advertise-address={{ inventory_hostname }} \ --allow-privileged=true \ --anonymous-auth=false \ --api-audiences=api,istio-ca \ @@ -87,7 +96,8 @@ ExecStart={{ bin_dir }}/kube-apiserver \ --kubelet-certificate-authority={{ ca_dir }}/ca.pem \ --kubelet-client-certificate={{ ca_dir }}/kubernetes.pem \ --kubelet-client-key={{ ca_dir }}/kubernetes-key.pem \ - --service-account-issuer=kubernetes.default.svc \ + --secure-port={{ SECURE_PORT }} \ + --service-account-issuer=https://kubernetes.default.svc \ --service-account-signing-key-file={{ ca_dir }}/ca-key.pem \ --service-account-key-file={{ ca_dir }}/ca.pem \ --service-cluster-ip-range={{ SERVICE_CIDR }} \ @@ -113,7 +123,6 @@ WantedBy=multi-user.target ``` + Kubernetes 对 API 访问需要依次经过认证、授权和准入控制(admission controll),认证解决用户是谁的问题,授权解决用户能做什么的问题,Admission Control则是资源管理方面的作用。 + 关于authorization-mode=Node,RBAC v1.7+支持Node授权,配合NodeRestriction准入控制来限制kubelet仅可访问node、endpoint、pod、service以及secret、configmap、PV和PVC等相关的资源;需要注意的是v1.7中Node 授权是默认开启的,v1.8中需要显式配置开启,否则 Node无法正常工作 -+ 缺省情况下 kubernetes 对象保存在 etcd /registry 路径下,可以通过 --etcd-prefix 参数进行调整 + 详细参数配置请参考`kube-apiserver --help`,关于认证、授权和准入控制请[阅读](https://github.com/feiskyer/kubernetes-handbook/blob/master/components/apiserver.md) + 增加了访问kubelet使用的证书配置,防止匿名访问kubelet的安全漏洞,详见[漏洞说明](../mixes/01.fix_kubelet_annoymous_access.md) @@ -126,8 +135,10 @@ Documentation=https://github.com/GoogleCloudPlatform/kubernetes [Service] ExecStart={{ bin_dir }}/kube-controller-manager \ - --bind-address={{ inventory_hostname }} \ --allocate-node-cidrs=true \ + --authentication-kubeconfig=/etc/kubernetes/kube-controller-manager.kubeconfig \ + --authorization-kubeconfig=/etc/kubernetes/kube-controller-manager.kubeconfig \ + --bind-address=0.0.0.0 \ --cluster-cidr={{ CLUSTER_CIDR }} \ --cluster-name=kubernetes \ --cluster-signing-cert-file={{ ca_dir }}/ca.pem \ @@ -161,7 +172,9 @@ Documentation=https://github.com/GoogleCloudPlatform/kubernetes [Service] ExecStart={{ bin_dir }}/kube-scheduler \ - --bind-address={{ inventory_hostname }} \ + --authentication-kubeconfig=/etc/kubernetes/kube-scheduler.kubeconfig \ + --authorization-kubeconfig=/etc/kubernetes/kube-scheduler.kubeconfig \ + --bind-address=0.0.0.0 \ --kubeconfig=/etc/kubernetes/kube-scheduler.kubeconfig \ --leader-elect=true \ --v=2 diff --git a/docs/setup/05-install_kube_node.md b/docs/setup/05-install_kube_node.md index acb7981..3e93465 100644 --- a/docs/setup/05-install_kube_node.md +++ b/docs/setup/05-install_kube_node.md @@ -2,10 +2,17 @@ `kube_node` 是集群中运行工作负载的节点,前置条件需要先部署好`kube_master`节点,它需要部署如下组件: -+ kubelet: kube_node上最主要的组件 +``` bash +cat playbooks/05.kube-node.yml +- hosts: kube_node + roles: + - { role: kube-lb, when: "inventory_hostname not in groups['kube_master']" } + - { role: kube-node, when: "inventory_hostname not in groups['kube_master']" } +``` + ++ kube-lb:由nginx裁剪编译的四层负载均衡,用于将请求转发到主节点的 apiserver服务 ++ kubelet:kube_node上最主要的组件 + kube-proxy: 发布应用服务与负载均衡 -+ haproxy:用于请求转发到多个 apiserver,详见[HA-2x 架构](00-planning_and_overall_intro.md#ha-architecture) -+ calico: 配置容器网络 (或者其他网络组件) ### 创建cni 基础网络插件配置文件 @@ -23,28 +30,34 @@ Documentation=https://github.com/GoogleCloudPlatform/kubernetes [Service] WorkingDirectory=/var/lib/kubelet -{% if KUBE_RESERVED_ENABLED == "yes" or SYS_RESERVED_ENABLED == "yes" %} +{% if ansible_distribution == "Debian" and ansible_distribution_version|int >= 10 %} ExecStartPre=/bin/mount -o remount,rw '/sys/fs/cgroup' -ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpuset/system.slice/kubelet.service -ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/hugetlb/system.slice/kubelet.service -ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/memory/system.slice/kubelet.service -ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/pids/system.slice/kubelet.service +{% endif %} +{% if KUBE_RESERVED_ENABLED == "yes" or SYS_RESERVED_ENABLED == "yes" %} +ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpu/podruntime.slice +ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpuacct/podruntime.slice +ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpuset/podruntime.slice +ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/memory/podruntime.slice +ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/pids/podruntime.slice +ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/systemd/podruntime.slice + +ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpu/system.slice +ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpuacct/system.slice +ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpuset/system.slice +ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/memory/system.slice +ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/pids/system.slice +ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/systemd/system.slice + +{% if ansible_distribution != "Debian" %} +ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/hugetlb/podruntime.slice +ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/hugetlb/system.slice +{% endif %} {% endif %} ExecStart={{ bin_dir }}/kubelet \ --config=/var/lib/kubelet/config.yaml \ -{% if KUBE_VER|float < 1.13 %} - --allow-privileged=true \ -{% endif %} - --cni-bin-dir={{ bin_dir }} \ - --cni-conf-dir=/etc/cni/net.d \ -{% if CONTAINER_RUNTIME == "containerd" %} - --container-runtime=remote \ --container-runtime-endpoint=unix:///run/containerd/containerd.sock \ -{% endif %} --hostname-override={{ inventory_hostname }} \ --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \ - --network-plugin=cni \ - --pod-infra-container-image={{ SANDBOX_IMAGE }} \ --root-dir={{ KUBELET_ROOT_DIR }} \ --v=2 Restart=always @@ -53,11 +66,6 @@ RestartSec=5 [Install] WantedBy=multi-user.target ``` -+ --pod-infra-container-image 指定`基础容器`(负责创建Pod 内部共享的网络、文件系统等)镜像,**K8S每一个运行的 POD里面必然包含这个基础容器**,如果它没有运行起来那么你的POD 肯定创建不了,kubelet日志里面会看到类似 ` FailedCreatePodSandBox` 错误,可用`docker images` 查看节点是否已经下载到该镜像 -+ --cluster-dns 指定 kubedns 的 Service IP(可以先分配,后续创建 kubedns 服务时指定该 IP),--cluster-domain 指定域名后缀,这两个参数同时指定后才会生效; -+ --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir={{ bin_dir }} 为使用cni 网络,并调用calico管理网络所需的配置 -+ --fail-swap-on=false K8S 1.8+需显示禁用这个,否则服务不能启动 -+ --client-ca-file={{ ca_dir }}/ca.pem 和 --anonymous-auth=false 关闭kubelet的匿名访问,详见[匿名访问漏洞说明](mixes/01.fix_kubelet_annoymous_access.md) + --ExecStartPre=/bin/mkdir -p xxx 对于某些系统(centos7)cpuset和hugetlb 是默认没有初始化system.slice 的,需要手动创建,否则在启用--kube-reserved-cgroup 时会报错Failed to start ContainerManager Failed to enforce System Reserved Cgroup Limits + 关于kubelet资源预留相关配置请参考 https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/ @@ -78,13 +86,8 @@ After=network.target [Service] WorkingDirectory=/var/lib/kube-proxy ExecStart={{ bin_dir }}/kube-proxy \ - --bind-address={{ inventory_hostname }} \ - --cluster-cidr={{ CLUSTER_CIDR }} \ - --hostname-override={{ inventory_hostname }} \ - --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig \ - --logtostderr=true \ - --v=2 -Restart=on-failure + --config=/var/lib/kube-proxy/kube-proxy-config.yaml +Restart=always RestartSec=5 LimitNOFILE=65536 @@ -92,8 +95,7 @@ LimitNOFILE=65536 WantedBy=multi-user.target ``` -+ --hostname-override 参数值必须与 kubelet 的值一致,否则 kube-proxy 启动后会找不到该 Node,从而不会创建任何 iptables 规则 -+ 特别注意:kube-proxy 根据 --cluster-cidr 判断集群内部和外部流量,指定 --cluster-cidr 或 --masquerade-all 选项后 kube-proxy 才会对访问 Service IP 的请求做 SNAT; +请注意 [kube-proxy-config](../../roles/kube-node/templates/kube-proxy-config.yaml.j2) 文件的注释说明 ### 验证 node 状态 diff --git a/docs/setup/06-install_network_plugin.md b/docs/setup/06-install_network_plugin.md index 0c4cc2d..9ca9301 100644 --- a/docs/setup/06-install_network_plugin.md +++ b/docs/setup/06-install_network_plugin.md @@ -1,13 +1,13 @@ ## 06-安装网络组件 -首先回顾下K8S网络设计原则,在配置集群网络插件或者实践K8S 应用/服务部署请时刻想到这些原则: +首先回顾下K8S网络设计原则,在配置集群网络插件或者实践K8S 应用/服务部署请牢记这些原则: - 1.每个Pod都拥有一个独立IP地址,Pod内所有容器共享一个网络命名空间 - 2.集群内所有Pod都在一个直接连通的扁平网络中,可通过IP直接访问 - 所有容器之间无需NAT就可以直接互相访问 - 所有Node和所有容器之间无需NAT就可以直接互相访问 - 容器自己看到的IP跟其他容器看到的一样 -- 3.Service cluster IP尽可在集群内部访问,外部请求需要通过NodePort、LoadBalance或者Ingress来访问 +- 3.Service cluster IP只可在集群内部访问,外部请求需要通过NodePort、LoadBalance或者Ingress来访问 `Container Network Interface (CNI)`是目前CNCF主推的网络模型,它由两部分组成: @@ -17,23 +17,23 @@ - IPAM Plugin负责给容器分配IP地址 Kubernetes Pod的网络是这样创建的: -- 0.每个Pod除了创建时指定的容器外,都有一个kubelet启动时指定的`基础容器`,比如:`easzlab/pause` `registry.access.redhat.com/rhel7/pod-infrastructure` -- 1.首先 kubelet创建`基础容器`生成network namespace -- 2.然后 kubelet调用网络CNI driver,由它根据配置调用具体的CNI 插件 -- 3.然后 CNI 插件给`基础容器`配置网络 -- 4.最后 Pod 中其他的容器共享使用`基础容器`的网络 +- 0. 每个Pod除了创建时指定的容器外,都有一个kubelet启动时指定的`基础容器`,即`pause`容器 +- 1. kubelet创建`基础容器`生成network namespace +- 2. kubelet调用网络CNI driver,由它根据配置调用具体的CNI 插件 +- 3. CNI 插件给`基础容器`配置网络 +- 4. Pod 中其他的容器共享使用`基础容器`的网络 -本项目基于CNI driver 调用各种网络插件来配置kubernetes的网络,常用CNI插件有 `flannel` `calico` `weave`等等,这些插件各有优势,也在互相借鉴学习优点,比如:在所有node节点都在一个二层网络时候,flannel提供hostgw实现,避免vxlan实现的udp封装开销,估计是目前最高效的;calico也针对L3 Fabric,推出了IPinIP的选项,利用了GRE隧道封装;因此这些插件都能适合很多实际应用场景。 +本项目基于CNI driver 调用各种网络插件来配置kubernetes的网络,常用CNI插件有 `flannel` `calico` `cilium`等等,这些插件各有优势,也在互相借鉴学习优点,比如:在所有node节点都在一个二层网络时候,flannel提供hostgw实现,避免vxlan实现的udp封装开销,估计是目前最高效的;calico也针对L3 Fabric,推出了IPinIP的选项,利用了GRE隧道封装;因此这些插件都能适合很多实际应用场景。 项目当前内置支持的网络插件有:`calico` `cilium` `flannel` `kube-ovn` `kube-router` ### 安装讲解 - [安装calico](network-plugin/calico.md) -- [安装cilium](network-plugin/cilium.md) +- [安装cilium](network-plugin/cilium.md) - [安装flannel](network-plugin/flannel.md) -- [安装kube-ovn](network-plugin/kube-ovn.md) -- [安装kube-router](network-plugin/kube-router.md) +- [安装kube-ovn](network-plugin/kube-ovn.md) 暂未更新 +- [安装kube-router](network-plugin/kube-router.md) 暂未更新 ### 参考 - [kubernetes.io networking docs](https://kubernetes.io/docs/concepts/cluster-administration/networking/) diff --git a/docs/setup/07-install_cluster_addon.md b/docs/setup/07-install_cluster_addon.md index f8d1d95..9079a66 100644 --- a/docs/setup/07-install_cluster_addon.md +++ b/docs/setup/07-install_cluster_addon.md @@ -1,11 +1,27 @@ # 07-安装集群主要插件 目前挑选一些常用、必要的插件自动集成到安装脚本之中: -- [自动脚本](../../roles/cluster-addon/tasks/main.yml) -- 配置开关 - - 参照[配置指南](config_guide.md),生成后在`roles/cluster-addon/defaults/main.yml`配置 -## 脚本介绍 +## 集群默认安装 + +- [coredns](../guide/kubedns.md) +- [nodelocaldns](../guide/kubedns.md) +- [metrics-server](../guide/metrics-server.md) +- [dashboard](../guide/dashboard.md) + +kubeasz 默认安装上述基础插件,并支持离线方式安装(./ezdown -D 命令会自动下载组件镜像,并推送到本地镜像仓库easzlab.io.local:5000) + +## 集群可选安装 + +- [prometheus](../guide/prometheus.md) +- [network_check](network-plugin/network-check.md) +- [nfs_provisioner]() + +kubeasz 默认不安装上述插件,可以在配置文件(clusters/xxx/config.yml)中开启,支持离线方式安装(./ezdown -X 会额外下载这些组件镜像,并推送到本地镜像仓库easzlab.io.local:5000) + +## 安装脚本 + +详见`roles/cluster-addon/` 目录 - 1.根据hosts文件中配置的`CLUSTER_DNS_SVC_IP` `CLUSTER_DNS_DOMAIN`等参数生成kubedns.yaml和coredns.yaml文件 - 2.注册变量pod_info,pod_info用来判断现有集群是否已经运行各种插件 diff --git a/docs/setup/config_guide.md b/docs/setup/config_guide.md index 45f3f49..d71d084 100644 --- a/docs/setup/config_guide.md +++ b/docs/setup/config_guide.md @@ -21,15 +21,12 @@ ## clusters/xxxx/config.yml -主要包括集群某个具体组件的个性化配置,具体组件的配置项可能会不断增加; +主要包括集群某个具体组件的个性化配置,具体组件的配置项可能会不断增加;可以在不做任何配置更改情况下使用默认值创建集群 -- 可以在不做任何配置更改情况下使用默认值创建集群 -- 可以根据实际需要配置 k8s 集群,常用举例 - - 配置使用离线安装系统包:INSTALL_SOURCE: "offline" (需要ezdown -P 下载离线系统软件) - - 配置集群节点安全加固:OS_HARDEN: true - - 配置CA证书以及其签发证书的有效期 - - 配置 docker 国内镜像加速:ENABLE_MIRROR_REGISTRY: true - - 配置 docker 容器存储目录:DOCKER_STORAGE_DIR: "/var/lib/docker" - - 配置 apiserver 支持公网域名:MASTER_CERT_HOSTS - - 配置 cluster-addon 组件安装 - - ... +根据实际需要配置 k8s 集群,常用举例 + +- 配置使用离线安装系统包:INSTALL_SOURCE: "offline" (需要ezdown -P 下载离线系统软件) +- 配置CA证书以及其签发证书的有效期 +- 配置 apiserver 支持公网域名:MASTER_CERT_HOSTS +- 配置 cluster-addon 组件安装 +- ... diff --git a/docs/setup/containerd.md b/docs/setup/containerd.md deleted file mode 100644 index f764ea7..0000000 --- a/docs/setup/containerd.md +++ /dev/null @@ -1,37 +0,0 @@ -# containerd 容器运行时 - -作为 CNCF 毕业项目,containerd 致力于提供简洁、可靠、可扩展的容器运行时;它被设计用来集成到 kubernetes 等系统使用,而不是像 docker 那样独立使用。 - -- 安装指南 https://github.com/containerd/cri/blob/master/docs/installation.md -- 客户端 circtl 使用指南 https://github.com/containerd/cri/blob/master/docs/crictl.md -- man 文档 https://github.com/containerd/containerd/tree/master/docs/man - -## kubeasz 集成安装 containerd - -- 注意:k8s 1.24以后,项目已经设置默认容器运行时为 containerd,无需手动修改 -- 安装前修改配置文件,在clusters/xxxx/hosts 中修改全局变量 `CONTAINER_RUNTIME="containerd"` -- 其他正常执行安装即可:分步安装`ezctl setup xxxx 03`,一键安装`ezctl setup xxxx all` - -## 命令对比 - -|命令 |docker |crictl(推荐) |ctr | -|:- |:- |:- |:- | -|查看容器列表 |docker ps |crictl ps |ctr -n k8s.io c ls | -|查看容器详情 |docker inspect |crictl inspect |ctr -n k8s.io c info | -|查看容器日志 |docker logs |crictl logs |无 | -|容器内执行命令 |docker exec |crictl exec |无 | -|挂载容器 |docker attach |crictl attach |无 | -|容器资源使用 |docker stats |crictl stats |无 | -|创建容器 |docker create |crictl create |ctr -n k8s.io c create | -|启动容器 |docker start |crictl start |ctr -n k8s.io run | -|停止容器 |docker stop |crictl stop |无 | -|删除容器 |docker rm |crictl rm |ctr -n k8s.io c del | -|查看镜像列表 |docker images |crictl images |ctr -n k8s.io i ls | -|查看镜像详情 |docker inspect |crictl inspecti|无 | -|拉取镜像 |docker pull |crictl pull |ctr -n k8s.io i pull | -|推送镜像 |docker push |无 |ctr -n k8s.io i push | -|删除镜像 |docker rmi |crictl rmi |ctr -n k8s.io i rm | -|查看Pod列表 |无 |crictl pods |无 | -|查看Pod详情 |无 |crictl inspectp|无 | -|启动Pod |无 |crictl runp |无 | -|停止Pod |无 |crictl stopp |无 | diff --git a/docs/setup/kubeasz_on_public_cloud.md b/docs/setup/kubeasz_on_public_cloud.md index 888c9f9..bbe868f 100644 --- a/docs/setup/kubeasz_on_public_cloud.md +++ b/docs/setup/kubeasz_on_public_cloud.md @@ -4,7 +4,7 @@ ### 安全组 -注意虚机的安全组规则配置,一般集群内部节点之间端口放开即可; +注意虚机的安全组规则配置,一般集群内部节点之间端口全部放开即可; ### 网络组件 diff --git a/docs/setup/network-plugin/calico.md b/docs/setup/network-plugin/calico.md index 70d91ae..274487e 100644 --- a/docs/setup/network-plugin/calico.md +++ b/docs/setup/network-plugin/calico.md @@ -1,21 +1,21 @@ ## 06-安装calico网络组件.md -推荐阅读[calico kubernetes guide](https://docs.projectcalico.org/v3.4/getting-started/kubernetes/) +calico 是k8s社区最流行的网络插件之一,也是k8s-conformance test 默认使用的网络插件,功能丰富,支持network policy;是当前kubeasz项目的默认网络插件。 -本项目提供多种网络插件可选,如果需要安装calico,请在/etc/ansible/hosts文件中设置变量 `CLUSTER_NETWORK="calico"`,更多的calico设置在`roles/calico/defaults/main.yml`文件定义。 - -- calico-node需要在所有master节点和node节点安装 +如果需要安装calico,请在`clusters/xxxx/hosts`文件中设置变量 `CLUSTER_NETWORK="calico"`,参考[这里](../config_guide.md) ``` bash roles/calico/ -├── defaults -│ └── main.yml ├── tasks -│ └── main.yml -└── templates - ├── calico-csr.json.j2 - ├── calicoctl.cfg.j2 - └── calico-vx.y.yaml.j2 +│   └── main.yml +├── templates +│   ├── calico-csr.json.j2 +│   ├── calicoctl.cfg.j2 +│   ├── calico-v3.15.yaml.j2 +│   ├── calico-v3.19.yaml.j2 +│   └── calico-v3.8.yaml.j2 +└── vars + └── main.yml ``` 请在另外窗口打开`roles/calico/tasks/main.yml`文件,对照看以下讲解内容。 @@ -40,29 +40,28 @@ roles/calico/ ] } ``` -- calico 使用客户端证书,所以hosts字段可以为空;后续可以看到calico证书用在四个地方: - - calico/node 这个docker 容器运行时访问 etcd 使用证书 - - cni 配置文件中,cni 插件需要访问 etcd 使用证书 - - calicoctl 操作集群网络时访问 etcd 使用证书 - - calico/kube-controllers 同步集群网络策略时访问 etcd 使用证书 +calico 使用客户端证书,所以hosts字段可以为空;后续可以看到calico证书用在四个地方: + +- calico/node 这个docker 容器运行时访问 etcd 使用证书 +- cni 配置文件中,cni 插件需要访问 etcd 使用证书 +- calicoctl 操作集群网络时访问 etcd 使用证书 +- calico/kube-controllers 同步集群网络策略时访问 etcd 使用证书 ### 创建 calico DaemonSet yaml文件和rbac 文件 请对照 roles/calico/templates/calico.yaml.j2文件注释和以下注意内容 -+ 详细配置参数请参考[calico官方文档](https://docs.projectcalico.org/v2.6/reference/node/configuration) ++ 详细配置参数请参考[calico官方文档](https://projectcalico.docs.tigera.io/reference/node/configuration) + 配置ETCD_ENDPOINTS 、CA、证书等,所有{{ }}变量与ansible hosts文件中设置对应 + 配置集群POD网络 CALICO_IPV4POOL_CIDR={{ CLUSTER_CIDR }} -+ **重要**本K8S集群运行在同网段kvm虚机上,虚机间没有网络ACL限制,因此可以设置`CALICO_IPV4POOL_IPIP=off`,如果你的主机位于不同网段,或者运行在公有云上需要打开这个选项 `CALICO_IPV4POOL_IPIP=always` -+ 配置FELIX_DEFAULTENDPOINTTOHOSTACTION=ACCEPT 默认允许Pod到Node的网络流量,更多[felix配置选项](https://docs.projectcalico.org/v2.6/reference/felix/configuration) ++ 配置FELIX_DEFAULTENDPOINTTOHOSTACTION=ACCEPT 默认允许Pod到Node的网络流量,更多[felix配置选项](https://projectcalico.docs.tigera.io/reference/felix/configuration) ### 安装calico 网络 + 安装前检查主机名不能有大写字母,只能由`小写字母` `-` `.` 组成 (name must consist of lower case alphanumeric characters, '-' or '.' (regex: [a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*))(calico-node v3.0.6以上已经解决主机大写字母问题) + **安装前必须确保各节点主机名不重复** ,calico node name 由节点主机名决定,如果重复,那么重复节点在etcd中只存储一份配置,BGP 邻居也不会建立。 + 安装之前必须确保`kube_master`和`kube_node`节点已经成功部署 -+ 只需要在任意装有kubectl客户端的节点运行 `kubectl apply -f`安装即可 -+ 等待15s后(视网络拉取calico相关镜像速度),calico 网络插件安装完成,删除之前kube_node安装时默认cni网络配置 ++ 轮询等待calico 网络插件安装完成,删除之前kube_node安装时默认cni网络配置 ### [可选]配置calicoctl工具 [calicoctl.cfg.j2](roles/calico/templates/calicoctl.cfg.j2) diff --git a/docs/setup/network-plugin/flannel.md b/docs/setup/network-plugin/flannel.md index 7fc1eb7..8e8c762 100644 --- a/docs/setup/network-plugin/flannel.md +++ b/docs/setup/network-plugin/flannel.md @@ -1,13 +1,11 @@ ## 06-安装flannel网络组件.md -本项目提供多种网络插件可选,如果需要安装flannel,请在/etc/ansible/hosts文件中设置变量 `CLUSTER_NETWORK="flannel"`,更多设置请查看`roles/flannel/defaults/main.yml` +本项目提供多种网络插件可选,如果需要安装flannel,请在`clusters/xxxx/hosts`文件中设置变量 `CLUSTER_NETWORK="flannel"`,参考[这里](../config_guide.md) `Flannel`是最早应用到k8s集群的网络插件之一,简单高效,且提供多个后端`backend`模式供选择;本文介绍以`DaemonSet Pod`方式集成到k8s集群,需要在所有master节点和node节点安装。 ``` text roles/flannel/ -├── defaults -│   └── main.yml ├── tasks │   └── main.yml └── templates @@ -18,7 +16,7 @@ roles/flannel/ ### 下载基础cni 插件 -请到CNI 插件最新[release](https://github.com/containernetworking/plugins/releases)页面下载[cni-v0.6.0.tgz](https://github.com/containernetworking/plugins/releases/download/v0.6.0/cni-v0.6.0.tgz),解压后里面有很多插件,选择如下几个复制到项目 `bin`目录下 +项目已经自动下载基础cni插件,请参考这里 https://github.com/kubeasz/dockerfiles/blob/master/kubeasz-ext-bin/Dockerfile - flannel用到的插件 - bridge @@ -59,36 +57,14 @@ FLANNEL_IPMASQ=true 请阅读 `roles/flannel/templates/kube-flannel.yaml.j2` 内容,注意: -+ 注意:本安装方式,flannel 通过 apiserver 接口读取 podCidr 信息,详见 https://github.com/coreos/flannel/issues/847;因此想要修改节点pod网段掩码,请前往`roles/kube-master/defaults/main.yml`设置 ++ 注意:本安装方式,flannel 通过 apiserver 接口读取 podCidr 信息,详见 https://github.com/coreos/flannel/issues/847;因此想要修改节点pod网段掩码,请在`clusters/xxxx/config.yml` 中修改`NODE_CIDR_LEN`配置项 + 配置相关RBAC 权限和 `service account` -+ 配置`ConfigMap`包含 CNI配置和 flannel配置(指定backend等),和`hosts`文件中相关设置对应 -+ `DaemonSet Pod`包含两个容器,一个容器运行flannel本身,另一个init容器部署cni 配置文件 -+ 为方便国内加速使用镜像 `jmgao1983/flannel:v0.10.0-amd64` (官方镜像在docker-hub上的转存) -+ 特别注意:如果服务器是多网卡(例如vagrant环境),则需要在`roles/flannel/templates/kube-flannel.yaml.j2 `中增加指定环境变量,详见 [kubernetes ISSUE 39701](https://github.com/kubernetes/kubernetes/issues/39701) -+ 更新:多网卡情况下flannel问题,理论上已解决,一般已不需要如下配置,参考 #479 https://github.com/easzlab/kubeasz/issues/479 ++ 配置`ConfigMap`包含 CNI配置和 flannel配置(指定backend等),在文件中相关设置对应 -``` bash - ... - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: KUBERNETES_SERVICE_HOST # 指定apiserver的主机地址 - value: "{{ MASTER_IP }}" - - name: KUBERNETES_SERVICE_PORT # 指定apiserver的服务端口 - value: "{{ KUBE_APISERVER.split(':')[2] }}" - ... -``` ### 安装 flannel网络 + 安装之前必须确保kube_master和kube_node节点已经成功部署 -+ 只需要在任意装有kubectl客户端的节点运行 kubectl create安装即可 -+ 等待15s后(视网络拉取相关镜像速度),flannel 网络插件安装完成,删除之前kube_node安装时默认cni网络配置 ++ 轮询等待flannel 网络插件安装完成,删除之前kube_node安装时默认cni网络配置 ### 验证flannel网络 diff --git a/docs/setup/network-plugin/kube-ovn.md b/docs/setup/network-plugin/kube-ovn.md index ce6cd74..5e270f7 100644 --- a/docs/setup/network-plugin/kube-ovn.md +++ b/docs/setup/network-plugin/kube-ovn.md @@ -1,5 +1,7 @@ ## 06-安装kube-ovn网络组件.md +(以下文档暂未更新,以插件官网文档为准) + 由灵雀云开源的网络组件 kube-ovn,将已被 openstack 社区采用的成熟网络虚拟化技术 ovs/ovn 引入 kubernetes 平台;为 kubernetes 网络打开了新的大门,令人耳目一新;强烈推荐大家试用该网络组件,反馈建议以帮助项目早日走向成熟。 - 介绍 https://blog.csdn.net/alauda_andy/article/details/88886128 diff --git a/docs/setup/network-plugin/kube-router.md b/docs/setup/network-plugin/kube-router.md index 3f1e4b9..b3c6fc4 100644 --- a/docs/setup/network-plugin/kube-router.md +++ b/docs/setup/network-plugin/kube-router.md @@ -1,5 +1,7 @@ # kube-router 网络组件 +(以下文档暂未更新,以插件官网文档为准) + kube-router是一个简单、高效的网络插件,它提供一揽子解决方案: - 基于GoBGP 提供Pod 网络互联(Routing) - 使用ipsets优化的iptables 提供网络策略支持(Firewall/NetworkPolicy) diff --git a/docs/setup/network-plugin/network-check.md b/docs/setup/network-plugin/network-check.md new file mode 100644 index 0000000..47d6c8a --- /dev/null +++ b/docs/setup/network-plugin/network-check.md @@ -0,0 +1,67 @@ +# network-check + +网络测试组件,根据cilium connectivity-check 脚本修改而来;利用cronjob 定期检测集群各节点、容器、serviceip、nodeport等之间的网络联通性;可以方便的判断当前集群网络是否正常。 + +目前检测如下: + +``` bash +kubectl get cronjobs.batch -n network-test +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +test01-pod-to-container */5 * * * * False 0 3m19s 6d3h +test02-pod-to-node-nodeport */5 * * * * False 0 3m19s 6d3h +test03-pod-to-multi-node-clusterip */5 * * * * False 1 6d3h 6d3h +test04-pod-to-multi-node-headless */5 * * * * False 1 6d3h 6d3h +test05-pod-to-multi-node-nodeport */5 * * * * False 1 6d3h 6d3h +test06-pod-to-external-1111 */5 * * * * False 0 3m19s 6d3h +test07-pod-to-external-fqdn-baidu */5 * * * * False 0 3m19s 6d3h +test08-host-to-multi-node-clusterip */5 * * * * False 1 6d3h 6d3h +test09-host-to-multi-node-headless */5 * * * * False 1 6d3h 6d3h +``` + ++ 带`multi-node`的测试需要多节点集群才能运行,如果单节点集群,测试pod会处于`Pending`状态 ++ 带`external`的测试需要节点能够访问互联网,否则测试会失败 + +## 启用网络检测 + +- 下载额外容器镜像 `./ezdown -X` + +- 配置集群,在配置文件`/etc/kubeasz/clusters/xxx/config.yml` (xxx为集群名) 修改如下选项 + +``` +# network-check 自动安装 +network_check_enabled: true +network_check_schedule: "*/5 * * * *" # 检测频率,默认5分钟执行一次 +``` + +- 安装网络检测插件 `docker exec -it kubeasz ezctl setup xxx 07` + +## 检查测试结果 + +大约等待5分钟左右,查看运行结果,如果pod 状态为`Completed` 表示检测正常通过。 + +``` +kubectl get pod -n network-test +NAME READY STATUS RESTARTS AGE +echo-server-58d7bb7f6-77ps6 1/1 Running 0 6d4h +echo-server-host-cc87c966d-bk57t 1/1 Running 0 6d4h +test01-pod-to-container-27606775-q6xlb 0/1 Completed 0 3m10s +test02-pod-to-node-nodeport-27606775-x2v5d 0/1 Completed 0 3m10s +test03-pod-to-multi-node-clusterip-27597895-cbq8d 0/1 Pending 0 6d4h +test04-pod-to-multi-node-headless-27597895-qzsgz 0/1 Pending 0 6d4h +test05-pod-to-multi-node-nodeport-27597895-kb5r7 0/1 Pending 0 6d4h +test06-pod-to-external-1111-27606775-p6v8s 0/1 Completed 0 3m10s +test07-pod-to-external-fqdn-baidu-27606775-qdfwd 0/1 Completed 0 3m10s +test08-host-to-multi-node-clusterip-27597895-qsgn9 0/1 Pending 0 6d4h +test09-host-to-multi-node-headless-27597895-hpkt5 0/1 Pending 0 6d4h +``` + ++ pod 状态为`Completed` 表示检测正常通过 ++ pod 状态为`Pending` 表示该检测需要多节点的k8s集群才会运行 + +## 禁用网络检测 + +如果集群已经开启网络检测,检测结果符合预期,并且不想继续循环检测时,只要删除对应namespace即可 + +``` +kubectl delete ns network-test +``` diff --git a/ezdown b/ezdown index f70dadb..8f39640 100755 --- a/ezdown +++ b/ezdown @@ -14,9 +14,9 @@ set -o errexit # default settings, can be overridden by cmd line options, see usage DOCKER_VER=20.10.16 -KUBEASZ_VER=3.3.0 -K8S_BIN_VER=v1.24.1 -EXT_BIN_VER=1.1.0 +KUBEASZ_VER=3.3.1 +K8S_BIN_VER=v1.24.2 +EXT_BIN_VER=1.2.0 SYS_PKG_VER=0.4.3 HARBOR_VER=v2.1.3 REGISTRY_MIRROR=CN @@ -24,7 +24,7 @@ REGISTRY_MIRROR=CN # images downloaded by default(with '-D') calicoVer=v3.19.4 dnsNodeCacheVer=1.21.1 -corednsVer=1.8.6 +corednsVer=1.9.3 dashboardVer=v2.5.1 dashboardMetricsScraperVer=v1.0.8 metricsVer=v0.5.2 diff --git a/roles/kube-node/tasks/main.yml b/roles/kube-node/tasks/main.yml index e0b93d7..704e93a 100644 --- a/roles/kube-node/tasks/main.yml +++ b/roles/kube-node/tasks/main.yml @@ -36,19 +36,6 @@ - name: 设置变量 CLUSTER_DNS_SVC_IP set_fact: CLUSTER_DNS_SVC_IP={{ DNS_SVC_IP.stdout }} -- block: - - name: 获取docker版本信息 - shell: "{{ base_dir }}/bin/dockerd --version|cut -d' ' -f3" - register: docker_ver - - - name: 转换docker版本信息为浮点数 - set_fact: - DOCKER_VER: "{{ docker_ver.stdout.split('.')[0]|int + docker_ver.stdout.split('.')[1]|int/100 }}" - connection: local - run_once: true - tags: upgrade_k8s, restart_node - when: "CONTAINER_RUNTIME == 'docker'" - - name: 创建kubelet的配置文件 template: src=kubelet-config.yaml.j2 dest=/var/lib/kubelet/config.yaml tags: upgrade_k8s, restart_node diff --git a/roles/kube-node/templates/haproxy.service.j2 b/roles/kube-node/templates/haproxy.service.j2 deleted file mode 100644 index ab3450f..0000000 --- a/roles/kube-node/templates/haproxy.service.j2 +++ /dev/null @@ -1,14 +0,0 @@ -[Unit] -Description=HAProxy Load Balancer -After=syslog.target network.target - -[Service] -EnvironmentFile=/etc/sysconfig/haproxy -ExecStartPre=/usr/bin/mkdir -p /run/haproxy -ExecStart=/usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid $OPTIONS -ExecReload=/bin/kill -USR2 $MAINPID -KillMode=mixed -Restart=always - -[Install] -WantedBy=multi-user.target diff --git a/roles/kube-node/templates/kube-proxy-config.yaml.j2 b/roles/kube-node/templates/kube-proxy-config.yaml.j2 index 5ef19ed..804874d 100644 --- a/roles/kube-node/templates/kube-proxy-config.yaml.j2 +++ b/roles/kube-node/templates/kube-proxy-config.yaml.j2 @@ -3,6 +3,7 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 bindAddress: 0.0.0.0 clientConnection: kubeconfig: "/etc/kubernetes/kube-proxy.kubeconfig" +# 根据clusterCIDR 判断集群内部和外部流量,配置clusterCIDR选项后,kube-proxy 会对访问 Service IP 的请求做 SNAT clusterCIDR: "{{ CLUSTER_CIDR }}" conntrack: maxPerCore: 32768 @@ -10,6 +11,7 @@ conntrack: tcpCloseWaitTimeout: 1h0m0s tcpEstablishedTimeout: 24h0m0s healthzBindAddress: 0.0.0.0:10256 +# hostnameOverride 值必须与 kubelet 的对应一致,否则 kube-proxy 启动后会找不到该 Node,从而不会创建任何 iptables 规则 hostnameOverride: "{{ inventory_hostname }}" metricsBindAddress: 0.0.0.0:10249 mode: "{{ PROXY_MODE }}" diff --git a/roles/kube-node/templates/kube-proxy.service.j2 b/roles/kube-node/templates/kube-proxy.service.j2 index 4231db2..5523702 100644 --- a/roles/kube-node/templates/kube-proxy.service.j2 +++ b/roles/kube-node/templates/kube-proxy.service.j2 @@ -4,7 +4,6 @@ Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=network.target [Service] -# kube-proxy 根据 --cluster-cidr 判断集群内部和外部流量,指定 --cluster-cidr 或 --masquerade-all 选项后,kube-proxy 会对访问 Service IP 的请求做 SNAT WorkingDirectory=/var/lib/kube-proxy ExecStart={{ bin_dir }}/kube-proxy \ --config=/var/lib/kube-proxy/kube-proxy-config.yaml diff --git a/roles/kube-node/vars/main.yml b/roles/kube-node/vars/main.yml index 298533f..b6ca52f 100644 --- a/roles/kube-node/vars/main.yml +++ b/roles/kube-node/vars/main.yml @@ -2,12 +2,4 @@ KUBE_APISERVER: "https://127.0.0.1:{{ SECURE_PORT }}" # cgroup driver -CGROUP_DRIVER: "{%- if CONTAINER_RUNTIME == 'containerd' -%} \ - systemd \ - {%- else -%} \ - {%- if DOCKER_VER|float >= 20.10 -%} \ - systemd \ - {%- else -%} \ - cgroupfs \ - {%- endif -%} \ - {%- endif -%}" +CGROUP_DRIVER: "systemd"