update docs part2

pull/1166/head
jin.gjm 2022-06-28 19:59:50 +08:00
parent 9f99d89b2f
commit 773bf5f55e
23 changed files with 300 additions and 373 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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集群状态

View File

@ -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)

View File

@ -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

View File

@ -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服务
+ kubeletkube_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 对于某些系统centos7cpuset和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 状态

View File

@ -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,13 +17,13 @@
- 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`
@ -32,8 +32,8 @@ Kubernetes Pod的网络是这样创建的
- [安装calico](network-plugin/calico.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/)

View File

@ -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_infopod_info用来判断现有集群是否已经运行各种插件

View File

@ -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 组件安装
- ...

View File

@ -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 |无 |

View File

@ -4,7 +4,7 @@
### 安全组
注意虚机的安全组规则配置,一般集群内部节点之间端口放开即可;
注意虚机的安全组规则配置,一般集群内部节点之间端口全部放开即可;
### 网络组件

View File

@ -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)

View File

@ -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网络

View File

@ -1,5 +1,7 @@
## 06-安装kube-ovn网络组件.md
(以下文档暂未更新,以插件官网文档为准)
由灵雀云开源的网络组件 kube-ovn将已被 openstack 社区采用的成熟网络虚拟化技术 ovs/ovn 引入 kubernetes 平台;为 kubernetes 网络打开了新的大门,令人耳目一新;强烈推荐大家试用该网络组件,反馈建议以帮助项目早日走向成熟。
- 介绍 https://blog.csdn.net/alauda_andy/article/details/88886128

View File

@ -1,5 +1,7 @@
# kube-router 网络组件
(以下文档暂未更新,以插件官网文档为准)
kube-router是一个简单、高效的网络插件它提供一揽子解决方案
- 基于GoBGP 提供Pod 网络互联Routing
- 使用ipsets优化的iptables 提供网络策略支持Firewall/NetworkPolicy

View File

@ -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
View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 }}"

View File

@ -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

View File

@ -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"