概述:
这篇文章是为了介绍使用 kubeadm 安装 Kubernetes 集群(可以用于生产级别). 使用了 CentOS 7 系统.
PS:
篇幅有点长, 但是比较详细, 比较全面
一, Centos7 配置说明
1.1 Firewalld(防火墙)
CentOS Linux 7 默认开起来防火墙服务 (firewalld), 而 Kubernetes 的 Master 与工作 Node 之间会有大量的网络通信, 安全的做法是在防火墙上配置 Kbernetes 各组件(API-server,kubelet 等等) 需要相互通信的端口号. 在安全的内部网络环境中可以关闭防火墙服务.
关闭防火墙的命令:
- # firewall-cmd --state #查看防火墙状态
- # systemctl stop firewalld.service #停止 firewall
- # systemctl disable firewalld.service #禁止 firewall 开机启动
- 1.2 SELinux
建议禁用 SELinux, 让容器可以读取主机文件系统
执行命令:
- # getenforce #查看 selinux 状态
- # setenforce 0 #临时关闭 selinux
- # sed -i 's/^ *SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config #永久关闭(需重启系统)
- # shutdown -r now #重启系统
二, 安装准备工作
2.1 安装环境
软硬件 | 最低配置 | 推荐配置 |
CPU 和内存 | Master: 至少 2 Core 和 4G 内存 Node:至少 4 Core 和 16G 内存 | Master:4 core 和 16G 内存 Node:应根据需要运行的容器数量进行配置 |
Linux 操作系统 | 基于 x86_64 架构的各种 Linux 发行版本,Kernel 版本要求在 3.10 及以上 | Red Hat Linux 7 CentOS 7 |
说明:
以上为建议配置, 实际安装过程中, Master 必须 2 core 及以上(否则安装失败, 切记),Node 可以采用 1 core.
2.2 部署环境说明
主机列表:
主机名 | Centos 版本 | ip | docker version | flannel version | Keepalived version | 主机配置 | 备注 |
master01 | 7.6.1810 | 192.168.0.6 | 18.09.9 | v0.11.0 | v1.3.5 | 2C1G | control plane |
work01 | 7.6.1810 | 192.168.0.10 | 18.09.9 | / | / | 1C1G | worker nodes |
work02 | 7.6.1810 | 192.168.0.12 | 18.09.9 | / | / | 1C1G | worker nodes |
VIP | 7.6.1810 | 192.168.0.130 | 18.09.9 | v0.11.0 | v1.3.5 | 4C4G | 在 control plane 上浮动 |
client | 7.6.1810 | 192.168.0.234 | / | / | / | 4C4G | client(可不需要) |
共有 7 台服务器, 3 台 control plane,3 台 work,1 台 client.
k8s 版本(可根据需要进行更改):
主机名 | kubelet version | kubeadm version | kubectl version | 备注 |
master01 | v1.16.4 | v1.16.4 | v1.16.4 | kubectl 选装 |
work01 | v1.16.4 | v1.16.4 | v1.16.4 | kubectl 选装 |
work02 | v1.16.4 | v1.16.4 | v1.16.4 | kubectl 选装 |
client | / | / | v1.16.4 | client |
2.3. 配置主机名(master 和 node 节点都执行)
2.3.1 修改主机名
Master 主机改为 master01, 执行以下命令:
- # hostnamectl set-hostname master01 #修改主机名称为 master01
- # more /etc/hostname #查看修改结果
同样的修改 node01 和 node02(注意主机名为 node01 和 node02)
说明:
退出重新登陆即可显示新设置的主机名 master01, 重新登录之后
2.3.2 修改 hosts 文件
执行以下命令:
- cat>> /etc/hosts <<EOF
- 192.168.0.6 master01
- 192.168.0.10 node01
- 192.168.0.12 node02
- EOF
2.3.3 禁用 swap
Kubeadm 建议关闭交换空间的使用, 简单来说, 执行 swapoff -a 命令, 然后在 / etc/fstab 中删除对 swap 的加载, 并重新启动服务器即可.
临时禁用, 执行以下命令:
# swapoff -a
永久禁用, 需要在 swapoff -a 之后, 执行以下命令:
# sed -i.bak '/swap/s/^/#/' /etc/fstab
2.3.4 设置 kubernetes 源
2.3.4.1 新增 kubernetes 源
执行以下命令:
- # cat <<EOF> /etc/yum.repos.d/kubernetes.repo
- [kubernetes]
- name=Kubernetes
- baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
- enabled=1
- gpgcheck=1
- repo_gpgcheck=1
- gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
- EOF
2.3.4.2 更新缓存
- # yum clean all
- # yum -y makecache
三, Docker 安装(master 和 node 节点都执行)
注意:
安装 docker 之前, 最好确认一下, kubernetes 支持哪些版本的 docker(kubernetes 和 docker 的版本要对应, 否则可能会造成重新安装).
3.1 卸载 / 更新已经安装的 Docker
- # 卸载 docker
- #1. 列出安装过的包
- # yum list installed | grep docker
- #2. 根据安装过的包进行卸载
- # yum -y remove docker-ce-cli.x86_64
- # yum -y remove docker-ce.x86_64
- # yum -y remove containerd.io
- # 更新 docker
- # yum -y update docker
3.2 安装 Docker 环境
3.2.1 配置 docker 源
如已安装过 docker, 则不需要进行此步骤
# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
3.2.2 安装依赖包
# yum install -y yum-utils device-mapper-persistent-data lvm2
3.2.3 设置从 stable 仓库获取 docker
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
3.2.4 安装 Docker
# yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io -y
说明:
执行以上命令之前, 可以看看 docker 版本, 执行以下命令查看
# yum list docker-ce --showduplicates | sort -r
3.2.5 启动 Docker(并设置为开机启动)
# systemctl start docker && systemctl enable docker
3.2.6 命令补全
安装 bash-completion
# yum -y install bash-completion
加载 bash-completion
# source /etc/profile.d/bash_completion.sh
3.2.7 镜像加速(并修改 Cgoup Driver)
- # mkdir -p /etc/docker
- # tee /etc/docker/daemon.JSON <<-'EOF'
- {
- "registry-mirrors": ["https://usydjf4t.mirror.aliyuncs.com",
- "https://registry.docker-cn.com"]
- , "exec-opts": ["native.cgroupdriver=systemd"]
- }
- EOF
- # systemctl daemon-reload
- # systemctl restart docker
说明:
修改 cgroupdriver 是为了消除告警:
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
四, Keepalived 安装(master 节点安装)
4.1 安装 keepalived
# yum -y install keepalived
4.2 keepalived 配置
保留默认配置
# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived_default.conf
写入新的配置
- # cat <<EOF> /etc/keepalived/keepalived.conf
- ! Configuration File for keepalived
- global_defs {
- router_id master01
- }
- vrrp_instance VI_1 {
- state MASTER
- interface enp0s3
- virtual_router_id 50
- priority 100
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 192.168.0.130
- }
- }
- EOF
说明:
特别注意红色字体文本, master01 是主机名称(如果有其他主机则使用对应的主机名称进行替换),enp0s3 是网卡名称(每个 Linux 系统可能不一致),192.168.0.130 是虚拟 IP
4.3 启动 keepalived
# service keepalived start && systemctl enable keepalived
4.4 VIP 查看
在 master 机器上执行
# ip a
可以看到 VIP 在 master01(目前只有一台 master, 以后可能会有多个 master)上
五, 安装 k8s(master 和 node 节点都执行)
5.1 查看 kubernetes 版本
# yum list kubelet --showduplicates | sort -r
说明:
本文安装的 kubelet 版本是 1.16.4, 该版本支持的 docker 版本为 1.13.1, 17.03, 17.06, 17.09, 18.06, 18.09.
5.2 安装 kubelet,kubeadm 和 kubectl(注意版本号, 根据需要进行改变)
# yum install -y kubelet-1.16.4 kubeadm-1.16.4 kubectl-1.16.4
说明:
kubelet 运行在集群所有节点上, 用于启动 Pod 和容器等对象的工具
kubeadm 用于初始化集群, 启动集群的命令工具
kubectl 用于和集群通信的命令行, 通过 kubectl 可以部署和管理应用, 查看各种资源, 创建, 删除和更新各种组件
5.3 启动 kubelet(并设置为开机启动)
# systemctl enable kubelet && systemctl start kubelet
5.4 命令补全
- # echo "source <(kubectl completion bash)">> ~/.bash_profile
- # source .bash_profile
5.5 下载镜像
Kubernetes 几乎所有的安装组件和 Docker 镜像都放在 goolge 自己的网站上, 直接访问可能会有网络问题, 这里的解决办法是从阿里云镜像仓库下载镜像, 拉取到本地以后改回默认的镜像 tag. 本文通过运行 image.sh 脚本方式拉取镜像.
直接执行以下命令(灰色背景部分):
- # more image.sh #以下为 image.sh 文件的内容
- #!/bin/bash
- url=registry.cn-hangzhou.aliyuncs.com/loong576 #阿里云镜像仓库地址, 可以按需修改
- version=v1.16.4 #安装的 kubernetes 的版本(可以按需修改)
- images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
- for imagename in ${images[@]} ; do
- docker pull $url/$imagename
- docker tag $url/$imagename k8s.gcr.io/$imagename
- docker rmi -f $url/$imagename
- done
注意:
如果需要下载其他的 kubernetes 版本, 需要修改对应的版本号(红色字体部分)
5.6 查看已经下载的镜像
# docker images
六, 网络插件 (flannel) 配置(Master 执行)
本文的 k8s 网络使用 flannel, 该网络需要设置内核参数 bridge-nf-call-iptables=1, 修改这个参数需要系统有 br_netfilter 模块.
说明:
K8s 网络插件有很多, 使用网络插件之前, 要进行判断是否和系统适配.
6.1 br_netfilter 模块加载
查看 br_netfilter 模块:
# lsmod |grep br_netfilter
如果系统没有 br_netfilter 模块则执行下面的新增命令, 如有则忽略.
永久新增 br_netfilter 模块:
- # cat> /etc/rc.sysinit <<EOF
- #!/bin/bash
- for file in /etc/sysconfig/modules/*.modules ; do
- [ -x $file ] && $file
- done
- EOF
- # cat> /etc/sysconfig/modules/br_netfilter.modules <<EOF
- modprobe br_netfilter
- EOF
- # chmod 755 /etc/sysconfig/modules/br_netfilter.modules
6.2 内核参数永久修改
- # cat <<EOF> /etc/sysctl.d/k8s.conf
- net.bridge.bridge-nf-call-ip6tables = 1
- net.bridge.bridge-nf-call-iptables = 1
- EOF
- # sysctl -p /etc/sysctl.d/k8s.conf
说明:
如安装网络插件之后, 长时间状态没有变更, 则可以试试重启机器(或者是虚拟机, 这里是指 CentOS 7 系统).
七, 初始化 Master(Master 节点执行)
说明:
Master 的 kubernetes 之前, 须先确定要确定的网络插件(因为可能会影响到初始化的参数), 不同的系统可能需要使用不同的网络插件(CentOS 不支持 Calico).
建议先阅读网络插件资料.(Kubernetes 所有网络插件说明: 这里)
7.1 创建初始化文件
7.1.1 获取默认的初始化参数文件
# kubeadm config print init-defaults> init.default.YAML
7.1.2 查看 init.default.YAML 文件
# cat init.default.YAML
7.1.3 配置初始化文件
创建 kubeadm.conf.YAML 文件, 输入以下内容(灰色背景部分):
- apiVersion: kubeadm.k8s.io/v1beta2
- kind: ClusterConfiguration
- kubernetesVersion: v1.16.4
- apiServer:
- certSANs: #填写所有 kube-apiserver 节点的 hostname,IP,VIP
- - master01
- - node01
- - node02
- - 192.168.0.6
- - 192.168.0.10
- - 192.168.0.12
- - 192.168.0.130
- controlPlaneEndpoint: "192.168.0.130:6443"
- networking:
- podSubnet: "10.244.0.0/16" #这里需要根据具体的网络插件来配置(这里使用的 flannel 网络插件配置)
说明:
注意红色字体部分内容, 需要根据 init.default.YAML 文件和自己的需要进行更改
7.2 初始化 kubernetes
# kubeadm init --config=kubeadm.conf.YAML
说明:
如果初始化失败, 可执行 kubeadm reset 后重新初始化(执行以下两条命令)
- # kubeadm reset
- # rm -rf $HOME/.kube/config
初始化成功, 如下图:
按照提示执行下面的命令, 复制配置文件到普通用户的 home 目录下:
- # mkdir -p $HOME/.kube
- # cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
- # chown $(id -u):$(id -g) $HOME/.kube/config
在其他位置(或者主机), 保存如下信息(其他 node 节点加入集群时使用):
- You should now deploy a pod network to the cluster.
- Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
- https://kubernetes.io/docs/concepts/cluster-administration/addons/
- You can now join any number of control-plane nodes by copying certificate authorities
- and service account keys on each node and then running the following as root:
- kubeadm join 192.168.0.130:6443 --token afeqnz.vhp0e8rtrw6jz6v2 \
- --discovery-token-ca-cert-hash sha256:d6a450aafb14e82efb69fbcb71e426bfed8e423d64b37bac85b3ff8ce7dc6562 \
- --control-plane
- Then you can join any number of worker nodes by running the following on each as root:
- ## node 加入集群时使用
- kubeadm join 192.168.0.130:6443 --token afeqnz.vhp0e8rtrw6jz6v2 \
- --discovery-token-ca-cert-hash sha256:d6a450aafb14e82efb69fbcb71e426bfed8e423d64b37bac85b3ff8ce7dc6562
7.3 加载环境变量
- # echo "export KUBECONFIG=/etc/kubernetes/admin.conf">> ~/.bash_profile
- # source .bash_profile
八, node 节点加入集群
8.1 开启 Master 节点防火墙端口
说明:
如果 master 节点的防火墙已经关闭, 可以直接跳过此小节
如果 node 已经加入其它集群, 需要退出集群, 请执行在 node 上执行:
# kubeadm reset
查看防火墙状态:
# systemctl status firewalld 或者 firewall-cmd --state
开启 6443 端口
- # firewall-cmd --zone=public --add-port=6443/tcp --permanent
- ## 出现 success 表明添加成功
命令含义:
- --zone #作用域
- --add-port=80/tcp #添加端口, 格式为: 端口 / 通讯协议
- --permanent #永久生效, 没有此参数重启后失效
重启防火墙
# systemctl restart firewalld.service
说明:
Kubernetes 集群中的 Service 可使用的物理机端口号范围为 30000~32767
一次全部公开所有可能使用的端口:
- # firewall-cmd --zone=public --add-port=30000-32767/tcp --permanent
- # systemctl restart firewalld.service
8.2 加入集群
Master 节点在初始化完成之后, 最后一行代码, 如下:
- # kubeadm join 192.168.0.130:6443 --token afeqnz.vhp0e8rtrw6jz6v2 \
- --discovery-token-ca-cert-hash sha256:d6a450aafb14e82efb69fbcb71e426bfed8e423d64b37bac85b3ff8ce7dc6562
把两行信息复制出来, 在 node 节点执行, 如下图:(join 成功)
在 master 节点, 执行以下命令查看已经加入的节点
# kubectl get nodes
说明:
由于没有安装网络插件, 这里 STATUS 为 NotReady
九, 安装网络插件(Master)
在 master 主机上执行以下命令:
# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
说明:
由于网络原因, 可能会安装失败, 可以在浏览器直接下载 kube-flannel.YAML 文件(也可以在浏览器打开 url 地址, 然后复制文件内容到文件), 然后再执行 apply
查看节点状态, 执行以下命令:
# kubectl get nodes
说明:
STATUS 从 NotReady 变为 Ready
十, Client 配置(client 端执行)
10.1 新增 kubernetes 源
- # cat <<EOF> /etc/yum.repos.d/kubernetes.repo
- [kubernetes]
- name=Kubernetes
- baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
- enabled=1
- gpgcheck=1
- repo_gpgcheck=1
- gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
- EOF
10.2 更新缓存
# yum clean all && yum -y makecache
10.3 安装 kubectl
# yum install -y kubectl-1.16.4
10.4 命令补全
安装 bash- completion
# yum -y install bash-completion
加载 bash-completion
# source /etc/profile.d/bash_completion.sh
10.5 从 Master 节点拷贝 admin.conf
- # mkdir -p /etc/kubernetes
- # scp 192.168.0.6:/etc/kubernetes/admin.conf /etc/kubernetes/
说明:
192.168.0.6 是 master 主机
- # echo "export KUBECONFIG=/etc/kubernetes/admin.conf">> ~/.bash_profile
- # source .bash_profile
10.6 加载环境变量
- # echo "source <(kubectl completion bash)">> ~/.bash_profile
- # source .bash_profile
10.7 Kubectl 测试
# kubectl get nodes
# kubectl get cs
# kubectl get po -o wide -n kube-system
十一, Dashboard 搭建(client 端执行)
11.1 下载 YAML
# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
说明:
如果连接超时, 可以多试几次. 也可以在这里下载
11.2 修改镜像地址
# sed -i 's/kubernetesui/registry.cn-hangzhou.aliyuncs.com\/loong576/g' recommended.YAML
说明:
也可以采用其他的一些镜像(切换镜像, 需要更改 recommended.YAML 文件)
更改镜像操作:
如果需要更改镜像的版本号, 需要在阿里云查询一下是否有镜像
下载镜像命令:(注意阿里云是没有带版本号的, 需要自己录入版本号)
# docker pull registry.cn-hangzhou.aliyuncs.com/kubernetesui/dashboard:v2.0.0-rc5
11.3 配置 YAML
外网访问
# sed -i '/targetPort: 8443/a\ \ \ \ \ \ nodePort: 30001\n\ \ type: NodePort' recommended.YAML
说明:
配置 NodePort, 外部通过 https://NodeIp:NodePort 访问 Dashboard, 此时端口为 30001
11.4 新增管理员账号
创建超级管理员的账号用于登录 Dashboard
- # cat>> recommended.YAML << EOF
- ---
- # ------------------- dashboard-admin ------------------- #
- apiVersion: v1
- kind: ServiceAccount
- metadata:
- name: dashboard-admin
- namespace: kubernetes-dashboard
- ---
- apiVersion: rbac.authorization.k8s.io/v1beta1
- kind: ClusterRoleBinding
- metadata:
- name: dashboard-admin
- subjects:
- - kind: ServiceAccount
- name: dashboard-admin
- namespace: kubernetes-dashboard
- roleRef:
- apiGroup: rbac.authorization.k8s.io
- kind: ClusterRole
- name: cluster-admin
- EOF
11.5 部署 Dashboard
# kubectl apply -f recommended.YAML
状态查看:
# kubectl get all -n kubernetes-dashboard
令牌查看:
# kubectl describe secrets -n kubernetes-dashboard dashboard-admin
令牌为(一定要注意可能存在换行的情况):
eyJhbGciOiJSUzI1NiIsImtpZCI6IllkWjQxWENEYnBXYV9rUlNqWTRldjVOYXV3M0tPTklYTVZTWUZWOXp0SHMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tZzRwdzUiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNjNmNzllODUtNzMzMy00MDY1LTg1YTEtYzkxZTkzNjk3ZjA0Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.vsizK9ZP53to5aL5d1oyFYAiR8Kt1LaQ_Lkt86yPgHp6QloMS_pLCdD7KZi76deQ4ISTFC9Ldc62zslLtY4qgxNvSUiVWj1bWUn2BfCJ-3jPxpd7ZOgr3Gbp2xAFc3xjgm-qZaOydec9i44CbkdiVDoAjL0Au78yt7aHSW8B6plc2fAYNdywtyIOAMhe7f0gjyRaWrGQje2CVduITxZ-2NCwd3EYQNs31OA-zUPFvel_xi_KzdMBuj4z7DdvIK9wPQHyuke0TIs5dHSUEtiY84erLMg5i0ZGXCd019D5Nrsd78fVe_NbO-NThVReskA-jt1FyhAUesZie4GX-2eL3Q
说明:
如果安装 Dashboard 过程中出现问题, 要仔细进行排查, 可能 pod 还没有安装完成, 等待一段时间之后, 再看看, 如果还是不行, 则需要考虑一下中途是否有问题, 是否需要重新安装.
如果忘记 Token, 可以通过以下命令获取:
# kubectl describe secret -n kubernetes-dashboard $(kubectl get secret -n kubernetes-dashboard |grep kubernetes-dashboard-token | awk '{print $1}') |grep token | awk '{print $2}'
11.6 使用火狐浏览器浏览
https://192.168.0.6:30001
部署 Dashboard 之后, 由于证书问题导致无法在浏览器浏览(暂时没有找到解决方案, 尝试了网上的方式, 不行, 以下是尝试的过程(可以跳过))
删除已经部署的 Dashboard
- 1. kubectl delete ns kubernetes-dashboard
- https://github.com/kubernetes/dashboard/releases
2. 阅读参考资料(并执行命令, 除了删除命令)
https://blog.51cto.com/10616534/2430512
十二, 查找问题方式
12.1 查看 Pod 详细信息
查看所有 Pod
# kubectl get pods --all-namespaces
查看状态异常的 Pod 的详细信息
# kubectl describe pod kubernetes-dashboard-8478d57dc6-p7jt7 --namespace=kubernetes-dashboard
说明:
可以看到在哪台 Node 上创建了容器
12.2 防火墙的问题
建议关闭防火墙
- # systemctl stop firewalld.service
- # systemctl disable firewalld.service
说明:
如果不关闭防火墙, 可能会造成容器产生错误, 如 no host to route, 是因为防火墙拦截了端口.
12.3 Dashboard 证书过期问题
12.4 Node 节点执行 kubectl 命令出错问题
错误描述信息:
The connection to the server raw.githubusercontent.com was refused - did you specify the right host or port?
需要将 master 节点的 /etc/kubernetes/admin.conf 文件复制到 node 节点下.
参考资料
Kubernetes 的安装:
https://www.kubernetes.org.cn/6632.html
CentOS Linux 开放端口:
https://www.cnblogs.com/archoncap/p/5402983.html
Kubernetes 所有网络插件说明:
来源: https://www.cnblogs.com/zhizihuakai/p/12629514.html