属于网站设计内容的是,华强北ic网站建设,濮阳开公司怎么找客户,免费网站推广工具有哪些二进制搭建kubernetes 一、常见的K8S部署方式1.Minikube2.Kubeadmin3.二进制安装部署 二、二进制搭建K8S(单台master)1.部署架构规划2.系统初始化配置3.部署 docker引擎4.部署 etcd 集群4.部署 Master 组件5.部署 Worker Node 组件6.部署网络组件 三、负载均衡部署1.配置load b… 二进制搭建kubernetes 一、常见的K8S部署方式1.Minikube2.Kubeadmin3.二进制安装部署 二、二进制搭建K8S(单台master)1.部署架构规划2.系统初始化配置3.部署 docker引擎4.部署 etcd 集群4.部署 Master 组件5.部署 Worker Node 组件6.部署网络组件 三、负载均衡部署1.配置load balancer集群双机热备负载均衡nginx实现负载均衡keepalived实现双机热备2.修改nginx配置文件配置四层反向代理负载均衡指定k8s群集2台master的节点ip和6443端口3.检查配置文件语法4.部署keepalived服务5.创建nginx状态检查脚本6.启动keepalived服务一定要先启动了nginx服务再启动keepalived服务7.修改node节点上的bootstrap.kubeconfig,kubelet.kubeconfig配置文件为VIP8.重启kubelet和kube-proxy服务9.在 lb01 上查看 nginx 和 node 、 master 节点的连接状态 四、在 master01 节点上操作1.测试创建pod2.查看Pod的状态信息3.在对应网段的node节点上操作可以直接使用浏览器或者curl命令访问4.这时在master01节点上查看nginx日志 五、部署 Dashboard1.Dashboard 介绍2.在 master01 节点上操作2.创建service account并绑定默认cluster-admin管理员集群角色3.使用输出的token登录Dashboard2.在 master01 节点上操作2.创建service account并绑定默认cluster-admin管理员集群角色3.使用输出的token登录Dashboard   一、常见的K8S部署方式 
1.Minikube 
Minikube是一个工具可以在本地快速运行一个单节点微型K8S仅用于学习、预览K8s的些特性使用。 
部署地址: https://kubernetes.io/docs/setup/minikube 
2.Kubeadmin 
Kubeadmin也是一个工具提供kubeadm init和kubeadm join用于快速部署K8S集群相对简单。 
部署地址:https://kubernetes,io/docs/reference/setup-tools/kubeadm/kubeadm/ 
3.二进制安装部署 
从官方下载发行版的二进制包手动部署每个组件和自签TLS证书组成K8S集群新手推荐。 
部署地址:https://qithub,com/kubernetes/kubernetes/releases 
总Kubeadm降低部署门槛但屏蔽了很多细节遇到问题很难排查。如果想更容易可控推荐使用二进制包部署Kubernetes集群虽然手动部署麻烦点期间可以学习很多工作原理也利于后期维护和出错排错。 
二、二进制搭建K8S(单台master) 
1.部署架构规划 
主机节点主机地址安装的软件master01192.168.174.12apiserver、comtroller-manager、scheduler、etcd01node01192.168.174.18kubelet、kube-proxy、docker、etcd02node02192.168.174.19kubelet、kube-proxy、docker、etcd03 
后面服务搭建规划 VIP192.168.174.100 master02192.168.174.15 负载均衡nginxkeepalive01master192.168.174.18 负载均衡nginxkeepalive02backup192.168.174.19 2.系统初始化配置 
1所有节点上操作 
#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
#永久关闭firewalld并清空iptables所有表规则
iptables -F  iptables -t nat -F  iptables -t mangle -F  iptables -X#关闭selinux
setenforce 0
sed -i s/enforcing/disabled/ /etc/selinux/config#关闭swap
swapoff -a
sed -ri s/.*swap.*/#/ /etc/fstab 2三个节点分开执行 
#根据规划设置主机名
#192.168.174.12上面执行
hostnamectl set-hostname master01
#192.168.174.18上面执行
hostnamectl set-hostname node01
#192.168.174.19上面执行
hostnamectl set-hostname node023所有节点执行 
#刷新bash使得修改的主机名生效
bash#使用多行重定向将主机名对应的ip写到hosts里面加快访问速度注意改为自己的ip
cat  /etc/hosts  EOF
192.168.174.12 master01
192.168.174.15 master02
192.168.174.18 node01
192.168.174.19 node02
EOF#调整内核参数
#使用多行重定向调整内核参数前2行为开启网桥模式后2行为关闭ipv6协议和开启路由转发
cat  /etc/sysctl.d/k8s.conf  EOF
#开启网桥模式可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables  1
net.bridge.bridge-nf-call-iptables  1
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv61
net.ipv4.ip_forward1
EOF#加载内核使得配置内核参数生效
sysctl --system#时间同步
#安装ntpdate时间同步程序与本机的windows同步时间
yum install ntpdate -y
ntpdate time.windows.com3.部署 docker引擎 
所有 node 节点部署docker引擎192.168.174.18、192.168.174.19 
yum install -y yum-utils device-mapper-persistent-data lvm2
#安装docker的依赖包yum-utils提供了 yum-config-manager 工具。
#device mapper 是Linux内核中支持逻辑卷管理的通用设备映射机制它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
#evice mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#yum源配置为阿里云镜像
yum install -y docker-ce  docker-ce-cli
#安装docker(ce表示社区版若需安装指定版本则--后跟版本)  #开机自启并现在启动docker
systemctl start docker.service
systemctl enable docker.service 4.部署 etcd 集群 
1etcd简介 
① etcd概念 
etcd是CoreOS团队于2013年6月发起的开源项目它的目标是构建一个高可用的分布式键值key-value数据库。etcd内部采用raft协议作为一致性算法etcd是go语言编写的。 
② etcd的特点 
etcd 作为服务发现系统有以下的特点 简单安装配置简单而且提供了HTTP API进行交互使用也很简单 安全支持SSL证书验证 快速单实例支持每秒2k读操作 可靠采用raft算法实现分布式系统数据的可用性和一致性 
③ etcd端口及部署注意 
etcd 目前默认使用2379端口提供HTTP API服务 2380端口和peer通信(这两个端口已经被IANA(互联网数字分配机构)官方预留给etcd)。 即etcd默认使用2379端口对外为客户端提供通讯使用端口2380来进行服务器间内部通讯。 etcd 在生产环境中一般推荐集群方式部署。由于etcd 的leader选举机制要求至少为3台或以上的奇数台。 
2准备签发证书环境 
本文使用CFSSL工具签发证书 
CFSSL 是 CloudFlare 公司开源的一款 PKI/TLS 工具。 CFSSL 包含一个命令行工具和一个用于签名、验证和捆绑 TLS 证书的 HTTP API 服务。使用Go语言编写。 CFSSL 使用配置文件生成证书因此自签之前需要生成它识别的 json 格式的配置文件CFSSL 提供了方便的命令行生成配置文件。 CFSSL 用来为 etcd 提供 TLS 证书它支持签三种类型的证书 
client 证书服务端连接客户端时携带的证书用于客户端验证服务端身份如 kube-apiserver 访问 etcdpeer 证书相互之间连接时使用的证书如 etcd 节点之间进行验证和通信。 这里全部都使用同一套证书认证。server 证书客户端连接服务端时携带的证书用于服务端验证客户端身份如 etcd 对外提供服务本次实验使用的是server证书。 
3etcd 集群部署 
① 在 master01节点上操作 
#在线直接下载方式
#准备cfssl证书生成工具
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/local/bin/cfssljson
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/local/bin/cfssl-certinfochmod x /usr/local/bin/cfssl*② 本文使用的是的直接上传的安装软件所有需要的资源在博客文章旁边的资源里有K8S的软件包里 
#将cfssl证书签发的工具和命令(cfssl、cfssljson、cfssl-certinfo)上传到/usr/local/bin目录下并添加执行权限
#cfssl证书签发的工具命令
#cfssljson将 cfssl 生成的证书json格式变为文件承载式证书
#cfssl-certinfo验证证书的信息
#cfssl-certinfo -cert 证书名称			#查看证书的信息cd /usr/local/bin
chmod x /usr/local/bin/cfssl*#生成Etcd证书
mkdir /opt/k8s
cd /opt/k8s/#上传 etcd-cert.sh 和 etcd.sh 到 /opt/k8s/ 目录中
chmod x etcd-cert.sh etcd.sh
#创建用于生成CA证书、etcd 服务器证书以及私钥的目录
mkdir /opt/k8s/etcd-cert
#移动生成证书的脚本到存放etcd证书的目录下
mv etcd-cert.sh etcd-cert/
#进入创建的目录执行脚本
cd /opt/k8s/etcd-cert/
#此脚本需要修改80到82行的ip地址依次为master01node1node2顺序保存退出
vim  ./etcd-cert.sh
#执行脚本生成CA证书、etcd 服务器证书以及私钥
./etcd-cert.sh
#查看生成的证书是否为4个.pem结尾3个.json结尾
ls  /opt/k8s/etcd-cert#上传 etcd-v3.4.9-linux-amd64.tar.gz 到 /opt/k8s 目录中启动etcd服务
cd /opt/k8s/
tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
#解压上传的etcd包内容为3个.md文件一个目录一个etcd和一个etcdctl启动控制脚本
ls etcd-v3.4.9-linux-amd64
#创建用于存放etcd配置文件命令文件证书的目录
mkdir -p /opt/etcd/{cfg,bin,ssl}
#进入解压的etcd包中
cd /opt/k8s/etcd-v3.4.9-linux-amd64/
#将etcd启动和etcdctl控制脚本移动到创建的用于存放etcd命令文件的bin目录下
mv etcd etcdctl /opt/etcd/bin/
#进入创建etcd证书的目录并将本目录下所有证书全部拷贝一份到创建的用于存放etcd证书的路径ssl上
cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/
#进入存放etcd.sh部署etcd集群的脚本目录执行etcd.sh脚本 后面跟三个etcd集群的ip注意格式进入卡住状态等待其他节点加入这里需要三台etcd服务同时启动如果只启动其中一台后服务会卡在那里直到集群中所有etcd节点都已启动先操作不然不会生成system管理和配置文件重新开启一个shell查看etcd状态
#另一个窗口执行
#查看etcd集群状态是否为自己的三个etcd  ip
ps -ef | grep etcd#把etcd相关证书文件、命令文件和服务管理文件全部拷贝到另外两个etcd集群节点
scp -r /opt/etcd/ root192.168.174.18:/opt/
scp -r /opt/etcd/ root192.168.174.19:/opt/
scp /usr/lib/systemd/system/etcd.service root192.168.174.18:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service root192.168.174.19:/usr/lib/systemd/system/② 在 node01 节点上操作 
#在 node01 节点上操作
#修改scp过来的etcd配置文件
vim /opt/etcd/cfg/etcd
#[Member]
ETCD_NAMEetcd02											#修改为etcd02
ETCD_DATA_DIR/var/lib/etcd/default.etcd
ETCD_LISTEN_PEER_URLShttps://192.168.174.18:2380			#修改为node1的ip地址
ETCD_LISTEN_CLIENT_URLShttps://192.168.174.18:2379		#修改为node1的ip地址#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLShttps://192.168.174.18:2380		#修改为node1的ip地址
ETCD_ADVERTISE_CLIENT_URLShttps://192.168.174.18:2379			#修改为node1的ip地址
ETCD_INITIAL_CLUSTERetcd01https://192.168.174.12:2380,etcd02https://192.168.174.18:2380,etcd03https://192.168.174.19:2380
ETCD_INITIAL_CLUSTER_TOKENetcd-cluster
ETCD_INITIAL_CLUSTER_STATEnewsystemctl start etcd
systemctl enable etcd
systemctl status etcd③ 在 node02 节点上操作 
#在 node02 节点上操作
vim /opt/etcd/cfg/etcd
#[Member]
ETCD_NAMEetcd03											#修改
ETCD_DATA_DIR/var/lib/etcd/default.etcd
ETCD_LISTEN_PEER_URLShttps://192.168.174.19:2380			#修改为node2的ip地址
ETCD_LISTEN_CLIENT_URLShttps://192.168.198.13:2379		#修改为node2的ip地址#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLShttps://192.168.174.19:2380		#修改为node2的ip地址
ETCD_ADVERTISE_CLIENT_URLShttps://192.168.174.19:2379		    #修改为node2的ip地址
ETCD_INITIAL_CLUSTERetcd01https://192.168.174.12:2380,etcd02https://192.168.174.18:2380,etcd03https://192.168.174.19:2380
ETCD_INITIAL_CLUSTER_TOKENetcd-cluster
ETCD_INITIAL_CLUSTER_STATEnewsystemctl start etcd
systemctl enable etcd
systemctl status etcdmaster节点执行 
#master节点执行
cd /opt/k8s/
./etcd.sh etcd01 192.168.174.12 etcd02https://192.168.174.18:2380,etcd03https://192.168.174.19:2380node1 node2执行 
#node1 node2执行
systemctl enable --now etcd
#设置开机启动并立即启动etcd然后回到master上查看是否成功。不是一直前台运行状态即成功master执行 
#master执行
#检查etcd群集状态
#检查集群监控状态health全部未true即可
ETCDCTL_API3 /opt/etcd/bin/etcdctl --cacert/opt/etcd/ssl/ca.pem --cert/opt/etcd/ssl/server.pem --key/opt/etcd/ssl/server-key.pem --endpointshttps://192.168.174.12:2379,https://192.168.174.18:2379,https://192.168.174.19:2379 endpoint health --write-outtable#查看etcd集群成员列表
ETCDCTL_API3 /opt/etcd/bin/etcdctl --cacert/opt/etcd/ssl/ca.pem --cert/opt/etcd/ssl/server.pem --key/opt/etcd/ssl/server-key.pem --endpointshttps://192.168.174.12:2379,https://192.168.174.18:2379,https://192.168.174.19:2379 --write-outtable member list4.部署 Master 组件 
在 master01 节点上操作 
#在 master01 节点上操作
#上传 master.zip 和 k8s-cert.sh 到 /opt/k8s 目录中解压 master.zip 压缩包
cd /opt/k8s/
#解压master组件包里面有master的4个组件脚本添加权限
unzip master.zip
chmod x *.sh
#创建kubernetes工作目录
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
#创建用于生成CA证书、相关组件的证书和私钥的目录
mkdir /opt/k8s/k8s-cert
#将k8s证书移动到创建的k8s的证书存放路径
mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert
cd /opt/k8s/k8s-cert/
#修改脚本中的56-60行顺序是第一个为master1、第二个为master2此为master单节点可以删除、第三个为master虚拟ip、第四load balancer01master第五为load balancer01backup。第四第五可以删除。单节点master不用若后面需要做集群需要提前规划好ip第一个地址为master地址192.168.174.12第二个地址为VTP虚拟地址配置文件里的文字部分需删除
chmod x k8s-cert.sh
vim /opt/k8s/k8s-cert/k8s-cert.sh
#生成CA证书、相关组件的证书和私钥
./k8s-cert.sh
#显示生成的证书等一共8个.pem结尾
ls *pem#将ca证书和apiserver证书拷贝到创建的存放证书的ssl/目录下
cp ca*pem apiserver*pem /opt/kubernetes/ssl/
#上传 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目录中解压 kubernetes 压缩包
cd /opt/k8s/
#上传 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目录中解压 kubernetes 压缩包
tar zxvf kubernetes-server-linux-amd64.tar.gz
#进入解压后的k8s的bin目录中将4个组件拷贝到创建的k8s存放bin文件的路径下
cd /opt/k8s/kubernetes/server/bin
cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
ln -s /opt/kubernetes/bin/* /usr/local/bin/#本地创建 bootstrap token 认证文件apiserver 启动时会调用然后就相当于在集群内创建了一个这个用户接下来就可以用 RBAC 给他授权
cd /opt/k8s/
vim token.sh#!/bin/bash
#获取随机数前16个字节内容以十六进制格式输出并删除其中空格
BOOTSTRAP_TOKEN$(head -c 16 /dev/urandom | od -An -t x | tr -d  )
#生成 token.csv 文件按照 Token序列号,用户名,UID,用户组 的格式生成
cat  /opt/kubernetes/cfg/token.csv EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,system:kubelet-bootstrap
EOF#保存后退出chmod x token.sh
./token.sh#创建 bootstrap token 认证文件apiserver 启动时会调用然后就相当于在集群内创建了一个这个用户接下来就可以用 RBAC 给他授权查看是否生成了csv文件
cat /opt/kubernetes/cfg/token.csv#二进制文件、token、证书都准备好后开启 apiserver 服务将apiserver.sh脚本导入到目录下
cd /opt/k8s/
./apiserver.sh 192.168.174.12 https://192.168.174.12:2379,https://192.168.174.18:2379,https://192.168.174.19:2379
#检查进程是否启动成功过滤kube-apiserver最上面一个后面会有-etcd-servershttps://192.168.174.12:2379,https://192.168.174.18:2379,https://192.168.174.19:2379 --bind-address192.168.174.12 --secure-port6443此信息为正常注意ip要改为自己的ip地址
https://blog.csdn.net/weixin_67287151/article/details/130562192ps aux | grep kube-apiserver#安全端口6443用于接收HTTPS请求用于基于Token文件或客户端证书等认证
#过滤端口只有监控本机ip的6443为正常
netstat -natp | grep 6443 #启动 scheduler 服务
cd /opt/k8s/
#修改脚本中的ip第47行KUBE_APISERVERhttps://192.168.174.12:6443为自己的apiserver的ip地址本文是master地址保存退出
vim  scheduler.sh
#运行shceduler组件脚本查看服务是否正常
./scheduler.sh
ps aux | grep kube-scheduler#修改第58行的ipKUBE_APISERVERhttps://192.168.174.12:6443为自己的apiserver的ip地址本文是master地址
vim controller-manager.sh
#启动 controller-manager 服务
./controller-manager.sh
#运行controller-manager.sh组件脚本查看服务是否正常
ps aux | grep kube-controller-manager#修改第4行的ip地址KUBE_APISERVERhttps://192.168.174.12:6443为自己的apiserver的ip地址本文是master地址
vim ./admin.sh
#生成kubectl连接集群的证书
./admin.sh
#创建集群以及用户
kubectl create clusterrolebinding cluster-system-anonymous --clusterrolecluster-admin --usersystem:anonymous
#通过kubectl工具查看当前集群组件状态
kubectl get cs#查看版本信息
kubectl version5.部署 Worker Node 组件 
在所有 node 节点上操作 
#在所有 node 节点上操作
#创建kubernetes工作目录
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}#上传 node.zip 到 /opt 目录中解压 node.zip 压缩包获得kubelet.sh、proxy.sh
cd /opt/
unzip node.zip
chmod x kubelet.sh proxy.sh在 master01 节点上操作 
#在 master01 节点上操作
#把 kubelet、kube-proxy 拷贝到 node 节点
cd /opt/k8s/kubernetes/server/bin
scp kubelet kube-proxy root192.168.174.18:/opt/kubernetes/bin/
scp kubelet kube-proxy root192.168.174.19:/opt/kubernetes/bin/#上传 kubeconfig.sh 文件到 /opt/k8s/kubeconfig 目录中生成 kubeconfig 的配置文件
mkdir /opt/k8s/kubeconfig
cd /opt/k8s/kubeconfig
chmod x kubeconfig.sh
./kubeconfig.sh 192.168.174.12 /opt/k8s/k8s-cert/
#把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 2个授权文件拷贝到 node 节点
scp bootstrap.kubeconfig kube-proxy.kubeconfig root192.168.174.18:/opt/kubernetes/cfg/
scp bootstrap.kubeconfig kube-proxy.kubeconfig root192.168.174.19:/opt/kubernetes/cfg/
#RBAC授权使用户 kubelet-bootstrap 能够有权限发起 CSR 请求
kubectl create clusterrolebinding kubelet-bootstrap --clusterrolesystem:node-bootstrapper --userkubelet-bootstrap在 node01 节点上操作 
#在 node01 节点上操作
#启动 kubelet 服务
cd /opt/
#此处是本机node01地址
./kubelet.sh 192.168.174.18
ps aux | grep kubelet在 master01 节点上操作 
#在 master01 节点上操作通过 CSR 请求
#检查到 node01 节点的 kubelet 发起的 CSR 请求Pending 表示等待集群给该节点签发证书
kubectl get csr
NAME                                                   AGE   SIGNERNAME                                    REQUESTOR           CONDITION
node-csr-P22F6DfVnVdvdqPz9SXBqS8lVyhyP7yuKET3GB_ehds   40s   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Pending#通过 CSR 请求,注意此处是前面node的节点签发证书kubectl certificate approve
kubectl certificate approve node-csr-P22F6DfVnVdvdqPz9SXBqS8lVyhyP7yuKET3GB_ehds
#Approved,Issued 表示已授权 CSR 请求并签发证书
kubectl get csr#查看节点由于网络插件还没有部署节点会没有准备就绪 NotReady
kubectl get node在 node01 节点上操作 
#在 node01 节点上操作
#加载 ip_vs 模块
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o ^[^.]*);do echo $i; /sbin/modinfo -F filename $i /dev/null 21  /sbin/modprobe $i;done
#启动proxy服务
cd /opt/
./proxy.sh 192.168.174.18
ps aux | grep kube-proxy6.部署网络组件 
1K8S 中 Pod 网络介绍 
① K8S 中 Pod 网络通信 
Pod 内容器与容器之间的通信 在同一个 Pod 内的容器Pod 内的容器是不会跨宿主机的共享同一个网络命名空间相当于它们在同一台机器上一样可以用 localhost 地址访问彼此的端口。同一个 Node 内 Pod 之间的通信 每个 Pod 都有一个真实的全局 IP 地址同一个 Node 内的不同 Pod 之间可以直接采用对方 Pod 的 IP 地址进行通信Pod1 与 Pod2 都是通过 Veth 连接到同一个 docker0/cni0 网桥网段相同所以它们之间可以直接通信。不同 Node 上 Pod 之间的通信 Pod 地址与 docker0 在同一网段docker0 网段与宿主机网卡是两个不同的网段且不同 Node 之间的通信只能通过宿主机的物理网卡进行。要想实现不同 Node 上 Pod 之间的通信就必须想办法通过主机的物理网卡 IP 地址进行寻址和通信。因此要满足两个条件Pod 的 IP 不能冲突将 Pod 的 IP 和所在的 Node 的 IP 关联起来通过这个关联让不同 Node 上 Pod 之间直接通过内网 IP 地址通信。 
② Overlay Network 
叠加网络在二层或者三层基础网络上叠加的一种虚拟网络技术模式该网络中的主机通过虚拟链路隧道连接起来。 通过Overlay技术可以理解成隧道技术在原始报文外再包一层四层协议UDP协议通过主机网络进行路由转发。这种方式性能有一定损耗主要体现在对原始报文的修改。目前Overlay主要采用VXLAN。 
③ VXLAN 
将源数据包封装到UDP中并使用基础网络的IP/MAC作为外层报文头进行封装然后在以太网上传输到达目的地后由隧道端点解封装并将数据发送给目标地址。 
④ Flannel: 
Flannel 的功能是让集群中的不同节点主机创建的 Docker 容器都具有全集群唯一的虚拟 IP 地址。 Flannel 是 Overlay 网络的一种也是将 TCP 源数据包封装在另一种网络包里面进行路由转发和通信目前支持 UDP、VXLAN、Host-gw 3种数据转发方式。 
⑤ Flannel UDP 模式的工作原理 
node跨节点通信 数据从主机 A 上 Pod 的源容器中发出后经由所在主机的 docker0/cni0 网络接口转发到 flannel0 接口flanneld 服务监听在 flannel0 虚拟网卡的另外一端。 Flannel 通过 Etcd 服务维护了一张节点间的路由表。源主机 A 的 flanneld 服务将原本的数据内容封装到 UDP 报文中 根据自己的路由表通过物理网卡投递给目的节点主机 B 的 flanneld 服务数据到达以后被解包然后直接进入目的节点的 flannel0 接口 之后被转发到目的主机的 docker0/cni0 网桥最后就像本机容器通信一样由 docker0/cni0 转发到目标容器。 
⑥ ETCD 之 Flannel 提供说明: 
存储管理Flannel可分配的IP地址段资源 监控 ETCD 中每个 Pod 的实际地址并在内存中建立维护 Pod 节点路由表 
由于 UDP 模式是在用户态做转发会多一次报文隧道封装因此性能上会比在内核态做转发的 VXLAN 模式差。  
⑦ VXLAN 模式 
VXLAN 模式使用比较简单flannel 会在各节点生成一个 flannel.1 的 VXLAN 网卡VTEP设备负责 VXLAN 封装和解封装。 VXLAN 模式下封包与解包的工作是由内核进行的。flannel 不转发数据仅动态设置 ARP 表和 MAC 表项。 UDP 模式的 flannel0 网卡是三层转发使用 flannel0 时在物理网络之上构建三层网络属于 ip in udp VXLAN 模式是二层实现overlay 是数据帧属于 mac in udp 。 vxlan隧道方案默认配置利用内核级别的vxlan的封装host之间的传送包——好用 ⑧ Flannel VXLAN 模式跨主机的工作原理 
数据帧从主机 A 上 Pod 的源容器中发出后经由所在主机的 docker0/cni0 网络接口转发到 flannel.1 接口flannel.1 收到数据帧后添加 VXLAN 头部封装在 UDP 报文中主机 A 通过物理网卡发送封包到主机 B 的物理网卡中主机 B 的物理网卡再通过 VXLAN 默认端口 4789 转发到 flannel.1 接口进行解封装解封装以后内核将数据帧发送到 cni0最后由 cni0 发送到桥接到此接口的容器 B 中。 
⑨ Kubernetes的三种网络介绍 总flannel三种网络模式 vxlan隧道方案: 默认配置三层利用内核级别的vxlan的封装host之间的传送包 好用基于udp host-gw路由网关 : 二层网络配置 不支持 云环境 通过在hst路由表中直接创建到其他主机subnet的路由条目 udp在用户态实现的数据封装和解封装 2部署 flannel 
在 node01 节点上操作 
#在 node01 节点上操作
#上传 cni-plugins-linux-amd64-v0.8.6.tgz 和 flannel.tar 到 /opt 目录中
cd /opt/
docker load -i flannel.tar
mkdir /opt/cni/bin -p
tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin在 node02 节点上操作 
#在 node02 节点上操作
#上传 cni-plugins-linux-amd64-v0.8.6.tgz 和 flannel.tar 到 /opt 目录中
cd /opt/
docker load -i flannel.tar
mkdir /opt/cni/bin -p
tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin在 master01 节点上操作 
#在 master01 节点上操作
#上传 kube-flannel.yml 文件到 /opt/k8s 目录中部署 CNI 网络
cd /opt/k8s
#加载上传的flannel的yml文件部署 CNI 网络
kubectl apply -f kube-flannel.yml 
#用于在Kubernetes集群中获取kube-system命名空间中所有Pod的状态信息
kubectl get pods -n kube-system#查看节点状态为ready正常
kubectl get nodes3node02 节点部署 
在 node01 节点上操作 
#在 node01 节点上操作
cd /opt/
scp kubelet.sh proxy.sh root192.168.174.19:/opt/
scp kubelet.sh proxy.sh root192.168.174.12:/opt/
scp -r /opt/cni root192.168.174.19:/opt/在 node02 节点上操作 
#在 node02 节点上操作
#启动kubelet服务
cd /opt/
chmod x kubelet.sh
./kubelet.sh 192.168.174.19
ps aux | grep kubelet在 master01 节点上操作 
#在 master01 节点上操作
kubectl get csr
NAME                                                   AGE     SIGNERNAME                                    REQUESTOR           CONDITION
node-csr-bwHsD2ZMrd296LxkZuCgBGd9vLoztJe0-QRyiL6y5LE   27s     kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Pending
node-csr-y-ulRpkb-7uzhed0CD5CnGpBcEYzXbxdeNOsIMrUvBc   9m54s   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Approved,Issued#通过 CSR 请求注意kubectl certificate approve后面跟的是前面查询的节点
kubectl certificate approve node-csr-bwHsD2ZMrd296LxkZuCgBGd9vLoztJe0-QRyiL6y5LE#查看
kubectl get csr
NAME                                                   AGE   SIGNERNAME                                    REQUESTOR           CONDITION
node-csr-bwHsD2ZMrd296LxkZuCgBGd9vLoztJe0-QRyiL6y5LE   87s   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Approved,Issued
node-csr-y-ulRpkb-7uzhed0CD5CnGpBcEYzXbxdeNOsIMrUvBc   10m   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Approved,Issued#加载 ipvs 模块
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o ^[^.]*);do echo $i; /sbin/modinfo -F filename $i /dev/null 21  /sbin/modprobe $i;done#使用proxy.sh脚本启动proxy服务
cd /opt/
chmod x proxy.sh
./proxy.sh 192.168.174.19#查看群集中的节点状态
kubectl get nodes4部署 CoreDNS 
在所有 node 节点上操作 
#在所有 node 节点上操作
#上传 coredns.tar 到 /opt 目录中
cd /opt
docker load -i coredns.tar在 master01 节点上操作 
#在 master01 节点上操作
#上传 coredns.yaml 文件到 /opt/k8s 目录中部署 CoreDNS 
cd /opt/k8s
kubectl apply -f coredns.yamlkubectl get pods -n kube-system 
NAME                       READY   STATUS    RESTARTS   AGE
coredns-6954c77b9b-pwp7k   0/1     Running   0          9s
kube-flannel-ds-nkntv      0/1     Error     5          3m6s
kube-flannel-ds-xdd9n      1/1     Running   0          9m48s#DNS 解析测试
kubectl run -it --rm dns-test --imagebusybox:1.28.4 sh
If you dont see a command prompt, try pressing enter.
/ # nslookup kubernetes
Server:    10.0.0.2
Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.localName:      kubernetes
Address 1: 10.0.0.1 kubernetes.default.svc.cluster.local5master02 节点部署 
//从 master01 节点上拷贝证书文件、各master组件的配置文件和服务管理文件到 master02 节点
scp -r /opt/etcd/ root192.168.174.15:/opt/
scp -r /opt/kubernetes/ root192.168.174.15:/opt
scp -r /root/.kube root192.168.174.15:/root
scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root192.168.174.15:/usr/lib/systemd/system///修改配置文件kube-apiserver中的IP
vim /opt/kubernetes/cfg/kube-apiserver
KUBE_APISERVER_OPTS--logtostderrtrue \
--v4 \
--etcd-servershttps://192.168.174.12:2379,https://192.168.174.18:2379,https://192.168.174.19:2379 \
--bind-address192.168.174.15 \				#修改
--secure-port6443 \
--advertise-address192.168.174.15 \			#修改
......//在 master02 节点上启动各服务并设置开机自启
systemctl start kube-apiserver.service
systemctl enable kube-apiserver.service
systemctl start kube-controller-manager.service
systemctl enable kube-controller-manager.service
systemctl start kube-scheduler.service
systemctl enable kube-scheduler.service//查看node节点状态
ln -s /opt/kubernetes/bin/* /usr/local/bin/
kubectl get nodes
kubectl get nodes -o wide			#-owide输出额外信息对于Pod将输出Pod所在的Node名
//此时在master02节点查到的node节点状态仅是从etcd查询到的信息而此时node节点实际上并未与master02节点建立通信连接因此需要使用一个VIP把node节点与master节点都关联起来三、负载均衡部署 
1.配置load balancer集群双机热备负载均衡nginx实现负载均衡keepalived实现双机热备 
在lb01、lb02节点上操作可在node1,2上做 
配置nginx的官方在线yum源配置本地nginx的yum源
cat  /etc/yum.repos.d/nginx.repo  EOF
[nginx]
namenginx repo
baseurlhttp://nginx.org/packages/centos/7/$basearch/
gpgcheck0
EOF
yum install nginx -y2.修改nginx配置文件配置四层反向代理负载均衡指定k8s群集2台master的节点ip和6443端口 
vim /etc/nginx/nginx.conf
events {worker_connections  1024;
}#添加
stream {log_format  main  $remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent;access_log  /var/log/nginx/k8s-access.log  main;upstream k8s-apiserver {server 192.168.174.12:6443;server 192.168.174.15:6443;}server {listen 6443;proxy_pass k8s-apiserver;}
}http {
......3.检查配置文件语法 
nginx -t   
//启动nginx服务查看已监听6443端口
systemctl start nginx
systemctl enable nginx
netstat -natp | grep nginx 4.部署keepalived服务 
yum install keepalived -y//修改keepalived配置文件
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {# 接收邮件地址notification_email {acassenfirewall.locfailoverfirewall.locsysadminfirewall.loc}# 邮件发送地址notification_email_from Alexandre.Cassenfirewall.locsmtp_server 127.0.0.1smtp_connect_timeout 30router_id NGINX_MASTER	#lb01节点的为 NGINX_MASTERlb02节点的为 NGINX_BACKUP
}#添加一个周期性执行的脚本
vrrp_script check_nginx {script /etc/nginx/check_nginx.sh	#指定检查nginx存活的脚本路径
}vrrp_instance VI_1 {state MASTER			#lb01节点的为 MASTERlb02节点的为 BACKUPinterface ens33			#指定网卡名称 ens33virtual_router_id 51	#指定vrid两个节点要一致priority 100			#lb01节点的为 100lb02节点的为 90advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.174.100/24	#指定 VIP}track_script {check_nginx			#指定vrrp_script配置的脚本}
}5.创建nginx状态检查脚本 
vim /etc/nginx/check_nginx.sh
#!/bin/bash
#egrep -cv grep|$$ 用于过滤掉包含grep 或者 $$ 表示的当前Shell进程ID即脚本运行的当前进程ID号
count$(ps -ef | grep nginx | egrep -cv grep|$$)if [ $count -eq 0 ];thensystemctl stop keepalived
fichmod x /etc/nginx/check_nginx.sh6.启动keepalived服务一定要先启动了nginx服务再启动keepalived服务 
systemctl start keepalived
systemctl enable keepalived
ip a				#查看VIP是否生成7.修改node节点上的bootstrap.kubeconfig,kubelet.kubeconfig配置文件为VIP 
cd /opt/kubernetes/cfg/
vim bootstrap.kubeconfig 
server: https://192.168.174.100:6443vim kubelet.kubeconfig
server: https://192.168.174.100:6443vim kube-proxy.kubeconfig
server: https://192.168.174.100:64438.重启kubelet和kube-proxy服务 
systemctl restart kubelet.service 
systemctl restart kube-proxy.service9.在 lb01 上查看 nginx 和 node 、 master 节点的连接状态 
netstat -natp | grep nginx四、在 master01 节点上操作 
1.测试创建pod 
kubectl run nginx --imagenginx2.查看Pod的状态信息 
kubectl get pods
NAME       READY   STATUS              RESTARTS   AGE
dns-test   0/1     ContainerCreating   0          26m
nginx      0/1     ContainerCreating   0          28skubectl get pods
NAME       READY   STATUS              RESTARTS   AGE
dns-test   0/1     ContainerCreating   0          26m
nginx      0/1     ContainerCreating   0          61skubectl get pods -o wide
NAME       READY   STATUS              RESTARTS   AGE   IP       NODE             NOMINATED NODE   READINESS GATES
dns-test   0/1     ContainerCreating   0          27m   none   192.168.174.19   none           none
nginx      0/1     ContainerCreating   0          76s   none   192.168.174.19   none           none//READY为1/1表示这个Pod中有1个容器3.在对应网段的node节点上操作可以直接使用浏览器或者curl命令访问 
curl 172.17.36.24.这时在master01节点上查看nginx日志 
kubectl logs nginx-dbddb74b8-nf9sk五、部署 Dashboard 
1.Dashboard 介绍 
仪表板是基于Web的Kubernetes用户界面。您可以使用仪表板将容器化应用程序部署到Kubernetes集群对容器化应用程序进行故障排除并管理集群本身及其伴随资源。您可以使用仪表板来概述群集上运行的应用程序以及创建或修改单个Kubernetes资源例如deploymentjobdaemonset等。例如您可以使用部署向导扩展部署启动滚动更新重新启动Pod或部署新应用程序。仪表板还提供有关群集中Kubernetes资源状态以及可能发生的任何错误的信息。 
2.在 master01 节点上操作 
1上传 recommended.yaml 文件到 /opt/k8s 目录中 
cd /opt/k8s
vim recommended.yaml
#默认Dashboard只能集群内部访问修改Service为NodePort类型暴露到外部
kind: Service
apiVersion: v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
spec:ports:- port: 443targetPort: 8443nodePort: 30001     #添加type: NodePort          #添加selector:k8s-app: kubernetes-dashboardkubectl apply -f recommended.yaml2.创建service account并绑定默认cluster-admin管理员集群角色 
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrolecluster-admin --serviceaccountkube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk /dashboard-admin/{print $1})3.使用输出的token登录Dashboard 
仪表板来概述群集上运行的应用程序以及创建或修改单个Kubernetes资源例如deploymentjobdaemonset等。例如您可以使用部署向导扩展部署启动滚动更新重新启动Pod或部署新应用程序。仪表板还提供有关群集中Kubernetes资源状态以及可能发生的任何错误的信息。 
2.在 master01 节点上操作 
1上传 recommended.yaml 文件到 /opt/k8s 目录中 
cd /opt/k8s
vim recommended.yaml
#默认Dashboard只能集群内部访问修改Service为NodePort类型暴露到外部
kind: Service
apiVersion: v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
spec:ports:- port: 443targetPort: 8443nodePort: 30001     #添加type: NodePort          #添加selector:k8s-app: kubernetes-dashboardkubectl apply -f recommended.yaml2.创建service account并绑定默认cluster-admin管理员集群角色 
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrolecluster-admin --serviceaccountkube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk /dashboard-admin/{print $1})3.使用输出的token登录Dashboard 
https://NodeIP:30001 文章转载自: http://www.morning.wngpq.cn.gov.cn.wngpq.cn http://www.morning.brps.cn.gov.cn.brps.cn http://www.morning.plchy.cn.gov.cn.plchy.cn http://www.morning.rbkgp.cn.gov.cn.rbkgp.cn http://www.morning.pzcqz.cn.gov.cn.pzcqz.cn http://www.morning.zsyqg.cn.gov.cn.zsyqg.cn http://www.morning.lcdtb.cn.gov.cn.lcdtb.cn http://www.morning.wnjrf.cn.gov.cn.wnjrf.cn http://www.morning.lkkkf.cn.gov.cn.lkkkf.cn http://www.morning.qsmmq.cn.gov.cn.qsmmq.cn http://www.morning.txjrc.cn.gov.cn.txjrc.cn http://www.morning.rhsr.cn.gov.cn.rhsr.cn http://www.morning.bksbx.cn.gov.cn.bksbx.cn http://www.morning.frcxx.cn.gov.cn.frcxx.cn http://www.morning.kzhgy.cn.gov.cn.kzhgy.cn http://www.morning.kpgft.cn.gov.cn.kpgft.cn http://www.morning.mflhr.cn.gov.cn.mflhr.cn http://www.morning.gltmz.cn.gov.cn.gltmz.cn http://www.morning.jmdpp.cn.gov.cn.jmdpp.cn http://www.morning.kxwsn.cn.gov.cn.kxwsn.cn http://www.morning.trzmb.cn.gov.cn.trzmb.cn http://www.morning.cqyhdy.cn.gov.cn.cqyhdy.cn http://www.morning.rpkg.cn.gov.cn.rpkg.cn http://www.morning.nnwpz.cn.gov.cn.nnwpz.cn http://www.morning.hptbp.cn.gov.cn.hptbp.cn http://www.morning.kgphc.cn.gov.cn.kgphc.cn http://www.morning.qgmbx.cn.gov.cn.qgmbx.cn http://www.morning.fpjw.cn.gov.cn.fpjw.cn http://www.morning.rymd.cn.gov.cn.rymd.cn http://www.morning.chmcq.cn.gov.cn.chmcq.cn http://www.morning.zjrnq.cn.gov.cn.zjrnq.cn http://www.morning.qggcc.cn.gov.cn.qggcc.cn http://www.morning.qhkx.cn.gov.cn.qhkx.cn http://www.morning.zkgpg.cn.gov.cn.zkgpg.cn http://www.morning.ysmw.cn.gov.cn.ysmw.cn http://www.morning.dbnrl.cn.gov.cn.dbnrl.cn http://www.morning.kggxj.cn.gov.cn.kggxj.cn http://www.morning.zwznz.cn.gov.cn.zwznz.cn http://www.morning.ssxlt.cn.gov.cn.ssxlt.cn http://www.morning.iknty.cn.gov.cn.iknty.cn http://www.morning.rqjfm.cn.gov.cn.rqjfm.cn http://www.morning.ljzgf.cn.gov.cn.ljzgf.cn http://www.morning.ykmkz.cn.gov.cn.ykmkz.cn http://www.morning.zxhpx.cn.gov.cn.zxhpx.cn http://www.morning.ffbp.cn.gov.cn.ffbp.cn http://www.morning.bccls.cn.gov.cn.bccls.cn http://www.morning.yhxhq.cn.gov.cn.yhxhq.cn http://www.morning.dpqqg.cn.gov.cn.dpqqg.cn http://www.morning.rrgqq.cn.gov.cn.rrgqq.cn http://www.morning.wwklf.cn.gov.cn.wwklf.cn http://www.morning.ldfcb.cn.gov.cn.ldfcb.cn http://www.morning.rfxg.cn.gov.cn.rfxg.cn http://www.morning.mygbt.cn.gov.cn.mygbt.cn http://www.morning.yjprj.cn.gov.cn.yjprj.cn http://www.morning.coffeedelsol.com.gov.cn.coffeedelsol.com http://www.morning.jcypk.cn.gov.cn.jcypk.cn http://www.morning.wztlr.cn.gov.cn.wztlr.cn http://www.morning.nyplp.cn.gov.cn.nyplp.cn http://www.morning.sjli222.cn.gov.cn.sjli222.cn http://www.morning.pzbqm.cn.gov.cn.pzbqm.cn http://www.morning.rbtny.cn.gov.cn.rbtny.cn http://www.morning.qpntn.cn.gov.cn.qpntn.cn http://www.morning.ktfnj.cn.gov.cn.ktfnj.cn http://www.morning.qjbxt.cn.gov.cn.qjbxt.cn http://www.morning.plydc.cn.gov.cn.plydc.cn http://www.morning.mpmtz.cn.gov.cn.mpmtz.cn http://www.morning.lbgsh.cn.gov.cn.lbgsh.cn http://www.morning.lgnbr.cn.gov.cn.lgnbr.cn http://www.morning.wgqtt.cn.gov.cn.wgqtt.cn http://www.morning.nxpqw.cn.gov.cn.nxpqw.cn http://www.morning.jnvivi.com.gov.cn.jnvivi.com http://www.morning.npmcf.cn.gov.cn.npmcf.cn http://www.morning.srgsb.cn.gov.cn.srgsb.cn http://www.morning.zbpqq.cn.gov.cn.zbpqq.cn http://www.morning.rmfh.cn.gov.cn.rmfh.cn http://www.morning.ndyrb.com.gov.cn.ndyrb.com http://www.morning.nzms.cn.gov.cn.nzms.cn http://www.morning.yrnll.cn.gov.cn.yrnll.cn http://www.morning.wjyyg.cn.gov.cn.wjyyg.cn http://www.morning.xblrq.cn.gov.cn.xblrq.cn