目录
六、基于Web的Kubernetes用户界面--Dashboard
在同一个pod中的容器时共享资源和网络,使用同一个网络命名空间。可以直接通信
每个pod都有一个全局的真实IP地址,同一个node节点之间的不同pod可以直接的使用对方pod的IP地址进行通信。
pod1和pod2是通过docker0的网桥来进行通信的
cni是一个标准接口,用于容器运行时调用网络插件,负责设置容器的网络命名空间,IP地址,路由等等参数
功能:让集群之中不同节点的docker容器,具有整个集群唯一的虚拟IP地址
overlay的网络类型,在底层物理网络的基础之上创建一个逻辑的网络层。是二层+三层的集合。二层是物理网络(数据链路层),三层是逻辑上的网络层
overlay网络也是一种网络虚拟化的技术
1、UDP模式:默认模式,应用转发,配置简单,但是性能最差
2、vxlan:基于内核转发,也是最常用的网络类型(小集群都用这个模式)
3、hosts-gw:性能最好,但是配置麻烦
基于应用转发,flannel提供路由表,flannel封装数据包,解封装。
UDP是基于应用层,用户态
在每个node节点上都会有一个flannel的虚拟网卡,负责封装和解封装
使用的是overlay的虚拟隧道通信技术。是二层+三层的模式,和UDP不同。
vxlan:flannel提供路由表,内核封装解封装
用的flannel1.1接口,(ifconfig看到flannel1.1用的就是vxlan)
flannel.1提供vni
类似于三层交换机:
flannel:是每个发向容器的数据包封装,vxlan通过vtep打包数据,然后由内核封装成数据包,再转发到目标node节点,到了目标节点由内核解封装,解封装之后发送到目标pod。
无论是flannel还是udp对性能是有一定影响的(小集群不在乎)
两个node节点操作
在 node01 节点上操作
上传 cni-plugins-linux-amd64-v0.8.6.tgz 和 flannel.tar 到 /opt 目录中
cd /opt/
docker load -i flannel.tar
mkdir -p /opt/cni/bin
tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin
在 master01 节点上操作
#上传 kube-flannel.yml 文件到 /opt/k8s 目录中,部署 CNI 网络
cd /opt/k8s
kubectl apply -f kube-flannel.yml
kubectl get pods -n kube-system
kubectl get nodes
calico:采用直接路由的方式。BGP路由。不需要需改报文,统一直接通过路由表转发,路由表会很复杂,运行维护的要求比较高
BGP模式的特点:交换路由信息的外部网关协议,可以连接不同的node节点,node节点可能不是同一网段,BGP实现可靠的、最佳的、动态的路由选择。自动识别相邻的路由设备。
calico不使用overlay重叠网络,也不需要交换,直接通过虚拟路由实现,每一台虚拟路由都通过BGP转发
felix:也是运行在主机上的一个个pod,一个进程。K8S daemonset的方式部署的pod
负责在宿主机上(node节点上)插入路由规则,维护calico所需的网络设备。网络接口管理,网络接口的监听,路由等等
daemonset:daemonset会在每个node节点部署相同的pod,后台的方式进行运行
BGP client:bird BGP的客户端,专门负责杂集群中分发路由规则的信息。每一个节点都会有一个BGP client
BGP协议广播的方式通知其他节点,分发路由的规则,实现网络互通
etcd:保存路由信息,负责整个网络元数据的一致性,保证整个网络状态的一致和准确
路由转发,纯路由,没有交换
发现目标设备:BGP协议
通过路由表来维护每个pod之间的通信
一旦创建好pod之后,添加一个设备cali veth pair设备,是一个虚拟网卡设备
虚拟网卡:veth pair是一对设备,是一个虚拟的以太网设备。
一头连接在容器的网络命名空间(名称一般是eth0)
另一台连接在宿主机的网络命名空间 (名称一般是cali)
IP地址分配:veth pair连接容器的部分给容器分配一个IP地址,这个IP地址是一个唯一标识。宿主机也会被veth pair分配一个calico网络的内部IP地址。和其他节点上的容器进行通信
veth设备,容器发出的IP地址通过veth pair设备到宿主机,宿主机根据路由规则的下一跳地址,发送到网关(目标宿主机节点),数据包到达目标宿主机,veth pair设备,目标宿主机也是根据路由规则,下一跳地址,转发到目标容器。
ipip模式:
会生成一个Tunnel,所有的数据包封装都在Tunnel内部打包。封装的是宿主机ip、容器内部的IP地址
ipip的隧道:在隧道进行数据包的封装
BGP模式:
通过为ip路由表的前缀来实现目标主机的可达性
对比ipip模式,BGP模式没有隧道,BGP模式下,pod的数据包直接通过网卡发送到目的地
在 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
kubectl get nodes
常用的K8S网络类型:
flannel:配置简单,功能简单,基于overlay叠加网络实现,在物理层的网络上再封装一层虚拟的网络层
vxlan是虚拟三层网络,用的最多的模式。是基于vni +ip进行转发,flannel提供路由表,内核封装和解封装。
UDP是默认模式(只管发),一般不用,host配置复杂一般也不用
由于封装和解封装的过程,对数据传输的性能会有影响,没有网络策略配置的能力。
默认网段是:10.244.0.0/16
calico:功能强大,基于路由表进行转发,没有封装和解封装的过程。具备网络策略的配置能力。但是路由表维护起来比较复杂
模式:ipip模式和BGP模式
简单的小集群使用flannel即可
日后有扩容、配置网络策略选择calico
可以为集群中的service资源创建一个域名和ip进行对应解析的关系
service是对外提供访问的一个地址,现在加入DNS机制之后,可以直接访问它的服务名,
在所有 node 节点上操作
#上传 coredns.tar 到 /opt 目录中
cd /opt
docker load -i coredns.tar
在 master01 节点上操作
#上传 coredns.yaml 文件到 /opt/k8s 目录中,部署 CoreDNS
cd /opt/k8s
kubectl apply -f coredns.yaml
kubectl get pods -n kube-system
DNS 解析测试
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
要先初始化,将上面的准备操作准备
从 master01 节点上拷贝证书文件、各master组件的配置文件和服务管理文件到 master02 节点
scp -r /opt/etcd/ root@20.0.0.62:/opt/
scp -r /opt/kubernetes/ root@20.0.0.62:/opt
scp -r /root/.kube root@20.0.0.62:/root
scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@20.0.0.62:/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.233.91:2379,https://192.168.233.93:2379,https://192.168.233.94:2379 \
--bind-address=192.168.233.92 \ #修改
--secure-port=6443 \
--advertise-address=192.168.233.92 \ #修改
在 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节点都关联起来
配置load balancer集群双机热备负载均衡(nginx实现负载均衡,keepalived实现双机热备)
配置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端口
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 20.0.0.61:6443;
????????server 20.0.0.62:6443;
????}
????server { ?????
????????listen 6443;
????????proxy_pass k8s-apiserver;
????}
} ???????
?#日志记录格式
#$remote_addr: 客户端的 IP 地址。
#$upstream_addr: 上游服务器的地址。
#[$time_local]: 访问时间,使用本地时间。
#$status: HTTP 响应状态码。
#$upstream_bytes_sent: 从上游服务器发送到客户端的字节数。 ???
检查配置文件语法
nginx -t ??
启动nginx服务,查看已监听6443端口
systemctl start nginx
systemctl enable nginx
netstat -natp | grep nginx
yum install keepalived -y
修改keepalived配置文件
vim /etc/keepalived/keepalived.conf
创建nginx状态检查脚本
vim /etc/nginx/check_nginx.sh
#!/bin/bash ???????????????????????????????????????????????????????
/usr/bin/curl -I http://localhost &>/dev/null ???
if [ $? -ne 0 ];then ???????????????????????????????????????????
# ???/etc/init.d/keepalived stop
????systemctl stop keepalived
fi
chmod +x /etc/nginx/check_nginx.sh
启动keepalived服务(一定要先启动了nginx服务,再启动keepalived服务)
systemctl start keepalived
systemctl enable keepalived
ip a
主nginx
ip addr
关闭主nginx测试高可用:
VIP漂移到备nginx上
测试故障恢复:
先启动nginx,再启动keepalived
VIP漂移回来了
修改node节点上的bootstrap.kubeconfig,kubelet.kubeconfig配置文件为VIP
cd /opt/kubernetes/cfg/
vim bootstrap.kubeconfig
server: https://20.0.0.100:6443
??????????????????????
vim kubelet.kubeconfig
server: https://20.0.0.100:6443
????????????????????????
vim kube-proxy.kubeconfig
server: https://20.0.0.100:6443
重启kubelet和kube-proxy服务
systemctl restart kubelet.service
systemctl restart kube-proxy.service
在 lb01 上查看 nginx 和 node 、 master 节点的连接状态
netstat -natp | grep nginx
在 master01 节点上操作
测试创建pod
kubectl run nginx --image=nginx
查看Pod的状态信息
kubectl get pods
kubectl get pods -o wide
READY为1/1,表示这个Pod中有1个容器
kubectl exec -it nginx bash
这时在master01节点上查看nginx日志
kubectl logs nginx-dbddb74b8-nf9sk
仪表盘,kubernetes的可视化界面。在这个可视化界面上,可以对集群进行管理
安装dashhoard
在 master01 节点上操作
#上传 recommended.yaml 文件到 /opt/k8s 目录中
cd /opt/k8s
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
#获取token值
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
#使用输出的token登录Dashboard
https://20.0.0.63:30001