Nginx反向代理
NGINX服务器的反向代理PROXY_PASS配置方法讲解
Nginx的配置还是比较简单的,如:
1 | location ~ /* { |
NGINX服务器的反向代理PROXY_PASS配置方法讲解
Nginx的配置还是比较简单的,如:
1 | location ~ /* { |
docker 运行和管理容器,kubelet 通过 Container Runtime Interface (CRI) 与它进行交互。
注意:
到 docker 下载页面 下载最新发布包:
1 | cd /opt/k8s/work |
分发二进制文件到所有 worker 节点:
1 | cd /opt/k8s/work |
1 | cd /opt/k8s/work |
EOF 前后有双引号,这样 bash 不会替换文档中的变量,如 $DOCKER_NETWORK_OPTIONS
(这些环境变量是 systemd 负责替换的。);
dockerd 运行时会调用其它 docker 命令,如 docker-proxy,所以需要将 docker 命令所在的目录加到 PATH 环境变量中;
flanneld 启动时将网络配置写入 /run/flannel/docker
文件中,dockerd 启动前读取该文件中的环境变量 DOCKER_NETWORK_OPTIONS
,然后设置 docker0 网桥网段;
如果指定了多个 EnvironmentFile
选项,则必须将 /run/flannel/docker
放在最后(确保 docker0 使用 flanneld 生成的 bip 参数);
docker 需要以 root 用于运行;
docker 从 1.13 版本开始,可能将 iptables FORWARD chain的默认策略设置为DROP,从而导致 ping 其它 Node 上的 Pod IP 失败,遇到这种情况时,需要手动设置策略为 ACCEPT
:
1 | $ sudo iptables -P FORWARD ACCEPT |
并且把以下命令写入 /etc/rc.local
文件中,防止节点重启iptables FORWARD chain的默认策略又还原为DROP
1 | /sbin/iptables -P FORWARD ACCEPT |
分发 systemd unit 文件到所有 worker 机器:
1 | cd /opt/k8s/work |
使用国内的仓库镜像服务器以加快 pull image 的速度,同时增加下载的并发数 (需要重启 dockerd 生效):
1 | cd /opt/k8s/work |
分发 docker 配置文件到所有 worker 节点:
1 | cd /opt/k8s/work |
1 | source /opt/k8s/bin/environment.sh |
1 | source /opt/k8s/bin/environment.sh |
确保状态为 active (running)
,否则查看日志,确认原因:
1 | journalctl -u docker |
1 | source /opt/k8s/bin/environment.sh |
确认各 worker 节点的 docker0 网桥和 flannel.1 接口的 IP 处于同一个网段中(如下 172.30.80.0/32 位于 172.30.80.1/21 中):
1 | >>> 172.27.137.240 |
注意: 如果您的服务安装顺序不对或者机器环境比较复杂, docker服务早于flanneld服务安装,此时 worker 节点的 docker0 网桥和 flannel.1 接口的 IP可能不会同处同一个网段下,这个时候请先停止docker服务, 手工删除docker0网卡,重新启动docker服务后即可修复:
1 | systemctl stop docker |
1 | $ ps -elfH|grep docker |
1 | $ docker info |
需要删除 kubelet 的 systemd unit 文件(/etc/systemd/system/kubelet.service),删除下面 4 行:
1 | --network-plugin=cni \\ |
然后重启 kubelet 服务:
1 | systemctl restart kubelet |
kubernetes 要求集群内各节点(包括 master 节点)能通过 Pod 网段互联互通。flannel 使用 vxlan 技术为各节点创建一个可以互通的 Pod 网络,使用的端口为 UDP 8472(需要开放该端口,如公有云 AWS 等)。
flanneld 第一次启动时,从 etcd 获取配置的 Pod 网段信息,为本节点分配一个未使用的地址段,然后创建 flannedl.1
网络接口(也可能是其它名称,如 flannel1 等)。
flannel 将分配给自己的 Pod 网段信息写入 /run/flannel/docker
文件,docker 后续使用这个文件中的环境变量设置 docker0
网桥,从而从这个地址段为本节点的所有 Pod 容器分配 IP。
注意:
1 | FLANNEL_ETCD_PREFIX="/kubernetes/network" |
从 flannel 的 release 页面 下载最新版本的安装包:
1 | cd /opt/k8s/work |
分发二进制文件到集群所有节点:
1 | cd /opt/k8s/work |
flanneld 从 etcd 集群存取网段分配信息,而 etcd 集群启用了双向 x509 证书认证,所以需要为 flanneld 生成证书和私钥。
创建证书签名请求:
1 | cd /opt/k8s/work |
生成证书和私钥:
1 | cfssl gencert -ca=/opt/k8s/work/ca.pem \ |
将生成的证书和私钥分发到所有节点(master 和 worker):
1 | cd /opt/k8s/work |
注意:本步骤只需执行一次。
1 | cd /opt/k8s/work |
${CLUSTER_CIDR}
地址段(如 /16)必须小于 SubnetLen
,必须与 kube-controller-manager
的 --cluster-cidr
参数值一致;1 | cd /opt/k8s/work |
mk-docker-opts.sh
脚本将分配给 flanneld 的 Pod 子网段信息写入 /run/flannel/docker
文件,后续 docker 启动时使用这个文件中的环境变量配置 docker0 网桥;-iface
参数指定通信接口;-ip-masq
: flanneld 为访问 Pod 网络外的流量设置 SNAT 规则,同时将传递给 Docker 的变量 --ip-masq
(/run/flannel/docker
文件中)设置为 false,这样 Docker 将不再创建 SNAT 规则;--ip-masq
为 true 时,创建的 SNAT 规则比较“暴力”:将所有本节点 Pod 发起的、访问非 docker0 接口的请求做 SNAT,这样访问其他节点 Pod 的请求来源 IP 会被设置为 flannel.1 接口的 IP,导致目的 Pod 看不到真实的来源 Pod IP。1 | cd /opt/k8s/work |
1 | source /opt/k8s/bin/environment.sh |
1 | source /opt/k8s/bin/environment.sh |
确保状态为 active (running)
,否则查看日志,确认原因:
1 | journalctl -u flanneld |
查看集群 Pod 网段(/16):
1 | source /opt/k8s/bin/environment.sh |
输出:
{"Network":"172.30.0.0/16", "SubnetLen": 24, "Backend": {"Type": "vxlan"}}
查看已分配的 Pod 子网段列表(/24):
1 | source /opt/k8s/bin/environment.sh |
输出(结果视部署情况而定):
1 | /kubernetes/network/subnets/172.30.80.0-24 |
查看某一 Pod 网段对应的节点 IP 和 flannel 接口地址:
1 | source /opt/k8s/bin/environment.sh |
输出(结果视部署情况而定):
{"PublicIP":"172.27.137.240","BackendType":"vxlan","BackendData":{"VtepMAC":"ce:9c:a9:08:50:03"}}
1 | [root@zhangjun-k8s01 work]# ip addr show |
1 | [root@zhangjun-k8s01 work]# ip route show |grep flannel.1 |
${FLANNEL_ETCD_PREFIX}/subnets/172.30.80.0-24
,来决定进请求发送给哪个节点的互联 IP;在各节点上部署 flannel 后,检查是否创建了 flannel 接口(名称可能为 flannel0、flannel.0、flannel.1 等):
1 | source /opt/k8s/bin/environment.sh |
输出:
1 | >>> 172.27.137.240 |
在各节点上 ping 所有 flannel 接口 IP,确保能通:
1 | source /opt/k8s/bin/environment.sh |
该文档部署了最新的v1.8.2
版本,实现了kube-apiserver
的高可用、traefik ingress
的部署、在kubernetes
上安装docker
的私有仓库harbor
、容器化kubernetes
部分组建、使用阿里云日志服务收集日志。
部署完成后,你将理解系统各组件的交互原理,进而能快速解决实际问题,所以本文档主要适合于那些有一定kubernetes
基础,想通过一步步部署的方式来学习和了解系统配置、运行原理的人。
本系列系文档适用于 CentOS 7
、Ubuntu 16.04
及以上版本系统,由于启用了 TLS
双向认证、RBAC
授权等严格的安全机制,建议从头开始部署,否则可能会认证、授权等失败!
从MySQL5.5开始,MySQL以插件的形式支持半同步复制。如何理解半同步呢?首先我们来看看异步,全同步的概念
异步复制(Asynchronous replication)
MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。
1 | 监控linux tcp连接数 |