Blog.093 K8S 多节点二进制部署与 Dashboard UI 部署

本章目录

 

 

 

 

1. 多 Master 集群架构的了解
2. master 2 节点部署
  2.1 环境准备
  2.2 部署过程
3. 负载均衡部署
  3.1 部署过程
4. 部署 Dashboard UI
  4.1 概述
  4.2 部署过程

 

 

 

 

 

1. 多 Master 集群架构的了解

    Kubernetes 作为容器集群系统,通过健康检查+重启策略实现了 Pod 故障自我修复能力,通过调度算法实现将 Pod 分布式部署,并保持预期副本数,根据 Node 失效状态自动在其他 Node 拉起 Pod,实现了应用层的高可用性。

    针对 Kubernetes 集群,高可用性还应包含以下两个层面的考虑:

  • Etcd 数据库的高可用性
  • Kubernetes Master 组件的高可用性

    Master 节点扮演着总控中心的角色,通过不断与工作节点上的 Kubelet 进行通信来维护整个集群的健康工作状态。
    如果 Master 节点故障,将无法使用 kubectl 工具或者 API 做任何集群管理。

    Master 节点主要有三个服务 kube-apiserver、kube-controller-mansger 和 kube-scheduler
    其中 kube-controller-mansger 和 kube-scheduler 组件自身通过选择机制已经实现了高可用,所以 Master 高可用主要针对 kube-apiserver 组件,而该组件是以 HTTP API 提供服务,因此对高可用与 Web 服务器类似,增加负载均衡器对其负载均衡即可,并且可水平扩容。


2. master 2 节点部署

    根据单节点继续多节点部署,详见博客:


  2.1 环境准备

  • K8S 集群 Master02:192.168.30.40:kube-apiserver、kube-controller-manager、kube-scheduler、etcd
  • K8S 集群 lb01:192.168.30.50:Nginx L4、keepalived
  • K8S 集群 lb02:192.168.30.60:Nginx L4、keepalived


  2.2 部署过程

    (1)关闭防火墙

1 systemctl stop firewalld
2 systemctl disable firewalld

 

 

    (2)关闭 swap

1 swapoff -a
2 sed -ri 's/.*swap.*/#&/' /etc/fstab

 

 


    (3)根据规划设置主机名

1 hostnamectl  set-hostname master02

 

 

    (4)在 master 节点以及各个 Node 节点均添加 hosts

1 cat >>  /etc/hosts <<EOF
2 192.168.229.90 master01
3 192.168.229.80 node01
4 192.168.229.70 node02
5 192.168.229.60 master02
6 EOF

 

    (5)将桥接的 IPv4 流量传递到 iptables 的链

1 cat > /etc/sysctl.d/k8s.conf <<EOF
2 net.bridge.bridge-nf-call-ip6tables = 1
3 net.bridge.bridge-nf-call-ip6tables = 1
4 EOF<br>sysctl --system

 

 

    (6)时间同步

1 yum -y install ntpdate
2 ntpdate time.windows.com

 

 

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

1 scp -r /opt/etcd/ root@192.168.229.60:/opt/
2 scp -r /opt/kubernetes/ root@192.168.229.60:/opt、
3 scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@192.168.229.60:/usr/lib/systemd/system/

 

 

 

 

    (8)修改配置文件 kube-apiserver 的 IP

1 vim /opt/kubernetes/cfg/kube-apiserver
2 KUBE_APISERVER_OPTS="--logtostderr=true \
3 --v=4 \
4 --etcd-servers=https://192.168.229.90:2379,https://192.168.229.80:2379,https://192.168.229.70:2379 \
5 --bind-address=192.168.229.60 \ #修改
6 --secure-port=6443 \
7 --advertise-address=192.168.229.60 \    #修改
8 ......

 

 

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

1 systemctl daemon-reload<br>systemctl enable --now kube-apiserver.service kube-controller-manager.service kube-scheduler.service

 

 

    (10)查看 node 节点状态

1 ln -s /opt/kubernetes/bin/* /usr/local/bin/
2 kubectl get nodes
3 kubectl get nodes -o wide   #-o=wide:输出额外信息;对于Pod,将输出Pod所在的Node名  

 

    此时在 master02 节点查到的 node 节点状态仅是从 etcd 查询到的信息,而此时 node 节点实际上并未与 master02 节点建立通信连接,因此需要使用一个 VIP 把node 节点与 master 节点都关联起来。

 

 

 

3. 负载均衡部署

    配置 load balancer 集群双机热备负载均衡(nginx 实现负载均衡,keepalived 实现双机热备)


  3.1 部署过程

    在 lb01、lb02 节点上操作

    (1)配置 nginx 的官方在线 yum 源,配置本地 nginx 的 yum 源

1 cat > /etc/yum.repos.d/nginx.repo << 'EOF'
2 [nginx]
3 name=nginx repo
4 baseurl=http://nginx.org/packages/centos/7/$basearch/
5 gpgcheck=0
6 EOF
7  
8 yum install nginx -y

 

 

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

 1 vim /etc/nginx/nginx.conf
 2 events {
 3 worker_connections 1024;
 4 }
 5  
 6 #添加
 7 stream {
 8 log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
 9  
10 access_log /var/log/nginx/k8s-access.log main;
11  
12 upstream k8s-apiserver {
13 server 192.168.229.90:6443;
14 server 192.168.229.60:6443;
15 }
16 server {
17 listen 6443;
18 proxy_pass k8s-apiserver;
19 }
20 }
21  
22 http {
23 ......

 

 

    (3)检查配置文件语法

1 nginx -t

 

 

    (4)启动 nginx 服务,查看已监听 6443 端口

1 systemctl start nginx
2 systemctl enable nginx
3 netstat -natp | grep nginx

 

 

    (5)部署 keepalived 服务

1 yum install keepalived -y

 

 

    (6)修改 keepalived 配置文件

 1 vim /etc/keepalived/keepalived.conf
 2 ! Configuration File for keepalived
 3  
 4 global_defs {
 5 # 接收邮件地址
 6 notification_email {
 7 acassen@firewall.loc
 8 failover@firewall.loc
 9 sysadmin@firewall.loc
10 }
11 # 邮件发送地址
12 notification_email_from Alexandre.Cassen@firewall.loc
13 smtp_server 127.0.0.1
14 smtp_connect_timeout 30
15 router_id NGINX_MASTER  #lb01节点的为 NGINX_MASTER,lb02节点的为 NGINX_BACKUP
16 }
17  
18 #添加一个周期性执行的脚本
19 vrrp_script check_nginx {
20 script "/etc/keepalived/check_nginx.sh" #指定检查nginx存活的脚本路径
21 }
22  
23 vrrp_instance VI_1 {
24 state MASTER    #lb01节点的为 MASTER,lb02节点的为 BACKUP
25 interface ens33 #指定网卡名称 ens33
26 virtual_router_id 51    #指定vrid,两个节点要一致
27 priority 100    #lb01节点的为 100,lb02节点的为 90
28 advert_int 1
29 authentication {
30 auth_type PASS
31 auth_pass 1111
32 }
33 virtual_ipaddress {
34 192.168.80.30/24    #指定 VIP
35 }
36 track_script {
37 check_nginx #指定vrrp_script配置的脚本
38 }
39 }<br>其他多余的配置删除

 

 

 

 

 

    (7)创建 nginx 状态检查脚本

 1 vim /etc/keepalived/check_nginx.sh
 2 #!/bin/bash
 3 #egrep -cv "grep|$$" 用于过滤掉包含grep 或者 $$ 表示的当前Shell进程ID
 4 count=$(ps -ef | grep nginx | egrep -cv "grep|$$")
 5  
 6 if [ "$count" -eq 0 ];then
 7 systemctl stop keepalived
 8 fi
 9  
10  
11 chmod +x /etc/keepalived/check_nginx.sh

 

 

 

    (8)启动 keepalived 服务(一定要先启动 nginx 服务,再启动 keepalived 服务)

1 systemctl start keepalived
2 systemctl enable keepalived
3 ip a    #查看VIP是否生成

 

 

    (9)修改 node 节点上的 bootstrap.kubeconfig、kubelet.kubeconfig 配置文件为 VIP

1 cd /opt/kubernetes/cfg/
2 vim bootstrap.kubeconfig
3 server: https://192.168.229.30:6443
4  
5 vim kubelet.kubeconfig
6 server: https://192.168.229.30:6443
7  
8 vim kube-proxy.kubeconfig
9 server: https://192.168.229.30:6443

 

    (10)重启 kubelet 和 kube-proxy 服务

1 systemctl restart kubelet.service
2 systemctl restart kube-proxy.service

 

 

    (11)在 lb01 上查看 nginx 的 k8s 日志

1 tail /var/log/nginx/k8s-access.log

 

 

    在 master02 节点上操作

    (12)测试创建 pod

1 kubectl create deployment redis-master02 --image=redis  

 

    (13)查看 Pod 的状态信息

1 kubectl get pods
2 NAME READY STATUS RESTARTS AGE
3 nginx-dbddb74b8-nf9sk 0/1 ContainerCreating 0 33s #正在创建中

 

1 kubectl get pods
2 NAME READY STATUS RESTARTS AGE
3 nginx-dbddb74b8-nf9sk 1/1 Running 0 80s #创建完成,运行中
4  
5 kubectl get pods -o wide
6 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
7 nginx-dbddb74b8-26r9l 1/1 Running 0 10m 172.17.36.2 192.168.80.15 <none>
8 //READY为1/1,表示这个Pod中有1个容器

 

 

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

1 curl 172.17.54.2

 

 

    (15)这时在 master01 节点上查看 nginx 日志,发现没有权限查看

1 kubectl logs nginx-dbddb74b8-nf9sk
2 Error from server (Forbidden): Forbidden (user=system:anonymous, verb=get, resource=nodes, subresource=proxy) ( nginx-dbddb74b8-nf9sk)

 

 

    (16)在 master01 节点上,将 cluster-admin 角色授予用户 system:anonymous

1 kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
2 clusterrolebinding.rbac.authorization.k8s.io/cluster-system-anonymous created

 

    (17)再次查看 nginx 日志

1 kubectl logs nginx-dbddb74b8-nf9sk

 

 

4. 部署 Dashboard UI
  4.1 概述

    仪表板是基于 Web 的 Kubernetes 用户界面。

  • 用户可以使用仪表板将容器化应用程序部署到 Kubernetes 集群,对容器化应用程序进行故障排除,并管理集群本身及其伴随资源;
  • 可以使用仪表板来概述群集上运行的应用程序,以及创建或修改单个 Kubernetes 资源(例如部署,作业,守护进程等)。

    仪表板还提供有关群集中 Kubernetes 资源状态以及可能发生的任何错误的信息。


  4.2 部署过程

    在 master1 节点上操作

    (1)在 k8s 工作目录中创建 dashborad 工作目录

1 mkdir /opt/k8s/dashboard
2 cd /opt/k8s/dashboard

 

    上传 Dashboard.zip 压缩包,并解压,一共有7个文件,包含5个构建该界面的核心文件。
    一个 k8s-admin.yaml 文件是自己写的,用来生成待会在浏览器中登录时所用的令牌;
    一个 dashboard-cert.sh,用来快速生成解决谷歌浏览器加密通信问题所需的证书文件。

 

  • dashboard-rbac.yaml:用于访问控制设置,配置各种角色的访问控制权限及角色绑定(绑定角色和服务账户),内容中包含对应各种角色所配置的规则(rules)
  • dashboard-secret.yaml:提供令牌,访问 API 服务器所用(个人理解为一种安全认证机制)
  • dashboard-configmap.yaml:配置模板文件,负责设置Dashboard的文件,ConfigMap 提供了将配置数据注入容器的方式,保证容器中的应用程序配置从 Image 内容中解耦
  • dashboard-controller.yaml:负责控制器及服务账户的创建,来管理 pod 副本
  • dashboard-service.yaml:负责将容器中的服务提供出去,供外部访问


    (2)通过 kubectl create 命令创建 resources

1 cd /opt/k8s/dashboard

 

  • 规定 kubernetes-dashboard-minimal 该角色的权限:例如其中具备获取更新删除等不同的权限
1 kubectl create -f dashboard-rbac.yaml  

 

  • 有几个 kind 就会有几个结果被创建,格式为 kind+apiServer/name
1 role.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
2 rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created

 

 

  • 查看类型为 Role,RoleBinding 的资源对象 kubernetes-dashboard-minimal 是否生成
1 kubectl get role,rolebinding -n kube-system  

 

    -n kube-system 表示查看指定命名空间中的 pod,缺省值为 default

 

 

    (3)证书和密钥创建

1 kubectl create -f dashboard-secret.yaml
2 secret/kubernetes-dashboard-certs created
3 secret/kubernetes-dashboard-key-holder created

 

 

  • 查看类型为 Secret 的资源对象 kubernetes-dashboard-certs,kubernetes-dashboard-key-holder 是否生成
1 kubectl get secret -n kube-system

 

 

    (4)配置文件,对于集群 dashboard 设置的创建

1 kubectl create -f dashboard-configmap.yaml
2 configmap/kubernetes-dashboard-settings created  

 

  • 查看类型为 ConfigMap 的资源对象 kubernetes-dashboard-settings 是否生成
1 kubectl get configmap -n kube-system

 

 

    (5)创建容器需要的控制器以及服务账户

1 kubectl create -f dashboard-controller.yaml
2 serviceaccount/kubernetes-dashboard created
3 deployment.apps/kubernetes-dashboard created  

 

  • 查看类型为 ServiceAccount,Deployment 的资源对象 kubernetes-dashboard-settings 是否生成
1 kubectl get serviceaccount,deployment -n kube-system

 

 

    (6)将服务提供出去

1 kubectl create -f dashboard-service.yaml
2 service/kubernetes-dashboard created  

 

  • 查看创建在指定的 kube-system 命名空间下的 pod 和 service 状态信息

 

1 kubectl get pods,svc -n kube-system -o wide  

 

  • svc 为 service 的缩写,可用 kubectl api-resources 查看
1 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
2 pod/kubernetes-dashboard-7dffbccd68-c6d24 1/1 Running 1 11m 172.17.26.2 192.168.80.11 <none>
3  
4 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
5 service/kubernetes-dashboard NodePort 10.0.0.75 <none> 443:30001/TCP 11m k8s-app=kubernetes-dashboard

 

 

    (7)dashboard 分配给了 node01 服务器,访问的入口是30001端口,打开浏览器访问 https://nodeIP:30001 来进行测试

  • 火狐浏览器可直接访问:https://192.168.229.70:30001;
  • 谷歌浏览器则因为缺少加密通信的认证证书,导致无法直接访问;
  • 可通过 菜单->更多工具->开发者工具->Security 查看访问失败的原因。

 

 

 

 

    (8)解决谷歌浏览器加密通信问题,使用的脚本 dashboard-cert.sh 来快速生成证书文件

1 cd /opt/k8s/dashboard/
2 vim dashboard-controller.yaml
3 ......
4 args:
5 # PLATFORM-SPECIFIC ARGS HERE
6 - --auto-generate-certificates
7 #在文件的第47行下面添加以下两行,指定加密(tls)的私钥和证书文件
8 - --tls-key-file=dashboard-key.pem
9 - --tls-cert-file=dashboard.pem

 

 

    (9)执行脚本

1 cd /opt/k8s/dashboard/
2 chmod +x dashboard-cert.sh
3 ./dashboard-cert.sh /opt/k8s/k8s-cert/

 

 

    (10)在 dashboard 工作目录下将生成两个证书

1 ls *.pem
2 dashboard.pem   dashboard-key.pem

 

 

    (11)重新进行部署(注意:当 apply 不生效时,先使用 delete 清除资源,再 apply 创建资源)

1 kubectl apply -f dashboard-controller.yaml  

 

  • 由于可能会更换所分配的节点,所以要再次查看一下分配的节点服务器地址和端口号
1 kubectl get pods,svc -n kube-system -o wide

 

  • 再次进行访问测试,选择使用令牌方式登录,使用 k8s-admin.yaml 文件进行创建令牌
1 cd /opt/k8s/dashboard/
2 kubectl create -f k8s-admin.yaml

 

  • 获取 token 简要信息,名称为 dashboard-admin-token-xxxxx
1 kubectl get secrets -n kube-system
2 NAME TYPE DATA AGE
3 dashboard-admin-token-kpmm8 kubernetes.io/service-account-token 3
4 default-token-7dhwm kubernetes.io/service-account-token 3
5 kubernetes-dashboard-certs Opaque 11
6 kubernetes-dashboard-key-holder Opaque 2
7 kubernetes-dashboard-token-jn94c kubernetes.io/service-account-token 3  

 

  • 查看令牌序列号,取 token: 后面的内容
  • kubectl describe secrets dashboard-admin-token-kpmm8 -n kube-system

 

 

  • 再将令牌序列号复制填入到浏览器页面中,点击登录

 

    先通过 kubectl get pods 命令查看一下集群中是否有资源在运行,再在 Dashboard UI 界面中命令空间选 default,点击侧边栏中的“容器组”,点击容器名称,进入一个页面,点击右上方的“运行命令”或”日志“控件会弹出另一个额外页面。
    可在“运行命令”输入 curl <podip> 命令访问容器,再通过dashboard页面查看日志更新结果。

 

 

 

 

 

 

 

 

 

 

-

 

posted @ 2021-11-03 15:03  洛洛你好  阅读(130)  评论(0)    收藏  举报