kubeadm安装k8s集群
固定静态IP。
1.初始化安装环境
前言:没有特殊说明的操作就是所有机器都要做的
-
固定静态IP
#修改配置文件 [root@master1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens192 #修改配置文件之后需要重启网络服务才能使配置生效,重启网络服务命令如下: [root@master1 ~]# service network restart
-
配置主机名和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
-
配置主机间免密登录
[root@master1 ~]# ssh-keygen #一直回车 # 把本地生成的密钥文件和私钥文件拷贝到远程主机 [root@master1 ~]# ssh-copy-id master1 [root@master1 ~]# ssh-copy-id node1 [root@master1 ~]# ssh-copy-id node2
-
关闭交换分区swap,提升性能
#临时关闭 [root@master1 ~]# swapoff -a #永久关闭:注释掉 swap 挂载 [root@master1 ~]# vim /etc/fstab #/dev/mapper/centos-swap swap swap defaults 0 0 #如果是克隆的虚拟机,需要删除 UUID
-
修改内核参数
[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 转发功能已经打开。
-
关闭防火墙
[root@master1 ~]# systemctl stop firewalld ; systemctl disable firewalld
-
关闭selinux
# 临时关闭 [root@master1 ~]# setenforce 0 # 永久关闭 [root@master1 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config [root@master1 ~]# getenforce Disabled #显示 Disabled 说明 selinux 已经关闭
-
配置阿里云repo和epel源 百度
-
配置国内阿里云 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/
-
安装基础软件包
[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
-
配置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
-
配置时间同步
#安装 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
-
开启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 支持服务器健康检查和连接重试等功能
-
安装iptables
#安装 iptables [root@master1 ~]# yum install iptables-services -y #禁用 iptables [root@master1 ~]# service iptables stop && systemctl disable iptables #清空防火墙规则 [root@master1 ~]# iptables -F
2.安装docker服务
-
安装 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
-
配置 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
- 安装初始化 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 就正常了。
- 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 状态,因为没有安装网络插件。
- 扩容 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
- 扩容 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 状态,说明没有安装网络插件
- 安装 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状态
- 测试在 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
- 测试 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主页
-
测试 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
-
安装 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访问不到)
```
- 通过 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 登陆处即可登陆
-
通过 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 界面,就可以登陆了
-
安装 metrics-server 组件
metrics-server 是一个集群范围内的资源数据集和工具,只显示数据,并不提供数据存储服务,主要关注的是资源度量 API 的实现,比如 CPU、文件描述符、内存、请求延时等指标,metric-server 收集数据给 k8s 集群内使用,如 kubectl,hpa,scheduler 等-
部署 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
-
测试 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%
-
-
把 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
更多推荐
所有评论(0)