Blog.093 K8S 多节点二进制部署与 Dashboard UI 部署
本章目录
1. 多 Master 集群架构的了解
2. master 2 节点部署
2.1 环境准备
2.2 部署过程
3. 负载均衡部署
3.1 部署过程
4. 部署 Dashboard UI
4.1 概述
4.2 部署过程
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 服务器类似,增加负载均衡器对其负载均衡即可,并且可水平扩容。
根据单节点继续多节点部署,详见博客:
- 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
(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 节点都关联起来。
配置 load balancer 集群双机热备负载均衡(nginx 实现负载均衡,keepalived 实现双机热备)
在 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
仪表板是基于 Web 的 Kubernetes 用户界面。
- 用户可以使用仪表板将容器化应用程序部署到 Kubernetes 集群,对容器化应用程序进行故障排除,并管理集群本身及其伴随资源;
- 可以使用仪表板来概述群集上运行的应用程序,以及创建或修改单个 Kubernetes 资源(例如部署,作业,守护进程等)。
仪表板还提供有关群集中 Kubernetes 资源状态以及可能发生的任何错误的信息。
在 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页面查看日志更新结果。
-