1.初始化安装环境

前言:没有特殊说明的操作就是所有机器都要做的

  1. 固定静态IP

    #修改配置文件
    [root@master1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens192
    
    #修改配置文件之后需要重启网络服务才能使配置生效,重启网络服务命令如下:
    [root@master1 ~]# service network restart
    
  2. 配置主机名和hosts文件

    [root@master1 ~]# hostnamectl set-hostname master1
    [root@node1 ~]# hostnamectl set-hostname node1
    [root@node2 ~]# hostnamectl set-hostname node2
    
    [root@master1 ~]# vi /etc/hosts
    192.168.210.91 master1
    192.168.210.92 node1
    192.168.210.93 node2
    
  3. 配置主机间免密登录

    [root@master1 ~]# ssh-keygen #一直回车
    # 把本地生成的密钥文件和私钥文件拷贝到远程主机 
    [root@master1 ~]# ssh-copy-id master1
    [root@master1 ~]# ssh-copy-id node1
    [root@master1 ~]# ssh-copy-id node2
    
  4. 关闭交换分区swap,提升性能

    #临时关闭
    [root@master1 ~]# swapoff -a
    
    #永久关闭:注释掉 swap 挂载
    [root@master1 ~]# vim /etc/fstab 
    #/dev/mapper/centos-swap swap swap defaults 0 0
    #如果是克隆的虚拟机,需要删除 UUID
    
  5. 修改内核参数

    [root@master1 ~]# modprobe br_netfilter 
    [root@master1 ~]# echo "modprobe br_netfilter" >> /etc/profile 
    [root@master1 ~]# cat > /etc/sysctl.d/k8s.conf <<EOF 
    net.bridge.bridge-nf-call-ip6tables = 1 
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1 
    EOF
    
    

    问题 1:sysctl 是做什么的?

    ​ 在运行时配置内核参数

    ​ -p 从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf 中加载

    问题 2:为什么要执行 modprobe br_netfilter?

    修改/etc/sysctl.d/k8s.conf 文件,增加如下三行参数:

    net.bridge.bridge-nf-call-ip6tables = 1

    net.bridge.bridge-nf-call-iptables = 1

    net.ipv4.ip_forward = 1

    sysctl -p /etc/sysctl.d/k8s.conf 出现报错:

    sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory

    sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory

    解决方法:

    modprobe br_netfilter

    问题 3:为什么开启 net.bridge.bridge-nf-call-iptables 内核参数?

    在 centos 下安装 docker,执行 docker info 出现如下警告:

    WARNING: bridge-nf-call-iptables is disabled

    WARNING: bridge-nf-call-ip6tables is disabled

    解决办法:

    vim /etc/sysctl.d/k8s.conf

    net.bridge.bridge-nf-call-ip6tables = 1

    net.bridge.bridge-nf-call-iptables = 1

    问题 4:为什么要开启 net.ipv4.ip_forward = 1 参数?

    kubeadm 初始化 k8s 如果报错:

    ERROR FileContent–proc-sys-net-ipv4-ip forward:/proc/sys/net/ipv4/ip_forwarcont
    ents are not set to 1

    就表示没有开启 ip_forward,需要开启。

    net.ipv4.ip_forward 是数据包转发:

    出于安全考虑,Linux 系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,

    其中一块收到数据包,根据数据包的目的 ip 地址将数据包发往本机另一块网卡,该网卡根据路由表继

    续发送数据包。这通常是路由器所要实现的功能。

    要让 Linux 系统具有路由转发功能,需要配置一个 Linux 的内核参数 net.ipv4.ip_forward。这个

    参数指定了 Linux 系统当前对路由转发功能的支持情况;其值为 0 时表示禁止进行 IP 转发;如果是 1,

    则说明 IP 转发功能已经打开。

  6. 关闭防火墙

    [root@master1 ~]# systemctl stop firewalld ; systemctl disable firewalld
    
  7. 关闭selinux

    # 临时关闭
    [root@master1 ~]# setenforce 0
    # 永久关闭
    [root@master1 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
    [root@master1 ~]# getenforce 
    Disabled #显示 Disabled 说明 selinux 已经关闭
    
  8. 配置阿里云repo和epel源 百度

  9. 配置国内阿里云 docker 的 repo 源

    #配置国内阿里云 docker 的 repo 源
    [root@master1 ~]# yum install yum-utils -y 
    [root@master1 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
     
    #配置 epel 源 
    把 epel.repo 上传到 master1 的/etc/yum.repos.d 目录下,远程拷贝到 xianchaonode1 和
    xianchaonode2 节点。 
    [root@master1 ~]# scp /etc/yum.repos.d/epel.repo 
    xianchaonode1:/etc/yum.repos.d/ 
    [root@master1 ~]# scp /etc/yum.repos.d/epel.repo 
    xianchaonode2:/etc/yum.repos.d/
    
  10. 安装基础软件包

    [root@master1 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make vim 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 ntpdate telnet ipvsadm
    
  11. 配置k8s组件的阿里云repo源

    [root@master1 ~]#vim /etc/yum.repos.d/kubernetes.repo 
    [kubernetes] 
    name=Kubernetes 
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ 
    enabled=1 
    gpgcheck=0
    
  12. 配置时间同步

    #安装 ntpdate 命令
    [root@master1 ~]# yum install ntpdate -y 
    #跟网络时间做同步
    [root@master1 ~]# ntpdate cn.pool.ntp.org 
    #把时间同步做成计划任务
    [root@master1 ~]# crontab -e 
    * */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org 
    #重启 crond 服务
    [root@master1 ~]#service crond restart
    
  13. 开启ipvs

    [root@master1 ~]# cd /etc/sysconfig/modules/
    [root@master1 modules]# vi ipvs.modules 
    #!/bin/bash
    ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
    for kernel_module in ${ipvs_modules}; do
    /sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1
    if [ 0 -eq 0 ]; then
    /sbin/modprobe ${kernel_module}
    fi
    done
    [root@master1 modules]# chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs 
    ip_vs_ftp 13079 0 
    nf_nat 26583 1 ip_vs_ftp 
    ip_vs_sed 12519 0 
    ip_vs_nq 12516 0 
    ip_vs_sh 12688 0 
    ip_vs_dh 12688 0
    # 看到类似上面的输出则ipvs启动成功
    

    问题 1:ipvs 是什么?

    ipvs (IP Virtual Server) 实现了传输层负载均衡,也就是我们常说的 4 层 LAN 交换,作为 Linux

    内核的一部分。ipvs 运行在主机上,在真实服务器集群前充当负载均衡器。ipvs 可以将基于 TCP 和 UDP

    的服务请求转发到真实服务器上,并使真实服务器的服务在单个 IP 地址上显示为虚拟服务。

    问题 2:ipvs 和 iptable 对比分析

    kube-proxy 支持 iptables 和 ipvs 两种模式, 在 kubernetes v1.8 中引入了 ipvs 模式,在

    v1.9 中处于 beta 阶段,在 v1.11 中已经正式可用了。iptables 模式在 v1.1 中就添加支持了,从

    v1.2 版本开始 iptables 就是 kube-proxy 默认的操作模式,ipvs 和 iptables 都是基于 netfilter

    的,但是 ipvs 采用的是 hash 表,因此当 service 数量达到一定规模时,hash 查表的速度优势就会显现

    出来,从而提高 service 的服务性能。那么 ipvs 模式和 iptables 模式之间有哪些差异呢?

    1、ipvs 为大型集群提供了更好的可扩展性和性能

    2、ipvs 支持比 iptables 更复杂的复制均衡算法(最小负载、最少连接、加权等等)

    3、ipvs 支持服务器健康检查和连接重试等功能

  14. 安装iptables

    #安装 iptables
    [root@master1 ~]# yum install iptables-services -y
    #禁用 iptables
    [root@master1 ~]# service iptables stop && systemctl disable iptables
    #清空防火墙规则
    [root@master1 ~]# iptables -F
    

2.安装docker服务

  1. 安装 docker-ce

    [root@master1 ~]# yum install -y docker-ce-20.10.6 docker-ce-cli-20.10.6 containerd.io 
    [root@master1 ~]# systemctl start docker && systemctl enable docker.service 
    
  2. 配置 docker 镜像加速器和驱动

#配置镜像加速器
#修改 docker 文件驱动为 systemd,默认为 cgroupfs,kubelet 默认使用 systemd,两者必须一致才可以。
[root@master1 ~]#vim /etc/docker/daemon.json
{ 
  "registry-mirrors":["https://rsbud4vc.mirror.aliyuncs.com","https://registry.dockercn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com","http://qtid6917.mirror.aliyuncs.com", 
"https://rncxm540.mirror.aliyuncs.com"], 
 "exec-opts": ["native.cgroupdriver=systemd"] 
} 

[root@master1 ~]# systemctl daemon-reload && systemctl restart docker 
[root@master1 ~]# systemctl status docker
  1. 安装初始化 k8s 需要的软件包
    kubeadm: kubeadm 是一个工具,用来初始化 k8s 集群的

kubelet: 安装在集群所有节点上,用于启动 Pod 的

kubectl: 通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件

[root@master1 ~]# yum install -y kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6 
[root@master1 ~]# systemctl enable kubelet 
[root@master1 ~]# systemctl status kubelet 
### 看到 kubelet 不是 running 状态,这个是正常的,不用管,等 k8s 组件起来这个kubelet 就正常了。
  1. kubeadm 初始化 k8s 集群
#把初始化 k8s 集群需要的离线镜像包上传到 master1、node1、node2 机器上,手动解压: 
[root@master1 ~]# docker load -i k8simage-1-20-6.tar.gz

###仅在master1上执行
#使用 kubeadm 初始化 k8s 集群 
[root@master1 ~]# kubeadm init --kubernetes-version=1.20.6 --apiserver-advertise-address=192.168.210.91 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=SystemVerification

输出如下说明安装完成。

在这里插入图片描述

#配置 kubectl 的配置文件 config,相当于对 kubectl 进行授权,这样 kubectl 命令可以使用这个证书对 k8s 集群进行管理 
[root@master1 ~]# mkdir -p $HOME/.kube 
[root@master1 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config 
[root@master1 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@master1 ~]# kubectl get nodes
NAME      STATUS     ROLES                  AGE    VERSION
master1   NotReady   control-plane,master   3m7s   v1.20.6
#此时集群状态还是 NotReady 状态,因为没有安装网络插件。
  1. 扩容 k8s 集群-添加第一个工作节点
# 查看添加节点的命令
[root@master1 ~]#  kubeadm token create --print-join-command
kubeadm join 192.168.210.91:6443 --token 6rf09u.acvqwm1u2ljgqvla     --discovery-token-ca-cert-hash sha256:c7459566500cd6570a10ae5cbd8fbdb7d94425bc0a07646abb3fd33909beff00 

# 在node1上执行
[root@node1 ~]# kubeadm join 192.168.210.91:6443 --token 6rf09u.acvqwm1u2ljgqvla     --discovery-token-ca-cert-hash sha256:c7459566500cd6570a10ae5cbd8fbdb7d94425bc0a07646abb3fd33909beff00

# 查看所有节点
[root@master1 ~]# kubectl get nodes
NAME      STATUS     ROLES                  AGE     VERSION
master1   NotReady   control-plane,master   5m35s   v1.20.6
node1     NotReady   <none>                 72s     v1.20.6
  1. 扩容 k8s 集群-添加第二个工作节点
# 每次添加节点都需要生成一个新的token
[root@master1 ~]#  kubeadm token create --print-join-command
kubeadm join 192.168.210.91:6443 --token z237vr.ua2in87cuvjd3tg8     --discovery-token-ca-cert-hash sha256:c7459566500cd6570a10ae5cbd8fbdb7d94425bc0a07646abb3fd33909beff00 

# 添加node2
[root@node2 ~]# kubeadm join 192.168.210.91:6443 --token z237vr.ua2in87cuvjd3tg8     --discovery-token-ca-cert-hash sha256:c7459566500cd6570a10ae5cbd8fbdb7d94425bc0a07646abb3fd33909beff00

[root@master1 ~]# kubectl get nodes
NAME      STATUS     ROLES                  AGE     VERSION
master1   NotReady   control-plane,master   9m4s    v1.20.6
node1     NotReady   <none>                 4m41s   v1.20.6
node2     NotReady   <none>                 118s    v1.20.6

#可以把 node1 和 node2 的 ROLES 变成 work,按照如下方法: 
[root@master1 ~]# kubectl label node node1 node-role.kubernetes.io/worker=worker 
[root@master1 ~]# kubectl label node node2 node-role.kubernetes.io/worker=worker
[root@master1 ~]# kubectl get nodes
NAME      STATUS     ROLES                  AGE     VERSION
master1   NotReady   control-plane,master   14m     v1.20.6
node1     NotReady   worker                 10m     v1.20.6
node2     NotReady   worker                 7m51s   v1.20.6
注意:上面状态都是 NotReady 状态,说明没有安装网络插件
  1. 安装 kubernetes 网络组件-Calico
# 上传 calico.yaml 到 master1 上,使用 yaml 文件安装 calico 网络插件 。 
[root@master1 ~]# kubectl apply -f calico.yaml
注:在线下载配置文件地址是: https://docs.projectcalico.org/manifests/calico.yaml 
 
[root@master1 ~]# kubectl get pods -n kube-system # 查看pod状态
[root@master1 ~]# kubectl get nodes
NAME      STATUS   ROLES                  AGE   VERSION
master1   Ready    control-plane,master   18m   v1.20.6
node1     Ready    worker                 14m   v1.20.6
node2     Ready    worker                 11m   v1.20.6
# 网络就绪后,节点已变为Ready状态
  1. 测试在 k8s 创建 pod 是否可以正常访问网络
# 把 busybox-1-28.tar.gz 上传到 node1、node2 节点,手动解压
[root@node1 ~]#  docker load -i busybox-1-28.tar.gz
432b65032b94: Loading layer   1.36MB/1.36MB
Loaded image: busybox:1.28

# 运行busybox容器 测试网络
[root@master1 ~]# kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh
If you don't see a command prompt, try pressing enter.
/ # ping www.baidu.com
PING www.baidu.com (39.156.66.18): 56 data bytes
64 bytes from 39.156.66.18: seq=0 ttl=47 time=34.607 ms
64 bytes from 39.156.66.18: seq=1 ttl=47 time=34.723 ms
64 bytes from 39.156.66.18: seq=2 ttl=47 time=34.611 ms
^C
--- www.baidu.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 34.607/34.647/34.723 ms
  1. 测试 k8s 集群中部署 tomcat 服务
#把 tomcat.tar.gz 上传到 node1、node2,手动解压
[root@node1 ~]# docker load -i tomcat.tar.gz 
[root@node2 ~]# docker load -i tomcat.tar.gz
[root@master1 ~]# kubectl apply -f tomcat.yaml
[root@master1 ~]# kubectl get pods 
[root@master1 ~]# kubectl get pod -A
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
default       demo-pod                                   1/1     Running   0          10s
[root@master1 ~]# kubectl apply -f tomcat-service.yaml
[root@master1 ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP          31m
tomcat       NodePort    10.110.45.248   <none>        8080:30080/TCP   8s
# 在浏览器访问 node1 节点的 ip:30080 即可访问到Tomcat主页
  1. 测试 coredns 是否正常
    解析内部 Service 的名称,是通过 coreDNS 去解析的。

    [root@master1 ~]#  kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh
    If you don't see a command prompt, try pressing enter.
    / #  nslookup kubernetes.default.svc.cluster.local
    Server:    10.96.0.10
    Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
    
    Name:      kubernetes.default.svc.cluster.local
    Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
    / # 
    # 10.96.0.10 就是我们 coreDNS 的 clusterIP,说明 coreDNS 配置好了。
    # busybox 要用指定的 1.28 版本,不能用最新版本,最新版本,nslookup 会解析不到 dns 和 ip
    
  2. 安装 k8s 可视化 UI 界面 dashboard (选装)

```shell
[root@node1 ~]# docker load -i dashboard_2_0_0.tar.gz
[root@node2 ~]# docker load -i dashboard_2_0_0.tar.gz

#安装 dashboard 组件
[root@master1 ~]# kubectl apply -f kubernetes-dashboard.yaml
#查看 dashboard 的状态
[root@master1 ~]# kubectl get pods -n kubernetes-dashboard
NAME                                         READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-7445d59dfd-ghdmn   1/1     Running   0          28s
kubernetes-dashboard-54f5b6dc4b-hsmwl        1/1     Running   0          28s
#查看 dashboard 前端的 service
[root@master1 ~]# kubectl get svc -n kubernetes-dashboard
NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
dashboard-metrics-scraper   ClusterIP   10.104.156.11   <none>        8000/TCP   2m10s
kubernetes-dashboard        ClusterIP   10.100.166.29   <none>        443/TCP    2m10s
#修改 service type 类型变成 NodePort
#把 type: ClusterIP 变成 type: NodePort,保存退出即可。
[root@master1 ~]# kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
service/kubernetes-dashboard edited
[root@master1 ~]# kubectl get svc -n kubernetes-dashboard
NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.104.156.11   <none>        8000/TCP        3m46s
kubernetes-dashboard        NodePort    10.100.166.29   <none>        443:30083/TCP   3m46s
#上面可看到 service 类型是 NodePort,访问任何一个工作节点 ip: 30083 端口即可访问 kubernetes dashboard (最好使用火狐浏览器 Chrome和Edge访问不到)

```

在这里插入图片描述

  1. 通过 token 令牌访问 dashboard
    #创建管理员 token,具有查看任何空间的权限,可以管理所有资源对象 
    [root@master1 ~]# kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:kubernetes-dashboard
    clusterrolebinding.rbac.authorization.k8s.io/dashboard-cluster-admin created
    #查看 kubernetes-dashboard 名称空间下的 secret 
    [root@master1 ~]# kubectl get secret -n kubernetes-dashboard
    NAME                               TYPE                                  DATA   AGE
    default-token-nx9bd                kubernetes.io/service-account-token   3      10m
    kubernetes-dashboard-certs         Opaque                                0      10m
    kubernetes-dashboard-csrf          Opaque                                1      10m
    kubernetes-dashboard-key-holder    Opaque                                2      10m
    kubernetes-dashboard-token-bs9lr   kubernetes.io/service-account-token   3      10m
     
    #找到对应的带有 token 的 kubernetes-dashboard-token-bs9lr
    [root@master1 ~]# kubectl describe secret -n kubernetes-dashboard kubernetes-dashboard-token-bs9lr
    Name:         kubernetes-dashboard-token-bs9lr
    Namespace:    kubernetes-dashboard
    Labels:       <none>
    Annotations:  kubernetes.io/service-account.name: kubernetes-dashboard
                  kubernetes.io/service-account.uid: 4923c77c-6ca6-4fa3-82a1-230f80afc5a5
    
    Type:  kubernetes.io/service-account-token
    
    Data
    ====
    token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IjF0LWJjSzJkWEV4SWNid2l3QzNqODJDeW5OaE1RZHRvOUxrY2hTOHBzdlUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi1iczlsciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjQ5MjNjNzdjLTZjYTYtNGZhMy04MmExLTIzMGY4MGFmYzVhNSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDprdWJlcm5ldGVzLWRhc2hib2FyZCJ9.jemp_zRCJY2FrnhYRubVwQ-Om3dXwUD0gbrCjhA4gYA-sT_uJICrAg2ELi5cv-mj7hG_YDcwojxV1PQ1L1VXmAvCed3PdI7VSDu-Nyb6CvG834sgd7LK_201_pxmrt7AiY8uLRNuBJ0pJHEfruVoUlT-EzO6b18tJpXYYa26rIEH9RoHZoYIX8R-sK1ajQMwHJo7IoSS02xtiEZvi3dyyYNCNd4nO43KruqXQ4iNrzkPchLqu1Q4s5I_kuBJsxk6GxBS_EGR1hUsVWF6twwTzVhNdTzKVAnBzOrMefL8LrhRRox_IpZElFeEcMsVstBdRRYfGJiZCRq47v0KI5jiKQ
    ca.crt:     1066 bytes
    namespace:  20 bytes
    #把 token 值复制到浏览器 token 登陆处即可登陆
    

在这里插入图片描述

  1. 通过 kubeconfig 文件访问 dashboard

    [root@master1 ~]#  cd /etc/kubernetes/pki
    # 1、创建 cluster 集群 
    [root@master1 pki]# kubectl config set-cluster kubernetes --certificate-authority=./ca.crt --server="https://192.168.210.91:6443" --embed-certs=true --kubeconfig=/root/dashboard-admin.conf 
    [root@master1 pki]# cat /root/dashboard-admin.conf
    
    # 2、创建 credentials (创建用户)
    # 创建 credentials 需要使用上面的 kubernetes-dashboard-token-bs9lr 对应的 token 信息 
    [root@master1 pki]# DEF_NS_ADMIN_TOKEN=$(kubectl get secret kubernetes-dashboard-token-bs9lr -n kubernetes-dashboard -o jsonpath={.data.token}|base64 -d) 
    # 在dashboard-admin.conf中增加新的凭据
    [root@master1 pki]# kubectl config set-credentials dashboard-admin --token=$DEF_NS_ADMIN_TOKEN --kubeconfig=/root/dashboard-admin.conf 
    [root@master1 pki]# cat /root/dashboard-admin.conf
    
    # 3、创建 context 设置当前上下文
    [root@master1 pki]# kubectl config set-context dashboard-admin@kubernetes --cluster=kubernetes --user=dashboard-admin --kubeconfig=/root/dashboard-admin.conf
    [root@master1 pki]# cat /root/dashboard-admin.conf
    
    # 4、切换 context 的 current-context 是 dashboard-admin@kubernetes 
    [root@master1 pki]# kubectl config use-context dashboard-admin@kubernetes --kubeconfig=/root/dashboard-admin.conf 
     
    [root@master1 pki]# cat /root/dashboard-admin.conf
    5、把刚才的 kubeconfig 文件 dashboard-admin.conf 复制到桌面 
    浏览器访问时使用 kubeconfig 认证,把刚才的 dashboard-admin.conf 导入到 web 界面,就可以登陆了
    
  2. 安装 metrics-server 组件
    metrics-server 是一个集群范围内的资源数据集和工具,只显示数据,并不提供数据存储服务,主要关注的是资源度量 API 的实现,比如 CPU、文件描述符、内存、请求延时等指标,metric-server 收集数据给 k8s 集群内使用,如 kubectl,hpa,scheduler 等

    1. 部署 metrics-server 组件

      #部署 metrics-server 服务 
      #在/etc/kubernetes/manifests 里面改一下 apiserver 的配置 
      注意:这个是 k8s 在 1.17 的新特性,如果是 1.16 版本的可以不用添加,1.17 以后要添加。这个参数的作用是 Aggregation 允许在不修改 Kubernetes 核心代码的同时扩展 Kubernetes API。 
      [root@master1 ~]# vim /etc/kubernetes/manifests/kube-apiserver.yaml 
      增加如下内容: 
      - --enable-aggregator-routing=true
      #重新更新 kube-apiserver.yaml
      [root@master1 ~]# kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
      pod/kube-apiserver created
      #把 CrashLoopBackOff 状态的 pod 删除 
      [root@master1 ~]# kubectl delete pods kube-apiserver -n kube-system
      [root@master1 ~]# kubectl apply -f metrics.yaml
      
    2. 测试 kubectl top 命令

      [root@master1 ~]# kubectl top pod -n kube-system
      NAME                                       CPU(cores)   MEMORY(bytes)   
      calico-kube-controllers-6949477b58-zxr9n   2m           20Mi            
      calico-node-6qbhc                          38m          88Mi            
      calico-node-bw6rz                          41m          91Mi            
      calico-node-svxmg                          40m          88Mi            
      coredns-7f89b7bc75-22kt2                   4m           16Mi            
      coredns-7f89b7bc75-2nfgn                   3m           16Mi            
      etcd-master1                               18m          36Mi            
      kube-apiserver-master1                     85m          325Mi           
      kube-controller-manager-master1            18m          48Mi            
      kube-proxy-bmvtp                           1m           19Mi            
      kube-proxy-vxhdw                           1m           19Mi            
      kube-proxy-xbt8k                           1m           17Mi            
      kube-scheduler-master1                     4m           16Mi            
      metrics-server-6595f875d6-wmtnk            2m           16Mi 
      [root@master1 ~]# kubectl top node
      NAME      CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
      master1   230m         5%     1586Mi          20%       
      node1     129m         2%     1087Mi          4%        
      node2     110m         1%     1295Mi          5% 
      
  3. 把 scheduler、controller-manager 端口变成物理机可以监听的端口

    [root@master1 ~]# kubectl get cs
    NAME                 STATUS      MESSAGE                                                                                       ERROR
    scheduler            Unhealthy   Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused   
    controller-manager   Unhealthy   Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused   
    etcd-0               Healthy     {"health":"true"} 
    # 默认在 1.19 之后 10252 和 10251 都是绑定在 127.0.0.1 的,如果想要通过 prometheus 监控,会采集不到数据,所以可以把端口绑定到物理机
    
    ##修改方法如下
    [root@master1 ~]# vim /etc/kubernetes/manifests/kube-scheduler.yaml
    [root@master1 ~]# vim /etc/kubernetes/manifests/kube-controller-manager.yaml
    修改如下内容:
    把 --bind-address=127.0.0.1 改为masterIP --bind-address=192.168.210.91
    把 httpGet:字段下的 hosts 由 127.0.0.1 改为masterIP 192.168.210.91 (有两处)
    把 --port=0 删除
    [root@master1 ~]# systemctl restart kubelet
    [root@master1 ~]# kubectl get cs
    NAME                 STATUS    MESSAGE             ERROR
    controller-manager   Healthy   ok                  
    scheduler            Healthy   ok                  
    etcd-0               Healthy   {"health":"true"}   
    
    [root@master1 ~]# ss -antulp | grep :10251
    tcp    LISTEN     0      4096   [::]:10251              [::]:*                   users:(("kube-scheduler",pid=35099,fd=7))
    [root@master1 ~]# ss -antulp | grep :10252
    tcp    LISTEN     0      4096   [::]:10252              [::]:*                   users:(("kube-controller",pid=37930,fd=7))
    # 可以看到相应的端口已经被物理机监听了
    
    

    参考:韩先超 [2024]kubernetes/k8s+DevOps云原生全栈技术:基于世界1000强实战课程 https://edu.51cto.com/lesson/933982.html

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐