mirror of https://github.com/easzlab/kubeasz.git
update docs part2
parent
9f99d89b2f
commit
773bf5f55e
|
@ -5,7 +5,7 @@
|
||||||
- **集群特性** `TLS`双向认证、`RBAC`授权、[Master高可用](docs/setup/00-planning_and_overall_intro.md#ha-architecture)、支持`Network Policy`、[离线安装](docs/setup/offline_install.md)
|
- **集群特性** `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
|
- **集群版本** kubernetes v1.21, v1.22, v1.23, v1.24
|
||||||
- **操作系统** CentOS/RedHat 7, Debian 9/10, Ubuntu 16.04/18.04/20.04
|
- **操作系统** 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)
|
- **网络** [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)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -13,21 +13,21 @@
|
||||||
|
|
||||||
|角色|数量|描述|
|
|角色|数量|描述|
|
||||||
|:-|:-|:-|
|
|:-|:-|:-|
|
||||||
|部署节点|1|运行ansible/ezctl命令,建议独立节点|
|
|部署节点|1|运行ansible/ezctl命令,一般复用第一个master节点|
|
||||||
|etcd节点|3|注意etcd集群需要1,3,5,...奇数个节点,一般复用master节点|
|
|etcd节点|3|注意etcd集群需要1,3,5,...奇数个节点,一般复用master节点|
|
||||||
|master节点|2|高可用集群至少2个master节点|
|
|master节点|2|高可用集群至少2个master节点|
|
||||||
|node节点|3|运行应用负载的节点,可根据需要提升机器配置/增加节点数|
|
|node节点|n|运行应用负载的节点,可根据需要提升机器配置/增加节点数|
|
||||||
|
|
||||||
机器配置:
|
机器配置:
|
||||||
- master节点:4c/8g内存/50g硬盘
|
- master节点:4c/8g内存/50g硬盘
|
||||||
- worker节点:建议8c/32g内存/200g硬盘以上
|
- 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种方式
|
在 kubeasz 2x 版本,多节点高可用集群安装可以使用2种方式
|
||||||
|
|
||||||
- 1.先部署单节点集群 [AllinOne部署](quickStart.md),然后通过 [节点添加](../op/op-index.md) 扩容成高可用集群
|
- 1.按照本文步骤先规划准备,预先配置节点信息后,直接安装多节点高可用集群
|
||||||
- 2.按照如下步骤先规划准备,在clusters/${cluster_name}/hosts 配置节点信息后,直接安装多节点高可用集群
|
- 2.先部署单节点集群 [AllinOne部署](quickStart.md),然后通过 [节点添加](../op/op-index.md) 扩容成高可用集群
|
||||||
|
|
||||||
## 部署步骤
|
## 部署步骤
|
||||||
|
|
||||||
|
@ -41,63 +41,51 @@
|
||||||
|
|
||||||
### 2.在每个节点安装依赖工具
|
### 2.在每个节点安装依赖工具
|
||||||
|
|
||||||
Ubuntu 16.04 请执行以下脚本:
|
推荐使用ansible in docker 容器化方式运行,无需安装额外依赖。
|
||||||
|
|
||||||
|
### 3.准备ssh免密登陆
|
||||||
|
|
||||||
|
配置从部署节点能够ssh免密登陆所有节点,并且设置python软连接
|
||||||
|
|
||||||
``` bash
|
``` bash
|
||||||
apt-get update && apt-get upgrade -y && apt-get dist-upgrade -y
|
#$IP为所有节点地址包括自身,按照提示输入yes 和root密码
|
||||||
# 安装python2
|
ssh-copy-id $IP
|
||||||
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密码
|
|
||||||
|
|
||||||
# 为每个节点设置python软链接
|
# 为每个节点设置python软链接
|
||||||
ssh $IPs ln -s /usr/bin/python3 /usr/bin/python
|
ssh $IP ln -s /usr/bin/python3 /usr/bin/python
|
||||||
```
|
```
|
||||||
|
|
||||||
### 4.在部署节点编排k8s安装
|
### 4.在部署节点编排k8s安装
|
||||||
|
|
||||||
- 4.1 下载项目源码、二进制及离线镜像
|
- 4.1 下载项目源码、二进制及离线镜像
|
||||||
|
|
||||||
|
下载工具脚本ezdown,举例使用kubeasz版本3.3.1
|
||||||
|
|
||||||
``` bash
|
``` bash
|
||||||
# 下载工具脚本ezdown,举例使用kubeasz版本3.0.0
|
export release=3.3.1
|
||||||
export release=3.0.0
|
|
||||||
wget https://github.com/easzlab/kubeasz/releases/download/${release}/ezdown
|
wget https://github.com/easzlab/kubeasz/releases/download/${release}/ezdown
|
||||||
chmod +x ./ezdown
|
chmod +x ./ezdown
|
||||||
# 使用工具脚本下载
|
```
|
||||||
|
|
||||||
|
下载kubeasz代码、二进制、默认容器镜像(更多关于ezdown的参数,运行./ezdown 查看)
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
# 国内环境
|
||||||
./ezdown -D
|
./ezdown -D
|
||||||
|
# 海外环境
|
||||||
|
#./ezdown -D -m standard
|
||||||
|
```
|
||||||
|
|
||||||
|
【可选】下载额外容器镜像(cilium,flannel,prometheus等)
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
./ezdown -X
|
||||||
|
```
|
||||||
|
|
||||||
|
【可选】下载离线系统包 (适用于无法使用yum/apt仓库情形)
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
./ezdown -P
|
||||||
```
|
```
|
||||||
|
|
||||||
上述脚本运行成功后,所有文件(kubeasz代码、二进制、离线镜像)均已整理好放入目录`/etc/kubeasz`
|
上述脚本运行成功后,所有文件(kubeasz代码、二进制、离线镜像)均已整理好放入目录`/etc/kubeasz`
|
||||||
|
@ -105,7 +93,11 @@ chmod +x ./ezdown
|
||||||
- 4.2 创建集群配置实例
|
- 4.2 创建集群配置实例
|
||||||
|
|
||||||
``` bash
|
``` 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 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 set version of common plugins
|
||||||
2021-01-19 10:48:23 DEBUG cluster k8s-01: files successfully created.
|
2021-01-19 10:48:23 DEBUG cluster k8s-01: files successfully created.
|
||||||
|
@ -118,16 +110,21 @@ ezctl new k8s-01
|
||||||
如果你对集群安装流程不熟悉,请阅读项目首页 **安装步骤** 讲解后分步安装,并对 **每步都进行验证**
|
如果你对集群安装流程不熟悉,请阅读项目首页 **安装步骤** 讲解后分步安装,并对 **每步都进行验证**
|
||||||
|
|
||||||
``` bash
|
``` bash
|
||||||
# 一键安装
|
#建议配置命令alias,方便执行
|
||||||
ezctl setup k8s-01 all
|
echo "alias dk='docker exec -it kubeasz'" >> /root/.bashrc
|
||||||
|
source /root/.bashrc
|
||||||
|
|
||||||
# 或者分步安装,具体使用 ezctl help setup 查看分步安装帮助信息
|
# 一键安装,等价于执行docker exec -it kubeasz ezctl setup k8s-01 all
|
||||||
# ezctl setup k8s-01 01
|
dk ezctl setup k8s-01 all
|
||||||
# ezctl setup k8s-01 02
|
|
||||||
# ezctl setup k8s-01 03
|
# 或者分步安装,具体使用 dk ezctl help setup 查看分步安装帮助信息
|
||||||
# ezctl setup k8s-01 04
|
# 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)
|
[后一篇](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
|
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 创建kube-controller-manager 和 kube-scheduler 组件的kubeconfig 文件
|
||||||
|
|
||||||
|
过程与创建kube-proxy.kubeconfig 类似,略。
|
||||||
|
|
||||||
## prepare 角色
|
## prepare 角色
|
||||||
|
|
||||||
请在另外窗口打开[roles/prepare/tasks/main.yml](../../roles/prepare/tasks/main.yml) 文件,比较简单直观
|
请在另外窗口打开[roles/prepare/tasks/main.yml](../../roles/prepare/tasks/main.yml) 文件,比较简单直观
|
||||||
|
|
||||||
1. 设置基础操作系统软件和系统参数,请阅读脚本中的注释内容
|
1. 设置基础操作系统软件和系统参数,请阅读脚本中的注释内容
|
||||||
1. 创建一些基础文件目录
|
1. 创建一些基础文件目录、环境变量以及添加本地镜像仓库`easzlab.io.local`的域名解析
|
||||||
1. 分发kubeconfig配置文件
|
1. 分发kubeconfig等配置文件
|
||||||
|
|
||||||
|
|
||||||
[后一篇](02-install_etcd.md)
|
[后一篇](02-install_etcd.md)
|
||||||
|
|
|
@ -48,7 +48,7 @@ Documentation=https://github.com/coreos
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=notify
|
Type=notify
|
||||||
WorkingDirectory=/var/lib/etcd/
|
WorkingDirectory={{ ETCD_DATA_DIR }}
|
||||||
ExecStart={{ bin_dir }}/etcd \
|
ExecStart={{ bin_dir }}/etcd \
|
||||||
--name=etcd-{{ inventory_hostname }} \
|
--name=etcd-{{ inventory_hostname }} \
|
||||||
--cert-file={{ ca_dir }}/etcd.pem \
|
--cert-file={{ ca_dir }}/etcd.pem \
|
||||||
|
@ -64,11 +64,12 @@ ExecStart={{ bin_dir }}/etcd \
|
||||||
--initial-cluster-token=etcd-cluster-0 \
|
--initial-cluster-token=etcd-cluster-0 \
|
||||||
--initial-cluster={{ ETCD_NODES }} \
|
--initial-cluster={{ ETCD_NODES }} \
|
||||||
--initial-cluster-state={{ CLUSTER_STATE }} \
|
--initial-cluster-state={{ CLUSTER_STATE }} \
|
||||||
--data-dir=/var/lib/etcd \
|
--data-dir={{ ETCD_DATA_DIR }} \
|
||||||
|
--wal-dir={{ ETCD_WAL_DIR }} \
|
||||||
--snapshot-count=50000 \
|
--snapshot-count=50000 \
|
||||||
--auto-compaction-retention=1 \
|
--auto-compaction-retention=1 \
|
||||||
--max-request-bytes=10485760 \
|
|
||||||
--auto-compaction-mode=periodic \
|
--auto-compaction-mode=periodic \
|
||||||
|
--max-request-bytes=10485760 \
|
||||||
--quota-backend-bytes=8589934592
|
--quota-backend-bytes=8589934592
|
||||||
Restart=always
|
Restart=always
|
||||||
RestartSec=15
|
RestartSec=15
|
||||||
|
@ -78,10 +79,12 @@ OOMScoreAdjust=-999
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
```
|
```
|
||||||
|
|
||||||
+ 完整参数列表请使用 `etcd --help` 查询
|
+ 完整参数列表请使用 `etcd --help` 查询
|
||||||
+ 注意etcd 即需要服务器证书也需要客户端证书,为方便使用一个peer 证书代替两个证书
|
+ 注意etcd 即需要服务器证书也需要客户端证书,为方便使用一个peer 证书代替两个证书
|
||||||
+ `--initial-cluster-state` 值为 `new` 时,`--name` 的参数值必须位于 `--initial-cluster` 列表中
|
+ `--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集群状态
|
### 验证etcd集群状态
|
||||||
|
|
||||||
|
|
|
@ -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
|
作为 CNCF 毕业项目,containerd 致力于提供简洁、可靠、可扩展的容器运行时;它被设计用来集成到 kubernetes 等系统使用,而不是像 docker 那样独立使用。
|
||||||
[Unit]
|
|
||||||
Description=Docker Application Container Engine
|
|
||||||
Documentation=http://docs.docker.io
|
|
||||||
|
|
||||||
[Service]
|
- 安装指南 https://github.com/containerd/cri/blob/master/docs/installation.md
|
||||||
Environment="PATH={{ bin_dir }}:/bin:/sbin:/usr/bin:/usr/sbin"
|
- 客户端 circtl 使用指南 https://github.com/containerd/cri/blob/master/docs/crictl.md
|
||||||
ExecStart={{ bin_dir }}/dockerd
|
- man 文档 https://github.com/containerd/containerd/tree/master/docs/man
|
||||||
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
|
|
||||||
|
|
||||||
[Install]
|
## kubeasz 集成安装 containerd
|
||||||
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` 选项
|
|
||||||
|
|
||||||
### 配置daemon.json
|
- 注意:k8s 1.24以后,项目已经设置默认容器运行时为 containerd,无需手动修改
|
||||||
|
- 执行安装:分步安装`ezctl setup xxxx 03`,一键安装`ezctl setup xxxx all`
|
||||||
|
|
||||||
roles/docker/templates/daemon.json.j2
|
## 命令对比
|
||||||
|
|
||||||
``` bash
|
|命令 |docker |crictl(推荐) |ctr |
|
||||||
{
|
|:- |:- |:- |:- |
|
||||||
"data-root": "{{ DOCKER_STORAGE_DIR }}",
|
|查看容器列表 |docker ps |crictl ps |ctr -n k8s.io c ls |
|
||||||
"exec-opts": ["native.cgroupdriver=cgroupfs"],
|
|查看容器详情 |docker inspect |crictl inspect |ctr -n k8s.io c info |
|
||||||
{% if ENABLE_MIRROR_REGISTRY %}
|
|查看容器日志 |docker logs |crictl logs |无 |
|
||||||
"registry-mirrors": [
|
|容器内执行命令 |docker exec |crictl exec |无 |
|
||||||
"https://docker.mirrors.ustc.edu.cn",
|
|挂载容器 |docker attach |crictl attach |无 |
|
||||||
"http://hub-mirror.c.163.com"
|
|容器资源使用 |docker stats |crictl stats |无 |
|
||||||
],
|
|创建容器 |docker create |crictl create |ctr -n k8s.io c create |
|
||||||
{% endif %}
|
|启动容器 |docker start |crictl start |ctr -n k8s.io run |
|
||||||
{% if ENABLE_REMOTE_API %}
|
|停止容器 |docker stop |crictl stop |无 |
|
||||||
"hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"],
|
|删除容器 |docker rm |crictl rm |ctr -n k8s.io c del |
|
||||||
{% endif %}
|
|查看镜像列表 |docker images |crictl images |ctr -n k8s.io i ls |
|
||||||
"insecure-registries": {{ INSECURE_REG }},
|
|查看镜像详情 |docker inspect |crictl inspecti|无 |
|
||||||
"max-concurrent-downloads": 10,
|
|拉取镜像 |docker pull |crictl pull |ctr -n k8s.io i pull |
|
||||||
"live-restore": true,
|
|推送镜像 |docker push |无 |ctr -n k8s.io i push |
|
||||||
"log-driver": "json-file",
|
|删除镜像 |docker rmi |crictl rmi |ctr -n k8s.io i rm |
|
||||||
"log-level": "warn",
|
|查看Pod列表 |无 |crictl pods |无 |
|
||||||
"log-opts": {
|
|查看Pod详情 |无 |crictl inspectp|无 |
|
||||||
"max-size": "50m",
|
|启动Pod |无 |crictl runp |无 |
|
||||||
"max-file": "1"
|
|停止Pod |无 |crictl stopp |无 |
|
||||||
},
|
|
||||||
"storage-driver": "overlay2"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
- data-root 配置容器数据目录,默认/var/lib/docker,在集群安装时要规划磁盘空间使用
|
|
||||||
- registry-mirrors 配置国内镜像仓库加速
|
|
||||||
- live-restore 可以重启docker daemon ,而不重启容器
|
|
||||||
- log-opts 容器日志相关参数,设置单个容器日志超过50M则进行回卷,回卷的副本数超过1个就进行清理
|
|
||||||
|
|
||||||
对于企业内部应用的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)
|
[后一篇](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 证书签名请求
|
### 创建 kubernetes 证书签名请求
|
||||||
|
|
||||||
``` bash
|
``` bash
|
||||||
|
@ -57,10 +67,10 @@
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
- kubernetes apiserver 使用对等证书,创建时hosts字段需要配置:
|
kubernetes apiserver 使用对等证书,创建时hosts字段需要配置:
|
||||||
- 如果配置 ex_lb,需要把 EX_APISERVER_VIP 也配置进去
|
- 如果配置 ex_lb,需要把 EX_APISERVER_VIP 也配置进去
|
||||||
- 如果需要外部访问 apiserver,可选在config.yml配置 MASTER_CERT_HOSTS
|
- 如果需要外部访问 apiserver,可选在config.yml配置 MASTER_CERT_HOSTS
|
||||||
- `kubectl get svc` 将看到集群中由api-server 创建的默认服务 `kubernetes`,因此也要把 `kubernetes` 服务名和各个服务域名也添加进去
|
- `kubectl get svc` 将看到集群中由api-server 创建的默认服务 `kubernetes`,因此也要把 `kubernetes` 服务名和各个服务域名也添加进去
|
||||||
|
|
||||||
### 创建apiserver的服务配置文件
|
### 创建apiserver的服务配置文件
|
||||||
|
|
||||||
|
@ -72,7 +82,6 @@ After=network.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
ExecStart={{ bin_dir }}/kube-apiserver \
|
ExecStart={{ bin_dir }}/kube-apiserver \
|
||||||
--advertise-address={{ inventory_hostname }} \
|
|
||||||
--allow-privileged=true \
|
--allow-privileged=true \
|
||||||
--anonymous-auth=false \
|
--anonymous-auth=false \
|
||||||
--api-audiences=api,istio-ca \
|
--api-audiences=api,istio-ca \
|
||||||
|
@ -87,7 +96,8 @@ ExecStart={{ bin_dir }}/kube-apiserver \
|
||||||
--kubelet-certificate-authority={{ ca_dir }}/ca.pem \
|
--kubelet-certificate-authority={{ ca_dir }}/ca.pem \
|
||||||
--kubelet-client-certificate={{ ca_dir }}/kubernetes.pem \
|
--kubelet-client-certificate={{ ca_dir }}/kubernetes.pem \
|
||||||
--kubelet-client-key={{ ca_dir }}/kubernetes-key.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-signing-key-file={{ ca_dir }}/ca-key.pem \
|
||||||
--service-account-key-file={{ ca_dir }}/ca.pem \
|
--service-account-key-file={{ ca_dir }}/ca.pem \
|
||||||
--service-cluster-ip-range={{ SERVICE_CIDR }} \
|
--service-cluster-ip-range={{ SERVICE_CIDR }} \
|
||||||
|
@ -113,7 +123,6 @@ WantedBy=multi-user.target
|
||||||
```
|
```
|
||||||
+ Kubernetes 对 API 访问需要依次经过认证、授权和准入控制(admission controll),认证解决用户是谁的问题,授权解决用户能做什么的问题,Admission Control则是资源管理方面的作用。
|
+ 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无法正常工作
|
+ 关于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)
|
+ 详细参数配置请参考`kube-apiserver --help`,关于认证、授权和准入控制请[阅读](https://github.com/feiskyer/kubernetes-handbook/blob/master/components/apiserver.md)
|
||||||
+ 增加了访问kubelet使用的证书配置,防止匿名访问kubelet的安全漏洞,详见[漏洞说明](../mixes/01.fix_kubelet_annoymous_access.md)
|
+ 增加了访问kubelet使用的证书配置,防止匿名访问kubelet的安全漏洞,详见[漏洞说明](../mixes/01.fix_kubelet_annoymous_access.md)
|
||||||
|
|
||||||
|
@ -126,8 +135,10 @@ Documentation=https://github.com/GoogleCloudPlatform/kubernetes
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
ExecStart={{ bin_dir }}/kube-controller-manager \
|
ExecStart={{ bin_dir }}/kube-controller-manager \
|
||||||
--bind-address={{ inventory_hostname }} \
|
|
||||||
--allocate-node-cidrs=true \
|
--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-cidr={{ CLUSTER_CIDR }} \
|
||||||
--cluster-name=kubernetes \
|
--cluster-name=kubernetes \
|
||||||
--cluster-signing-cert-file={{ ca_dir }}/ca.pem \
|
--cluster-signing-cert-file={{ ca_dir }}/ca.pem \
|
||||||
|
@ -161,7 +172,9 @@ Documentation=https://github.com/GoogleCloudPlatform/kubernetes
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
ExecStart={{ bin_dir }}/kube-scheduler \
|
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 \
|
--kubeconfig=/etc/kubernetes/kube-scheduler.kubeconfig \
|
||||||
--leader-elect=true \
|
--leader-elect=true \
|
||||||
--v=2
|
--v=2
|
||||||
|
|
|
@ -2,10 +2,17 @@
|
||||||
|
|
||||||
`kube_node` 是集群中运行工作负载的节点,前置条件需要先部署好`kube_master`节点,它需要部署如下组件:
|
`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: 发布应用服务与负载均衡
|
+ kube-proxy: 发布应用服务与负载均衡
|
||||||
+ haproxy:用于请求转发到多个 apiserver,详见[HA-2x 架构](00-planning_and_overall_intro.md#ha-architecture)
|
|
||||||
+ calico: 配置容器网络 (或者其他网络组件)
|
|
||||||
|
|
||||||
### 创建cni 基础网络插件配置文件
|
### 创建cni 基础网络插件配置文件
|
||||||
|
|
||||||
|
@ -23,28 +30,34 @@ Documentation=https://github.com/GoogleCloudPlatform/kubernetes
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
WorkingDirectory=/var/lib/kubelet
|
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/mount -o remount,rw '/sys/fs/cgroup'
|
||||||
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpuset/system.slice/kubelet.service
|
{% endif %}
|
||||||
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/hugetlb/system.slice/kubelet.service
|
{% if KUBE_RESERVED_ENABLED == "yes" or SYS_RESERVED_ENABLED == "yes" %}
|
||||||
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/memory/system.slice/kubelet.service
|
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpu/podruntime.slice
|
||||||
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/pids/system.slice/kubelet.service
|
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 %}
|
{% endif %}
|
||||||
ExecStart={{ bin_dir }}/kubelet \
|
ExecStart={{ bin_dir }}/kubelet \
|
||||||
--config=/var/lib/kubelet/config.yaml \
|
--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 \
|
--container-runtime-endpoint=unix:///run/containerd/containerd.sock \
|
||||||
{% endif %}
|
|
||||||
--hostname-override={{ inventory_hostname }} \
|
--hostname-override={{ inventory_hostname }} \
|
||||||
--kubeconfig=/etc/kubernetes/kubelet.kubeconfig \
|
--kubeconfig=/etc/kubernetes/kubelet.kubeconfig \
|
||||||
--network-plugin=cni \
|
|
||||||
--pod-infra-container-image={{ SANDBOX_IMAGE }} \
|
|
||||||
--root-dir={{ KUBELET_ROOT_DIR }} \
|
--root-dir={{ KUBELET_ROOT_DIR }} \
|
||||||
--v=2
|
--v=2
|
||||||
Restart=always
|
Restart=always
|
||||||
|
@ -53,11 +66,6 @@ RestartSec=5
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
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
|
+ --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/
|
+ 关于kubelet资源预留相关配置请参考 https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/
|
||||||
|
|
||||||
|
@ -78,13 +86,8 @@ After=network.target
|
||||||
[Service]
|
[Service]
|
||||||
WorkingDirectory=/var/lib/kube-proxy
|
WorkingDirectory=/var/lib/kube-proxy
|
||||||
ExecStart={{ bin_dir }}/kube-proxy \
|
ExecStart={{ bin_dir }}/kube-proxy \
|
||||||
--bind-address={{ inventory_hostname }} \
|
--config=/var/lib/kube-proxy/kube-proxy-config.yaml
|
||||||
--cluster-cidr={{ CLUSTER_CIDR }} \
|
Restart=always
|
||||||
--hostname-override={{ inventory_hostname }} \
|
|
||||||
--kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig \
|
|
||||||
--logtostderr=true \
|
|
||||||
--v=2
|
|
||||||
Restart=on-failure
|
|
||||||
RestartSec=5
|
RestartSec=5
|
||||||
LimitNOFILE=65536
|
LimitNOFILE=65536
|
||||||
|
|
||||||
|
@ -92,8 +95,7 @@ LimitNOFILE=65536
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
```
|
```
|
||||||
|
|
||||||
+ --hostname-override 参数值必须与 kubelet 的值一致,否则 kube-proxy 启动后会找不到该 Node,从而不会创建任何 iptables 规则
|
请注意 [kube-proxy-config](../../roles/kube-node/templates/kube-proxy-config.yaml.j2) 文件的注释说明
|
||||||
+ 特别注意:kube-proxy 根据 --cluster-cidr 判断集群内部和外部流量,指定 --cluster-cidr 或 --masquerade-all 选项后 kube-proxy 才会对访问 Service IP 的请求做 SNAT;
|
|
||||||
|
|
||||||
### 验证 node 状态
|
### 验证 node 状态
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
## 06-安装网络组件
|
## 06-安装网络组件
|
||||||
|
|
||||||
首先回顾下K8S网络设计原则,在配置集群网络插件或者实践K8S 应用/服务部署请时刻想到这些原则:
|
首先回顾下K8S网络设计原则,在配置集群网络插件或者实践K8S 应用/服务部署请牢记这些原则:
|
||||||
|
|
||||||
- 1.每个Pod都拥有一个独立IP地址,Pod内所有容器共享一个网络命名空间
|
- 1.每个Pod都拥有一个独立IP地址,Pod内所有容器共享一个网络命名空间
|
||||||
- 2.集群内所有Pod都在一个直接连通的扁平网络中,可通过IP直接访问
|
- 2.集群内所有Pod都在一个直接连通的扁平网络中,可通过IP直接访问
|
||||||
- 所有容器之间无需NAT就可以直接互相访问
|
- 所有容器之间无需NAT就可以直接互相访问
|
||||||
- 所有Node和所有容器之间无需NAT就可以直接互相访问
|
- 所有Node和所有容器之间无需NAT就可以直接互相访问
|
||||||
- 容器自己看到的IP跟其他容器看到的一样
|
- 容器自己看到的IP跟其他容器看到的一样
|
||||||
- 3.Service cluster IP尽可在集群内部访问,外部请求需要通过NodePort、LoadBalance或者Ingress来访问
|
- 3.Service cluster IP只可在集群内部访问,外部请求需要通过NodePort、LoadBalance或者Ingress来访问
|
||||||
|
|
||||||
`Container Network Interface (CNI)`是目前CNCF主推的网络模型,它由两部分组成:
|
`Container Network Interface (CNI)`是目前CNCF主推的网络模型,它由两部分组成:
|
||||||
|
|
||||||
|
@ -17,23 +17,23 @@
|
||||||
- IPAM Plugin负责给容器分配IP地址
|
- IPAM Plugin负责给容器分配IP地址
|
||||||
|
|
||||||
Kubernetes Pod的网络是这样创建的:
|
Kubernetes Pod的网络是这样创建的:
|
||||||
- 0.每个Pod除了创建时指定的容器外,都有一个kubelet启动时指定的`基础容器`,比如:`easzlab/pause` `registry.access.redhat.com/rhel7/pod-infrastructure`
|
- 0. 每个Pod除了创建时指定的容器外,都有一个kubelet启动时指定的`基础容器`,即`pause`容器
|
||||||
- 1.首先 kubelet创建`基础容器`生成network namespace
|
- 1. kubelet创建`基础容器`生成network namespace
|
||||||
- 2.然后 kubelet调用网络CNI driver,由它根据配置调用具体的CNI 插件
|
- 2. kubelet调用网络CNI driver,由它根据配置调用具体的CNI 插件
|
||||||
- 3.然后 CNI 插件给`基础容器`配置网络
|
- 3. CNI 插件给`基础容器`配置网络
|
||||||
- 4.最后 Pod 中其他的容器共享使用`基础容器`的网络
|
- 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` `cilium` `flannel` `kube-ovn` `kube-router`
|
||||||
|
|
||||||
### 安装讲解
|
### 安装讲解
|
||||||
|
|
||||||
- [安装calico](network-plugin/calico.md)
|
- [安装calico](network-plugin/calico.md)
|
||||||
- [安装cilium](network-plugin/cilium.md)
|
- [安装cilium](network-plugin/cilium.md)
|
||||||
- [安装flannel](network-plugin/flannel.md)
|
- [安装flannel](network-plugin/flannel.md)
|
||||||
- [安装kube-ovn](network-plugin/kube-ovn.md)
|
- [安装kube-ovn](network-plugin/kube-ovn.md) 暂未更新
|
||||||
- [安装kube-router](network-plugin/kube-router.md)
|
- [安装kube-router](network-plugin/kube-router.md) 暂未更新
|
||||||
|
|
||||||
### 参考
|
### 参考
|
||||||
- [kubernetes.io networking docs](https://kubernetes.io/docs/concepts/cluster-administration/networking/)
|
- [kubernetes.io networking docs](https://kubernetes.io/docs/concepts/cluster-administration/networking/)
|
||||||
|
|
|
@ -1,11 +1,27 @@
|
||||||
# 07-安装集群主要插件
|
# 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文件
|
- 1.根据hosts文件中配置的`CLUSTER_DNS_SVC_IP` `CLUSTER_DNS_DOMAIN`等参数生成kubedns.yaml和coredns.yaml文件
|
||||||
- 2.注册变量pod_info,pod_info用来判断现有集群是否已经运行各种插件
|
- 2.注册变量pod_info,pod_info用来判断现有集群是否已经运行各种插件
|
||||||
|
|
|
@ -21,15 +21,12 @@
|
||||||
|
|
||||||
## clusters/xxxx/config.yml
|
## clusters/xxxx/config.yml
|
||||||
|
|
||||||
主要包括集群某个具体组件的个性化配置,具体组件的配置项可能会不断增加;
|
主要包括集群某个具体组件的个性化配置,具体组件的配置项可能会不断增加;可以在不做任何配置更改情况下使用默认值创建集群
|
||||||
|
|
||||||
- 可以在不做任何配置更改情况下使用默认值创建集群
|
根据实际需要配置 k8s 集群,常用举例
|
||||||
- 可以根据实际需要配置 k8s 集群,常用举例
|
|
||||||
- 配置使用离线安装系统包:INSTALL_SOURCE: "offline" (需要ezdown -P 下载离线系统软件)
|
- 配置使用离线安装系统包:INSTALL_SOURCE: "offline" (需要ezdown -P 下载离线系统软件)
|
||||||
- 配置集群节点安全加固:OS_HARDEN: true
|
- 配置CA证书以及其签发证书的有效期
|
||||||
- 配置CA证书以及其签发证书的有效期
|
- 配置 apiserver 支持公网域名:MASTER_CERT_HOSTS
|
||||||
- 配置 docker 国内镜像加速:ENABLE_MIRROR_REGISTRY: true
|
- 配置 cluster-addon 组件安装
|
||||||
- 配置 docker 容器存储目录:DOCKER_STORAGE_DIR: "/var/lib/docker"
|
- ...
|
||||||
- 配置 apiserver 支持公网域名:MASTER_CERT_HOSTS
|
|
||||||
- 配置 cluster-addon 组件安装
|
|
||||||
- ...
|
|
||||||
|
|
|
@ -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 |无 |
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
### 安全组
|
### 安全组
|
||||||
|
|
||||||
注意虚机的安全组规则配置,一般集群内部节点之间端口放开即可;
|
注意虚机的安全组规则配置,一般集群内部节点之间端口全部放开即可;
|
||||||
|
|
||||||
### 网络组件
|
### 网络组件
|
||||||
|
|
||||||
|
|
|
@ -1,21 +1,21 @@
|
||||||
## 06-安装calico网络组件.md
|
## 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,请在`clusters/xxxx/hosts`文件中设置变量 `CLUSTER_NETWORK="calico"`,参考[这里](../config_guide.md)
|
||||||
|
|
||||||
- calico-node需要在所有master节点和node节点安装
|
|
||||||
|
|
||||||
``` bash
|
``` bash
|
||||||
roles/calico/
|
roles/calico/
|
||||||
├── defaults
|
|
||||||
│ └── main.yml
|
|
||||||
├── tasks
|
├── tasks
|
||||||
│ └── main.yml
|
│ └── main.yml
|
||||||
└── templates
|
├── templates
|
||||||
├── calico-csr.json.j2
|
│ ├── calico-csr.json.j2
|
||||||
├── calicoctl.cfg.j2
|
│ ├── calicoctl.cfg.j2
|
||||||
└── calico-vx.y.yaml.j2
|
│ ├── calico-v3.15.yaml.j2
|
||||||
|
│ ├── calico-v3.19.yaml.j2
|
||||||
|
│ └── calico-v3.8.yaml.j2
|
||||||
|
└── vars
|
||||||
|
└── main.yml
|
||||||
```
|
```
|
||||||
请在另外窗口打开`roles/calico/tasks/main.yml`文件,对照看以下讲解内容。
|
请在另外窗口打开`roles/calico/tasks/main.yml`文件,对照看以下讲解内容。
|
||||||
|
|
||||||
|
@ -40,29 +40,28 @@ roles/calico/
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
- calico 使用客户端证书,所以hosts字段可以为空;后续可以看到calico证书用在四个地方:
|
calico 使用客户端证书,所以hosts字段可以为空;后续可以看到calico证书用在四个地方:
|
||||||
- calico/node 这个docker 容器运行时访问 etcd 使用证书
|
|
||||||
- cni 配置文件中,cni 插件需要访问 etcd 使用证书
|
- calico/node 这个docker 容器运行时访问 etcd 使用证书
|
||||||
- calicoctl 操作集群网络时访问 etcd 使用证书
|
- cni 配置文件中,cni 插件需要访问 etcd 使用证书
|
||||||
- calico/kube-controllers 同步集群网络策略时访问 etcd 使用证书
|
- calicoctl 操作集群网络时访问 etcd 使用证书
|
||||||
|
- calico/kube-controllers 同步集群网络策略时访问 etcd 使用证书
|
||||||
|
|
||||||
### 创建 calico DaemonSet yaml文件和rbac 文件
|
### 创建 calico DaemonSet yaml文件和rbac 文件
|
||||||
|
|
||||||
请对照 roles/calico/templates/calico.yaml.j2文件注释和以下注意内容
|
请对照 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文件中设置对应
|
+ 配置ETCD_ENDPOINTS 、CA、证书等,所有{{ }}变量与ansible hosts文件中设置对应
|
||||||
+ 配置集群POD网络 CALICO_IPV4POOL_CIDR={{ CLUSTER_CIDR }}
|
+ 配置集群POD网络 CALICO_IPV4POOL_CIDR={{ CLUSTER_CIDR }}
|
||||||
+ **重要**本K8S集群运行在同网段kvm虚机上,虚机间没有网络ACL限制,因此可以设置`CALICO_IPV4POOL_IPIP=off`,如果你的主机位于不同网段,或者运行在公有云上需要打开这个选项 `CALICO_IPV4POOL_IPIP=always`
|
+ 配置FELIX_DEFAULTENDPOINTTOHOSTACTION=ACCEPT 默认允许Pod到Node的网络流量,更多[felix配置选项](https://projectcalico.docs.tigera.io/reference/felix/configuration)
|
||||||
+ 配置FELIX_DEFAULTENDPOINTTOHOSTACTION=ACCEPT 默认允许Pod到Node的网络流量,更多[felix配置选项](https://docs.projectcalico.org/v2.6/reference/felix/configuration)
|
|
||||||
|
|
||||||
### 安装calico 网络
|
### 安装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以上已经解决主机大写字母问题)
|
+ 安装前检查主机名不能有大写字母,只能由`小写字母` `-` `.` 组成 (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 邻居也不会建立。
|
+ **安装前必须确保各节点主机名不重复** ,calico node name 由节点主机名决定,如果重复,那么重复节点在etcd中只存储一份配置,BGP 邻居也不会建立。
|
||||||
+ 安装之前必须确保`kube_master`和`kube_node`节点已经成功部署
|
+ 安装之前必须确保`kube_master`和`kube_node`节点已经成功部署
|
||||||
+ 只需要在任意装有kubectl客户端的节点运行 `kubectl apply -f`安装即可
|
+ 轮询等待calico 网络插件安装完成,删除之前kube_node安装时默认cni网络配置
|
||||||
+ 等待15s后(视网络拉取calico相关镜像速度),calico 网络插件安装完成,删除之前kube_node安装时默认cni网络配置
|
|
||||||
|
|
||||||
### [可选]配置calicoctl工具 [calicoctl.cfg.j2](roles/calico/templates/calicoctl.cfg.j2)
|
### [可选]配置calicoctl工具 [calicoctl.cfg.j2](roles/calico/templates/calicoctl.cfg.j2)
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,11 @@
|
||||||
## 06-安装flannel网络组件.md
|
## 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节点安装。
|
`Flannel`是最早应用到k8s集群的网络插件之一,简单高效,且提供多个后端`backend`模式供选择;本文介绍以`DaemonSet Pod`方式集成到k8s集群,需要在所有master节点和node节点安装。
|
||||||
|
|
||||||
``` text
|
``` text
|
||||||
roles/flannel/
|
roles/flannel/
|
||||||
├── defaults
|
|
||||||
│ └── main.yml
|
|
||||||
├── tasks
|
├── tasks
|
||||||
│ └── main.yml
|
│ └── main.yml
|
||||||
└── templates
|
└── templates
|
||||||
|
@ -18,7 +16,7 @@ roles/flannel/
|
||||||
|
|
||||||
### 下载基础cni 插件
|
### 下载基础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用到的插件
|
- flannel用到的插件
|
||||||
- bridge
|
- bridge
|
||||||
|
@ -59,36 +57,14 @@ FLANNEL_IPMASQ=true
|
||||||
|
|
||||||
请阅读 `roles/flannel/templates/kube-flannel.yaml.j2` 内容,注意:
|
请阅读 `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`
|
+ 配置相关RBAC 权限和 `service account`
|
||||||
+ 配置`ConfigMap`包含 CNI配置和 flannel配置(指定backend等),和`hosts`文件中相关设置对应
|
+ 配置`ConfigMap`包含 CNI配置和 flannel配置(指定backend等),在文件中相关设置对应
|
||||||
+ `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
|
|
||||||
|
|
||||||
``` 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网络
|
### 安装 flannel网络
|
||||||
|
|
||||||
+ 安装之前必须确保kube_master和kube_node节点已经成功部署
|
+ 安装之前必须确保kube_master和kube_node节点已经成功部署
|
||||||
+ 只需要在任意装有kubectl客户端的节点运行 kubectl create安装即可
|
+ 轮询等待flannel 网络插件安装完成,删除之前kube_node安装时默认cni网络配置
|
||||||
+ 等待15s后(视网络拉取相关镜像速度),flannel 网络插件安装完成,删除之前kube_node安装时默认cni网络配置
|
|
||||||
|
|
||||||
### 验证flannel网络
|
### 验证flannel网络
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
## 06-安装kube-ovn网络组件.md
|
## 06-安装kube-ovn网络组件.md
|
||||||
|
|
||||||
|
(以下文档暂未更新,以插件官网文档为准)
|
||||||
|
|
||||||
由灵雀云开源的网络组件 kube-ovn,将已被 openstack 社区采用的成熟网络虚拟化技术 ovs/ovn 引入 kubernetes 平台;为 kubernetes 网络打开了新的大门,令人耳目一新;强烈推荐大家试用该网络组件,反馈建议以帮助项目早日走向成熟。
|
由灵雀云开源的网络组件 kube-ovn,将已被 openstack 社区采用的成熟网络虚拟化技术 ovs/ovn 引入 kubernetes 平台;为 kubernetes 网络打开了新的大门,令人耳目一新;强烈推荐大家试用该网络组件,反馈建议以帮助项目早日走向成熟。
|
||||||
|
|
||||||
- 介绍 https://blog.csdn.net/alauda_andy/article/details/88886128
|
- 介绍 https://blog.csdn.net/alauda_andy/article/details/88886128
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
# kube-router 网络组件
|
# kube-router 网络组件
|
||||||
|
|
||||||
|
(以下文档暂未更新,以插件官网文档为准)
|
||||||
|
|
||||||
kube-router是一个简单、高效的网络插件,它提供一揽子解决方案:
|
kube-router是一个简单、高效的网络插件,它提供一揽子解决方案:
|
||||||
- 基于GoBGP 提供Pod 网络互联(Routing)
|
- 基于GoBGP 提供Pod 网络互联(Routing)
|
||||||
- 使用ipsets优化的iptables 提供网络策略支持(Firewall/NetworkPolicy)
|
- 使用ipsets优化的iptables 提供网络策略支持(Firewall/NetworkPolicy)
|
||||||
|
|
|
@ -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
|
||||||
|
```
|
8
ezdown
8
ezdown
|
@ -14,9 +14,9 @@ set -o errexit
|
||||||
|
|
||||||
# default settings, can be overridden by cmd line options, see usage
|
# default settings, can be overridden by cmd line options, see usage
|
||||||
DOCKER_VER=20.10.16
|
DOCKER_VER=20.10.16
|
||||||
KUBEASZ_VER=3.3.0
|
KUBEASZ_VER=3.3.1
|
||||||
K8S_BIN_VER=v1.24.1
|
K8S_BIN_VER=v1.24.2
|
||||||
EXT_BIN_VER=1.1.0
|
EXT_BIN_VER=1.2.0
|
||||||
SYS_PKG_VER=0.4.3
|
SYS_PKG_VER=0.4.3
|
||||||
HARBOR_VER=v2.1.3
|
HARBOR_VER=v2.1.3
|
||||||
REGISTRY_MIRROR=CN
|
REGISTRY_MIRROR=CN
|
||||||
|
@ -24,7 +24,7 @@ REGISTRY_MIRROR=CN
|
||||||
# images downloaded by default(with '-D')
|
# images downloaded by default(with '-D')
|
||||||
calicoVer=v3.19.4
|
calicoVer=v3.19.4
|
||||||
dnsNodeCacheVer=1.21.1
|
dnsNodeCacheVer=1.21.1
|
||||||
corednsVer=1.8.6
|
corednsVer=1.9.3
|
||||||
dashboardVer=v2.5.1
|
dashboardVer=v2.5.1
|
||||||
dashboardMetricsScraperVer=v1.0.8
|
dashboardMetricsScraperVer=v1.0.8
|
||||||
metricsVer=v0.5.2
|
metricsVer=v0.5.2
|
||||||
|
|
|
@ -36,19 +36,6 @@
|
||||||
- name: 设置变量 CLUSTER_DNS_SVC_IP
|
- name: 设置变量 CLUSTER_DNS_SVC_IP
|
||||||
set_fact: CLUSTER_DNS_SVC_IP={{ DNS_SVC_IP.stdout }}
|
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的配置文件
|
- name: 创建kubelet的配置文件
|
||||||
template: src=kubelet-config.yaml.j2 dest=/var/lib/kubelet/config.yaml
|
template: src=kubelet-config.yaml.j2 dest=/var/lib/kubelet/config.yaml
|
||||||
tags: upgrade_k8s, restart_node
|
tags: upgrade_k8s, restart_node
|
||||||
|
|
|
@ -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
|
|
|
@ -3,6 +3,7 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1
|
||||||
bindAddress: 0.0.0.0
|
bindAddress: 0.0.0.0
|
||||||
clientConnection:
|
clientConnection:
|
||||||
kubeconfig: "/etc/kubernetes/kube-proxy.kubeconfig"
|
kubeconfig: "/etc/kubernetes/kube-proxy.kubeconfig"
|
||||||
|
# 根据clusterCIDR 判断集群内部和外部流量,配置clusterCIDR选项后,kube-proxy 会对访问 Service IP 的请求做 SNAT
|
||||||
clusterCIDR: "{{ CLUSTER_CIDR }}"
|
clusterCIDR: "{{ CLUSTER_CIDR }}"
|
||||||
conntrack:
|
conntrack:
|
||||||
maxPerCore: 32768
|
maxPerCore: 32768
|
||||||
|
@ -10,6 +11,7 @@ conntrack:
|
||||||
tcpCloseWaitTimeout: 1h0m0s
|
tcpCloseWaitTimeout: 1h0m0s
|
||||||
tcpEstablishedTimeout: 24h0m0s
|
tcpEstablishedTimeout: 24h0m0s
|
||||||
healthzBindAddress: 0.0.0.0:10256
|
healthzBindAddress: 0.0.0.0:10256
|
||||||
|
# hostnameOverride 值必须与 kubelet 的对应一致,否则 kube-proxy 启动后会找不到该 Node,从而不会创建任何 iptables 规则
|
||||||
hostnameOverride: "{{ inventory_hostname }}"
|
hostnameOverride: "{{ inventory_hostname }}"
|
||||||
metricsBindAddress: 0.0.0.0:10249
|
metricsBindAddress: 0.0.0.0:10249
|
||||||
mode: "{{ PROXY_MODE }}"
|
mode: "{{ PROXY_MODE }}"
|
||||||
|
|
|
@ -4,7 +4,6 @@ Documentation=https://github.com/GoogleCloudPlatform/kubernetes
|
||||||
After=network.target
|
After=network.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
# kube-proxy 根据 --cluster-cidr 判断集群内部和外部流量,指定 --cluster-cidr 或 --masquerade-all 选项后,kube-proxy 会对访问 Service IP 的请求做 SNAT
|
|
||||||
WorkingDirectory=/var/lib/kube-proxy
|
WorkingDirectory=/var/lib/kube-proxy
|
||||||
ExecStart={{ bin_dir }}/kube-proxy \
|
ExecStart={{ bin_dir }}/kube-proxy \
|
||||||
--config=/var/lib/kube-proxy/kube-proxy-config.yaml
|
--config=/var/lib/kube-proxy/kube-proxy-config.yaml
|
||||||
|
|
|
@ -2,12 +2,4 @@
|
||||||
KUBE_APISERVER: "https://127.0.0.1:{{ SECURE_PORT }}"
|
KUBE_APISERVER: "https://127.0.0.1:{{ SECURE_PORT }}"
|
||||||
|
|
||||||
# cgroup driver
|
# cgroup driver
|
||||||
CGROUP_DRIVER: "{%- if CONTAINER_RUNTIME == 'containerd' -%} \
|
CGROUP_DRIVER: "systemd"
|
||||||
systemd \
|
|
||||||
{%- else -%} \
|
|
||||||
{%- if DOCKER_VER|float >= 20.10 -%} \
|
|
||||||
systemd \
|
|
||||||
{%- else -%} \
|
|
||||||
cgroupfs \
|
|
||||||
{%- endif -%} \
|
|
||||||
{%- endif -%}"
|
|
||||||
|
|
Loading…
Reference in New Issue