K8s:二进制安装k8s(单台master)

目录

一、安装k8s

1、拓扑图

2、系统初始化配置

2.1关闭防火墙selinx以及swap

2.2设置主机名

2.3在每台主机中添加hosts,做映射

2.4调整内核参数,将桥接的ipv4流量传递到iptables,关闭ipv6

2.4时间同步

3、部署docker引擎(两个node节点执行)

4、部署etcd集群

4.1在master01节点操作

4.2生成etcd证书,上传etcd-cert.sh 和 etcd.sh 到 /opt/k8s/ 目录中

4.3创建用于生成CA证书,etcd服务器证书以及私钥的目录

4.4上传 etcd-v3.4.9-linux-amd64.tar.gz 到 /opt/k8s 目录中,启动etcd服务

4.5创建用于存放etcd配置文件,命令文件,证书的目录

4.6把etcd相关证书文件、命令文件和服务管理文件全部拷贝到另外两个etcd集群节点

4.7在node1节点操作(node2同样)

4.8启动etcd,并检查etcd集群状态

5、master部署组件

6、部署worker node组件

6.1在所有 node 节点上操作创建kubernetes工作目录

6.2上传 node.zip 到 /opt 目录中,解压 node.zip 压缩包,获得kubelet.sh、prox

6.3在master01节点上操作把 kubelet、kube-proxy 拷贝到 node 节点

6.4上传kubeconfig.sh文件到/opt/k8s/kubeconfig目录中,生成kubelet初次加入集群引导kubeconfig文件和kube-proxy.kubeconfig文件#kubeconfig 文件包含集群参数(CA 证书、API Server 地址),客户端参数(上面生成的证书和私钥),集群 context 上下文参数(集群名称、用户名)。Kubenetes 组件(如 kubelet、kube-proxy)通过启动时指定不同的 kubeconfig 文件可以切换到不同的集群,连接到 apiserver。

6.5把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷贝到 node 节点

6.6RBAC授权,使用户 kubelet-bootstrap 能够有权限发起 CSR 请求证书

7、在node01节点上操作

7.1启动kubelet

7.2在 master01 节点上操作,通过 CSR 请求检查到 node01 节点的 kubelet 发起的 CSR 请求,Pending 表示等待集群给该节点签发证书

7.3通过 CSR 请求

7.4查看节点,由于网络插件还没有部署,节点会没有准备就绪 NotReady

7.5在 node01 节点上操作加载 ip_vs 模块 启动proxy服务

8、CNI网络组件

8.1K8s中Pod网络通信:

8.11Pod内容器与容器之间的通信:

8.12同一个node内的pod之间的通信:

8.13不同node上pod之间的通信

8.2Overlay Network:

8.3Vxlan:

8.4Fannel 

8.5Flannel UDP 模式的工作原理:

8.6ETCD 之 Flannel 提供说明:

8.7、VXLAN 模式:

8.8Flannel VXLAN 模式跨主机的工作原理:

9、部署CNI网络组件

9.1在 node01 节点上操作

9.1.1上传 cni-plugins-linux-amd64-v0.8.6.tgz 和 flannel.tar 到 /opt 目录中

9.2在master01节点上操作

10Calico

10.1flannel方案:

10.2 calico方案

10.3calico主要的三个部分

10.4calico工作原理

11.部署calico(部署calico之前先还原到签发成功证书之后)

11.1在master节点上操作

11.2在node2节点部署步骤同node01一样

12、部署CoreDNS

12.1在所有node节点上操作

12.2在master01节点上操作

13、master02节点部署

13.1先开启master02然后修改master02的配置信息

13.2从 master01 节点上拷贝证书文件、各master组件的配置文件和服务管理文件到 master02 节点

13.3修改配置文件kube-apiserver中的IP

13.4在master02节点上启动服务并设置开机自启

13.5查看node节点状态

14、负载均衡部署

14.1在nginx0102上执行配置nginx的官方在线yum源,配置本地nginx的yum源

14.2修改nginx配置文件,配置四层反向代理负载均衡,指定k8s群集2台master的节点ip和6443端口

14.3启动nginx服务,查看已监听的6443端口

14.4部署keeplived服务

14.5修改keepalived配置文件

14.6创建nginx状态检查脚本

14.7启动keepalived(先启动nginx再启动keepalived)

14.8修改node节点上的bootstrap.kubeconfig,kubelet.kubeconfig配置文件为VIP

14.9在nginx01上查看nginx和node,master节点的连接状态

14.10在master节点上操作

15、部署Dashboard

15.1Dashboard介绍

15.2在master01节点上操作

15.3创建service account并绑定默认cluster-admin管理员集群角色

15.4在node1node2中要先准备好dashboard.tar跟metrics-scraper.tar

15.5使用输出的token登录dashboard

二、总结

1、控制器五大类

2、k8s二进制安装步骤过程

①etcd安装步骤

3、master组件

3.1先安装apiserver

3.2再启动controller-manager和scheduler

3.3检查集群组件状态

4、kubernetes的三种网络

5、vxlan与vlan的区别:

6、相比vlan技术vxlan技术优势:

7、Flannle UDP模式

8、Flannle Vxlan模式

9、CNI网络插件

9.1flannle

10、calico

11、多master集群架构的部署过程


一、安装k8s

1、拓扑图

2、系统初始化配置

#所有节点执行
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
#永久关闭firewalld并清空iptables所有表规则
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab 
#永久关闭selinux和swap分区
#三个节点分开执行
hostnamectl set-hostname master01
#192.168.170.111的master上执行修改主机名
hostnamectl set-hostname node01
#192.168.170.113的node1上执行修改主机名
hostnamectl set-hostname node02
#192.168.170.114的node2上执行修改主机名
#所有节点执行
bash
#刷新bash使得修改的主机名生效
cat >> /etc/hosts << EOF
192.168.170.111 master01
192.168.170.113 node1
192.168.170.114 node2
EOF
#使用多行重定向将主机名对应的ip写到hosts里面加快访问速度,注意改为自己的ip
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF
#使用多行重定向调整内核参数,前2行为开启网桥模式后2行为关闭ipv6协议和开启路由转发
sysctl --system
#加载内核使得配置内核参数生效
yum install ntpdate -y
ntpdate time.windows.com
#安装ntpdate时间同步程序,并与本机的windows同步时间
2.1关闭防火墙selinx以及swap

2.2设置主机名

2.3在每台主机中添加hosts,做映射

2.4调整内核参数,将桥接的ipv4流量传递到iptables,关闭ipv6

2.4时间同步

3、部署docker引擎(两个node节点执行)

#2个node节点执行
yum install -y yum-utils device-mapper-persistent-data lvm2
#安装依赖包以便在系统上安装docker
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
#添加Docker官方源,并将它设置为docker-ce.repo文件
yum install -y docker-ce docker-ce-cli containerd.io
#yum安装docker-ce和docker客户端以及容器io
systemctl start docker.service
systemctl enable docker.service
#开机自启并现在启动docker

4、部署etcd集群

#master节点操作,#本文的所有需要上传资源在博客资源包中K8S压缩包中均有
cd /usr/local/bin
chmod +x /usr/local/bin/cfssl*
#将cfssl证书签发的工具和命令(cfssl、cfssljson、cfssl-certinfo)上传到/usr/local/bin目录下并添加执行权限
#本文的cfssl工具在博客资源包中K8S压缩包中有
#cfssl:证书签发的工具命令
#cfssljson:将 cfssl 生成的证书(json格式)变为文件承载式证书
#cfssl-certinfo:验证证书的信息
#cfssl-certinfo -cert <证书名称>			#查看证书的信息
mkdir /opt/k8s
cd /opt/k8s/
#上传 etcd-cert.sh(生成证书脚本) 和 etcd.sh(创建etcd集群脚本) 到 /opt/k8s/ 目录中
chmod +x etcd-cert.sh etcd.sh
#添加可执行权限
mkdir /opt/k8s/etcd-cert
#创建etcd-cert目录用于存放etcd的证书
mv etcd-cert.sh /opt/k8s/etcd-cert
#移动生成证书的脚本到存放etcd证书的目录下
vim /opt/k8s/etcd-cert/etcd-cert.sh
#此脚本ip需要修改80到82行master,node1,node2顺序保存退出
vim  ./etcd-cert.sh           
#修改脚本中的ip为自己的ip
./etcd-cert.sh			
#生成CA证书、etcd 服务器证书以及私钥
ls  /opt/k8s/etcd-cert
#查看生成的证书是否为4个.pem结尾3个.json结尾
#上传 etcd-v3.4.9-linux-amd64.tar.gz(etcd程序命令及证书) 到 /opt/k8s 目录中,启动etcd服务
cd /opt/k8s/
tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
ls etcd-v3.4.9-linux-amd64
#解压上传的etcd包,内容为3个.md文件一个目录,一个etcd和一个etcdctl启动控制脚本
mkdir -p /opt/etcd/{cfg,bin,ssl}
#创建用于存放etcd配置文件,命令文件,证书的目录
cd /opt/k8s/etcd-v3.4.9-linux-amd64
#进入解压的etcd包中
mv etcd etcdctl /opt/etcd/bin/
#将etcd启动和etcdctl控制脚本移动到创建的用于存放etcd命令文件的bin目录下
cd  /opt/k8s/etcd-cert
#进入创建etcd证书的目录
cp  ./*.pem   /opt/etcd/ssl
#将本目录下所有证书全部拷贝一份到创建的用于存放etcd证书的路径ssl上
cd /opt/k8s
./etcd.sh etcd01 192.168.170.111 etcd02=https://192.168.170.113:2380,etcd03=https://192.168.170.114:2380
#进入存放etcd.sh部署etcd集群的脚本目录执行etcd.sh脚本 后面跟三个etcd集群的ip注意格式,进入卡住状态等待其他节点加入,这里需要三台etcd服务同时启动,如果只启动其中一台后,服务会卡在那里,直到集群中所有etcd节点都已启动,先操作不然不会生成system管理和配置文件,重新开启一个shell查看etcd状态
#另一个窗口执行
ps -ef | grep etcd
#查看etcd集群状态是否为自己的三个etcd  ip
scp -r /opt/etcd/ root@192.168.170.113:/opt/
scp -r /opt/etcd/ root@192.168.170.114:/opt/
scp /usr/lib/systemd/system/etcd.service root@192.168.170.113:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service root@192.168.170.114:/usr/lib/systemd/system/
#把etcd相关证书文件、命令文件和服务管理文件全部拷贝到另外两个etcd集群节点
#node1节点执行
vim /opt/etcd/cfg/etcd
#修改scp过来的etcd配置文件
#[Member]
ETCD_NAME="etcd02"											#修改为etcd02
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.170.113:2380"			#修改为node1的ip地址
ETCD_LISTEN_CLIENT_URLS="https://192.168.170.113:2379"		#修改为node1的ip地址
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.170.113:2380"		#修改为node1的ip地址
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.170.113:2379"				#修改为node1的ip地址
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.170.111:2380,etcd02=https://192.168.170.113:2380,etcd03=https://192.168.170.114:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
#node2节点执行
vim /opt/etcd/cfg/etcd
#修改scp过来的etcd配置文件
#[Member]
ETCD_NAME="etcd03"											#修改为etcd03
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.170.114:2380"			#修改为node1的ip地址
ETCD_LISTEN_CLIENT_URLS="https://192.168.170.114:2379"		#修改为node1的ip地址
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.170.114:2380"		#修改为node1的ip地址
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.170.114:2379"				#修改为node1的ip地址
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.170.111:2380,etcd02=https://192.168.170.113:2380,etcd03=https://192.168.170.114:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
#master节点执行
cd /opt/k8s
./etcd.sh etcd01 192.168.170.111 etcd02=https://192.168.170.113:2380,etcd03=https://192.168.170.114:2380
#重新启动etcd集群
#node1 node2执行
systemctl enable --now etcd
#设置开机启动并立即启动etcd,然后回到master上查看是否成功。不是一直前台运行状态即成功
#master执行:
ETCDCTL_API=3   /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.170.111:2379,https://192.168.170.113:2379,https://192.168.170.114:2379" endpoint health --write-out=table
#检查集群监控状态,health全部未true即可
ETCDCTL_API=3   /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.170.111:2379,https://192.168.170.113:2379,https://192.168.170.114:2379" endpoint status  --write-out=table
#检查集群状态,有一个is  leader为true即可
ETCDCTL_API=3   /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.m --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.170.114:2379" --write-out=table member list
##查看etcd集群成员列表
4.1在master01节点操作

4.2生成etcd证书,上传etcd-cert.sh 和 etcd.sh 到 /opt/k8s/ 目录中

4.3创建用于生成CA证书,etcd服务器证书以及私钥的目录

4.4上传 etcd-v3.4.9-linux-amd64.tar.gz 到 /opt/k8s 目录中,启动etcd服务

4.5创建用于存放etcd配置文件,命令文件,证书的目录

注意:进入卡住状态等待其他节点加入,这里需要三台etcd服务同时启动,如果只启动其中一台后,服务会卡在那里,直到集群中所有etcd节点都已启动,可忽略这个情况

可以开启另外一个窗口来查看etcd进程是否正常

4.6把etcd相关证书文件、命令文件和服务管理文件全部拷贝到另外两个etcd集群节点

4.7在node1节点操作(node2同样)

4.8启动etcd,并检查etcd集群状态

5、master部署组件

//在 master01 节点上操作
#上传 master.zip(master组件) 和 k8s-cert.sh(证书) 到 /opt/k8s 目录中,解压 master.zip 压缩包
cd /opt/k8s/
unzip master.zip
cd  master 
chmod +x *.sh
mv *  /opt/k8s
#解压master组件包,里面有master的4个组件脚本,添加权限移动到/opt/k8s文件夹中
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
#创建kubernetes工作目录
mkdir /opt/k8s/k8s-cert
#创建k8s的证书存放路径
mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert
#将k8s证书移动到创建的k8s的证书存放路径
cd /opt/k8s/k8s-cert/
vim /opt/k8s/k8s-cert/k8s-cert.sh 
#修改脚本中的ip56-60行顺序是第一个为master、第二个为master高可用ip、第三个为master虚拟ip、第四load balancer01(master)第五为load balancer01(backup)。第四第五可以删除。单节点master不用,若后面需要做集群需要提前规划好ip
chmod +x k8s-cert.sh	
./k8s-cert.sh				
#生成CA证书、相关组件的证书和私钥
ls *pem
#显示生成的证书等一共8个.pem结尾
cp ca*pem apiserver*pem /opt/kubernetes/ssl/
#将ca证书和apiserver证书拷贝到创建的存放证书的ssl/目录下
cd /opt/k8s/
tar zxvf kubernetes-server-linux-amd64.tar.gz
#上传 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目录中,解压 kubernetes 压缩包
cd /opt/k8s/kubernetes/server/bin
#进入解压后的k8s的bin目录中将4个组件拷贝到创建的k8s存放bin文件的路径下
cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
cp /opt/kubernetes/bin/* /usr/local/bin/
#将脚本程序存放到 /usr/local/bin下可以全局使用4个命令
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
cat /opt/kubernetes/cfg/token.csv
#创建 bootstrap token 认证文件,apiserver 启动时会调用,然后就相当于在集群内创建了一个这个用户,接下来就可以用 RBAC 给他授权,查看是否生成了csv文件
cd /opt/k8s/
./apiserver.sh 192.168.170.111 https://192.168.30.11:2379,https://192.168.170.113:2379,https://192.168.170.114:2379
#二进制文件、token、证书都准备好后,开启 apiserver 服务
ps aux | grep kube-apiserver
#检查进程是否启动成功,过滤kube-apiserver最上面一个后面会有-etcd-servers=https://192.168.170.111:2379,https://192.168.170.113:2379,https://192.168.170.114:2379 --bind-address=192.168.170.111 --secure-port=6443此信息为正常,注意ip要改为自己的ip地址
netstat -natp | grep 6443
#过滤端口只有监控本机ip的6443为正常
cd /opt/k8s/
vim  scheduler.sh      
#修改脚本ip。KUBE_APISERVER="https://192.168.170.111:6443"为自己的apiserver的ip地址本文是master地址
./scheduler.sh
ps aux | grep kube-scheduler
#运行shceduler组件脚本,查看服务是否正常
vim controller-manager.sh  
#修改ipKUBE_APISERVER="https://192.168.170.111:6443"为自己的apiserver的ip地址本文是master地址
./controller-manager.sh
ps aux | grep kube-controller-manager
#运行controller-manager.sh组件脚本,查看服务是否正常
vim ./admin.sh
#修改ipKUBE_APISERVER="https://192.168.170.111:6443"为自己的apiserver的ip地址本文是master地址
./admin.sh
#生成kubectl连接集群的kubeconfig文件
kubectl get cs
#通过kubectl工具查看当前集群组件状态,正常状态如下
kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
controller-manager   Healthy   ok                  
scheduler            Healthy   ok                  
etcd-2               Healthy   {"health":"true"}   
etcd-1               Healthy   {"health":"true"}   
etcd-0               Healthy   {"health":"true"} 
kubectl version
#查看版本信息
 
 
 

上传 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目录中,解压 kubernetes 压缩包

复制master组件的关键命令文件到 kubernetes工作目录的 bin 子目录中

创建 bootstrap token 认证文件,apiserver 启动时会调用,然后就相当于在集群内创建了一个这个用户,接下来就可以用 RBAC 给他授权

二进制文件、token、证书都准备好后,开启 apiserver 服务

#启动 scheduler 服务

#启动 controller-manager 服务

#生成kubectl连接集群的kubeconfig文件

6、部署worker node组件

#node1执行
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
#创建kubernetes工作目录
cd /opt/
unzip node.zip
#上传 node.zip 到 /opt 目录中,解压 node.zip 压缩包,获得kubelet.sh、proxy.shchmod +x kubelet.sh proxy.sh
#master执行
cd /opt/k8s/kubernetes/server/bin
scp kubelet kube-proxy root@192.168.30.12:/opt/kubernetes/bin/
#把 kubelet、kube-proxy 节点的组件拷贝到 node1 节点
mkdir /opt/k8s/kubeconfig
cd /opt/k8s/kubeconfig
chmod +x kubeconfig.sh
vim kubeconfig.sh 
./kubeconfig.sh 192.168.170.111 /opt/k8s/k8s-cert/
#上传kubeconfig.sh文件到/opt/k8s/kubeconfig目录中,生成kubelet初次加入集群引导kubeconfig文件和kube-proxy.kubeconfig文件
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.170.113:/opt/kubernetes/cfg/
#把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 2个授权文件拷贝到 node1 节点
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
#RBAC授权,使用户 kubelet-bootstrap 能够有权限发起 CSR 请求证书
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
#若执行失败,可先给kubectl绑定默认cluster-admin管理员集群角色,授权集群操作权限
##node1节点执行
cd /opt/
./kubelet.sh 192.168.170.113
ps aux | grep kubelet
#node1节点执行kubelet安装脚步,注意要写node1节点的ip地址,查看kubelet服务是否正常运行
#在 master01 节点上操作,通过 CSR 请求
kubectl get csr
#可以查看有谁发起请求Pending 表示等待集群给该节点签发证书,查看的内容如下
NAME                                                   AGE   SIGNERNAME                                    REQUESTOR           CONDITION
node-csr-saZodXI7_rtwU6VJGMB1UKPx8sHUsAonx4l1BKJRXOo   53m   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Pending
 
kubectl certificate approve node-csr-saZodXI7_rtwU6VJGMB1UKPx8sHUsAonx4l1BKJRXOo
#执行命令授权csr请求并签发证书
kubectl get csr
#再次查看请求的csr状态Approved,Issued 表示已授权 CSR 请求并签发证书
kubectl get node
#查看节点,状态为NotReady 由于网络插件还没部署
NAME            STATUS     ROLES    AGE    VERSION
192.168.170.113   NotReady   <none>   108s   v1.20.11
6.1在所有 node 节点上操作创建kubernetes工作目录

6.2上传 node.zip 到 /opt 目录中,解压 node.zip 压缩包,获得kubelet.sh、prox

6.3在master01节点上操作把 kubelet、kube-proxy 拷贝到 node 节点

6.4上传kubeconfig.sh文件到/opt/k8s/kubeconfig目录中,生成kubelet初次加入集群引导kubeconfig文件和kube-proxy.kubeconfig文件
#kubeconfig 文件包含集群参数(CA 证书、API Server 地址),客户端参数(上面生成的证书和私钥),集群 context 上下文参数(集群名称、用户名)。Kubenetes 组件(如 kubelet、kube-proxy)通过启动时指定不同的 kubeconfig 文件可以切换到不同的集群,连接到 apiserver。

6.5把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷贝到 node 节点

6.6RBAC授权,使用户 kubelet-bootstrap 能够有权限发起 CSR 请求证书

7、在node01节点上操作

7.1启动kubelet

7.2在 master01 节点上操作,通过 CSR 请求检查到 node01 节点的 kubelet 发起的 CSR 请求,Pending 表示等待集群给该节点签发证书

7.3通过 CSR 请求

7.4查看节点,由于网络插件还没有部署,节点会没有准备就绪 NotReady

7.5在 node01 节点上操作加载 ip_vs 模块 启动proxy服务

8、CNI网络组件

8.1K8s中Pod网络通信:
8.11Pod内容器与容器之间的通信:

在同一个Pod内的容器(pod内的容器是不会跨宿主机的)共享同一个网络命名空间,相当于它们在同一台机器上一样,可以用localhost地址访问彼此的端口。

8.12同一个node内的pod之间的通信:

每个pod都有一个真实的全局IP地址,同一个node内的不同pod之间可以直接采用对方pod的ip地址进行通信,pod1与pod2都是通过Veth连接到同一个docker0/cni0网桥,网段相同,所以它们之间可以直接通信。

8.13不同node上pod之间的通信

pod地址与docker0在同一网段,docker0网段与宿主机网卡是两个不同的网段,而且不同的node之间的通信只能通过宿主机的物理网卡进行。

要想实现不同node上pod之间的通信,就必须想办法通过主机的物理网卡IP地址进行寻址和通信。因此要满足两个条件:pod的IP崩冲突,将pod的IP和所在的node的IP关联起来,通过这个关联让不同的node上pod之间直接通过内网IP地址通信。

8.2Overlay Network:

叠加网络,在二层或者三层基础网络上叠加的一种虚拟网络技术模式,该网络中的主机通过虚拟链路隧道连接起来。

通过overlay技术(可以理解成隧道技术),在原始报文外再包一层四层协议(udp),通过主机网络进行路由转发。这种方式性能有一定的损耗,主要体现再对原始报文的修改。目前overlay主要采用Vxlan。

8.3Vxlan:

将源数据包封装到UDP中,并使用基础网络的IP/MAC作为外层报文头进行封装,然后在以太网上进行传输,到达目的地后由隧道端点解封装并将数据发送给目标地址。

8.4Fannel 

Fannel的功能是让集群中的不同节点主机创建的docker容器都具有全集群唯一的虚拟IP地址。Fannel是overlay网络的一种,也是将TCP源数据包封装在另一种网络包里面进行路由转发和通信,目前支持UDP,Vxlan,Host-gw 3种数据转发方式。

8.5Flannel UDP 模式的工作原理:

数据从主机 A 上 Pod 的源容器中发出后,经由所在主机的 docker0/cni0 网络接口转发到 flannel0 接口,flanneld 服务监听在 flannel0 虚拟网卡的另外一端。
Flannel 通过 Etcd 服务维护了一张节点间的路由表。源主机 A 的 flanneld 服务将原本的数据内容封装到 UDP 报文中, 根据自己的路由表通过物理网卡投递给目的节点主机 B 的 flanneld 服务,数据到达以后被解包,然后直接进入目的节点的 flannel0 接口, 之后被转发到目的主机的 docker0/cni0 网桥,最后就像本机容器通信一样由 docker0/cni0 转发到目标容器。

8.6ETCD 之 Flannel 提供说明:

存储管理Flannel可分配的IP地址段资源
监控 ETCD 中每个 Pod 的实际地址,并在内存中建立维护 Pod 节点路由表

由于 UDP 模式是在用户态做转发,会多一次报文隧道封装,因此性能上会比在内核态做转发的 VXLAN 模式差。

8.7、VXLAN 模式:

VXLAN 模式使用比较简单,flannel 会在各节点生成一个 flannel.1 的 VXLAN 网卡(VTEP设备,负责 VXLAN 封装和解封装)。
VXLAN 模式下作是由内核进行的。flannel 不转发数据,仅动态设置 ARP 表和 MAC 表项。
UDP 模式的 flannel0 网卡是三层转发,使用 flannel0 时在物理网络之上构建三层网络,属于 ip in udp ;VXLAN封包与解包的工 模式是二层实现,overlay 是数据帧,属于 mac in udp 。

8.8Flannel VXLAN 模式跨主机的工作原理:

1、数据帧从主机 A 上 Pod 的源容器中发出后,经由所在主机的 docker0/cni0 网络接口转发到 flannel.1 接口
2、flannel.1 收到数据帧后添加 VXLAN 头部,封装在 UDP 报文中
3、主机 A 通过物理网卡发送封包到主机 B 的物理网卡中
4、主机 B 的物理网卡再通过 VXLAN 默认端口 4789 转发到 flannel.1 接口进行解封装
5、解封装以后,内核将数据帧发送到 cni0,最后由 cni0 发送到桥接到此接口的容器 B 中。

9、部署CNI网络组件

#node1节点操作
#上传 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
#master节点操作
#上传 kube-flannel.yml 文件到 /opt/k8s 目录中,部署 CNI 网络
cd /opt/k8s
kubectl apply -f kube-flannel.yml 
#加载上传的flannel的yml文件部署 CNI 网络
kubectl get pods -n kube-system
#用于在Kubernetes集群中获取kube-system命名空间中所有Pod的状态信息
NAME                    READY   STATUS    RESTARTS   AGE
kube-flannel-ds-hjtc7   1/1     Running   0          7s
#查看节点状态为ready正常
kubectl get nodes
NAME            STATUS   ROLES    AGE   VERSION
192.168.170.113   Ready    <none>   81m   v1.20.11
9.1在 node01 节点上操作
9.1.1上传 cni-plugins-linux-amd64-v0.8.6.tgz 和 flannel.tar 到 /opt 目录中

9.2在master01节点上操作

上传 kube-flannel.yml 文件到 /opt/k8s 目录中,部署 CNI 网络

注意:这里可能有延迟,所以可以等一会再查看pods

10Calico

K8s组网方案对比:

10.1flannel方案:

需要在每个节点上把发向容器的数据包进行封装后,再用隧道将封装后的数据包发送到运行着目标pod的node节点上,目标node节点再负责去掉封装,将去除封装的数据包发送到目标pod上。数据通讯性能则大受影响。

10.2 calico方案

calico不使用隧道或者NAT来实现转发,而是把host当作internet种的路由器,使用BGP同步路由,并使用iptables来做安全访问策略,完成跨host转发。

采用直接路由的方式,这种方式性能损耗最低,不需要修改报文数据,但是如果网络比较复杂场景下,路由表会很复杂,对运维同事提出了较高的要求。

10.3calico主要的三个部分

①calico cni插件:主要负责与kubernetes对接,供kubelet使用调用

②felix:负责维护宿主机上的路由规则,FBI转发信息库等。

③BIRD:负责分发路由规则,类似路由器。

④Confd:配置管理组件

10.4calico工作原理

Calico 是通过路由表来维护每个 pod 的通信。Calico 的 CNI 插件会为每个容器设置一个 veth pair 设备, 然后把另一端接入到宿主机网络空间,由于没有网桥,CNI 插件还需要在宿主机上为每个容器的 veth pair 设备配置一条路由规则, 用于接收传入的 IP 包。
有了这样的 veth pair 设备以后,容器发出的 IP 包就会通过 veth pair 设备到达宿主机,然后宿主机根据路由规则的下一跳地址, 发送给正确的网关,然后到达目标宿主机,再到达目标容器。
这些路由规则都是 Felix 维护配置的,而路由信息则是 Calico BIRD 组件基于 BGP 分发而来。
calico 实际上是将集群里所有的节点都当做边界路由器来处理,他们一起组成了一个全互联的网络,彼此之间通过 BGP 交换路由, 这些节点我们叫做 BGP Peer。

目前比较常用的CNI网络组件是flannel和calico,flannel的功能比较简单,不具备复杂的网络策略配置能力,calico是比较出色的网络管理插件,但具备复杂网络配置能力的同时,往往意味着本身的配置比较复杂,所以相对而言,比较小而简单的集群使用flannel,考虑到日后扩容,未来网络可能需要加入更多设备,配置更多网络策略,则使用calico更好。

11.部署calico(部署calico之前先还原到签发成功证书之后)

//在 master01 节点上操作
#上传 calico.yaml 文件到 /opt/k8s 目录中,部署 CNI 网络
cd /opt/k8s
vim calico.yaml
#修改里面定义 Pod 的网络(CALICO_IPV4POOL_CIDR),需与前面 kube-controller-manager 配置文件指定的 cluster-cidr 网段一样
    - name: CALICO_IPV4POOL_CIDR
      value: "10.244.0.0/16"        #Calico 默认使用的网段为 192.168.0.0/16
  
kubectl apply -f calico.yaml


kubectl get pods -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-659bd7879c-4h8vk   1/1     Running   0          58s
calico-node-nsm6b                          1/1     Running   0          58s
calico-node-tdt8v                          1/1     Running   0          58s

#等 Calico Pod 都 Running,节点也会准备就绪
kubectl get nodes
---------- node02 节点部署 ----------
//在 node01 节点上操作
cd /opt/
scp kubelet.sh proxy.sh root@192.168.170.114:/opt/
scp -r /opt/cni root@192.168.170.114:/opt/

//在 node02 节点上操作
#启动kubelet服务
cd /opt/
chmod +x kubelet.sh
./kubelet.sh 192.168.170.114

//在 master01 节点上操作
kubectl get csr
NAME                                                   AGE  SIGNERNAME                                    REQUESTOR           CONDITION
node-csr-BbqEh6LvhD4R6YdDUeEPthkb6T_CJDcpVsmdvnh81y0   10s  kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Pending
node-csr-duiobEzQ0R93HsULoS9NT9JaQylMmid_nBF3Ei3NtFE   85m  kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Approved,Issued

#通过 CSR 请求
kubectl certificate approve node-csr-BbqEh6LvhD4R6YdDUeEPthkb6T_CJDcpVsmdvnh81y0

kubectl get csr
NAME                                                   AGE  SIGNERNAME                                    REQUESTOR           CONDITION
node-csr-BbqEh6LvhD4R6YdDUeEPthkb6T_CJDcpVsmdvnh81y0   23s  kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Approved,Issued
node-csr-duiobEzQ0R93HsULoS9NT9JaQylMmid_nBF3Ei3NtFE   85m  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 2>&1 && /sbin/modprobe $i;done

#使用proxy.sh脚本启动proxy服务
cd /opt/
chmod +x proxy.sh
./proxy.sh 192.168.170.114

#查看群集中的节点状态
kubectl get nodes
11.1在master节点上操作

11.2在node2节点部署步骤同node01一样

12、部署CoreDNS

Core DNS:可以为集群中的service资源创建一个域名与IP对应关系解析

12.1在所有node节点上操作
//在所有 node 节点上操作
#上传 coredns.tar 到 /opt 目录中
cd /opt
docker load -i coredns.tar

12.2在master01节点上操作
//在 master01 节点上操作
#上传 coredns.yaml 文件到 /opt/k8s 目录中,部署 CoreDNS 
cd /opt/k8s
kubectl apply -f coredns.yaml

kubectl get pods -n kube-system 
NAME                          READY   STATUS    RESTARTS   AGE
coredns-5ffbfd976d-j6shb      1/1     Running   0          32s

#DNS 解析测试
kubectl run -it --rm dns-test --image=busybox:1.28.4 sh
If you don't 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.local

Name:      kubernetes
Address 1: 10.0.0.1 kubernetes.default.svc.cluster.local

13、master02节点部署

---------- master02 节点部署 ----------
在master01节点上操作
//从 master01 节点上拷贝证书文件、各master组件的配置文件和服务管理文件到 master02 节点
scp -r /opt/etcd/ root@192.168.170.115:/opt/
scp -r /opt/kubernetes/ root@192.168.170.115:/opt
scp -r /root/.kube root@192.168.170.115:/root
scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@192.168.170.115:/usr/lib/systemd/system/

//修改配置文件kube-apiserver中的IP
vim /opt/kubernetes/cfg/kube-apiserver
KUBE_APISERVER_OPTS="--logtostderr=true \
--v=4 \
--etcd-servers=https://192.168.170.111:2379,https://192.168.170.113:2379,https://192.168.170.114:2379 \
--bind-address=192.168.170.115 \				#修改
--secure-port=6443 \
--advertise-address=192.168.170.115 \			#修改
......

//在 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			#-o=wide:输出额外信息;对于Pod,将输出Pod所在的Node名
//此时在master02节点查到的node节点状态仅是从etcd查询到的信息,而此时node节点实际上并未与master02节点建立通信连接,因此需要使用一个VIP把node节点与master节点都关联起来
13.1先开启master02然后修改master02的配置信息

然后四台机器都做以下

13.2从 master01 节点上拷贝证书文件、各master组件的配置文件和服务管理文件到 master02 节点

13.3修改配置文件kube-apiserver中的IP

13.4在master02节点上启动服务并设置开机自启

13.5查看node节点状态

14、负载均衡部署

//配置load balancer集群双机热备负载均衡(nginx实现负载均衡,keepalived实现双机热备)
##### 在lb01、lb02节点上操作 ##### 
//配置nginx的官方在线yum源,配置本地nginx的yum源
cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
EOF

yum install nginx -y

//修改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.170.111:6443;
        server 192.168.170.115:6443;
    }
    server {
        listen 6443;
        proxy_pass k8s-apiserver;
    }
}

http {
......


//检查配置文件语法
nginx -t   

//启动nginx服务,查看已监听6443端口
systemctl start nginx
systemctl enable nginx
netstat -natp | grep nginx 


//部署keepalived服务
yum install keepalived -y

//修改keepalived配置文件
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   # 接收邮件地址
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   # 邮件发送地址
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id NGINX_MASTER	#lb01节点的为 NGINX_MASTER,lb02节点的为 NGINX_BACKUP
}

#添加一个周期性执行的脚本
vrrp_script check_nginx {
    script "/etc/nginx/check_nginx.sh"	#指定检查nginx存活的脚本路径
}

vrrp_instance VI_1 {
    state MASTER			#lb01节点的为 MASTER,lb02节点的为 BACKUP
    interface ens33			#指定网卡名称 ens33
    virtual_router_id 51	#指定vrid,两个节点要一致
    priority 100			#lb01节点的为 100,lb02节点的为 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.170.100/24	#指定 VIP
    }
    track_script {
        check_nginx			#指定vrrp_script配置的脚本
    }
}


//创建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 ];then
    systemctl stop keepalived
fi


chmod +x /etc/nginx/check_nginx.sh

//启动keepalived服务(一定要先启动了nginx服务,再启动keepalived服务)
systemctl start keepalived
systemctl enable keepalived
ip a				#查看VIP是否生成

//修改node节点上的bootstrap.kubeconfig,kubelet.kubeconfig配置文件为VIP
cd /opt/kubernetes/cfg/
vim bootstrap.kubeconfig 
server: https://192.168.170.100:6443
                      
vim kubelet.kubeconfig
server: https://192.168.170.100:6443
                        
vim kube-proxy.kubeconfig
server: https://192.168.170.100:6443

//重启kubelet和kube-proxy服务
systemctl restart kubelet.service 
systemctl restart kube-proxy.service

//在 lb01 上查看 nginx 和 node 、 master 节点的连接状态
netstat -natp | grep nginx
tcp        0      0 0.0.0.0:6443            0.0.0.0:*               LISTEN      84739/nginx: master 
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      84739/nginx: master 
tcp        0      0 192.168.10.21:60382     192.168.10.20:6443      ESTABLISHED 84741/nginx: worker 
tcp        0      0 192.168.10.100:6443     192.168.10.18:41650     ESTABLISHED 84741/nginx: worker 
tcp        0      0 192.168.10.100:6443     192.168.10.19:49726     ESTABLISHED 84741/nginx: worker 
tcp        0      0 192.168.10.21:35234     192.168.10.80:6443      ESTABLISHED 84741/nginx: worker 
tcp        0      0 192.168.10.100:6443     192.168.10.18:41648     ESTABLISHED 84741/nginx: worker 
tcp        0      0 192.168.10.100:6443     192.168.10.19:49728     ESTABLISHED 84742/nginx: worker 
tcp        0      0 192.168.10.100:6443     192.168.10.18:41646     ESTABLISHED 84741/nginx: worker 
tcp        0      0 192.168.10.21:32786     192.168.10.20:6443      ESTABLISHED 84741/nginx: worker 
tcp        0      0 192.168.10.100:6443     192.168.10.18:41656     ESTABLISHED 84741/nginx: worker 
tcp        0      0 192.168.10.21:60378     192.168.10.20:6443      ESTABLISHED 84741/nginx: worker 
tcp        0      0 192.168.10.21:32794     192.168.10.20:6443      ESTABLISHED 84741/nginx: worker 
tcp        0      0 192.168.10.100:6443     192.168.10.19:49724     ESTABLISHED 84741/nginx: worker 
tcp        0      0 192.168.10.21:35886     192.168.10.80:6443      ESTABLISHED 84741/nginx: worker 
tcp        0      0 192.168.10.100:6443     192.168.10.19:51372     ESTABLISHED 84742/nginx: worker 
tcp        0      0 192.168.10.100:6443     192.168.10.19:49722     ESTABLISHED 84741/nginx: worker 
tcp        0      0 192.168.10.100:6443     192.168.10.19:49702     ESTABLISHED 84741/nginx: worker


##### 在 master01 节点上操作 ##### 
//测试创建pod
kubectl run nginx --image=nginx

//查看Pod的状态信息
kubectl get pods
NAME                    READY   STATUS              RESTARTS   AGE
nginx-dbddb74b8-nf9sk   0/1     ContainerCreating   0          33s   #正在创建中

kubectl get pods
NAME                    READY   STATUS    RESTARTS   AGE
nginx-dbddb74b8-nf9sk   1/1     Running   0          80s  			#创建完成,运行中

kubectl get pods -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE
nginx-dbddb74b8-26r9l   1/1     Running   0          10m   172.17.36.2   192.168.80.15   <none>
//READY为1/1,表示这个Pod中有1个容器

//在对应网段的node节点上操作,可以直接使用浏览器或者curl命令访问
curl 172.17.36.2

//这时在master01节点上查看nginx日志
kubectl logs nginx-dbddb74b8-nf9sk
14.1在nginx0102上执行配置nginx的官方在线yum源,配置本地nginx的yum源

14.2修改nginx配置文件,配置四层反向代理负载均衡,指定k8s群集2台master的节点ip和6443端口

14.3启动nginx服务,查看已监听的6443端口

14.4部署keeplived服务

14.5修改keepalived配置文件

注意:

14.6创建nginx状态检查脚本

14.7启动keepalived(先启动nginx再启动keepalived)

14.8修改node节点上的bootstrap.kubeconfig,kubelet.kubeconfig配置文件为VIP

node01node02同步操作

14.9在nginx01上查看nginx和node,master节点的连接状态

14.10在master节点上操作

测试创建pod

由于是单核,所以创建过程时间会久一点

在对应网段的node节点上操作,可以直接使用浏览器或者curl命令访问

然后查看master01节点上查看nginx日志

15、部署Dashboard

15.1Dashboard介绍

仪表板是基于Web的Kubernetes用户界面。您可以使用仪表板将容器化应用程序部署到Kubernetes集群,对容器化应用程序进行故障排除,并管理集群本身及其伴随资源。您可以使用仪表板来概述群集上运行的应用程序,以及创建或修改单个Kubernetes资源(例如deployment,job,daemonset等)。例如,您可以使用部署向导扩展部署,启动滚动更新,重新启动Pod或部署新应用程序。仪表板还提供有关群集中Kubernetes资源状态以及可能发生的任何错误的信息。

15.2在master01节点上操作
#上传 recommended.yaml 文件到 /opt/k8s 目录中
cd /opt/k8s
vim recommended.yaml
#默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001     #添加
  type: NodePort          #添加
  selector:
    k8s-app: kubernetes-dashboard

kubectl apply -f recommended.yaml

#创建service account并绑定默认cluster-admin管理员集群角色
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

#使用输出的token登录Dashboard
https://NodeIP:30001





15.3创建service account并绑定默认cluster-admin管理员集群角色

15.4在node1node2中要先准备好dashboard.tar跟metrics-scraper.tar

15.5使用输出的token登录dashboard

https://192.168.170.113:30001

这里使用虚拟机内部的网页

使用token密钥登录

二、总结

1、控制器五大类

标签选择器 标签

①service

②ingress

③name

④namespace

2、k8s二进制安装步骤过程

①etcd安装步骤

1.准备CA证书和私钥文件,首先CA签发服务端证书和私钥文件

2.使用CA证书服务端证书,私钥文件加上etcd集群配置文件去启动etcd服务

3.复制etcd工作目录和管理文件到另外两个节点上,修改etcd集群配置文件并启动etcd服务

4.使用V3版本的接口,去执行etcdctl+z证书选项(endpoint health)|endpoint status|member list查看etcd集群和节点的状态

3、master组件

3.1先安装apiserver

①准备组件相关的证书和私钥文件

②准备bootstrap token认证文件(给kubelet启动时签发证书时使用)

③准备组件,启动配置文件

④启动apiserver服务端口是6443https

3.2再启动controller-manager和scheduler

①准备启动配置文件

②准备相关证书和私钥文件生成kubeconfig文件(用于指定对接哪个apiserver,使用什么证书认证)启动服务

3.3检查集群组件状态

①准备kubeconfig文件把kubectl加入到集群中(指定对接哪个apiserver,使用什么证书认证)

kubectl get csr

4、kubernetes的三种网络

5、vxlan与vlan的区别:

vxlan支持更多的二层网络
vlan使用12位bit表示vanID,因此最多支持212=4094个vlan
2^24个224个vxlan使用的I使用24位bit,最多可以支持
已有的网络路径利用效率更高
vlan使用spanning tree protocol避免环路,会将一半的网络路径阻塞
vxlan的数据包封装成UDP通过网络层传输,可以使用所有的网络路径
防止物理交换机Mac表耗尽
van需要在交换机的Mac表中记录Mac物理地址
vxlan采用隧道机制,Mac物理地址不需记录在交换机

6、相比vlan技术vxlan技术优势:

①24位长度的VNI字段值可以支持更多数量的虚拟网络,解决了VLAN数目上限为4094的局限性的问题。

②VXLAN技术诵过隧道技术在物理的三层网络中虚拟二层网络,处于VXLAN网络的终端无法察觉到VXLAN的通信过程,这样也就使得逻辑网络拓扑和物理网络拓扑实现了一定程度的解耦,网络拓扑的配置对于物理设备的配置的依赖程度有所降低,配置更灵活堕方便。

③VLAN技术仅仅解决了二层网络广播域分割的问题,而VXLAN技术还具有多租户支持的特性,通过VXLAN分割,各个租户可以独立组网、通信,地址分配方面和多个租户之间地址冲突的问题也得到了解决。

7、Flannle UDP模式

8、Flannle Vxlan模式

9、CNI网络插件

企业使用插件flannle和calico

9.1flannle

配置方便 ,功能简单,是基于overlay叠加(二层或三层网络)实现的,由于要进行封装和解封装性能会有一定的影响,同时具备策略配置3种模式,其中只配置一种模式 ,根据自己的需求或者自己的判断

①UDP UDP用户态就是应用程序,封装UDP协议,IP封装 ,解封装的过程,原理通过flannle服务进行封装

②VXLAN 隧道模式 是默认配置,利用内核vxlan来进行封装,主机host之间传送数据包,比较好用

③Host-gw host-gw二层网络配置,不支持云环境,通过在主机的路由表种直接创建路由信息(sybnet路由条目)到达目标,性能好但是配置麻烦。

默认网段 10.244.0.0/16

10、calico

功能强大,没有封装和解封装的过程,对性能影响较小,具有网络策略配置的能力,但是路由表维护起来比较复杂

默认网段:192.168.0.0/16

模式:网络BGP IPIP

11、多master集群架构的部署过程

①首先,部署master02等其他节点(master01配置文件拷贝包括(私钥,服务,执行文件)到master02)

②搭建nginx/Haproxy+keepalived高可用负载均衡器对master节点

③修改node节点上kubelet kube-proxy的kubeconfig配置文件对接vip

④kubectl的配置文件也要对接vip或者当前的节点

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值