欢迎来到飞鸟慕鱼博客,开始您的技术之旅!
当前位置: 首页知识笔记正文

k8s多master集群部署,k8s集群多master分工

终极管理员 知识笔记 42阅读

1.数据帧从主机A上的Pod的源容器中发出,然后通过主机的docker0/cni0网络接口转发到法兰绒. 1接口。2.法兰绒. 1添加了一个VXLAN报头,并将其封装在UDP消息中3中。主机A通过物理网卡向主机B的物理网卡中,发送数据包。4.主机B的物理网卡通过VXLAN的默认端口4789转发到法兰绒. 1接口解封装。5.解封后,内核将数据帧发送到cni0,最后cni0将它们发送到中桥接到该接口的容器B。//operate #将CNI-插件-Linux-amd64-v0.8.6.tgz和flannel.tar上传到node01上的/opt。

录中cd /opt/docker load -i flannel.tar #执行这个命令后Docker 将会从 flannel.tar 文件中加载 Docker 镜像并将其添加到本地的 Docker 镜像库中以便后续使用。
mkdir /opt/cni/bin -ptar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin

//在 master01 节点上操作
#上传 kube-flannel.yml 文件到 /opt/k8s 目录中部署 CNI 网络

cd /opt/k8s#kubectl 将会读取并解析 kube-flannel.yml 文件中的配置信息并将其应用到 Kubernetes 集群中。这个 YAML 文件通常包含了 Flannel 网络插件的配置用于设置集群中的网络通信。kubectl apply -f kube-flannel.yml 
kubectl get pods -n kube-system
kubectl get nodes


---------- 部署 Calico ----------
#k8s 组网方案对比:
●flannel方案
需要在每个节点上把发向容器的数据包进行封装后再用隧道将封装后的数据包发送到运行着目标Pod的node节点上。目标node节点再负责去掉封装将去除封装的数据包发送到目标Pod上。数据通信性能则大受影响。

●calico方案
Calico不使用隧道或NAT来实现转发而是把Host当作Internet中的路由器使用BGP同步路由并使用iptables来做安全访问策略完成跨Host转发。
采用直接路由的方式这种方式性能损耗最低不需要修改报文数据但是如果网络比较复杂场景下路由表会很复杂对运维同事提出了较高的要求。

#Calico 主要由三个部分组成
Calico CNI插件主要负责与kubernetes对接供kubelet调用使用。
Felix负责维护宿主机上的路由规则、FIB转发信息库等。
BIRD负责分发路由规则类似路由器。
Confd配置管理组件。

#Calico 工作原理
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和calicoflannel的功能比较简单不具备复杂的网络策略配置能力calico是比较出色的网络管理插件但具备复杂网络配置能力的同时往往意味着本身的配置比较复杂所以相对而言比较小而简单的集群使用flannel考虑到日后扩容未来网络可能需要加入更多设备配置更多网络策略则使用calico更好。

//在 master01 节点上操作
#上传 calico.yaml 文件到 /opt/k8s 目录中部署 CNI 网络

cd /opt/k8svim 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 将会读取并解析 calico.yaml 文件中的配置信息并将其应用到 Kubernetes 集群中。这个 YAML 文件通常包含了 Calico 网络插件的配置用于设置集群中的网络通信。Calico 是一种常用的网络插件用于实现 Kubernetes 集群中的网络策略和网络隔离。kubectl apply -f calico.yaml
#获得 kube-system 命名空间中所有 Pod 的详细信息kubectl get pods -n kube-system

详细解释
“kubectl get pods -n kube-system” 是一个用于在 Kubernetes 集群中获取 kube-system 命名空间下的所有 Pod 的命令。

“kubectl” 是 Kubernetes 命令行工具用于与 Kubernetes 集群进行交互。“get” 是 kubectl 的一个子命令用于获取 Kubernetes 资源的信息。“pods” 表示我们要获取的资源类型是 Pod。“-n kube-system” 是一个参数指定了要获取的 Pod 所在的命名空间是 kube-system。

通过执行这个命令我们可以获取到 kube-system 命名空间下的所有 Pod 的相关信息例如 Pod 的名称、状态、IP 地址、所在节点等。这些信息对于管理和监控 Kubernetes 集群非常有用。

#等 Calico Pod 都 Running节点也会准备就绪

#获取 Kubernetes 集群中的节点信息。kubectl get nodes

---------- node02 节点部署 ----------
//在 node01 节点上操作

cd /opt/scp kubelet.sh proxy.sh root20.0.0.103:/opt/#将本地的 /opt/cni 目录包括其中的文件和子目录复制到远程服务器的 /opt/ 目录下scp -r /opt/cni root20.0.0.103:/opt/

//在 node02 节点上操作

#启动kubelet服务cd /opt/chmod x kubelet.sh#执行这个命令后将会运行名为 kubelet.sh 的脚本文件并将 20.0.0.103 作为参数传递给脚本。./kubelet.sh 20.0.0.103

//在 master01 节点上操作

kubectl get csr

#通过 CSR 请求

kubectl certificate approve node-csr-uPmL1JkOA13jjbyNaG_au0w6pxMUaIxko0m5KAagz0A
#获取 Kubernetes 集群中的证书签名请求Certificate Signing RequestCSR列表。kubectl get csr

#加载 ipvs 模块 node02上

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#在20.0.0.103上启动代理./proxy.sh 20.0.0.103

#查看群集中的节点状态

kubectl get nodes


------------------------------ 部署 CoreDNS ------------------------------
CoreDNS可以为集群中的 service 资源创建一个域名 与 IP 的对应关系解析

//在所有 node 节点上操作
#上传 coredns.tar 到 /opt 目录中

cd /optdocker load -i coredns.tar


//在 master01 节点上操作
#上传 coredns.yaml 文件到 /opt/k8s 目录中部署 CoreDNS

cd /opt/k8skubectl apply -f coredns.yaml
kubectl get pods -n kube-systemNAME                          READY   STATUS    RESTARTS   AGEcoredns-5ffbfd976d-j6shb      1/1     Running   0          32s

#DNS 解析测试

kubectl run -it --rm dns-test --imagebusybox:1.28.4 shIf you dont see a command prompt, try pressing enter./ # nslookup kubernetesServer:    10.0.0.2Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.localName:      kubernetesAddress 1: 10.0.0.1 kubernetes.default.svc.cluster.local注如果出现以下报错[rootmaster01 k8s]# kubectl run -it  --imagebusybox:1.28.4 shIf you dont see a command prompt, try pressing enter.Error attaching, falling back to logs: unable to upgrade connection: Forbidden (usersystem:anonymous, verbcreate, resourcenodes, subresourceproxy)Error from server (Forbidden): Forbidden (usersystem:anonymous, verbget, resourcenodes, subresourceproxy) ( pods/log sh)需要添加 rbac的权限  直接使用kubectl绑定  clusteradmin 管理员集群角色  授权操作权限[rootmaster01 k8s]# kubectl create clusterrolebinding cluster-system-anonymous --clusterrolecluster-admin --usersystem:anonymousclusterrolebinding.rbac.authorization.k8s.io/cluster-system-anonymous created

---------- master02 节点部署 ----------
#关闭防火墙

systemctl stop firewalldsystemctl disable firewalldiptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X#关闭selinuxsetenforce 0sed -i s/enforcing/disabled/ /etc/selinux/config#关闭swapswapoff -ased -ri s/.*swap.*/#&/ /etc/fstab #根据规划设置主机名hostnamectl set-hostname master02

#在master添加hosts

cat >> /etc/hosts << EOF20.0.0.101 master0120.0.0.106 master0220.0.0.102 node0120.0.0.103 node02EOF

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

scp -r /opt/etcd/ root20.0.0.106:/opt/scp -r /opt/kubernetes/ root20.0.0.106:/optscp -r /root/.kube root20.0.0.106:/rootscp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root20.0.0.106:/usr/lib/systemd/system/

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

vim /opt/kubernetes/cfg/kube-apiserverKUBE_APISERVER_OPTS--logtostderrtrue \--v4 \--etcd-servers \--bind-address20.0.0.106 \#修改--secure-port6443 \--advertise-address20.0.0.106 \#修改......


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

systemctl start kube-apiserver.servicesystemctl enable kube-apiserver.servicesystemctl start kube-controller-manager.servicesystemctl enable kube-controller-manager.servicesystemctl start kube-scheduler.servicesystemctl enable kube-scheduler.service


//在master02查看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节点都关联起来

------------------------------ 负载均衡部署 ------------------------------
//配置load balancer集群双机热备负载均衡nginx实现负载均衡keepalived实现双机热备
#在lb0120.0.0.104、lb0220.0.0.105节点上操作
//配置nginx的官方在线yum源配置本地nginx的yum源

cat > /etc/yum.repos.d/nginx.repo << EOF[nginx]namenginx repobaseurl install nginx -y

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

vim /etc/nginx/nginx.confevents {    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 20.0.0.101:6443;        server 20.0.0.106:6443;    }    server {        listen 6443;        proxy_pass k8s-apiserver;    }}http {......

//检查配置文件语法

nginx -t   


//启动nginx服务查看已监听6443端口

systemctl start nginxsystemctl enable nginxnetstat -natp | grep nginx 


//部署keepalived服务

yum install keepalived -y

//修改keepalived配置文件

vim /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {   # 接收邮件地址   notification_email {     acassenfirewall.loc     failoverfirewall.loc     sysadminfirewall.loc   }   # 邮件发送地址   notification_email_from Alexandre.Cassenfirewall.loc   smtp_server 127.0.0.1   smtp_connect_timeout 30   router_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节点的为 BACKUP    interface ens33#指定网卡名称 ens33    virtual_router_id 51#指定vrid两个节点要一致    priority 100#lb01节点的为 100lb02节点的为 90    advert_int 1    authentication {        auth_type PASS        auth_pass 1111    }    virtual_ipaddress {        20.0.0.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 keepalivedfi
chmod x /etc/nginx/check_nginx.sh

//启动keepalived服务一定要先启动了nginx服务再启动keepalived服务

systemctl start keepalivedsystemctl enable keepalivedip a#查看VIP是否生成

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

cd /opt/kubernetes/cfg/vim bootstrap.kubeconfig server:   
vim kubelet.kubeconfigserver:   
vim kube-proxy.kubeconfigserver:   

//重启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 --imagenginx

//查看Pod的状态信息

kubectl get podsNAME                    READY   STATUS              RESTARTS   AGEnginx   0/1     ContainerCreating   0          33s   #正在创建中
kubectl get podsNAME                    READY   STATUS    RESTARTS   AGEnginx   1/1     Running   0          80s  #创建完成运行中
kubectl get pods -o wideNAME                    READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODEnginx  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

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

//在 master01 节点上操作
#上传 recommended.yaml 文件到 /opt/k8s 目录中

cd /opt/k8s
vim recommended.yaml#默认Dashboard只能集群内部访问修改Service为NodePort类型暴露到外部kind: ServiceapiVersion: v1metadata:  labels:    k8s-app: kubernetes-dashboard  name: kubernetes-dashboard  namespace: kubernetes-dashboardspec:  ports:    - port: 443      targetPort: 8443      nodePort: 30001     #添加  type: NodePort          #添加  selector:    k8s-app: kubernetes-dashboardkubectl apply -f recommended.yaml

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

kubectl create serviceaccount dashboard-admin -n kube-systemkubectl create clusterrolebinding dashboard-admin --clusterrolecluster-admin --serviceaccountkube-system:dashboard-adminkubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk /dashboard-admin/{print $1})

#使用输出的token登录Dashboard

标签:
声明:无特别说明,转载请标明本文来源!