本篇文章将完结多master集群的布置,即布置master02,以及nginx负载均衡、keepalived高可用。

多master集群架构

二进制搭建Kubernetes集群(下)——部署多master

  • node节点的kubelet只能对接一个master节点的apiserver,不可能一起对接多个master节点的apiserver。简而言之,node节只能由一个master来领导。
  • kubelet和kube-proxy是经过kubelet.kubeconfig和kube-proxy.kubeconfig文件中的server参数进行对接 master节点的。
  • 所以在多master节点的环境下,需求有nginx负载均衡器来进行调度,并且需求进行keepalived高可用的构建(主从两个节点),避免主节点宕机导致整个k8s集群的不可用。

布置两台或许三台master

  • 三台:多层保障、负载均衡(减轻每台master的压力)、选举机制选出leader。
  • 两台:也可完结负载均衡,负载压力没那么大的情况下可选两台,一起成本低。

布置master02 节点

master02:192.168.44.50

master01节点,复制文件到master02

#从 master01 节点上复制证书文件、各master组件的装备文件和服务办理文件到 master02 节点
scp -r /opt/etcd/ root@192.168.41.20:/opt/
scp -r /opt/kubernetes/ root@192.168.41.20:/opt/
scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@192.168.41.20:/usr/lib/systemd/system/
scp -r /root/.kube/  master02:/root/

master02节点,修正装备文件并发动相关服务

#修正装备文件kube-apiserver中的IP
vim /opt/kubernetes/cfg/kube-apiserver
KUBE_APISERVER_OPTS="--logtostderr=true \     #输出日志,false表明规范过错不输出到屏幕,而是输出到日志中。true表明规范过错会输出到屏幕。
--v=4 \                     #日志级别
--etcd-servers=https://192.168.44.50:2379,https://192.168.44.30:2379,https://192.168.44.40:2379 \   #etcd节点的IP通讯地址
--bind-address=192.168.44.50 \              #修正,当前绑定的内网IP监听的地址
--secure-port=6443 \                                #根据HPPTS敞开端口
--advertise-address=192.168.44.50 \         #修正,内网布告地址,让其他node节点地址通讯
......
#在 master02 节点上发动各服务并设置开机自启
systemctl enable --now kube-apiserver.service
systemctl enable --now kube-controller-manager.service
systemctl enable --now kube-scheduler.service
#将可履行文件,创立软链接
ln -s /opt/kubernetes/bin/* /usr/local/bin/
#检查node节点状况
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完结双机热备)。

  • load balancer01:192.168.44.100
  • load balancer01:192.168.44.150
  • VIP:192.168.44.200

在lb01、lb02节点上装备nginx和keepalived

装备load balancer集群双机热备负载均衡(nginx完结负载均衡,keepalived完结双机热备)

两台负载均衡器装备nginx

#装备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.44.20:6443;  #master01
     server 192.168.44.50:6443;  #master02
   }
   server {
     listen 6443;
     proxy_pass k8s-apiserver;
   }
}
http {
......
#检查装备文件语法
nginx -t  
#发动nginx服务,检查已监听6443端口
systemctl start nginx
systemctl enable nginx
netstat -natp | grep nginx 
tcp    0   0 0.0.0.0:6443      0.0.0.0:*        LISTEN   2715/nginx: master
tcp    0   0 0.0.0.0:80       0.0.0.0:*        LISTEN   2715/nginx: master

两台负载均衡器装备keepalived

#布置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 LB01   #lb01节点的为LB01,lb02节点的为LB02
}
#增加一个周期性履行的脚本
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.44.200/24   #指定 VIP,需求与之前证书中认证的地址共同
   }
   track_script {     #追踪脚本
     check_nginx         #指定vrrp_script装备的脚本
   }
}
#创立nginx状况检查脚本 
vim /etc/nginx/check_nginx.sh
#!/bin/bash
#egrep -cv "grep|$$" 用于过滤掉包括grep 或许 $$ 表明的当前Shell进程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 addr             #检查主节点的VIP是否生成

封闭主节点的nginx服务,模拟故障,测验keepalived

#封闭主节点lb01的Nginx服务,模拟宕机,调查VIP是否漂移到备节点
systemctl stop nginx
ip addr
systemctl status keepalived  #此刻keepalived被脚本杀掉了  
#备节点检查是否生成了VIP
ip addr  #此刻VIP漂移到备节点lb02
#康复主节点
systemctl start nginx     #先发动nginx
systemctl start keepalived  #再发动keepalived
ip addr

一切node节点修正装备文件

#修正node节点上的bootstrap.kubeconfig,kubelet.kubeconfig装备文件为VIP
cd /opt/kubernetes/cfg/
vim bootstrap.kubeconfig 
server: https://192.168.44.200:6443
           
vim kubelet.kubeconfig
server: https://192.168.44.200:6443
            
vim kube-proxy.kubeconfig
server: https://192.168.44.200:6443
#重启kubelet和kube-proxy服务
systemctl restart kubelet.service 
systemctl restart kube-proxy.service
#在lb01检查nginx的k8s日志
tail /var/log/nginx/k8s-access.log
#在 lb01 上检查 nginx 和 node 、 master 节点的衔接状况
netstat -natp | grep nginx
tcp    0   0 0.0.0.0:6443      0.0.0.0:*        LISTEN     102055/nginx: maste
tcp    0   0 0.0.0.0:80       0.0.0.0:*        LISTEN     102055/nginx: maste
tcp    0   0 192.168.44.100:41768   192.168.44.20:6443    ESTABLISHED    102059/nginx: worke
tcp    0   0 192.168.44.100:41756   192.168.44.20:6443    ESTABLISHED    102059/nginx: worke
tcp    0   0 192.168.44.200:6443   192.168.44.40:45278   ESTABLISHED    102058/nginx: worke
tcp    0   0 192.168.44.200:6443   192.168.44.40:45266   ESTABLISHED    102059/nginx: worke
tcp    0   0 192.168.44.200:6443   192.168.44.30:54798   ESTABLISHED    102058/nginx: worke

在 master01 节点测验创立pod

#测验创立pod
kubectl run nginx --image=nginx
#检查Pod的状况信息
kubectl get pods
NAME    READY  STATUS        RESTARTS  AGE
dns-test  1/1   Running       1      7h48m
nginx   0/1   ContainerCreating  0      6s  
#ContainerCreating,表明正在创立中
kubectl get pods
NAME    READY  STATUS   RESTARTS  AGE
dns-test  1/1   Running  1      7h49m
nginx   1/1   Running  0      88s         
#Running,表明创立完结,运转中
kubectl get pods -o wide  #-o wide:输出额定信息。关于Pod,将输出Pod所在的Node名
NAME    READY  STATUS   RESTARTS  AGE   IP        NODE       NOMINATED NODE  READINESS GATES
nginx   1/1   Running  0      6m6s  10.244.196.130  192.168.44.40  <none>      <none>
#READY为1/1,表明这个Pod中有1个容器
#在对应的node节点上操作,能够直接运用浏览器或许curl指令拜访nginx服务
curl 10.244.196.130  #拜访Pod的IP地址
#这时在master01节点上检查nginx日志,发现没有权限检查
kubectl logs nginx  #并没有Pod的拜访记载

布置Dashboard

Dashboard 介绍

仪表板是根据Web的Kubernetes用户界面。您能够运用仪表板将容器化应用程序布置到Kubernetes集群,对容器化应用程序进行故障排除,并办理集群自身及其伴随资源。您能够运用仪表板来概述群集上运转的应用程序,以及创立或修正单个Kubernetes资源(例如布置,作业,守护进程等)。

例如,能够运用布置向导扩展布置,发动翻滚更新,重新发动Pod或布置新应用程序。仪表板还提供有关群集中Kubernetes资源状况以及可能发生的任何过错的信息。

#在 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
#经过recommended.yaml资源装备清单,运用kubectl apply创立资源,-f指定资源装备清单文件
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
#假如web页面提示不安全,敲thisisunsafe即可进入下一页面,之后将token值输入
https://192.168.44.40:30001

布置 CoreDNS

运用DNS

Kubernetes能够选择运用DNS来避免将服务的集群IP 地址硬编码到您的应用程序中。Kubernetes DNS作为在集群.上调度的惯例Kubernetes 服务运转。它装备在每个节点上运转的kubelet, 以便容器运用DNS服务的IP来解析DNS称号。集群中界说的每个服务(包括DNS服务器自身)都被分配了一个DNS称号。DNS记载将DNS称号解析为服务的集群IP或POD的IP,详细取决于您的需求。SRV记载用于指定运转服务的特定命名端口。

在一切 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 
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