1. kubernetes高可用集群环境搭建(kubeadm-v1.20.6)

1.1 前置知识点

目前生产部署Kubernetes 集群主要有两种方式:

kubeadm

Kubeadm 是一个K8s 部署工具,提供kubeadm init 和kubeadm join,用于快速部署Kubernetes 集群。

官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

二进制包

从github 下载发行版的二进制包,手动部署每个组件,组成Kubernetes 集群。

Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。

img

1.2 kubeadm 部署方式介绍

kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes 集群的部署:

  • 创建一个master01 节点kubeadm init
  • 将Node 节点加入到当前集群中$ kubeadm join <master01 节点的IP 和端口>

1.3 安装要求

在开始之前,部署Kubernetes 集群机器需要满足以下几个条件:

  • 一台或多台机器,操作系统CentOS7.x-86_x64
  • 硬件配置:2GB 或更多RAM,2 个CPU 或更多CPU,硬盘30GB 或更多
  • 集群中所有机器之间网络互通
  • 可以访问外网,需要拉取镜像
  • 禁止swap 分区

1.4 最终目标

  • 在所有节点上安装Docker 和kubeadm
  • 部署Kubernetes 多master01
  • 部署容器网络插件(calico)
  • 部署高可用组件(nginx+keepalived)
  • 部署Kubernetes Node,将节点加入Kubernetes 集群中
  • 部署Dashboard Web 页面,可视化查看Kubernetes 资源
  • 部署metrics-server
  • 部署Prometheus+Grafana
  • 部署EFK+logstash构建日志收集平台
  • 部署Rancher管理k8s集群
  • 部署helm v3包管理工具
  • 部署ingress控制器
  • 部署Harbor私有镜像仓库

1.5 准备环境

image-20220325095702527

角色 IP地址 组件
master0101 192.168.225.138 apiserver、controller-manager、scheduler、etcd、calico、docker,kubectl,kubeadm,kubelet、kube-proxy
master0102 192.168.225.139 apiserver、controller-manager、scheduler、etcd、calico、docker,kubectl,kubeadm,kubelet、kube-proxy
master0103 192.168.225.140 apiserver、controller-manager、scheduler、etcd、calico、docker,kubectl,kubeadm,kubelet、kube-proxy
node01 192.168.225.141 docker,kube-proxy,kubeadm,kubelet、calico、coredns
node02 192.168.225.142 docker,kube-proxy,kubeadm,kubelet、calico
node03 192.168.225.143 docker,kube-proxy,kubeadm,kubelet、calico
Vip 192.168.225.150

1.6 环境初始化

1.6.1 检查操作系统的版本,安装规划修改所有节点hostname(所有节点操作)
#1 此方式下安装kubernetes集群要求Centos版本要在7.5或之上
[root@master01 ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core)
1.6.2 配置集群节点免密登录(所有节点操作)
#1 生成ssh密钥对:
[root@master01 ~]# ssh-keygen -t rsa  #一路回车,不输入密码
#2 把本地的ssh公钥文件安装到远程主机对应的账号中:
[root@master01 ~]# ssh-copy-id -i .ssh/id_rsa.pub master02
[root@master01 ~]# ssh-copy-id -i .ssh/id_rsa.pub master03
[root@master01 ~]# ssh-copy-id -i .ssh/id_rsa.pub node01
[root@master01 ~]# ssh-copy-id -i .ssh/id_rsa.pub node02
[root@master01 ~]# ssh-copy-id -i .ssh/id_rsa.pub node03
#其他几个节点的操作方式跟master01一致,在此只展示master01的操作方式;
1.6.3 主机名解析(所有节点操作)

为了方便集群节点间的直接调用,配置一下主机名解析,企业中推荐使用内部DNS服务器

#1 主机名成解析 编辑6台服务器的/etc/hosts文件,添加下面内容
[root@master0101 ~]# cat >> /etc/hosts <<EOF
192.168.225.138 master01
192.168.225.139 master02
192.168.225.140 master03
192.168.225.141 node01
192.168.225.142 node02
192.168.225.143 node03
EOF
1.6.4 时间同步(所有节点操作)

kubernetes要求集群中的节点时间必须精确一直,这里使用ntp服务从网络同步时间,企业中建议配置内部时钟同步服务器

#1 安装ntpdate命令,
[root@master0101 ~]# yum install ntpdate -y
#跟网络源做同步
[root@master0101 ~]# ntpdate ntp.aliyun.com
#2 把时间同步做成计划任务
[root@master0101 ~]# crontab -e
* */1 * * * /usr/sbin/ntpdate   ntp.aliyun.com
#3 重启crond服务,修改时区
[root@master0101 ~]# systemctl restart crond.service && timedatectl set-timezone Asia/Shanghai
1.6.5 禁用iptable和firewalld服务(所有节点操作)

kubernetes和docker 在运行的中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则

#1 关闭firewalld服务
[root@master0101 ~]# systemctl stop firewalld && systemctl disable firewalld
#2 安装iptables服务,同时关闭iptables服务
[root@master0101 ~]# yum install  -y iptables-services.x86_64
[root@master0101 ~]# systemctl stop iptables && systemctl disable iptables
#3 清空iptables规则
[root@master0101 ~]# iptables -F
1.6.6 禁用selinux(所有节点操作)

selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题

#1 关闭selinux,注意修改完毕之后需要重启服务器才可以生效
[root@master0101 ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config 
1.6.7 禁用swap分区(所有节点操作)

swap分区指的是虚拟内存分区,它的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用,启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备,但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明

#1 编辑分区配置文件/etc/fstab,注释掉swap分区一行,如果是克隆的虚拟机,需要删除UUID,注意修改完毕之后需要重启服务器
[root@master0101 ~]# vim /etc/fstsb
1.6.8 修改linux的内核参数(所有节点操作)
#1 修改linux的内核采纳数,添加网桥过滤和地址转发功能
#2 加载网桥过滤模块
[root@master01 ~]# modprobe br_netfilter
#3 编辑/etc/sysctl.d/k8s.conf文件,添加如下配置:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
#4 重新加载配置
[root@master01 ~]# sysctl -p /etc/sysctl.d/k8s.conf
#5 查看网桥过滤模块是否加载成功
[root@master01 ~]# lsmod | grep br_netfilter
#6 开机加载内核模块
[root@master01 ~]# echo "modprobe br_netfilter" >> /etc/profile
1.6.9 配置ipvs功能(所有节点操作)

在Kubernetes中Service有两种带来模型,一种是基于iptables的,一种是基于ipvs的两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块

#1 安装ipset和ipvsadm
[root@master01 ~]# yum install ipvsadm.x86_64 ipset  -y
#2 添加需要加载的模块写入脚本文件
[root@master01 ~]#  cat <<EOF> /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
#3 为脚本添加执行权限
[root@master01 ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs
1.6.10 配置部署集群所需要的yum源(所有节点操作)
#1 需要的yum.repo源
---CentOS-Base.repo
---docker-ce.repo
---epel.repo
---kubernetes.repo

[root@master01 yum.repos.d]# ll
total 16
-rw-r--r--. 1 root root 2523 Mar 17 09:44 CentOS-Base.repo
-rw-r--r--. 1 root root 2081 Mar 22 21:43 docker-ce.repo
-rw-r--r--. 1 root root 1050 Mar 22 22:43 epel.repo
-rw-r--r--. 1 root root  133 Mar 22 22:23 kubernetes.repo

#2 备份原有yum.repo源
[root@master01 ~]# mkdir /root/yum.bak
[root@master01 ~]# mv /etc/yum.repos.d/* /root/yum.bak
#3 将准备好的yum源通过scp的方式上传到集群所有节点的yum.repo目录下
---在文末会提供yum.repo文件的下载链接
#4 更新yum源
[root@master01 ~]# yum makecache
#5 配置安装基础依赖包
[root@master01 ~]# yum install -y wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack
1.6.11 安装docker(所有节点操作)
#1 查看当前镜像源中支持的docker版本
[root@master01 ~]# yum list docker-ce --showduplicates
#2 安装特定版本的docker-ce,必须制定--setopt=obsoletes=0,否则yum会自动安装更高版本
[root@master01 ~]# yum install docker-ce-20.10.6 docker-ce-cli-20.10.6 containerd.io -y
#3 添加一个配置文件,Docker 在默认情况下使用Vgroup Driver为cgroupfs,而Kubernetes推荐使用systemd来替代cgroupfs,同时配置docker镜像源加速
[root@master01 ~]# mkdir /etc/docker
[root@master01 ~]# cat <<EOF> /etc/docker/daemon.json
{
	"exec-opts": ["native.cgroupdriver=systemd"],
	"registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF
#4 启动dokcer
[root@master01 ~]# systemctl restart docker && systemctl enable docker
1.6.12 安装Kubernetes组件(所有节点操作)
#1 安装kubeadm、kubelet和kubectl
[root@master01 ~]# yum install --setopt=obsoletes=0 kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6 -y 
#2 启动kubelet,并设置为开机自启
[root@master01 ~]# systemctl enable kubelet && systemctl start kubelet
[root@master01 ~]# systemctl status kubelet
#可以看到kubelet状态不是running(auto-restart)状态,这个是正常的不用管,等k8s组件起来这个kubelet就正常了。
1.6.13 准备集群镜像(所有节点操作)
#1 在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,将部署集群需要的镜像通过scp的方式上传到集群的每个节点上面
[root@master01 ~]# ll
-rw-r--r--  1 root root 1083635200 Mar 17 10:00 k8simage-1-20-6.tar.gz
---在文末会提供k8simage-1-20-6.tar.gz文件的下载链接
#2 在各个节点上面使用docker命令解压集群镜像文件,不能使用tar直接去解压
[root@master01 ~]# docker load -i k8simage-1-20-6.tar.gz
#3 查看解压完成后的docker镜像
[root@master01 ~]# docker images
REPOSITORY                                                        TAG        IMAGE ID       CREATED         SIZE
registry.aliyuncs.com/google_containers/kube-proxy                v1.20.6    9a1ebfd8124d   11 months ago   118MB
registry.aliyuncs.com/google_containers/kube-controller-manager   v1.20.6    560dd11d4550   11 months ago   116MB
registry.aliyuncs.com/google_containers/kube-scheduler            v1.20.6    b93ab2ec4475   11 months ago   47.3MB
registry.aliyuncs.com/google_containers/kube-apiserver            v1.20.6    b05d611c1af9   11 months ago   122MB
calico/pod2daemon-flexvol                                         v3.18.0    2a22066e9588   12 months ago   21.7MB
calico/node                                                       v3.18.0    5a7c4970fbc2   13 months ago   172MB
calico/cni                                                        v3.18.0    727de170e4ce   13 months ago   131MB
calico/kube-controllers                                           v3.18.0    9a154323fbf7   13 months ago   53.4MB
registry.aliyuncs.com/google_containers/etcd                      3.4.13-0   0369cf4303ff   19 months ago   253MB
registry.aliyuncs.com/google_containers/coredns                   1.7.0      bfe3a36ebd25   21 months ago   45.2MB
registry.aliyuncs.com/google_containers/pause                     3.2        80d28bedfe5d   2 years ago     683kB
1.6.14 配置nginx和keepalived(3个master节点操作)
#1 安装keepalived和nginx
[root@master01 ~]#  yum install nginx-mod-stream nginx keepalived -y
#2 修改3个节点上面的keepalived配置文件,修改角色、优先级、网卡名称,其他保持不变即可,nginx配置文件不用修改
--- 在文末会提供nginx.conf和keepalived.conf文件以及keepalived健康检测脚本的下载链接
[root@master01 ~]# ll /etc/keepalived/
total 8
-rw-r--r-- 1 root root 134 Mar 22 23:16 check_nginx.sh
-rw-r--r-- 1 root root 986 Mar 23 22:51 keepalived.conf
[root@master01 ~]# ll /etc/nginx/nginx.conf
-rw-r--r-- 1 root root 1442 Mar 22 23:12 /etc/nginx/nginx.conf
#3 先启动3个节点的nginx服务,在启动keepalived服务
[root@master01 ~]# systemctl enable nginx && systemctl start nginx
[root@master01 ~]# systemctl enable keepalived  && systemctl start keepalived
#4 查看VIP是否生成
[root@master01 ~]# ip addr
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:ba:33:03 brd ff:ff:ff:ff:ff:ff
    inet 192.168.225.138/24 brd 192.168.225.255 scope global noprefixroute ens192
       valid_lft forever preferred_lft forever
    inet 192.168.225.150/24 scope global secondary ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::88c2:50d5:146:e608/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
1.6.15 集群初始化(master01节点操作)
#1 创建集群初始化文件
[root@master01 ~]# vim   kubeadm-config.yaml 
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.20.6
controlPlaneEndpoint: 192.168.225.150:16443
imageRepository: registry.aliyuncs.com/google_containers
apiServer:
 certSANs:
 - 192.168.225.138
 - 192.168.225.139
 - 192.168.225.140
 - 192.168.225.141
 - 192.168.225.142
 - 192.168.225.143
 - 192.168.225.150
networking:
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.10.0.0/16
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
#2 使用配置文件初始化集群
kubeadm init  --config kubeadm-config.yaml --ignore-preflight-errors=SystemVerification
[root@master01 ~]# mkdir -p $HOME/.kube
[root@master01 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master01 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
1.6.16 master节点加入集群(master02-03节点操作)
#1 创建目录,拷贝证书
[root@master01 ~]# cd /root && mkdir -p /etc/kubernetes/pki/etcd &&mkdir -p  ~/.kube/
[root@master01 ~]# scp /etc/kubernetes/pki/ca.crt  master02:/etc/kubernetes/pki/
[root@master01 ~]# scp /etc/kubernetes/pki/ca.key master02:/etc/kubernetes/pki/
[root@master01 ~]# scp /etc/kubernetes/pki/sa.key master02:/etc/kubernetes/pki/
[root@master01 ~]# scp /etc/kubernetes/pki/sa.pub master02:/etc/kubernetes/pki/
[root@master01 ~]# scp /etc/kubernetes/pki/front-proxy-ca.crt master02:/etc/kubernetes/pki/
[root@master01 ~]# scp /etc/kubernetes/pki/front-proxy-ca.key master02:/etc/kubernetes/pki/
[root@master01 ~]# scp /etc/kubernetes/pki/etcd/ca.crt master02:/etc/kubernetes/pki/etcd/
[root@master01 ~]# scp /etc/kubernetes/pki/etcd/ca.key master02:/etc/kubernetes/pki/etcd/

[root@master01 ~]# cd /root && mkdir -p /etc/kubernetes/pki/etcd &&mkdir -p  ~/.kube/
[root@master01 ~]# scp /etc/kubernetes/pki/ca.crt  master03:/etc/kubernetes/pki/
[root@master01 ~]# scp /etc/kubernetes/pki/ca.key master03:/etc/kubernetes/pki/
[root@master01 ~]# scp /etc/kubernetes/pki/sa.key master03:/etc/kubernetes/pki/
[root@master01 ~]# scp /etc/kubernetes/pki/sa.pub master03:/etc/kubernetes/pki/
[root@master01 ~]# scp /etc/kubernetes/pki/front-proxy-ca.crt master03:/etc/kubernetes/pki/
[root@master01 ~]# scp /etc/kubernetes/pki/front-proxy-ca.key master03:/etc/kubernetes/pki/
[root@master01 ~]# scp /etc/kubernetes/pki/etcd/ca.crt master03:/etc/kubernetes/pki/etcd/
[root@master01 ~]# scp /etc/kubernetes/pki/etcd/ca.key master0:/etc/kubernetes/pki/etcd/

#2 查看token文件,token文件的有效期为24h,过期后无法在使用该token加入集群
[root@master01 ~]# kubeadm token list
TOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
6zqaxk.te6y81dkvy73j5hs   23h         2022-03-26T10:43:37+08:00   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token

#3 重新生成token文件的方法
[root@master01 ~]#  kubeadm token create --print-join-command
#4 查看token文件的sha256字段
[root@master01 ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
#5 使用token将master02和master03加入到集群中
[root@master02 ~]# kubeadm join 192.168.225.150:16443 --token 6zqaxk.te6y81dkvy73j5hs   --discovery-token-ca-cert-hash sha256:f4694c021a9c1467b40254518358f2abf5e50f775e48907f3e08502a09dcc7db  --control-plane  --ignore-preflight-errors=SystemVerification

[root@master03 ~]# kubeadm join 192.168.225.150:16443 --token 6zqaxk.te6y81dkvy73j5hs   --discovery-token-ca-cert-hash sha256:f4694c021a9c1467b40254518358f2abf5e50f775e48907f3e08502a09dcc7db  --control-plane  --ignore-preflight-errors=SystemVerification
1.6.17 node节点加入集群(node01-03节点操作)
#1 使用token将node01-03加入到集群中
[root@node01 ~]# kubeadm join 192.168.225.150:16443 --token 6zqaxk.te6y81dkvy73j5hs   --discovery-token-ca-cert-hash sha256:f4694c021a9c1467b40254518358f2abf5e50f775e48907f3e08502a09dcc7db  --ignore-preflight-errors=SystemVerification

[root@node02 ~]# kubeadm join 192.168.225.150:16443 --token 6zqaxk.te6y81dkvy73j5hs   --discovery-token-ca-cert-hash sha256:f4694c021a9c1467b40254518358f2abf5e50f775e48907f3e08502a09dcc7db  --ignore-preflight-errors=SystemVerification

[root@node03 ~]# kubeadm join 192.168.225.150:16443 --token 6zqaxk.te6y81dkvy73j5hs   --discovery-token-ca-cert-hash sha256:f4694c021a9c1467b40254518358f2abf5e50f775e48907f3e08502a09dcc7db  --ignore-preflight-errors=SystemVerification
1.6.18 安装calico网络插件(master01节点操作)
#1 将calico的yaml文件通过scp的方式上传到master01上面,然后使用kubectl安装calico
--- 在文末会提供calico.yaml的下载链接
[root@master01 ~]# kubectl apply -f calico.yaml
1.6.19 查看集群状态(master01节点操作)
[root@master01 ~]# kubectl  get node
NAME       STATUS   ROLES                  AGE   VERSION
master01   Ready    control-plane,master   35h   v1.20.6
master02   Ready    control-plane,master   35h   v1.20.6
master03   Ready    control-plane,master   22h   v1.20.6
node01     Ready    <none>                 24h   v1.20.6
node02     Ready    <none>                 24h   v1.20.6
node03     Ready    <none>                 24h   v1.20.6
1.6.20 为node节点打标签(扩展)(master01节点操作)
#1 我们可以看到,节点列表中ROLES这块,node节点为node,如果想标识node节点,使用下面命令实现
[root@master01 ~]# kubectl label node node01 node-role.kubernetes.io/worker=worker
[root@master01 ~]# kubectl label node node02 node-role.kubernetes.io/worker=worker
[root@master01 ~]# kubectl label node node03 node-role.kubernetes.io/worker=worker

[root@master01 ~]# kubectl  get node
NAME       STATUS   ROLES                  AGE   VERSION
master01   Ready    control-plane,master   35h   v1.20.6
master02   Ready    control-plane,master   35h   v1.20.6
master03   Ready    control-plane,master   22h   v1.20.6
node01     Ready    worker                 24h   v1.20.6
node02     Ready    worker                 24h   v1.20.6
node03     Ready    worker                 24h   v1.20.6

1.7 集群测试

1.7.1 创建一个nginx服务
[root@master01 ~]# kubectl create deployment nginx  --image=nginx:1.14-alpine
deployment.apps/nginx created
1.7.2 暴露端口
[root@master01 ~]# kubectl expose deploy nginx  --port=80 --target-port=80  --type=NodePort
service/nginx exposed
1.7.3 查看服务
[root@master01 ~]# kubectl get pod,svc
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-65c4bffcb6-2qxzh   1/1     Running   0          49s

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
service/nginx        NodePort    10.10.153.8   <none>        80:31076/TCP   20s
1.7.4 查看pod

image-20220325110212812

浏览器测试结果:

image-20220325110311163

1.7.5 测试coredns服务是否正常
[root@master01 ~]# kubectl  exec -it nginx-65c4bffcb6-2qxzh -- sh
/ # ping nginx
PING nginx (10.10.153.8): 56 data bytes
64 bytes from 10.10.153.8: seq=0 ttl=64 time=0.066 ms
64 bytes from 10.10.153.8: seq=1 ttl=64 time=0.151 ms
/ # nslookup nginx.default.svc.cluster.local
Name:      nginx.default.svc.cluster.local
Address 1: 10.10.153.8 nginx.default.svc.cluster.local
#10.10.153.8  是创建的nginx的service ip

1.8 部署Dashboard Web

之前在kubernetes中完成的所有操作都是通过命令行工具kubectl完成的。其实,为了提供更丰富的用户体验,kubernetes还开发了一个基于web的用户界面(Dashboard)。用户可以使用Dashboard部署容器化的应用,还可以监控应用的状态,执行故障排查以及管理kubernetes中各种资源。

  • 自签证书

因为自动生成的证书很多浏览器无法使用,所以自己创建证书

#1 新建证书存放目录
[root@master01 ~]# mkdir /etc/kubernetes/dashboard-certs
[root@master01 ~]# cd /etc/kubernetes/dashboard-certs/
#2 创建命名空间
[root@master01 ~]# kubectl create namespace kubernetes-dashboard
#3 创建key文件
[root@master01 ~]# openssl genrsa -out dashboard.key 2048
#4 证书请求
[root@master01 ~]# openssl req -days 36000 -new -out dashboard.csr -key dashboard.key -subj '/CN=dashboard-cert'
#5 自签证书
[root@master01 ~]# openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt
#6 创建kubernetes-dashboard-certs对象
[root@master01 ~]# kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kubernetes-dashboard
  • 下载并修改配置文件
#1 下载配置文件
[root@master01 ~]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
#2 修改配置文件,增加直接访问端口

image-20220325112630553

#3 修改配置文件,注释原kubernetes-dashboard-certs对象声明

image-20220325113235361

#4 运行dashboard
[root@master01 ~]# kubectl apply -f recommended.yaml
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created
#5 查看dashboard组件状态
[root@master01 dashboard-certs]# kubectl get all -n kubernetes-dashboard
NAME                                             READY   STATUS    RESTARTS   AGE
pod/dashboard-metrics-scraper-7b59f7d4df-z24lb   1/1     Running   0          4m20s
pod/kubernetes-dashboard-74d688b6bc-wd54z        1/1     Running   0          78s

NAME                                TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)         AGE
service/dashboard-metrics-scraper   ClusterIP   10.10.42.68   <none>        8000/TCP        4m20s
service/kubernetes-dashboard        NodePort    10.10.172.2   <none>        443:30001/TCP   4m21s

NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/dashboard-metrics-scraper   1/1     1            1           4m20s
deployment.apps/kubernetes-dashboard        1/1     1            1           4m20s

NAME                                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/dashboard-metrics-scraper-7b59f7d4df   1         1         1       4m20s
replicaset.apps/kubernetes-dashboard-74d688b6bc        1         1         1       4m20s
#6 创建Dashboard管理员账号dashboard-admin.yaml,并apply
[root@master01 ~]# vim dashboard-admin.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: dashboard-admin
  namespace: kubernetes-dashboard
#7 赋权dashboard-admin-bind-cluster-role.yaml,并apply
[root@master01 ~]# vim dashboard-admin-bind-cluster-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: dashboard-admin-bind-cluster-role
  labels:
    k8s-app: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: dashboard-admin
  namespace: kubernetes-dashboard
#8 获取token信息
[root@master01 ~]# kubectl -n kubernetes-dashboard get secret | grep dashboard-admin | awk '{print $1}'
#9 登录访问https://192.168.225.138:30001/#/login

image-20220325115130018

image-20220325115154059

  • 使用kubeconfig文件登录集群
#1 设置集群参数
[root@master01 ~]# kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --server="https://192.168.225.150:16443"  --embed-certs=true  --kubeconfig=/root/shibosen-admin.conf
#2 设置变量
[root@master01 ~]# DEF_NS_ADMIN_TOKEN=$(kubectl get secret dashboard-admin-token-hj6j4 -n kubernetes-dashboard -o jsonpath={.data.token}|base64 -d)
#3 设置客户端认证参数
[root@master01 ~]# kubectl config set-credentials dashboard-admin --token=$DEF_NS_ADMIN_TOKEN  --kubeconfig=/root/shibosen-admin.conf
#4 设置安全上下文参数
[root@master01 ~]# kubectl config set-context dashboard-admin@kubernetes --cluster=kubernetes --user=dashboard-admin  --kubeconfig=/root/shibosen-admin.conf
#5 设置当前上下文参数
[root@master01 ~]# kubectl config use-context dashboard-admin@kubernetes --kubeconfig=/root/shibosen-admin.conf

image-20220325130136583

image-20220325130154052

1.9 部署metrics-server

1.10 部署Prometheus+Grafana

1.11 部署EFK+logstash构建日志收集平台

1.12 部署Rancher管理k8s集群

1.13 部署helm v3包管理工具

1.14 部署ingress控制器

1.15 部署Harbor私有镜像仓库